stream-markdown-parser 0.0.43 → 0.0.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +412 -30
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/factory.ts","../src/types.ts","../src/parser/inline-parsers/index.ts","../src/parser/index.ts","../src/config.ts","../src/findMatchingClose.ts","../src/parser/inline-parsers/fence-parser.ts","../src/plugins/containers.ts","../src/plugins/isMathLike.ts","../src/plugins/math.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/factory.ts","../src/types.ts","../src/parser/inline-parsers/index.ts","../src/parser/index.ts","../src/config.ts","../src/findMatchingClose.ts","../src/parser/inline-parsers/fence-parser.ts","../src/plugins/containers.ts","../src/plugins/isMathLike.ts","../src/plugins/math.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -6819,6 +6819,7 @@ const BASE_COMMON_HTML_TAGS = new Set([
|
|
|
6819
6819
|
"del",
|
|
6820
6820
|
"dfn",
|
|
6821
6821
|
"em",
|
|
6822
|
+
"font",
|
|
6822
6823
|
"i",
|
|
6823
6824
|
"img",
|
|
6824
6825
|
"input",
|
|
@@ -6874,7 +6875,7 @@ const BASE_COMMON_HTML_TAGS = new Set([
|
|
|
6874
6875
|
const OPEN_TAG_RE = /<([A-Z][\w-]*)(?=[\s/>]|$)/gi;
|
|
6875
6876
|
const CLOSE_TAG_RE = /<\/\s*([A-Z][\w-]*)(?=[\s/>]|$)/gi;
|
|
6876
6877
|
const TAG_NAME_AT_START_RE = /^<\s*(?:\/\s*)?([A-Z][\w-]*)/i;
|
|
6877
|
-
function findTagCloseIndexOutsideQuotes(html) {
|
|
6878
|
+
function findTagCloseIndexOutsideQuotes$1(html) {
|
|
6878
6879
|
let inSingle = false;
|
|
6879
6880
|
let inDouble = false;
|
|
6880
6881
|
for (let i = 0; i < html.length; i++) {
|
|
@@ -6917,8 +6918,8 @@ function findFirstIncompleteTag(content, tagSet) {
|
|
|
6917
6918
|
const idx = m.index ?? -1;
|
|
6918
6919
|
if (idx < 0) continue;
|
|
6919
6920
|
const tag = (m[1] ?? "").toLowerCase();
|
|
6920
|
-
if (!
|
|
6921
|
-
if (findTagCloseIndexOutsideQuotes(content.slice(idx)) !== -1) continue;
|
|
6921
|
+
if (!isCommonHtmlTagOrPrefix(tag, tagSet)) continue;
|
|
6922
|
+
if (findTagCloseIndexOutsideQuotes$1(content.slice(idx)) !== -1) continue;
|
|
6922
6923
|
if (!first || idx < first.index) first = {
|
|
6923
6924
|
index: idx,
|
|
6924
6925
|
tag,
|
|
@@ -6930,7 +6931,7 @@ function findFirstIncompleteTag(content, tagSet) {
|
|
|
6930
6931
|
if (idx < 0) continue;
|
|
6931
6932
|
const tag = (m[1] ?? "").toLowerCase();
|
|
6932
6933
|
if (!isCommonHtmlTagOrPrefix(tag, tagSet)) continue;
|
|
6933
|
-
if (findTagCloseIndexOutsideQuotes(content.slice(idx)) !== -1) continue;
|
|
6934
|
+
if (findTagCloseIndexOutsideQuotes$1(content.slice(idx)) !== -1) continue;
|
|
6934
6935
|
if (!first || idx < first.index) first = {
|
|
6935
6936
|
index: idx,
|
|
6936
6937
|
tag,
|
|
@@ -6996,7 +6997,7 @@ function fixStreamingHtmlInlineChildren(children, tagSet) {
|
|
|
6996
6997
|
cursor = lt + 1;
|
|
6997
6998
|
continue;
|
|
6998
6999
|
}
|
|
6999
|
-
const closeIdx = findTagCloseIndexOutsideQuotes(sub);
|
|
7000
|
+
const closeIdx = findTagCloseIndexOutsideQuotes$1(sub);
|
|
7000
7001
|
if (closeIdx === -1) {
|
|
7001
7002
|
pushTextPart("<", baseToken);
|
|
7002
7003
|
cursor = lt + 1;
|
|
@@ -7034,7 +7035,7 @@ function fixStreamingHtmlInlineChildren(children, tagSet) {
|
|
|
7034
7035
|
if (pending) {
|
|
7035
7036
|
pending.buffer += tokenToRaw$1(child);
|
|
7036
7037
|
pendingAtEnd = pending.buffer;
|
|
7037
|
-
const closeIdx = findTagCloseIndexOutsideQuotes(pending.buffer);
|
|
7038
|
+
const closeIdx = findTagCloseIndexOutsideQuotes$1(pending.buffer);
|
|
7038
7039
|
if (closeIdx === -1) continue;
|
|
7039
7040
|
const tagChunk = pending.buffer.slice(0, closeIdx + 1);
|
|
7040
7041
|
const afterChunk = pending.buffer.slice(closeIdx + 1);
|
|
@@ -7052,7 +7053,7 @@ function fixStreamingHtmlInlineChildren(children, tagSet) {
|
|
|
7052
7053
|
if (child.type === "html_inline") {
|
|
7053
7054
|
const content = tokenToRaw$1(child);
|
|
7054
7055
|
const tagName = (content.match(TAG_NAME_AT_START_RE)?.[1] ?? "").toLowerCase();
|
|
7055
|
-
if (tagName && tagSet.has(tagName) && findTagCloseIndexOutsideQuotes(content) === -1) {
|
|
7056
|
+
if (tagName && tagSet.has(tagName) && findTagCloseIndexOutsideQuotes$1(content) === -1) {
|
|
7056
7057
|
pending = {
|
|
7057
7058
|
tag: tagName,
|
|
7058
7059
|
buffer: content,
|
|
@@ -7132,10 +7133,69 @@ function applyFixHtmlInlineTokens(md, options = {}) {
|
|
|
7132
7133
|
const tagStack = [];
|
|
7133
7134
|
for (let i = 0; i < toks.length; i++) {
|
|
7134
7135
|
const t = toks[i];
|
|
7136
|
+
if (tagStack.length > 0) {
|
|
7137
|
+
const [openTag, openIndex] = tagStack[tagStack.length - 1];
|
|
7138
|
+
if (i !== openIndex) {
|
|
7139
|
+
if (t.type === "paragraph_open" || t.type === "paragraph_close") {
|
|
7140
|
+
toks.splice(i, 1);
|
|
7141
|
+
i--;
|
|
7142
|
+
continue;
|
|
7143
|
+
}
|
|
7144
|
+
const chunk = String(t.content ?? t.raw ?? "");
|
|
7145
|
+
const closeRe = new RegExp(`<\\s*\\/\\s*${openTag}\\s*>`, "i");
|
|
7146
|
+
const closeMatch = chunk ? closeRe.exec(chunk) : null;
|
|
7147
|
+
const isClosingTag$1 = !!closeMatch;
|
|
7148
|
+
if (chunk) {
|
|
7149
|
+
const openToken = toks[openIndex];
|
|
7150
|
+
if (closeMatch && typeof closeMatch.index === "number") {
|
|
7151
|
+
const end = closeMatch.index + String(closeMatch[0] ?? "").length;
|
|
7152
|
+
const before = chunk.slice(0, end);
|
|
7153
|
+
const after = chunk.slice(end);
|
|
7154
|
+
openToken.content = `${String(openToken.content || "")}\n${before}`;
|
|
7155
|
+
openToken.loading = false;
|
|
7156
|
+
const afterTrimmed = after.replace(/^\s+/, "");
|
|
7157
|
+
toks.splice(i, 1);
|
|
7158
|
+
tagStack.pop();
|
|
7159
|
+
if (afterTrimmed) toks.splice(i, 0, afterTrimmed.startsWith("<") ? {
|
|
7160
|
+
type: "html_block",
|
|
7161
|
+
content: afterTrimmed
|
|
7162
|
+
} : {
|
|
7163
|
+
type: "inline",
|
|
7164
|
+
content: afterTrimmed,
|
|
7165
|
+
children: [{
|
|
7166
|
+
type: "text",
|
|
7167
|
+
content: afterTrimmed,
|
|
7168
|
+
raw: afterTrimmed
|
|
7169
|
+
}]
|
|
7170
|
+
});
|
|
7171
|
+
i--;
|
|
7172
|
+
continue;
|
|
7173
|
+
}
|
|
7174
|
+
openToken.content = `${String(openToken.content || "")}\n${chunk}`;
|
|
7175
|
+
if (openToken.loading !== false) openToken.loading = !isClosingTag$1;
|
|
7176
|
+
}
|
|
7177
|
+
toks.splice(i, 1);
|
|
7178
|
+
i--;
|
|
7179
|
+
if (isClosingTag$1) tagStack.pop();
|
|
7180
|
+
continue;
|
|
7181
|
+
}
|
|
7182
|
+
}
|
|
7135
7183
|
if (t.type === "html_block") {
|
|
7136
|
-
const
|
|
7137
|
-
|
|
7138
|
-
|
|
7184
|
+
const rawContent = String(t.content || "");
|
|
7185
|
+
const tag = (rawContent.match(/<\s*(?:\/\s*)?([^\s>/]+)/)?.[1] ?? "").toLowerCase();
|
|
7186
|
+
if (!/^\s*<\s*\//.test(rawContent)) {
|
|
7187
|
+
if (tag) {
|
|
7188
|
+
if (!new RegExp(`<\\s*\\/\\s*${tag}\\s*>`, "i").test(rawContent)) tagStack.push([tag, i]);
|
|
7189
|
+
}
|
|
7190
|
+
} else if (tagStack.length > 0 && tag && tagStack[tagStack.length - 1][0] === tag) {
|
|
7191
|
+
const [, openIndex] = tagStack[tagStack.length - 1];
|
|
7192
|
+
const openToken = toks[openIndex];
|
|
7193
|
+
openToken.content = `${String(openToken.content || "")}\n${rawContent}`;
|
|
7194
|
+
openToken.loading = false;
|
|
7195
|
+
tagStack.pop();
|
|
7196
|
+
toks.splice(i, 1);
|
|
7197
|
+
i--;
|
|
7198
|
+
}
|
|
7139
7199
|
continue;
|
|
7140
7200
|
} else if (tagStack.length > 0) {
|
|
7141
7201
|
if (t.type === "paragraph_open" || t.type === "paragraph_close") {
|
|
@@ -7156,10 +7216,153 @@ function applyFixHtmlInlineTokens(md, options = {}) {
|
|
|
7156
7216
|
i--;
|
|
7157
7217
|
} else continue;
|
|
7158
7218
|
}
|
|
7219
|
+
if (customTagSet.size > 0) {
|
|
7220
|
+
const openReCache = /* @__PURE__ */ new Map();
|
|
7221
|
+
const closeReCache = /* @__PURE__ */ new Map();
|
|
7222
|
+
const getOpenRe = (tag) => {
|
|
7223
|
+
let r = openReCache.get(tag);
|
|
7224
|
+
if (!r) {
|
|
7225
|
+
r = new RegExp(`<\\s*${tag}\\b`, "i");
|
|
7226
|
+
openReCache.set(tag, r);
|
|
7227
|
+
}
|
|
7228
|
+
return r;
|
|
7229
|
+
};
|
|
7230
|
+
const getCloseRe = (tag) => {
|
|
7231
|
+
let r = closeReCache.get(tag);
|
|
7232
|
+
if (!r) {
|
|
7233
|
+
r = new RegExp(`<\\s*\\/\\s*${tag}\\s*>`, "i");
|
|
7234
|
+
closeReCache.set(tag, r);
|
|
7235
|
+
}
|
|
7236
|
+
return r;
|
|
7237
|
+
};
|
|
7238
|
+
const stack = [];
|
|
7239
|
+
for (let i = 0; i < toks.length; i++) {
|
|
7240
|
+
const tok = toks[i];
|
|
7241
|
+
const content = String(tok.content ?? "");
|
|
7242
|
+
if (stack.length > 0) {
|
|
7243
|
+
const top = stack[stack.length - 1];
|
|
7244
|
+
const openTok = toks[top.index];
|
|
7245
|
+
if (tok.type === "html_block" && getCloseRe(top.tag).test(content)) {
|
|
7246
|
+
openTok.content = `${String(openTok.content ?? "")}\n${content}`;
|
|
7247
|
+
if (Array.isArray(openTok.children)) openTok.children.push({
|
|
7248
|
+
type: "html_inline",
|
|
7249
|
+
content: `</${top.tag}>`,
|
|
7250
|
+
raw: `</${top.tag}>`
|
|
7251
|
+
});
|
|
7252
|
+
toks.splice(i, 1);
|
|
7253
|
+
i--;
|
|
7254
|
+
stack.pop();
|
|
7255
|
+
continue;
|
|
7256
|
+
}
|
|
7257
|
+
if (tok.type !== "inline") continue;
|
|
7258
|
+
const children = Array.isArray(tok.children) ? tok.children : [];
|
|
7259
|
+
const closeChildIndex = children.findIndex((c) => {
|
|
7260
|
+
if (!c || c.type !== "html_inline") return false;
|
|
7261
|
+
const cContent = String(c.content ?? "");
|
|
7262
|
+
return /^\s*<\s*\//.test(cContent) && cContent.toLowerCase().includes(top.tag);
|
|
7263
|
+
});
|
|
7264
|
+
if (closeChildIndex !== -1) {
|
|
7265
|
+
const beforeChildren = children.slice(0, closeChildIndex + 1);
|
|
7266
|
+
const afterChildren = children.slice(closeChildIndex + 1);
|
|
7267
|
+
const beforeText = beforeChildren.map((c) => String(c?.content ?? c?.raw ?? "")).join("");
|
|
7268
|
+
openTok.content = `${String(openTok.content ?? "")}\n${beforeText}`;
|
|
7269
|
+
if (Array.isArray(openTok.children)) openTok.children.push(...beforeChildren);
|
|
7270
|
+
if (afterChildren.length) {
|
|
7271
|
+
const afterText = afterChildren.map((c) => String(c.content ?? c.raw ?? "")).join("");
|
|
7272
|
+
if (afterText.trim()) {
|
|
7273
|
+
const trimmed = afterText.replace(/^\s+/, "");
|
|
7274
|
+
if (trimmed.startsWith("<")) toks.splice(i, 1, {
|
|
7275
|
+
type: "html_block",
|
|
7276
|
+
content: trimmed
|
|
7277
|
+
});
|
|
7278
|
+
else toks.splice(i, 1, {
|
|
7279
|
+
type: "paragraph_open",
|
|
7280
|
+
tag: "p",
|
|
7281
|
+
nesting: 1
|
|
7282
|
+
}, {
|
|
7283
|
+
type: "inline",
|
|
7284
|
+
tag: "",
|
|
7285
|
+
nesting: 0,
|
|
7286
|
+
content: afterText,
|
|
7287
|
+
children: [{
|
|
7288
|
+
type: "text",
|
|
7289
|
+
content: afterText,
|
|
7290
|
+
raw: afterText
|
|
7291
|
+
}]
|
|
7292
|
+
}, {
|
|
7293
|
+
type: "paragraph_close",
|
|
7294
|
+
tag: "p",
|
|
7295
|
+
nesting: -1
|
|
7296
|
+
});
|
|
7297
|
+
} else {
|
|
7298
|
+
toks.splice(i, 1);
|
|
7299
|
+
i--;
|
|
7300
|
+
}
|
|
7301
|
+
} else {
|
|
7302
|
+
toks.splice(i, 1);
|
|
7303
|
+
i--;
|
|
7304
|
+
}
|
|
7305
|
+
stack.pop();
|
|
7306
|
+
continue;
|
|
7307
|
+
}
|
|
7308
|
+
openTok.content = `${String(openTok.content ?? "")}\n${content}`;
|
|
7309
|
+
if (Array.isArray(openTok.children)) openTok.children.push(...children);
|
|
7310
|
+
toks.splice(i, 1);
|
|
7311
|
+
i--;
|
|
7312
|
+
continue;
|
|
7313
|
+
}
|
|
7314
|
+
if (tok.type !== "inline") continue;
|
|
7315
|
+
for (const tag of customTagSet) if (getOpenRe(tag).test(content) && !getCloseRe(tag).test(content)) {
|
|
7316
|
+
stack.push({
|
|
7317
|
+
tag,
|
|
7318
|
+
index: i
|
|
7319
|
+
});
|
|
7320
|
+
break;
|
|
7321
|
+
}
|
|
7322
|
+
}
|
|
7323
|
+
}
|
|
7324
|
+
{
|
|
7325
|
+
let depth = 0;
|
|
7326
|
+
for (let i = 0; i < toks.length; i++) {
|
|
7327
|
+
const t = toks[i];
|
|
7328
|
+
if (t.type === "paragraph_open") {
|
|
7329
|
+
depth++;
|
|
7330
|
+
continue;
|
|
7331
|
+
}
|
|
7332
|
+
if (t.type === "paragraph_close") if (depth > 0) depth--;
|
|
7333
|
+
else {
|
|
7334
|
+
toks.splice(i, 1);
|
|
7335
|
+
i--;
|
|
7336
|
+
}
|
|
7337
|
+
}
|
|
7338
|
+
}
|
|
7159
7339
|
for (let i = 0; i < toks.length; i++) {
|
|
7160
7340
|
const t = toks[i];
|
|
7161
7341
|
if (t.type === "html_block") {
|
|
7162
7342
|
const tag = (t.content?.match(/<([^\s>/]+)/)?.[1] ?? "").toLowerCase();
|
|
7343
|
+
if (customTagSet.has(tag)) {
|
|
7344
|
+
const raw$1 = String(t.content ?? "");
|
|
7345
|
+
const closeRe = new RegExp(`<\\/\\s*${tag}\\s*>`, "i");
|
|
7346
|
+
t.loading = closeRe.test(raw$1) ? false : t.loading !== void 0 ? t.loading : true;
|
|
7347
|
+
const closeMatch = closeRe.exec(raw$1);
|
|
7348
|
+
const endTagIndex = closeMatch ? closeMatch.index : -1;
|
|
7349
|
+
const closeLen = closeMatch ? closeMatch[0].length : 0;
|
|
7350
|
+
if (endTagIndex !== -1) {
|
|
7351
|
+
const rawForNode = raw$1.slice(0, endTagIndex + closeLen);
|
|
7352
|
+
t.content = rawForNode;
|
|
7353
|
+
t.raw = rawForNode;
|
|
7354
|
+
const afterTrimmed = (raw$1.slice(endTagIndex + closeLen) || "").replace(/^\s+/, "");
|
|
7355
|
+
if (afterTrimmed) toks.splice(i + 1, 0, afterTrimmed.startsWith("<") ? {
|
|
7356
|
+
type: "html_block",
|
|
7357
|
+
content: afterTrimmed
|
|
7358
|
+
} : {
|
|
7359
|
+
type: "text",
|
|
7360
|
+
content: afterTrimmed,
|
|
7361
|
+
raw: afterTrimmed
|
|
7362
|
+
});
|
|
7363
|
+
}
|
|
7364
|
+
continue;
|
|
7365
|
+
}
|
|
7163
7366
|
if (tag.startsWith("!") || tag.startsWith("?")) {
|
|
7164
7367
|
t.loading = false;
|
|
7165
7368
|
continue;
|
|
@@ -7177,7 +7380,7 @@ function applyFixHtmlInlineTokens(md, options = {}) {
|
|
|
7177
7380
|
"li"
|
|
7178
7381
|
].includes(tag)) continue;
|
|
7179
7382
|
t.type = "inline";
|
|
7180
|
-
const loading =
|
|
7383
|
+
const loading = new RegExp(`<\\/\\s*${tag}\\s*>`, "i").test(String(t.content ?? "")) ? false : t.loading !== void 0 ? t.loading : true;
|
|
7181
7384
|
const attrs = [];
|
|
7182
7385
|
const attrRegex = /\s([\w:-]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'>]+)))?/g;
|
|
7183
7386
|
let match;
|
|
@@ -7187,24 +7390,36 @@ function applyFixHtmlInlineTokens(md, options = {}) {
|
|
|
7187
7390
|
attrs.push([attrName, attrValue]);
|
|
7188
7391
|
}
|
|
7189
7392
|
if (customTagSet.has(tag)) {
|
|
7190
|
-
const
|
|
7191
|
-
const
|
|
7192
|
-
const
|
|
7193
|
-
const
|
|
7393
|
+
const raw$1 = String(t.content ?? "");
|
|
7394
|
+
const closeMatch = new RegExp(`<\\/\\s*${tag}\\s*>`, "i").exec(raw$1);
|
|
7395
|
+
const endTagIndex = closeMatch ? closeMatch.index : -1;
|
|
7396
|
+
const closeLen = closeMatch ? closeMatch[0].length : 0;
|
|
7397
|
+
const rawForNode = endTagIndex !== -1 ? raw$1.slice(0, endTagIndex + closeLen) : raw$1;
|
|
7398
|
+
let inner = "";
|
|
7399
|
+
const openEnd = findTagCloseIndexOutsideQuotes$1(raw$1);
|
|
7400
|
+
if (openEnd !== -1) {
|
|
7401
|
+
if (endTagIndex !== -1 && openEnd < endTagIndex) inner = raw$1.slice(openEnd + 1, endTagIndex);
|
|
7402
|
+
else if (endTagIndex === -1) inner = raw$1.slice(openEnd + 1).replace(/<.*$/, "");
|
|
7403
|
+
}
|
|
7194
7404
|
t.children = [{
|
|
7195
7405
|
type: tag,
|
|
7196
|
-
content:
|
|
7197
|
-
raw:
|
|
7406
|
+
content: inner,
|
|
7407
|
+
raw: rawForNode,
|
|
7198
7408
|
attrs,
|
|
7199
7409
|
tag,
|
|
7200
7410
|
loading
|
|
7201
7411
|
}];
|
|
7202
7412
|
if (endTagIndex !== -1) {
|
|
7203
|
-
|
|
7204
|
-
|
|
7413
|
+
t.content = rawForNode;
|
|
7414
|
+
t.raw = rawForNode;
|
|
7415
|
+
const afterTrimmed = (raw$1.slice(endTagIndex + closeLen) || "").replace(/^\s+/, "");
|
|
7416
|
+
if (afterTrimmed) toks.splice(i + 1, 0, afterTrimmed.startsWith("<") ? {
|
|
7417
|
+
type: "html_block",
|
|
7418
|
+
content: afterTrimmed
|
|
7419
|
+
} : {
|
|
7205
7420
|
type: "text",
|
|
7206
|
-
content:
|
|
7207
|
-
raw:
|
|
7421
|
+
content: afterTrimmed,
|
|
7422
|
+
raw: afterTrimmed
|
|
7208
7423
|
});
|
|
7209
7424
|
}
|
|
7210
7425
|
} else t.children = [{
|
|
@@ -7961,7 +8176,7 @@ function fixTableTokens(tokens) {
|
|
|
7961
8176
|
if (token.type === "inline") {
|
|
7962
8177
|
const tcontent = String(token.content ?? "");
|
|
7963
8178
|
const childContent = String(token.children?.[0]?.content ?? "");
|
|
7964
|
-
if (/^\|(?:[^|\n]+\|?)+/.test(tcontent)) {
|
|
8179
|
+
if (!tcontent.includes("\n") && /^\|(?:[^|\n]+\|?)+/.test(tcontent)) {
|
|
7965
8180
|
const body = childContent.slice(1).split("|").map((i$1) => i$1.trim()).filter(Boolean).flatMap((i$1) => createTh(i$1));
|
|
7966
8181
|
const insert = [
|
|
7967
8182
|
...createStart(),
|
|
@@ -8908,6 +9123,7 @@ function parseHtmlInlineCodeToken(token, tokens, i, parseInlineTokens$1, raw, pP
|
|
|
8908
9123
|
tag,
|
|
8909
9124
|
attrs,
|
|
8910
9125
|
content: fragment.innerTokens.length ? stringifyTokens(fragment.innerTokens) : "",
|
|
9126
|
+
children: fragment.innerTokens.length ? parseInlineTokens$1(fragment.innerTokens, raw, pPreToken, options) : [],
|
|
8911
9127
|
raw: content,
|
|
8912
9128
|
loading: token.loading || loading,
|
|
8913
9129
|
autoClosed
|
|
@@ -9255,7 +9471,7 @@ function parseInlineTokens(tokens, raw, pPreToken, options) {
|
|
|
9255
9471
|
i++;
|
|
9256
9472
|
return true;
|
|
9257
9473
|
}
|
|
9258
|
-
if (/\*\*/.test(content)
|
|
9474
|
+
if (/\*\*/.test(content)) {
|
|
9259
9475
|
const openIdx = content.indexOf("**");
|
|
9260
9476
|
const beforeText = openIdx > -1 ? content.slice(0, openIdx) : "";
|
|
9261
9477
|
if (beforeText) pushText(beforeText, beforeText);
|
|
@@ -10169,7 +10385,7 @@ function parseHtmlBlock(token) {
|
|
|
10169
10385
|
const isVoid = VOID_TAGS.has(tag);
|
|
10170
10386
|
let closeRe = CLOSE_TAG_RE_CACHE.get(tag);
|
|
10171
10387
|
if (!closeRe) {
|
|
10172
|
-
closeRe = new RegExp(
|
|
10388
|
+
closeRe = new RegExp(`<\\s*\\/\\s*${tag}\\s*>`, "i");
|
|
10173
10389
|
CLOSE_TAG_RE_CACHE.set(tag, closeRe);
|
|
10174
10390
|
}
|
|
10175
10391
|
const hasClosing = closeRe.test(raw);
|
|
@@ -10278,6 +10494,98 @@ function parseThematicBreak() {
|
|
|
10278
10494
|
|
|
10279
10495
|
//#endregion
|
|
10280
10496
|
//#region src/parser/node-parsers/block-token-parser.ts
|
|
10497
|
+
function findTagCloseIndexOutsideQuotes(input) {
|
|
10498
|
+
let inSingle = false;
|
|
10499
|
+
let inDouble = false;
|
|
10500
|
+
for (let i = 0; i < input.length; i++) {
|
|
10501
|
+
const ch = input[i];
|
|
10502
|
+
if (ch === "\\") {
|
|
10503
|
+
i++;
|
|
10504
|
+
continue;
|
|
10505
|
+
}
|
|
10506
|
+
if (!inDouble && ch === "'") {
|
|
10507
|
+
inSingle = !inSingle;
|
|
10508
|
+
continue;
|
|
10509
|
+
}
|
|
10510
|
+
if (!inSingle && ch === "\"") {
|
|
10511
|
+
inDouble = !inDouble;
|
|
10512
|
+
continue;
|
|
10513
|
+
}
|
|
10514
|
+
if (!inSingle && !inDouble && ch === ">") return i;
|
|
10515
|
+
}
|
|
10516
|
+
return -1;
|
|
10517
|
+
}
|
|
10518
|
+
function stripWrapperNewlines(s) {
|
|
10519
|
+
return s.replace(/^\r?\n/, "").replace(/\r?\n$/, "");
|
|
10520
|
+
}
|
|
10521
|
+
function stripTrailingPartialClosingTag(inner, tag) {
|
|
10522
|
+
if (!inner || !tag) return inner;
|
|
10523
|
+
const re = new RegExp(String.raw`[\t ]*<\s*\/\s*${tag}[^>]*$`, "i");
|
|
10524
|
+
return inner.replace(re, "");
|
|
10525
|
+
}
|
|
10526
|
+
function findNextCustomHtmlBlockFromSource(source, tag, startIndex) {
|
|
10527
|
+
if (!source || !tag) return null;
|
|
10528
|
+
const lowerTag = tag.toLowerCase();
|
|
10529
|
+
const openRe = new RegExp(String.raw`<\s*${lowerTag}(?=\s|>|/)`, "gi");
|
|
10530
|
+
openRe.lastIndex = Math.max(0, startIndex || 0);
|
|
10531
|
+
const openMatch = openRe.exec(source);
|
|
10532
|
+
if (!openMatch || openMatch.index == null) return null;
|
|
10533
|
+
const openStart = openMatch.index;
|
|
10534
|
+
const openSlice = source.slice(openStart);
|
|
10535
|
+
const openEndRel = findTagCloseIndexOutsideQuotes(openSlice);
|
|
10536
|
+
if (openEndRel === -1) return null;
|
|
10537
|
+
const openEnd = openStart + openEndRel;
|
|
10538
|
+
if (/\/\s*>\s*$/.test(openSlice.slice(0, openEndRel + 1))) {
|
|
10539
|
+
const end = openEnd + 1;
|
|
10540
|
+
return {
|
|
10541
|
+
raw: source.slice(openStart, end),
|
|
10542
|
+
end
|
|
10543
|
+
};
|
|
10544
|
+
}
|
|
10545
|
+
let depth = 1;
|
|
10546
|
+
let i = openEnd + 1;
|
|
10547
|
+
const isOpenAt = (pos) => {
|
|
10548
|
+
const s = source.slice(pos);
|
|
10549
|
+
return new RegExp(String.raw`^<\s*${lowerTag}(?=\s|>|/)`, "i").test(s);
|
|
10550
|
+
};
|
|
10551
|
+
const isCloseAt = (pos) => {
|
|
10552
|
+
const s = source.slice(pos);
|
|
10553
|
+
return new RegExp(String.raw`^<\s*\/\s*${lowerTag}(?=\s|>)`, "i").test(s);
|
|
10554
|
+
};
|
|
10555
|
+
while (i < source.length) {
|
|
10556
|
+
const lt = source.indexOf("<", i);
|
|
10557
|
+
if (lt === -1) return {
|
|
10558
|
+
raw: source.slice(openStart),
|
|
10559
|
+
end: source.length
|
|
10560
|
+
};
|
|
10561
|
+
if (isCloseAt(lt)) {
|
|
10562
|
+
const gt = source.indexOf(">", lt);
|
|
10563
|
+
if (gt === -1) return null;
|
|
10564
|
+
depth--;
|
|
10565
|
+
if (depth === 0) {
|
|
10566
|
+
const end = gt + 1;
|
|
10567
|
+
return {
|
|
10568
|
+
raw: source.slice(openStart, end),
|
|
10569
|
+
end
|
|
10570
|
+
};
|
|
10571
|
+
}
|
|
10572
|
+
i = gt + 1;
|
|
10573
|
+
continue;
|
|
10574
|
+
}
|
|
10575
|
+
if (isOpenAt(lt)) {
|
|
10576
|
+
const rel = findTagCloseIndexOutsideQuotes(source.slice(lt));
|
|
10577
|
+
if (rel === -1) return null;
|
|
10578
|
+
depth++;
|
|
10579
|
+
i = lt + rel + 1;
|
|
10580
|
+
continue;
|
|
10581
|
+
}
|
|
10582
|
+
i = lt + 1;
|
|
10583
|
+
}
|
|
10584
|
+
return {
|
|
10585
|
+
raw: source.slice(openStart),
|
|
10586
|
+
end: source.length
|
|
10587
|
+
};
|
|
10588
|
+
}
|
|
10281
10589
|
function parseBasicBlockToken(tokens, index, options) {
|
|
10282
10590
|
const token = tokens[index];
|
|
10283
10591
|
switch (token.type) {
|
|
@@ -10291,10 +10599,37 @@ function parseBasicBlockToken(tokens, index, options) {
|
|
|
10291
10599
|
if (new Set(options.customHtmlTags.map((t) => {
|
|
10292
10600
|
const m = String(t ?? "").trim().match(/^[<\s/]*([A-Z][\w-]*)/i);
|
|
10293
10601
|
return m ? m[1].toLowerCase() : "";
|
|
10294
|
-
}).filter(Boolean)).has(htmlBlockNode.tag))
|
|
10295
|
-
|
|
10296
|
-
|
|
10297
|
-
|
|
10602
|
+
}).filter(Boolean)).has(htmlBlockNode.tag)) {
|
|
10603
|
+
const tag = htmlBlockNode.tag;
|
|
10604
|
+
const fromSource = findNextCustomHtmlBlockFromSource(String(options?.__sourceMarkdown ?? ""), tag, Number(options?.__customHtmlBlockCursor ?? 0));
|
|
10605
|
+
if (fromSource) options.__customHtmlBlockCursor = fromSource.end;
|
|
10606
|
+
const rawHtml = String(fromSource?.raw ?? htmlBlockNode.content ?? "");
|
|
10607
|
+
const openEnd = findTagCloseIndexOutsideQuotes(rawHtml);
|
|
10608
|
+
const closeMatch = new RegExp(`<\\s*\\/\\s*${tag}\\s*>`, "i").exec(rawHtml);
|
|
10609
|
+
const closeIndex = closeMatch ? closeMatch.index : -1;
|
|
10610
|
+
let inner = "";
|
|
10611
|
+
if (openEnd !== -1) if (closeIndex !== -1 && openEnd < closeIndex) inner = rawHtml.slice(openEnd + 1, closeIndex);
|
|
10612
|
+
else inner = rawHtml.slice(openEnd + 1);
|
|
10613
|
+
if (closeIndex === -1) inner = stripTrailingPartialClosingTag(inner, tag);
|
|
10614
|
+
const attrs = [];
|
|
10615
|
+
const openTag = openEnd !== -1 ? rawHtml.slice(0, openEnd + 1) : rawHtml;
|
|
10616
|
+
const attrRegex = /\s([\w:-]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'>]+)))?/g;
|
|
10617
|
+
let m;
|
|
10618
|
+
while ((m = attrRegex.exec(openTag)) !== null) {
|
|
10619
|
+
const name = m[1];
|
|
10620
|
+
if (!name || name.toLowerCase() === tag) continue;
|
|
10621
|
+
const value = m[2] || m[3] || m[4] || "";
|
|
10622
|
+
attrs.push([name, value]);
|
|
10623
|
+
}
|
|
10624
|
+
return [{
|
|
10625
|
+
type: tag,
|
|
10626
|
+
tag,
|
|
10627
|
+
content: stripWrapperNewlines(inner),
|
|
10628
|
+
raw: String(fromSource?.raw ?? htmlBlockNode.raw ?? rawHtml),
|
|
10629
|
+
loading: htmlBlockNode.loading,
|
|
10630
|
+
attrs: attrs.length ? attrs : void 0
|
|
10631
|
+
}, index + 1];
|
|
10632
|
+
}
|
|
10298
10633
|
}
|
|
10299
10634
|
return [htmlBlockNode, index + 1];
|
|
10300
10635
|
}
|
|
@@ -10608,18 +10943,51 @@ function parseParagraph(tokens, index, options) {
|
|
|
10608
10943
|
|
|
10609
10944
|
//#endregion
|
|
10610
10945
|
//#region src/parser/index.ts
|
|
10946
|
+
function stripDanglingHtmlLikeTail(markdown) {
|
|
10947
|
+
const s = String(markdown ?? "");
|
|
10948
|
+
const lastLt = s.lastIndexOf("<");
|
|
10949
|
+
if (lastLt === -1) return s;
|
|
10950
|
+
const tail = s.slice(lastLt);
|
|
10951
|
+
if (tail.includes(">")) return s;
|
|
10952
|
+
if (!/^<\s*(?:\/\s*)?[A-Z!][\s\S]*$/i.test(tail)) return s;
|
|
10953
|
+
return s.slice(0, lastLt);
|
|
10954
|
+
}
|
|
10611
10955
|
function parseMarkdownToStructure(markdown, md, options = {}) {
|
|
10612
10956
|
let safeMarkdown = (markdown ?? "").toString().replace(/([^\\])\r(ight|ho)/g, "$1\\r$2").replace(/([^\\])\n(abla|eq|ot|exists)/g, "$1\\n$2");
|
|
10613
10957
|
if (safeMarkdown.endsWith("- *")) safeMarkdown = safeMarkdown.replace(/- \*$/, "- \\*");
|
|
10614
|
-
if (
|
|
10958
|
+
if (/(?:^|\n)\s*-\s*$/.test(safeMarkdown)) safeMarkdown = safeMarkdown.replace(/(?:^|\n)\s*-\s*$/, (m) => {
|
|
10959
|
+
return m.startsWith("\n") ? "\n" : "";
|
|
10960
|
+
});
|
|
10961
|
+
else if (/(?:^|\n)\s*--\s*$/.test(safeMarkdown)) safeMarkdown = safeMarkdown.replace(/(?:^|\n)\s*--\s*$/, (m) => {
|
|
10962
|
+
return m.startsWith("\n") ? "\n" : "";
|
|
10963
|
+
});
|
|
10964
|
+
else if (/(?:^|\n)\s*>\s*$/.test(safeMarkdown)) safeMarkdown = safeMarkdown.replace(/(?:^|\n)\s*>\s*$/, (m) => {
|
|
10965
|
+
return m.startsWith("\n") ? "\n" : "";
|
|
10966
|
+
});
|
|
10967
|
+
else if (/\n\s*[*+]\s*$/.test(safeMarkdown)) safeMarkdown = safeMarkdown.replace(/\n\s*[*+]\s*$/, "\n");
|
|
10615
10968
|
else if (/\n[[(]\n*$/.test(safeMarkdown)) safeMarkdown = safeMarkdown.replace(/(\n\[|\n\()+\n*$/g, "\n");
|
|
10969
|
+
if (options.customHtmlTags?.length) {
|
|
10970
|
+
const tags = options.customHtmlTags.map((t) => String(t ?? "").trim()).filter(Boolean).map((t) => {
|
|
10971
|
+
return (t.match(/^[<\s/]*([A-Z][\w-]*)/i)?.[1] ?? "").toLowerCase();
|
|
10972
|
+
}).filter(Boolean);
|
|
10973
|
+
if (tags.length) if (!safeMarkdown.includes("</")) {} else for (const tag of tags) {
|
|
10974
|
+
const re = new RegExp(String.raw`(^[\t ]*<\s*\/\s*${tag}\s*>[\t ]*)(\r?\n)(?![\t ]*\r?\n|$)`, "gim");
|
|
10975
|
+
safeMarkdown = safeMarkdown.replace(re, "$1$2$2");
|
|
10976
|
+
}
|
|
10977
|
+
}
|
|
10978
|
+
safeMarkdown = stripDanglingHtmlLikeTail(safeMarkdown);
|
|
10616
10979
|
const tokens = md.parse(safeMarkdown, {});
|
|
10617
10980
|
if (!tokens || !Array.isArray(tokens)) return [];
|
|
10618
10981
|
const pre = options.preTransformTokens;
|
|
10619
10982
|
const post = options.postTransformTokens;
|
|
10620
10983
|
let transformedTokens = tokens;
|
|
10621
10984
|
if (pre && typeof pre === "function") transformedTokens = pre(transformedTokens) || transformedTokens;
|
|
10622
|
-
|
|
10985
|
+
const internalOptions = {
|
|
10986
|
+
...options,
|
|
10987
|
+
__sourceMarkdown: safeMarkdown,
|
|
10988
|
+
__customHtmlBlockCursor: 0
|
|
10989
|
+
};
|
|
10990
|
+
let result = processTokens(transformedTokens, internalOptions);
|
|
10623
10991
|
if (post && typeof post === "function") {
|
|
10624
10992
|
const postResult = post(transformedTokens);
|
|
10625
10993
|
if (Array.isArray(postResult)) {
|
|
@@ -10677,6 +11045,20 @@ function processTokens(tokens, options) {
|
|
|
10677
11045
|
result.push(parseHardBreak());
|
|
10678
11046
|
i++;
|
|
10679
11047
|
break;
|
|
11048
|
+
case "text": {
|
|
11049
|
+
const content = String(token.content ?? "");
|
|
11050
|
+
result.push({
|
|
11051
|
+
type: "paragraph",
|
|
11052
|
+
raw: content,
|
|
11053
|
+
children: content ? [{
|
|
11054
|
+
type: "text",
|
|
11055
|
+
content,
|
|
11056
|
+
raw: content
|
|
11057
|
+
}] : []
|
|
11058
|
+
});
|
|
11059
|
+
i++;
|
|
11060
|
+
break;
|
|
11061
|
+
}
|
|
10680
11062
|
case "inline":
|
|
10681
11063
|
result.push(...parseInlineTokens(token.children || [], String(token.content ?? ""), void 0, {
|
|
10682
11064
|
requireClosingStrong: options?.requireClosingStrong,
|