@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.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(scanText);
294
- const def = defShaped !== null && (defShaped[1].startsWith("^") || isPlausibleLinkDefRest(scanText.slice(defShaped.index + defShaped[0].length))) ? defShaped : null;
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
- const defShapedLine = DEF_RE.test(ln.text) || FOOTNOTE_DEF_RE.test(ln.text) || cp.defBlockMaybeOpen || cp.fnDefResumable && ln.indent >= 4;
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) return;
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 && /^<(?:!--|\?|![A-Za-z]|!\[CDATA\[)/.test(mdTrimStart(ln.text));
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";