stream-markdown-parser 0.0.58-beta.9 → 0.0.58
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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +205 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
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":";;;UAaiB,cAAA,SAAuB;sBAClB;;EADL,gBAAA,CAAe,EAAA,OAAA;;;;ECXf,CAAA;EAaL;AAEZ;AAMA
|
|
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
|
@@ -10794,6 +10794,8 @@ function parseFootnote(tokens, index, options) {
|
|
|
10794
10794
|
//#region src/parser/node-parsers/heading-parser.ts
|
|
10795
10795
|
function parseHeading(tokens, index, options) {
|
|
10796
10796
|
const token = tokens[index];
|
|
10797
|
+
const attrs = token?.attrs;
|
|
10798
|
+
const attrsRecord = Array.isArray(attrs) && attrs.length ? Object.fromEntries(attrs.filter((pair) => Array.isArray(pair) && pair.length >= 1 && pair[0]).map(([name, value]) => [String(name), value == null || value === "" ? true : String(value)])) : void 0;
|
|
10797
10799
|
const levelStr = String(token.tag?.substring(1) ?? "1");
|
|
10798
10800
|
const headingLevel = Number.parseInt(levelStr, 10);
|
|
10799
10801
|
const headingContentToken = tokens[index + 1];
|
|
@@ -10802,6 +10804,7 @@ function parseHeading(tokens, index, options) {
|
|
|
10802
10804
|
type: "heading",
|
|
10803
10805
|
level: headingLevel,
|
|
10804
10806
|
text: headingContent,
|
|
10807
|
+
...attrsRecord ? { attrs: attrsRecord } : {},
|
|
10805
10808
|
children: parseInlineTokens(headingContentToken.children || [], headingContent, void 0, {
|
|
10806
10809
|
requireClosingStrong: options?.requireClosingStrong,
|
|
10807
10810
|
customHtmlTags: options?.customHtmlTags
|
|
@@ -11481,6 +11484,207 @@ function normalizeCustomHtmlOpeningTagSameLine(markdown, tags) {
|
|
|
11481
11484
|
}
|
|
11482
11485
|
return out;
|
|
11483
11486
|
}
|
|
11487
|
+
function ensureBlankLineBeforeCustomHtmlBlocks(markdown, tags) {
|
|
11488
|
+
if (!markdown || !tags.length) return markdown;
|
|
11489
|
+
const tagSet = new Set(tags.map((t) => String(t ?? "").toLowerCase()));
|
|
11490
|
+
if (!tagSet.size) return markdown;
|
|
11491
|
+
const isIndentWs = (ch) => ch === " " || ch === " ";
|
|
11492
|
+
const isIndentedCodeLine = (line) => {
|
|
11493
|
+
if (!line) return false;
|
|
11494
|
+
if (line[0] === " ") return true;
|
|
11495
|
+
let spaces = 0;
|
|
11496
|
+
for (let i = 0; i < line.length; i++) {
|
|
11497
|
+
const ch = line[i];
|
|
11498
|
+
if (ch === " ") {
|
|
11499
|
+
spaces++;
|
|
11500
|
+
if (spaces >= 4) return true;
|
|
11501
|
+
continue;
|
|
11502
|
+
}
|
|
11503
|
+
if (ch === " ") return true;
|
|
11504
|
+
break;
|
|
11505
|
+
}
|
|
11506
|
+
return false;
|
|
11507
|
+
};
|
|
11508
|
+
const isNameChar = (ch) => {
|
|
11509
|
+
const c = ch.charCodeAt(0);
|
|
11510
|
+
return c >= 65 && c <= 90 || c >= 97 && c <= 122 || c >= 48 && c <= 57 || ch === "_" || ch === "-" || ch === ":";
|
|
11511
|
+
};
|
|
11512
|
+
const trimStartIndentWs = (s) => {
|
|
11513
|
+
let i = 0;
|
|
11514
|
+
while (i < s.length && isIndentWs(s[i])) i++;
|
|
11515
|
+
return s.slice(i);
|
|
11516
|
+
};
|
|
11517
|
+
const parseBlockquotePrefix = (rawLine) => {
|
|
11518
|
+
let i = 0;
|
|
11519
|
+
let saw = false;
|
|
11520
|
+
let prefixEnd = 0;
|
|
11521
|
+
while (i < rawLine.length) {
|
|
11522
|
+
while (i < rawLine.length && isIndentWs(rawLine[i])) i++;
|
|
11523
|
+
if (i >= rawLine.length || rawLine[i] !== ">") break;
|
|
11524
|
+
saw = true;
|
|
11525
|
+
i++;
|
|
11526
|
+
while (i < rawLine.length && isIndentWs(rawLine[i])) i++;
|
|
11527
|
+
prefixEnd = i;
|
|
11528
|
+
}
|
|
11529
|
+
if (!saw) return null;
|
|
11530
|
+
const prefix = rawLine.slice(0, prefixEnd);
|
|
11531
|
+
return {
|
|
11532
|
+
prefix,
|
|
11533
|
+
key: prefix.replace(/[ \t]+$/, ""),
|
|
11534
|
+
content: rawLine.slice(prefixEnd)
|
|
11535
|
+
};
|
|
11536
|
+
};
|
|
11537
|
+
const previousLineLooksHtmlish = (line) => {
|
|
11538
|
+
return trimStartIndentWs(line).startsWith("<");
|
|
11539
|
+
};
|
|
11540
|
+
const lineIsBlank = (line) => {
|
|
11541
|
+
for (let i = 0; i < line.length; i++) {
|
|
11542
|
+
const ch = line[i];
|
|
11543
|
+
if (ch !== " " && ch !== " ") return false;
|
|
11544
|
+
}
|
|
11545
|
+
return true;
|
|
11546
|
+
};
|
|
11547
|
+
const parseOpeningCustomTagName = (line) => {
|
|
11548
|
+
if (isIndentedCodeLine(line)) return "";
|
|
11549
|
+
const trimmed = trimStartIndentWs(line);
|
|
11550
|
+
if (!trimmed.startsWith("<")) return "";
|
|
11551
|
+
let i = 1;
|
|
11552
|
+
while (i < trimmed.length && isIndentWs(trimmed[i])) i++;
|
|
11553
|
+
if (i >= trimmed.length) return "";
|
|
11554
|
+
if (trimmed[i] === "/" || trimmed[i] === "!" || trimmed[i] === "?") return "";
|
|
11555
|
+
const nameStart = i;
|
|
11556
|
+
while (i < trimmed.length && isNameChar(trimmed[i])) i++;
|
|
11557
|
+
if (i === nameStart) return "";
|
|
11558
|
+
const name = trimmed.slice(nameStart, i).toLowerCase();
|
|
11559
|
+
if (!tagSet.has(name)) return "";
|
|
11560
|
+
const next = trimmed[i];
|
|
11561
|
+
if (next && next !== " " && next !== " " && next !== ">" && next !== "/") return "";
|
|
11562
|
+
return name;
|
|
11563
|
+
};
|
|
11564
|
+
const parseLineStartCustomTag = (line) => {
|
|
11565
|
+
if (isIndentedCodeLine(line)) return null;
|
|
11566
|
+
const trimmed = trimStartIndentWs(line);
|
|
11567
|
+
if (!trimmed.startsWith("<")) return null;
|
|
11568
|
+
let i = 1;
|
|
11569
|
+
while (i < trimmed.length && isIndentWs(trimmed[i])) i++;
|
|
11570
|
+
if (i >= trimmed.length) return null;
|
|
11571
|
+
const isClose = trimmed[i] === "/";
|
|
11572
|
+
if (isClose) {
|
|
11573
|
+
i++;
|
|
11574
|
+
while (i < trimmed.length && isIndentWs(trimmed[i])) i++;
|
|
11575
|
+
}
|
|
11576
|
+
const next = trimmed[i];
|
|
11577
|
+
if (!next || next === "!" || next === "?") return null;
|
|
11578
|
+
const nameStart = i;
|
|
11579
|
+
while (i < trimmed.length && isNameChar(trimmed[i])) i++;
|
|
11580
|
+
if (i === nameStart) return null;
|
|
11581
|
+
const name = trimmed.slice(nameStart, i).toLowerCase();
|
|
11582
|
+
if (!tagSet.has(name)) return null;
|
|
11583
|
+
const boundary = trimmed[i];
|
|
11584
|
+
if (boundary && boundary !== " " && boundary !== " " && boundary !== ">" && boundary !== "/") return null;
|
|
11585
|
+
if (isClose) return {
|
|
11586
|
+
type: "close",
|
|
11587
|
+
name
|
|
11588
|
+
};
|
|
11589
|
+
if (/\/\s*>\s*$/.test(trimmed)) return {
|
|
11590
|
+
type: "open",
|
|
11591
|
+
name,
|
|
11592
|
+
complete: true
|
|
11593
|
+
};
|
|
11594
|
+
const gt = trimmed.indexOf(">", i);
|
|
11595
|
+
if (gt !== -1) {
|
|
11596
|
+
const after = trimmed.slice(gt + 1);
|
|
11597
|
+
if (new RegExp(`<\\s*\\/\\s*${name}\\s*>`, "i").test(after)) return {
|
|
11598
|
+
type: "open",
|
|
11599
|
+
name,
|
|
11600
|
+
complete: true
|
|
11601
|
+
};
|
|
11602
|
+
}
|
|
11603
|
+
return {
|
|
11604
|
+
type: "open",
|
|
11605
|
+
name,
|
|
11606
|
+
complete: false
|
|
11607
|
+
};
|
|
11608
|
+
};
|
|
11609
|
+
let inFence = false;
|
|
11610
|
+
let fenceChar = "";
|
|
11611
|
+
let fenceLen = 0;
|
|
11612
|
+
const parseFenceMarker = (line) => {
|
|
11613
|
+
let i = 0;
|
|
11614
|
+
while (i < line.length && isIndentWs(line[i])) i++;
|
|
11615
|
+
const ch = line[i];
|
|
11616
|
+
if (ch !== "`" && ch !== "~") return null;
|
|
11617
|
+
let j = i;
|
|
11618
|
+
while (j < line.length && line[j] === ch) j++;
|
|
11619
|
+
const len = j - i;
|
|
11620
|
+
if (len < 3) return null;
|
|
11621
|
+
return {
|
|
11622
|
+
markerChar: ch,
|
|
11623
|
+
markerLen: len,
|
|
11624
|
+
rest: line.slice(j)
|
|
11625
|
+
};
|
|
11626
|
+
};
|
|
11627
|
+
const fenceMatchLine = (rawLine) => parseFenceMarker(rawLine);
|
|
11628
|
+
let out = "";
|
|
11629
|
+
let idx = 0;
|
|
11630
|
+
let prevLineBlank = true;
|
|
11631
|
+
let prevLineHtmlish = false;
|
|
11632
|
+
let lastNewline = "\n";
|
|
11633
|
+
const customBlockStack = [];
|
|
11634
|
+
let prevQuoteKey = "";
|
|
11635
|
+
while (idx < markdown.length) {
|
|
11636
|
+
const nl = markdown.indexOf("\n", idx);
|
|
11637
|
+
const hasNl = nl !== -1;
|
|
11638
|
+
const isCrlf = hasNl && nl > idx && markdown[nl - 1] === "\r";
|
|
11639
|
+
const lineEnd = hasNl ? isCrlf ? nl - 1 : nl : markdown.length;
|
|
11640
|
+
const line = markdown.slice(idx, lineEnd);
|
|
11641
|
+
const newline$1 = hasNl ? isCrlf ? "\r\n" : "\n" : "";
|
|
11642
|
+
const blockquote$1 = parseBlockquotePrefix(line);
|
|
11643
|
+
const quoteKey = blockquote$1?.key ?? "";
|
|
11644
|
+
const contentLine = blockquote$1?.content ?? line;
|
|
11645
|
+
const fenceMatch = fenceMatchLine(contentLine);
|
|
11646
|
+
if (fenceMatch) if (inFence) {
|
|
11647
|
+
if (fenceMatch.markerChar === fenceChar && fenceMatch.markerLen >= fenceLen) {
|
|
11648
|
+
if (/^\s*$/.test(fenceMatch.rest)) {
|
|
11649
|
+
inFence = false;
|
|
11650
|
+
fenceChar = "";
|
|
11651
|
+
fenceLen = 0;
|
|
11652
|
+
}
|
|
11653
|
+
}
|
|
11654
|
+
} else {
|
|
11655
|
+
inFence = true;
|
|
11656
|
+
fenceChar = fenceMatch.markerChar;
|
|
11657
|
+
fenceLen = fenceMatch.markerLen;
|
|
11658
|
+
}
|
|
11659
|
+
const insideCustomBlock = customBlockStack.length > 0;
|
|
11660
|
+
if (!inFence && !insideCustomBlock) {
|
|
11661
|
+
if (parseOpeningCustomTagName(contentLine) && !prevLineBlank && !prevLineHtmlish) {
|
|
11662
|
+
if (quoteKey && prevQuoteKey && quoteKey === prevQuoteKey) out += `${quoteKey}${lastNewline}`;
|
|
11663
|
+
else if (!quoteKey) out += lastNewline;
|
|
11664
|
+
}
|
|
11665
|
+
}
|
|
11666
|
+
out += line;
|
|
11667
|
+
out += newline$1;
|
|
11668
|
+
if (newline$1) lastNewline = newline$1;
|
|
11669
|
+
if (!inFence) {
|
|
11670
|
+
const tag = parseLineStartCustomTag(contentLine);
|
|
11671
|
+
if (tag) {
|
|
11672
|
+
if (tag.type === "open") {
|
|
11673
|
+
if (!tag.complete) customBlockStack.push(tag.name);
|
|
11674
|
+
} else for (let j = customBlockStack.length - 1; j >= 0; j--) if (customBlockStack[j] === tag.name) {
|
|
11675
|
+
customBlockStack.length = j;
|
|
11676
|
+
break;
|
|
11677
|
+
}
|
|
11678
|
+
}
|
|
11679
|
+
}
|
|
11680
|
+
const blank = lineIsBlank(contentLine);
|
|
11681
|
+
prevLineBlank = blank;
|
|
11682
|
+
prevLineHtmlish = !blank && previousLineLooksHtmlish(contentLine);
|
|
11683
|
+
prevQuoteKey = quoteKey;
|
|
11684
|
+
idx = hasNl ? nl + 1 : markdown.length;
|
|
11685
|
+
}
|
|
11686
|
+
return out;
|
|
11687
|
+
}
|
|
11484
11688
|
function parseMarkdownToStructure(markdown, md, options = {}) {
|
|
11485
11689
|
const isFinal = !!options.final;
|
|
11486
11690
|
let safeMarkdown = (markdown ?? "").toString().replace(/([^\\])\r(ight|ho)/g, "$1\\r$2").replace(/([^\\])\n(abla|eq|ot|exists)/g, "$1\\n$2");
|
|
@@ -11504,6 +11708,7 @@ function parseMarkdownToStructure(markdown, md, options = {}) {
|
|
|
11504
11708
|
}).filter(Boolean);
|
|
11505
11709
|
if (tags.length) {
|
|
11506
11710
|
safeMarkdown = normalizeCustomHtmlOpeningTagSameLine(safeMarkdown, tags);
|
|
11711
|
+
safeMarkdown = ensureBlankLineBeforeCustomHtmlBlocks(safeMarkdown, tags);
|
|
11507
11712
|
if (!safeMarkdown.includes("</")) {} else for (const tag of tags) {
|
|
11508
11713
|
const re = new RegExp(String.raw`(^[\t ]*<\s*\/\s*${tag}\s*>[\t ]*)(\r?\n)(?![\t ]*\r?\n|$)`, "gim");
|
|
11509
11714
|
safeMarkdown = safeMarkdown.replace(re, "$1$2$2");
|