@ai-react-markdown/engine 2.8.1 → 2.9.0
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.cjs +65 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.dev.cjs +70 -17
- package/dist/index.dev.cjs.map +1 -1
- package/dist/index.dev.js +70 -17
- package/dist/index.dev.js.map +1 -1
- package/dist/index.js +65 -18
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.dev.js
CHANGED
|
@@ -289,9 +289,9 @@ function inlineResourceEnd(text, openIdx) {
|
|
|
289
289
|
}
|
|
290
290
|
return -1;
|
|
291
291
|
}
|
|
292
|
-
function collectRefLine(cp, lnStart, lnEnd, scanText, inRawText, isBlockStart) {
|
|
293
|
-
const defShaped = inRawText ? null : DEF_RE.exec(
|
|
294
|
-
const def = defShaped !== null && (defShaped[1].startsWith("^") || isPlausibleLinkDefRest(
|
|
292
|
+
function collectRefLine(cp, lnStart, lnEnd, scanText, rawText, inRawText, isBlockStart) {
|
|
293
|
+
const defShaped = inRawText ? null : DEF_RE.exec(rawText);
|
|
294
|
+
const def = defShaped !== null && (defShaped[1].startsWith("^") || isPlausibleLinkDefRest(rawText.slice(defShaped.index + defShaped[0].length))) ? defShaped : null;
|
|
295
295
|
const defLineStart = isBlockStart || !cp.prevLineWasText || cp.prevLineWasValidDef;
|
|
296
296
|
const validDef = def !== null && defLineStart;
|
|
297
297
|
if (validDef) {
|
|
@@ -509,12 +509,15 @@ var rawTextElement = (t) => t.kind === "rawText" ? t.element : t.kind === "scrip
|
|
|
509
509
|
var VOID_TAGS = /* @__PURE__ */ new Set([
|
|
510
510
|
"area",
|
|
511
511
|
"base",
|
|
512
|
+
"basefont",
|
|
513
|
+
"bgsound",
|
|
512
514
|
"br",
|
|
513
515
|
"col",
|
|
514
516
|
"embed",
|
|
515
517
|
"hr",
|
|
516
518
|
"img",
|
|
517
519
|
"input",
|
|
520
|
+
"keygen",
|
|
518
521
|
"link",
|
|
519
522
|
"meta",
|
|
520
523
|
"param",
|
|
@@ -766,6 +769,24 @@ function floatingResidue(text, commentOpenAtStart) {
|
|
|
766
769
|
if (!open) out += text.slice(last);
|
|
767
770
|
return out;
|
|
768
771
|
}
|
|
772
|
+
var RAW_CONSTRUCT_START_RE = /^<(?:!--|\?|![A-Za-z]|!\[CDATA\[)/;
|
|
773
|
+
var sealResumableAbove = (cp) => cp.defBlockMaybeOpen || cp.fnDefResumable || cp.containerMaybeOpen;
|
|
774
|
+
function sealReleaseDerived(cp, ln, isBlockStart) {
|
|
775
|
+
if (sealResumableAbove(cp) && !(isBlockStart && ln.indent <= 3)) return false;
|
|
776
|
+
if (cp.prevLineOpenContent) return false;
|
|
777
|
+
if (cp.tableMaybeOpen) return false;
|
|
778
|
+
const head = mdTrimStart(ln.text);
|
|
779
|
+
if (RAW_CONSTRUCT_START_RE.test(head) || TYPE1_START_RE.test(head) || isType7Line(head)) return false;
|
|
780
|
+
const t6 = TYPE6_START_RE.exec(head);
|
|
781
|
+
if (t6 !== null && TYPE6_NAMES.has(t6[1].toLowerCase())) return false;
|
|
782
|
+
if (DEF_RE.test(ln.text) || FOOTNOTE_DEF_RE.test(ln.text)) return false;
|
|
783
|
+
return true;
|
|
784
|
+
}
|
|
785
|
+
function sealReleaseEnumerated(cp, ln, isBlockStart) {
|
|
786
|
+
const defShapedLine = DEF_RE.test(ln.text) || FOOTNOTE_DEF_RE.test(ln.text) || cp.defBlockMaybeOpen || cp.fnDefResumable && !(isBlockStart && ln.indent <= 3);
|
|
787
|
+
const commentOnly = ln.text.replace(/<!--[\s\S]*?-->/g, " ").replace(/<!--[\s\S]*$/, " ").replace(/[ \t\r]/g, "") === "";
|
|
788
|
+
return !defShapedLine && !commentOnly && !CLOSE_TAG_ONLY_RE.test(ln.text);
|
|
789
|
+
}
|
|
769
790
|
function processConfirmedLine(cp, ln, text) {
|
|
770
791
|
const newest = cp.candidates[cp.candidates.length - 1];
|
|
771
792
|
if (newest && newest.defListSettled === null) {
|
|
@@ -773,16 +794,19 @@ function processConfirmedLine(cp, ln, text) {
|
|
|
773
794
|
}
|
|
774
795
|
const isBlockStart = cp.prevLineBlank;
|
|
775
796
|
if (cp.p5SealPending && !ln.blank && cp.mdBlock.kind !== "html" && !(cp.p5Tok.kind === "comment" || cp.p5Tok.kind === "bogus")) {
|
|
776
|
-
|
|
777
|
-
const commentOnly = ln.text.replace(/<!--[\s\S]*?-->/g, " ").replace(/<!--[\s\S]*$/, " ").replace(/[ \t\r]/g, "") === "";
|
|
778
|
-
const closeTagOnly = CLOSE_TAG_ONLY_RE.test(ln.text);
|
|
779
|
-
if (!defShapedLine && !commentOnly && !closeTagOnly) {
|
|
797
|
+
if (sealReleaseDerived(cp, ln, isBlockStart)) {
|
|
780
798
|
cp.p5SealPending = false;
|
|
799
|
+
if (!sealReleaseEnumerated(cp, ln, isBlockStart)) {
|
|
800
|
+
console.error(
|
|
801
|
+
`[ai-react-markdown] seal-release containment broken at offset ${ln.start}: the derived predicate released a line the retired enumeration withheld (${JSON.stringify(ln.text.slice(0, 80))}).`
|
|
802
|
+
);
|
|
803
|
+
}
|
|
781
804
|
}
|
|
782
805
|
}
|
|
783
806
|
const possiblyInsideForeign = () => FOREIGN_ROOT_NAMES.some((name) => (cp.tagBalance.get(name) ?? 0) > 0);
|
|
784
807
|
const honoursSelfClosing = (tag) => tag === "svg" || tag === "math";
|
|
785
808
|
const foreignRawTextSwitchUnknowable = () => possiblyInsideForeign();
|
|
809
|
+
let discardedEndTag = false;
|
|
786
810
|
const applyTag = (tag, closing) => {
|
|
787
811
|
if (inRawTextTok(cp.p5Tok)) {
|
|
788
812
|
if (cp.p5Tok.kind === "script" && cp.p5Tok.escaped && !closing && tag === "script") {
|
|
@@ -815,7 +839,10 @@ function processConfirmedLine(cp, ln, text) {
|
|
|
815
839
|
}
|
|
816
840
|
if (SCOPE_BARRIER_NAMES.has(cp.openStack[i])) break;
|
|
817
841
|
}
|
|
818
|
-
if (idx === -1)
|
|
842
|
+
if (idx === -1) {
|
|
843
|
+
discardedEndTag = true;
|
|
844
|
+
return;
|
|
845
|
+
}
|
|
819
846
|
cp.openStack.splice(idx, 1);
|
|
820
847
|
const count = cp.tagBalance.get(tag) ?? 0;
|
|
821
848
|
if (count > 0) {
|
|
@@ -934,6 +961,9 @@ function processConfirmedLine(cp, ln, text) {
|
|
|
934
961
|
cp.p5Tok = { kind: "data" };
|
|
935
962
|
}
|
|
936
963
|
}
|
|
964
|
+
if (cp.p5Tok.kind === "comment" && !mdHtml(cp.mdBlock, 2)) {
|
|
965
|
+
cp.phasePoisonedAt = Math.min(cp.phasePoisonedAt, ln.start);
|
|
966
|
+
}
|
|
937
967
|
if (cp.mdBlock.kind === "html" && cp.mdBlock.type >= 6) cp.mdBlock = { kind: "none" };
|
|
938
968
|
cp.blankRun += 1;
|
|
939
969
|
cp.lastBlankStart = ln.start;
|
|
@@ -977,7 +1007,7 @@ function processConfirmedLine(cp, ln, text) {
|
|
|
977
1007
|
if (tagStart) {
|
|
978
1008
|
const noRealBlockOpen = cp.mdBlock.kind !== "html";
|
|
979
1009
|
const t1 = noRealBlockOpen ? TYPE1_START_RE.exec(mdTrimStart(ln.text)) : null;
|
|
980
|
-
if (t1) cp.mdBlock = { kind: "html", type: 1, raw: RAW_TEXT_ELEMENTS.has(t1[1].toLowerCase()) };
|
|
1010
|
+
if (t1) cp.mdBlock = { kind: "html", type: 1, raw: RAW_TEXT_ELEMENTS.has(t1[1].toLowerCase()), indent: ln.indent };
|
|
981
1011
|
if (cp.mdBlock.kind !== "html") {
|
|
982
1012
|
const t = mdTrimStart(ln.text);
|
|
983
1013
|
const t6 = TYPE6_START_RE.exec(t);
|
|
@@ -992,7 +1022,7 @@ function processConfirmedLine(cp, ln, text) {
|
|
|
992
1022
|
// raw-text names (`</style>` alone is type 7, measured) and
|
|
993
1023
|
// quoted-`>` attribute values.
|
|
994
1024
|
!cp.prevLineOpenContent && type7Shaped) {
|
|
995
|
-
if (cp.mdBlock.kind === "none") cp.mdBlock = { kind: "html", type: realT6 ? 6 : 7 };
|
|
1025
|
+
if (cp.mdBlock.kind === "none") cp.mdBlock = { kind: "html", type: realT6 ? 6 : 7, indent: ln.indent };
|
|
996
1026
|
} else if (cp.prevLineOpenContent && cp.tableMaybeOpen && type7Shaped) {
|
|
997
1027
|
cp.phasePoisonedAt = Math.min(cp.phasePoisonedAt, ln.start);
|
|
998
1028
|
}
|
|
@@ -1001,14 +1031,14 @@ function processConfirmedLine(cp, ln, text) {
|
|
|
1001
1031
|
}
|
|
1002
1032
|
}
|
|
1003
1033
|
}
|
|
1004
|
-
const rawFlowStart = ln.indent <= 3 &&
|
|
1034
|
+
const rawFlowStart = ln.indent <= 3 && RAW_CONSTRUCT_START_RE.test(mdTrimStart(ln.text));
|
|
1005
1035
|
const htmlOwnedLine = cp.mdBlock.kind === "html" || rawOpenAtLineStart || rawFlowStart;
|
|
1006
1036
|
const maskingSuppressed = htmlOwnedLine || inRawTextTok(cp.p5Tok);
|
|
1007
1037
|
const { masked, unpaired } = maskingSuppressed ? { masked: null, unpaired: false } : maskIntraLineCodeSpans(ln.text, cp.paragraphHasUnpairedRun);
|
|
1008
1038
|
if (unpaired) cp.paragraphHasUnpairedRun = true;
|
|
1009
1039
|
const scanText = masked ?? ln.text;
|
|
1010
1040
|
const defRawToMicromark = cp.mdBlock.kind === "html" || rawOpenAtLineStart || inRawTextTok(cp.p5Tok);
|
|
1011
|
-
const { validLinkDef } = collectRefLine(cp, ln.start, ln.end, scanText, defRawToMicromark, isBlockStart);
|
|
1041
|
+
const { validLinkDef } = collectRefLine(cp, ln.start, ln.end, scanText, ln.text, defRawToMicromark, isBlockStart);
|
|
1012
1042
|
const rawSpans = [];
|
|
1013
1043
|
let pos = 0;
|
|
1014
1044
|
const poisonRawDivergence = () => {
|
|
@@ -1084,7 +1114,7 @@ function processConfirmedLine(cp, ln, text) {
|
|
|
1084
1114
|
pos = bogus + 2;
|
|
1085
1115
|
} else if (first === cd) {
|
|
1086
1116
|
rawSpans.push([cd, cd + 9]);
|
|
1087
|
-
if (cp.mdBlock.kind === "none") cp.mdBlock = { kind: "html", type: 5 };
|
|
1117
|
+
if (cp.mdBlock.kind === "none") cp.mdBlock = { kind: "html", type: 5, indent: ln.indent };
|
|
1088
1118
|
if (cp.p5Tok.kind === "data") cp.p5Tok = { kind: "bogus" };
|
|
1089
1119
|
if (!isMdBlank(scanText.slice(0, cd)) || ln.indent > 3) inlineRawOpenerIdx = cd;
|
|
1090
1120
|
pos = cd + 9;
|
|
@@ -1096,14 +1126,14 @@ function processConfirmedLine(cp, ln, text) {
|
|
|
1096
1126
|
continue;
|
|
1097
1127
|
}
|
|
1098
1128
|
rawSpans.push([pi, pi + 2]);
|
|
1099
|
-
if (cp.mdBlock.kind === "none") cp.mdBlock = { kind: "html", type: 3 };
|
|
1129
|
+
if (cp.mdBlock.kind === "none") cp.mdBlock = { kind: "html", type: 3, indent: ln.indent };
|
|
1100
1130
|
if (cp.p5Tok.kind === "data") cp.p5Tok = { kind: "bogus" };
|
|
1101
1131
|
if (!isMdBlank(scanText.slice(0, pi)) || ln.indent > 3) inlineRawOpenerIdx = pi;
|
|
1102
1132
|
pos = pi + 2;
|
|
1103
1133
|
} else {
|
|
1104
1134
|
rawSpans.push([decl, decl + 2]);
|
|
1105
1135
|
if (ln.indent <= 3 && /^doctype/i.test(scanText.slice(decl + 2))) cp.phasePoisonedAt = 0;
|
|
1106
|
-
if (cp.mdBlock.kind === "none") cp.mdBlock = { kind: "html", type: 4 };
|
|
1136
|
+
if (cp.mdBlock.kind === "none") cp.mdBlock = { kind: "html", type: 4, indent: ln.indent };
|
|
1107
1137
|
if (cp.p5Tok.kind === "data") cp.p5Tok = { kind: "bogus" };
|
|
1108
1138
|
if (!isMdBlank(scanText.slice(0, decl)) || ln.indent > 3) inlineRawOpenerIdx = decl;
|
|
1109
1139
|
pos = decl + 2;
|
|
@@ -1162,7 +1192,7 @@ function processConfirmedLine(cp, ln, text) {
|
|
|
1162
1192
|
if (next.startsWith(">") || next === "->") {
|
|
1163
1193
|
continue;
|
|
1164
1194
|
}
|
|
1165
|
-
if (cp.mdBlock.kind === "none") cp.mdBlock = { kind: "html", type: 2 };
|
|
1195
|
+
if (cp.mdBlock.kind === "none") cp.mdBlock = { kind: "html", type: 2, indent: ln.indent };
|
|
1166
1196
|
if (cp.p5Tok.kind === "data") cp.p5Tok = { kind: "comment" };
|
|
1167
1197
|
lastCommentOpenerIdx = m.index;
|
|
1168
1198
|
continue;
|
|
@@ -1283,7 +1313,7 @@ function processConfirmedLine(cp, ln, text) {
|
|
|
1283
1313
|
cursor = to;
|
|
1284
1314
|
}
|
|
1285
1315
|
masked2 += scanText.slice(cursor);
|
|
1286
|
-
if (floatingResidue(masked2, bothCommentsOpenAtLineStart).length > 0) {
|
|
1316
|
+
if (floatingResidue(masked2, bothCommentsOpenAtLineStart).length > 0 || discardedEndTag) {
|
|
1287
1317
|
cp.p5SealPending = true;
|
|
1288
1318
|
}
|
|
1289
1319
|
}
|
|
@@ -1322,7 +1352,30 @@ function processConfirmedLine(cp, ln, text) {
|
|
|
1322
1352
|
cp.defBlockMaybeOpen = cp.defBlockMaybeOpen || DEF_RE.test(ln.text) || FOOTNOTE_DEF_RE.test(ln.text);
|
|
1323
1353
|
if (FOOTNOTE_DEF_RE.test(ln.text)) cp.fnDefResumable = true;
|
|
1324
1354
|
else if (isBlockStart && ln.indent <= 3) cp.fnDefResumable = false;
|
|
1355
|
+
const isBarrier = (name) => SCOPE_BARRIER_NAMES.has(name);
|
|
1356
|
+
const topLevelHtmlBlock = cp.mdBlock.kind === "html" && cp.mdBlock.indent === 0;
|
|
1357
|
+
const confirmedBarriers = cp.openStack.filter(isBarrier).length - cp.pendingTruncatedTags.filter(isBarrier).length;
|
|
1358
|
+
if (!topLevelHtmlBlock && confirmedBarriers > 0) {
|
|
1359
|
+
cp.phasePoisonedAt = Math.min(cp.phasePoisonedAt, ln.start);
|
|
1360
|
+
}
|
|
1361
|
+
const maskUnbacked = mdType1RawText(cp.mdBlock) && !inRawTextTok(cp.p5Tok);
|
|
1362
|
+
if (maskUnbacked) {
|
|
1363
|
+
cp.phasePoisonedAt = Math.min(cp.phasePoisonedAt, ln.start);
|
|
1364
|
+
if (tailCarriesRetroactive(ln.text) || /<template(?![a-z0-9-])/i.test(ln.text)) {
|
|
1365
|
+
cp.phasePoisonedAt = 0;
|
|
1366
|
+
}
|
|
1367
|
+
}
|
|
1325
1368
|
}
|
|
1369
|
+
var SCANNER_NAME_LISTS = [
|
|
1370
|
+
["type1", TYPE1_NAMES],
|
|
1371
|
+
["rawText", RAW_TEXT_ELEMENTS],
|
|
1372
|
+
["type6", TYPE6_NAMES],
|
|
1373
|
+
["void", VOID_TAGS],
|
|
1374
|
+
["documentStructure", DOCUMENT_STRUCTURE_NAMES],
|
|
1375
|
+
["tablePart", TABLE_PART_NAMES],
|
|
1376
|
+
["scopeBarrier", SCOPE_BARRIER_NAMES],
|
|
1377
|
+
["foreignRoot", new Set(FOREIGN_ROOT_NAMES)]
|
|
1378
|
+
];
|
|
1326
1379
|
|
|
1327
1380
|
// src/components/incrementalParse/spliceParse.ts
|
|
1328
1381
|
import { normalizeIdentifier as normalizeIdentifier2 } from "micromark-util-normalize-identifier";
|