@simon_he/vue-tui 1.1.12 → 1.1.13

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/agent.cjs CHANGED
@@ -1009,6 +1009,19 @@ function sliceByCellsRange(text2, startCells, endCells, provider = currentTextWi
1009
1009
  out.push(g), cells = next;
1010
1010
  }), out.length ? out.join("") : "";
1011
1011
  }
1012
+ function sliceByCellsRangeForSelection(text2, startCells, endCells, provider = currentTextWidthProvider()) {
1013
+ if (startCells = Math.max(0, Math.floor(startCells)), endCells = Math.max(0, Math.floor(endCells)), endCells <= startCells || !text2)
1014
+ return "";
1015
+ if (hasAsciiFastPath(provider) && isAscii(text2))
1016
+ return text2.slice(startCells, endCells);
1017
+ let out = [], cells = 0;
1018
+ return forEachGrapheme(text2, (g) => {
1019
+ let leadingCell = cells;
1020
+ if (cells += charCellWidth(g, provider), leadingCell >= endCells)
1021
+ return !1;
1022
+ leadingCell >= startCells && out.push(g);
1023
+ }), out.join("");
1024
+ }
1012
1025
  function padEndByCells(text2, width, provider = currentTextWidthProvider()) {
1013
1026
  width = Math.max(0, Math.floor(width));
1014
1027
  let cells = text2 && hasAsciiFastPath(provider) && isAscii(text2) ? text2.length : textCellWidth(text2, provider);
@@ -8900,7 +8913,7 @@ var virtualListInstanceSeq = 0, TVirtualList = (0, import_vue21.defineComponent)
8900
8913
  function textForSelectionRange(range) {
8901
8914
  let cols = Math.max(1, Math.floor(props.w));
8902
8915
  return terminalSelectionRowSpans(range, cols, itemCount.value).map((span) => {
8903
- let text2 = sliceByCellsRange(itemText(span.y), span.x0, span.x1);
8916
+ let text2 = sliceByCellsRangeForSelection(itemText(span.y), span.x0, span.x1);
8904
8917
  return span.x1 >= cols ? text2.trimEnd() : text2;
8905
8918
  }).join(`
8906
8919
  `);
@@ -9587,7 +9600,7 @@ var virtualRowsInstanceSeq = 0, EMPTY_RECT2 = Object.freeze({ x: 0, y: 0, w: 0,
9587
9600
  x1: span.x1,
9588
9601
  cols
9589
9602
  }) ?? ""
9590
- ) : sliceByCellsRange(itemText(span.y), span.x0, span.x1);
9603
+ ) : sliceByCellsRangeForSelection(itemText(span.y), span.x0, span.x1);
9591
9604
  return span.x1 >= cols ? text2.trimEnd() : text2;
9592
9605
  }).join(`
9593
9606
  `);
@@ -10325,7 +10338,7 @@ var TTranscriptView = (0, import_vue23.defineComponent)({
10325
10338
  let text2 = "";
10326
10339
  for (let segment of segments) {
10327
10340
  let start = Math.max(x0, segment.x0), end = Math.min(x1, segment.x1);
10328
- end <= start || !segment.selectable || (text2 += sliceByCellsRange(segment.text, start - segment.x0, end - segment.x0));
10341
+ end <= start || !segment.selectable || (text2 += sliceByCellsRangeForSelection(segment.text, start - segment.x0, end - segment.x0));
10329
10342
  }
10330
10343
  return text2;
10331
10344
  }
@@ -10354,7 +10367,7 @@ var TTranscriptView = (0, import_vue23.defineComponent)({
10354
10367
  }
10355
10368
  function selectionTextForVisualRowSpan(ctx) {
10356
10369
  let visualRow = ctx.item;
10357
- return visualRow ? visualRow.selectionSegments.length ? textForSelectionSegments(visualRow.selectionSegments, ctx.x0, ctx.x1) : sliceByCellsRange(selectionTextForVisualRow(visualRow), ctx.x0, ctx.x1) : "";
10370
+ return visualRow ? visualRow.selectionSegments.length ? textForSelectionSegments(visualRow.selectionSegments, ctx.x0, ctx.x1) : sliceByCellsRangeForSelection(selectionTextForVisualRow(visualRow), ctx.x0, ctx.x1) : "";
10358
10371
  }
10359
10372
  return () => (0, import_vue23.h)(TVirtualRows, {
10360
10373
  ref: rowsRef,
@@ -12613,7 +12626,7 @@ var TLogView = (0, import_vue24.defineComponent)({
12613
12626
  function textForSelectionRange(range) {
12614
12627
  let cols = currentWrapWidth(), rows = estimatedVisualRowCount();
12615
12628
  return terminalSelectionRowSpans(range, cols, rows).map((span) => {
12616
- let text2 = sliceByCellsRange(textForVisualRow(span.y), span.x0, span.x1);
12629
+ let text2 = sliceByCellsRangeForSelection(textForVisualRow(span.y), span.x0, span.x1);
12617
12630
  return span.x1 >= cols ? text2.trimEnd() : text2;
12618
12631
  }).join(`
12619
12632
  `);
@@ -15157,7 +15170,7 @@ function loadBuiltinMathRasterizer() {
15157
15170
  })()), builtinRasterizerLoad;
15158
15171
  }
15159
15172
 
15160
- // node_modules/.pnpm/stream-markdown-parser@1.2.12/node_modules/stream-markdown-parser/dist/index.js
15173
+ // node_modules/.pnpm/stream-markdown-parser@1.2.19/node_modules/stream-markdown-parser/dist/index.js
15161
15174
  var __create2 = Object.create, __defProp$1 = Object.defineProperty, __getOwnPropDesc2 = Object.getOwnPropertyDescriptor, __getOwnPropNames2 = Object.getOwnPropertyNames, __getProtoOf2 = Object.getPrototypeOf, __hasOwnProp2 = Object.prototype.hasOwnProperty, __commonJS = (cb, mod) => function() {
15162
15175
  return mod || (0, cb[__getOwnPropNames2(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
15163
15176
  }, __export$1 = (all) => {
@@ -18484,6 +18497,30 @@ function inline(state) {
18484
18497
  }
18485
18498
  }
18486
18499
  var CJK_CHAR_RE = /[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}]/u, ASCII_DOMAIN_START_RE = /[0-9a-z]/i;
18500
+ function hasLinkifySeed(text$1) {
18501
+ return text$1.includes(".") || text$1.includes("@") || text$1.includes(":");
18502
+ }
18503
+ var linkifySeedSafety = /* @__PURE__ */ new WeakMap();
18504
+ function isLinkifySeedSafe(linkify$2) {
18505
+ let schemaSearch = linkify$2.re?.get_schema_search?.();
18506
+ if (!schemaSearch)
18507
+ return !1;
18508
+ let cached = linkifySeedSafety.get(linkify$2);
18509
+ if (cached && cached.schemaSearch === schemaSearch)
18510
+ return cached.safe;
18511
+ let schemas = linkify$2.__schemas__, safe = !0;
18512
+ if (schemas) {
18513
+ for (let name in schemas)
18514
+ if (name.charCodeAt(name.length - 1) !== 58) {
18515
+ safe = !1;
18516
+ break;
18517
+ }
18518
+ }
18519
+ return linkifySeedSafety.set(linkify$2, {
18520
+ schemaSearch,
18521
+ safe
18522
+ }), safe;
18523
+ }
18487
18524
  function isLinkOpen(str) {
18488
18525
  return /^<a[>\s]/i.test(str);
18489
18526
  }
@@ -18509,55 +18546,57 @@ function trimCjkPrefixFromFuzzyLink(linkify$2, link$1) {
18509
18546
  }
18510
18547
  function linkify(state) {
18511
18548
  let blockTokens = state.tokens;
18512
- if (state.md?.options?.linkify)
18513
- for (let j = 0; j < blockTokens.length; j++) {
18514
- let blockToken$1 = blockTokens[j];
18515
- if (blockToken$1.type !== "inline" || !state.md.linkify.test(blockToken$1.content))
18549
+ if (!state.md?.options?.linkify)
18550
+ return;
18551
+ let seedSafe = isLinkifySeedSafe(state.md.linkify), mayMatch = (text$1) => seedSafe ? hasLinkifySeed(text$1) : !0;
18552
+ for (let j = 0; j < blockTokens.length; j++) {
18553
+ let blockToken$1 = blockTokens[j];
18554
+ if (blockToken$1.type !== "inline" || !mayMatch(blockToken$1.content))
18555
+ continue;
18556
+ let tokens = blockToken$1.children;
18557
+ tokens || (tokens = [], blockToken$1.children = tokens);
18558
+ let htmlLinkLevel = 0;
18559
+ for (let i = tokens.length - 1; i >= 0; i--) {
18560
+ let currentToken = tokens[i];
18561
+ if (currentToken.type === "link_close") {
18562
+ for (i--; i >= 0 && tokens[i].level !== currentToken.level && tokens[i].type !== "link_open"; )
18563
+ i--;
18516
18564
  continue;
18517
- let tokens = blockToken$1.children;
18518
- tokens || (tokens = [], blockToken$1.children = tokens);
18519
- let htmlLinkLevel = 0;
18520
- for (let i = tokens.length - 1; i >= 0; i--) {
18521
- let currentToken = tokens[i];
18522
- if (currentToken.type === "link_close") {
18523
- for (i--; i >= 0 && tokens[i].level !== currentToken.level && tokens[i].type !== "link_open"; )
18524
- i--;
18565
+ }
18566
+ if (currentToken.type === "html_inline" && (isLinkOpen(currentToken.content) && htmlLinkLevel > 0 && htmlLinkLevel--, isLinkClose(currentToken.content) && htmlLinkLevel++), htmlLinkLevel > 0 || currentToken.type !== "text" || !mayMatch(currentToken.content))
18567
+ continue;
18568
+ let text$1 = currentToken.content, links = (state.md.linkify.match(text$1) || []).map((link$1) => trimCjkPrefixFromFuzzyLink(state.md.linkify, link$1));
18569
+ if (links.length === 0)
18570
+ continue;
18571
+ let nodes = [], level = currentToken.level, lastPos = 0;
18572
+ links.length > 0 && links[0].index === 0 && i > 0 && tokens[i - 1].type === "text_special" && (links = links.slice(1));
18573
+ for (let ln = 0; ln < links.length; ln++) {
18574
+ let link$1 = links[ln], fullUrl = state.md.normalizeLink(link$1.url);
18575
+ if (!state.md.validateLink(fullUrl))
18525
18576
  continue;
18577
+ let urlText = link$1.text;
18578
+ link$1.schema ? link$1.schema === "mailto:" && !/^mailto:/i.test(urlText) ? urlText = state.md.normalizeLinkText(`mailto:${urlText}`).replace(/^mailto:/, "") : urlText = state.md.normalizeLinkText(urlText) : urlText = state.md.normalizeLinkText(`http://${urlText}`).replace(/^http:\/\//, "");
18579
+ let pos = link$1.index;
18580
+ if (pos > lastPos) {
18581
+ let textToken$1 = new Token("text", "", 0);
18582
+ textToken$1.content = text$1.slice(lastPos, pos), textToken$1.level = level, nodes.push(textToken$1);
18526
18583
  }
18527
- if (currentToken.type === "html_inline" && (isLinkOpen(currentToken.content) && htmlLinkLevel > 0 && htmlLinkLevel--, isLinkClose(currentToken.content) && htmlLinkLevel++), htmlLinkLevel > 0 || currentToken.type !== "text" || !state.md.linkify.test(currentToken.content))
18528
- continue;
18529
- let text$1 = currentToken.content, links = (state.md.linkify.match(text$1) || []).map((link$1) => trimCjkPrefixFromFuzzyLink(state.md.linkify, link$1));
18530
- if (links.length === 0)
18531
- continue;
18532
- let nodes = [], level = currentToken.level, lastPos = 0;
18533
- links.length > 0 && links[0].index === 0 && i > 0 && tokens[i - 1].type === "text_special" && (links = links.slice(1));
18534
- for (let ln = 0; ln < links.length; ln++) {
18535
- let link$1 = links[ln], fullUrl = state.md.normalizeLink(link$1.url);
18536
- if (!state.md.validateLink(fullUrl))
18537
- continue;
18538
- let urlText = link$1.text;
18539
- link$1.schema ? link$1.schema === "mailto:" && !/^mailto:/i.test(urlText) ? urlText = state.md.normalizeLinkText(`mailto:${urlText}`).replace(/^mailto:/, "") : urlText = state.md.normalizeLinkText(urlText) : urlText = state.md.normalizeLinkText(`http://${urlText}`).replace(/^http:\/\//, "");
18540
- let pos = link$1.index;
18541
- if (pos > lastPos) {
18542
- let textToken$1 = new Token("text", "", 0);
18543
- textToken$1.content = text$1.slice(lastPos, pos), textToken$1.level = level, nodes.push(textToken$1);
18544
- }
18545
- let tokenOpen = new Token("link_open", "a", 1);
18546
- tokenOpen.attrs = [["href", fullUrl]], tokenOpen.level = level++, tokenOpen.markup = "linkify", tokenOpen.info = "auto", nodes.push(tokenOpen);
18547
- let tokenText = new Token("text", "", 0);
18548
- tokenText.content = urlText, tokenText.level = level, nodes.push(tokenText);
18549
- let tokenClose = new Token("link_close", "a", -1);
18550
- tokenClose.level = --level, tokenClose.markup = "linkify", tokenClose.info = "auto", nodes.push(tokenClose), lastPos = link$1.lastIndex;
18551
- }
18552
- if (lastPos !== 0) {
18553
- if (lastPos < text$1.length) {
18554
- let textToken$1 = new Token("text", "", 0);
18555
- textToken$1.content = text$1.slice(lastPos), textToken$1.level = level, nodes.push(textToken$1);
18556
- }
18557
- tokens.splice(i, 1, ...nodes);
18584
+ let tokenOpen = new Token("link_open", "a", 1);
18585
+ tokenOpen.attrs = [["href", fullUrl]], tokenOpen.level = level++, tokenOpen.markup = "linkify", tokenOpen.info = "auto", nodes.push(tokenOpen);
18586
+ let tokenText = new Token("text", "", 0);
18587
+ tokenText.content = urlText, tokenText.level = level, nodes.push(tokenText);
18588
+ let tokenClose = new Token("link_close", "a", -1);
18589
+ tokenClose.level = --level, tokenClose.markup = "linkify", tokenClose.info = "auto", nodes.push(tokenClose), lastPos = link$1.lastIndex;
18590
+ }
18591
+ if (lastPos !== 0) {
18592
+ if (lastPos < text$1.length) {
18593
+ let textToken$1 = new Token("text", "", 0);
18594
+ textToken$1.content = text$1.slice(lastPos), textToken$1.level = level, nodes.push(textToken$1);
18558
18595
  }
18596
+ tokens.splice(i, 1, ...nodes);
18559
18597
  }
18560
18598
  }
18599
+ }
18561
18600
  }
18562
18601
  var NEWLINES_RE = /\r\n?|\n/g, NULL_RE = /\0/g;
18563
18602
  function normalize(state) {
@@ -18733,7 +18772,7 @@ function process_inlines(tokens, state) {
18733
18772
  nextChar = tokens[j].content.charCodeAt(0);
18734
18773
  break;
18735
18774
  }
18736
- let isLastPunctChar = isMdAsciiPunct(lastChar2) || isPunctChar(String.fromCharCode(lastChar2)), isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar)), isLastWhiteSpace = isWhiteSpace(lastChar2), isNextWhiteSpace = isWhiteSpace(nextChar);
18775
+ let isLastPunctChar = isPunctCode(lastChar2), isNextPunctChar = isPunctCode(nextChar), isLastWhiteSpace = isWhiteSpace(lastChar2), isNextWhiteSpace = isWhiteSpace(nextChar);
18737
18776
  if (isNextWhiteSpace ? canOpen = !1 : isNextPunctChar && (isLastWhiteSpace || isLastPunctChar || (canOpen = !1)), isLastWhiteSpace ? canClose = !1 : isLastPunctChar && (isNextWhiteSpace || isNextPunctChar || (canClose = !1)), nextChar === 34 && t[0] === '"' && lastChar2 >= 48 && lastChar2 <= 57 && (canClose = canOpen = !1), canOpen && canClose && (canOpen = isLastPunctChar, canClose = isNextPunctChar), !canOpen && !canClose) {
18738
18777
  isSingle && (token.content = replaceAt(token.content, t.index, APOSTROPHE));
18739
18778
  continue;
@@ -18788,28 +18827,30 @@ var BAD_PROTO_RE = /^(?:vbscript|javascript|file|data):/, GOOD_DATA_RE = /^data:
18788
18827
  "http:",
18789
18828
  "https:",
18790
18829
  "mailto:"
18791
- ];
18830
+ ], NON_ASCII_RE = /[^\0-\x7F]/, PUNYCODE_LABEL_RE = /xn--/, ENCODE_IDENTITY_RE = /%(?![0-9a-f]{2})|[^\w;/?:@&=+$,\-.!~*'()#%]/i, DECODE_SCAN_RE = /%[0-9a-f]{2}/i;
18792
18831
  function validateLink(url) {
18793
18832
  let str = url.trim().toLowerCase();
18794
18833
  return BAD_PROTO_RE.test(str) ? GOOD_DATA_RE.test(str) : !0;
18795
18834
  }
18796
18835
  function normalizeLink(url) {
18797
18836
  let parsed = parse_default(url, !0);
18798
- if (parsed.hostname && (!parsed.protocol || RECODE_HOSTNAME_FOR.includes(parsed.protocol)))
18837
+ if (parsed.hostname && (!parsed.protocol || RECODE_HOSTNAME_FOR.includes(parsed.protocol)) && NON_ASCII_RE.test(parsed.hostname))
18799
18838
  try {
18800
18839
  parsed.hostname = import_punycode.default.toASCII(parsed.hostname);
18801
18840
  } catch {
18802
18841
  }
18803
- return encode_default(format(parsed));
18842
+ let formatted = format(parsed);
18843
+ return ENCODE_IDENTITY_RE.test(formatted) ? encode_default(formatted) : formatted;
18804
18844
  }
18805
18845
  function normalizeLinkText(url) {
18806
18846
  let parsed = parse_default(url, !0);
18807
- if (parsed.hostname && (!parsed.protocol || RECODE_HOSTNAME_FOR.includes(parsed.protocol)))
18847
+ if (parsed.hostname && (!parsed.protocol || RECODE_HOSTNAME_FOR.includes(parsed.protocol)) && (NON_ASCII_RE.test(parsed.hostname) || PUNYCODE_LABEL_RE.test(parsed.hostname)))
18808
18848
  try {
18809
18849
  parsed.hostname = import_punycode.default.toUnicode(parsed.hostname);
18810
18850
  } catch {
18811
18851
  }
18812
- return decode_default(format(parsed), `${decode_default.defaultChars}%`);
18852
+ let formatted = format(parsed);
18853
+ return DECODE_SCAN_RE.test(formatted) ? decode_default(formatted, `${decode_default.defaultChars}%`) : formatted;
18813
18854
  }
18814
18855
  function isSpace$7(code$1) {
18815
18856
  switch (code$1) {
@@ -22208,6 +22249,37 @@ var Renderer = class {
22208
22249
  return output;
22209
22250
  }
22210
22251
  }, renderer_default = Renderer, EMPTY_TOKENS = [], GLOBAL_STATE_APPEND_SCAN_WINDOW = 4096;
22252
+ function copyOptions(options) {
22253
+ let copy = { ...options };
22254
+ return Array.isArray(options.quotes) && (copy.quotes = [...options.quotes]), options.experimental && (copy.experimental = { ...options.experimental }), copy;
22255
+ }
22256
+ function optionsEqual(left, right) {
22257
+ let keys = Object.keys(right);
22258
+ return Object.keys(left).length !== keys.length ? !1 : keys.every((key) => {
22259
+ if (!Object.hasOwn(left, key))
22260
+ return !1;
22261
+ let leftValue = left[key], rightValue = right[key];
22262
+ if (Array.isArray(leftValue) && Array.isArray(rightValue))
22263
+ return leftValue.length === rightValue.length && leftValue.every((value, index) => Object.is(value, rightValue[index]));
22264
+ if (key === "experimental" && leftValue && rightValue) {
22265
+ let leftExperimental = leftValue, rightExperimental = rightValue, experimentalKeys = Object.keys(rightExperimental);
22266
+ return Object.keys(leftExperimental).length === experimentalKeys.length && experimentalKeys.every((option) => Object.hasOwn(leftExperimental, option) && Object.is(leftExperimental[option], rightExperimental[option]));
22267
+ }
22268
+ return Object.is(leftValue, rightValue);
22269
+ });
22270
+ }
22271
+ function copyParserConfig(md) {
22272
+ return {
22273
+ options: copyOptions(md.options),
22274
+ coreVersion: md.core.ruler.version,
22275
+ blockVersion: md.block.ruler.version,
22276
+ inlineVersion: md.inline.ruler.version,
22277
+ inline2Version: md.inline.ruler2.version
22278
+ };
22279
+ }
22280
+ function parserConfigEqual(config$1, md) {
22281
+ return optionsEqual(config$1.options, md.options) && config$1.coreVersion === md.core.ruler.version && config$1.blockVersion === md.block.ruler.version && config$1.inlineVersion === md.inline.ruler.version && config$1.inline2Version === md.inline.ruler2.version;
22282
+ }
22211
22283
  function appendedHasBlockConstructs(s) {
22212
22284
  let len = s.length, lineStart = 0;
22213
22285
  for (; lineStart <= len; ) {
@@ -22350,9 +22422,9 @@ var StreamParser = class {
22350
22422
  __publicField(this, "core");
22351
22423
  __publicField(this, "anchorBlock", new ParserBlock());
22352
22424
  __publicField(this, "cache", null);
22425
+ __publicField(this, "snapshots", /* @__PURE__ */ new WeakSet());
22353
22426
  __publicField(this, "stats", makeEmptyStats());
22354
22427
  __publicField(this, "normalizeLineEndings", !0);
22355
- __publicField(this, "coreRulerVersion", -1);
22356
22428
  __publicField(this, "tokenMapsTrusted", !0);
22357
22429
  __publicField(this, "allowUntrustedTailReuse", !1);
22358
22430
  __publicField(this, "MIN_SIZE_FOR_OPTIMIZATION", 1e3);
@@ -22375,19 +22447,46 @@ var StreamParser = class {
22375
22447
  let { resets } = this.stats;
22376
22448
  this.stats = makeEmptyStats(), this.stats.resets = resets;
22377
22449
  }
22378
- parse(src, env, md) {
22379
- let priorEnv = this.cache?.env;
22380
- this.coreRulerVersion >= 0 && this.coreRulerVersion !== md.core.ruler.version && (this.cache = null), this.coreRulerVersion = md.core.ruler.version;
22381
- let coreRules = md.core.ruler.getNamedRules(""), lineNormalizerIndex = coreRules.findIndex((rule) => rule.fn === normalize), blockRuleIndex = coreRules.findIndex((rule) => rule.fn === block), namedNormalizeRule = coreRules.find((rule) => rule.name === "normalize");
22450
+ snapshot() {
22451
+ let cache = this.cache;
22452
+ if (!cache)
22453
+ return null;
22454
+ let state = cache.snapshotState ?? { cache };
22455
+ cache.snapshotState = state;
22456
+ let snapshot = {
22457
+ state,
22458
+ get sourceLength() {
22459
+ return this.state.cache.src.length;
22460
+ },
22461
+ get tokenCount() {
22462
+ return this.state.cache.tokens.length;
22463
+ }
22464
+ };
22465
+ return this.snapshots.add(snapshot), snapshot;
22466
+ }
22467
+ restore(snapshot, md) {
22468
+ if (!this.snapshots.has(snapshot))
22469
+ throw new TypeError("Invalid stream snapshot");
22470
+ let cache = snapshot.state.cache;
22471
+ return this.cache = cache, parserConfigEqual(cache.config, md) ? cache.tokens : this.parse(cache.src, cache.env, md);
22472
+ }
22473
+ append(segment, env, md) {
22474
+ let cached = this.cache;
22475
+ if (!cached)
22476
+ throw new Error("Stream append requires cached history; call stream.parse(fullSource) first");
22477
+ return this.ensureBoundaryState(cached), this.parse(cached.src + segment, env, md, segment);
22478
+ }
22479
+ parse(src, env, md, knownAppend) {
22480
+ let previousCache = this.cache, priorEnv = previousCache?.env, coreRules = md.core.ruler.getNamedRules(""), lineNormalizerIndex = coreRules.findIndex((rule) => rule.fn === normalize), blockRuleIndex = coreRules.findIndex((rule) => rule.fn === block), namedNormalizeRule = coreRules.find((rule) => rule.name === "normalize");
22382
22481
  this.normalizeLineEndings = lineNormalizerIndex >= 0 && blockRuleIndex >= 0 && lineNormalizerIndex < blockRuleIndex;
22383
- let envProvided = env, previousCache = this.cache, customNormalize = namedNormalizeRule && namedNormalizeRule.fn !== normalize, nonstandardBuiltinNormalize = namedNormalizeRule && !this.normalizeLineEndings && src.includes("\r"), unknownPreBlockRule = blockRuleIndex < 0 || coreRules.slice(0, blockRuleIndex).some((rule) => rule.fn !== normalize);
22482
+ let envProvided = env, configChanged = !!previousCache && !parserConfigEqual(previousCache.config, md), customNormalize = namedNormalizeRule && namedNormalizeRule.fn !== normalize, nonstandardBuiltinNormalize = namedNormalizeRule && !this.normalizeLineEndings && src.includes("\r"), unknownPreBlockRule = blockRuleIndex < 0 || coreRules.slice(0, blockRuleIndex).some((rule) => rule.fn !== normalize);
22384
22483
  this.tokenMapsTrusted = !(blockRuleIndex < 0 || coreRules.slice(blockRuleIndex + 1).some((rule) => rule.fn !== inline && rule.fn !== linkify && rule.fn !== replacements && rule.fn !== smartquotes && rule.fn !== text_join)), this.allowUntrustedTailReuse = this.tokenMapsTrusted || md.options?.streamTailLocalPostBlockRules === !0;
22385
- let cached = customNormalize || nonstandardBuiltinNormalize || unknownPreBlockRule ? null : previousCache;
22484
+ let cached = configChanged || customNormalize || nonstandardBuiltinNormalize || unknownPreBlockRule ? null : previousCache;
22386
22485
  if (beginParseDiagnostics(envProvided ?? previousCache?.env ?? priorEnv), !cached || envProvided && envProvided !== cached.env) {
22387
22486
  let workingEnv = envProvided ?? previousCache?.env ?? priorEnv ?? {}, explicitChunkFallbackSetting$1 = !!md.__explicitStreamChunkFallbackSetting, canImplicitLargeInput$1 = typeof md.__canUseImplicitLargeInputStrategy == "function" ? md.__canUseImplicitLargeInputStrategy() : !0, wantsChunking$1 = !!md.options?.streamChunkedFallback, allowImplicitChunk$1 = !explicitChunkFallbackSetting$1 && canImplicitLargeInput$1, chunkedEnabled$1 = wantsChunking$1 || allowImplicitChunk$1, chunkAdaptive$1 = md.options?.streamChunkAdaptive !== !1, targetChunks$1 = md.options?.streamChunkTargetChunks ?? 8, chunkSizeCharsCfg$1 = md.options?.streamChunkSizeChars, chunkSizeLinesCfg$1 = md.options?.streamChunkSizeLines, chunkMaxChunksCfg$1 = md.options?.streamChunkMaxChunks, explicitChunkConfig$1 = !!md.__explicitStreamChunkConfig, auto$1 = md.options?.autoTuneChunks !== !1, chunkFenceAware$1 = md.options?.streamChunkFenceAware ?? !0, largeCachePolicy = md.options?.streamLargeCachePolicy ?? "retain", skipCacheChars = md.options?.streamSkipCacheAboveChars ?? this.DEFAULT_SKIP_CACHE_CHARS, skipCacheLines = md.options?.streamSkipCacheAboveLines ?? this.DEFAULT_SKIP_CACHE_LINES, srcLineCount, shouldSkipLargeCache = !1;
22388
- if (largeCachePolicy === "skip" && (shouldSkipLargeCache = src.length >= skipCacheChars, !shouldSkipLargeCache && skipCacheLines !== void 0 && (srcLineCount = countLines(src), shouldSkipLargeCache = srcLineCount >= skipCacheLines)), shouldSkipLargeCache) {
22487
+ if (largeCachePolicy === "skip" && (shouldSkipLargeCache = src.length >= skipCacheChars, !shouldSkipLargeCache && skipCacheLines !== void 0 && (srcLineCount = countLines(src), shouldSkipLargeCache = srcLineCount >= skipCacheLines)), shouldSkipLargeCache && knownAppend === void 0 && !previousCache?.snapshotState) {
22389
22488
  let parsed$2 = this.parseFullDocument(src, workingEnv, md, srcLineCount, !1);
22390
- return this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(workingEnv, {
22489
+ return this.cache = null, this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(workingEnv, {
22391
22490
  area: "stream",
22392
22491
  path: "stream-full",
22393
22492
  reason: "skip-cache-large-one-shot",
@@ -22403,26 +22502,28 @@ var StreamParser = class {
22403
22502
  maxChunkLines: useLines,
22404
22503
  fenceAware: recommendation?.fenceAware ?? chunkFenceAware$1,
22405
22504
  maxChunks: useMaxChunks
22406
- });
22407
- return this.cache = {
22505
+ }), globalStateReason = getParseDiagnostics(workingEnv)?.chunk?.globalStateDetected ?? null, cache$2 = this.setCache({
22408
22506
  src,
22409
22507
  tokens,
22410
22508
  env: workingEnv,
22411
22509
  lineCount: srcLineCount,
22412
22510
  lastSegment: void 0,
22413
- globalStateReason: detectGlobalMarkdownState(src)
22414
- }, this.updateCacheLineCount(this.cache, srcLineCount), this.recordChunkedParseResult(workingEnv, wantsChunking$1 ? "explicit-initial-large-doc" : "default-initial-large-doc"), tokens;
22511
+ globalStateReason
22512
+ }, md);
22513
+ return this.updateCacheLineCount(cache$2, srcLineCount), this.recordChunkedParseResult(workingEnv, wantsChunking$1 ? "explicit-initial-large-doc" : "default-initial-large-doc"), tokens;
22415
22514
  }
22416
22515
  }
22417
22516
  let parsed$1 = this.parseFullDocument(src, workingEnv, md, srcLineCount);
22418
- return srcLineCount = parsed$1.lineCount, this.cache = {
22517
+ srcLineCount = parsed$1.lineCount;
22518
+ let cache$1 = this.setCache({
22419
22519
  src,
22420
22520
  tokens: parsed$1.tokens,
22421
22521
  env: workingEnv,
22422
22522
  lineCount: srcLineCount,
22423
22523
  lastSegment: void 0,
22424
- globalStateReason: detectGlobalMarkdownState(src)
22425
- }, this.updateCacheLineCount(this.cache, srcLineCount), this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(workingEnv, {
22524
+ globalStateReason: parsed$1.globalStateReason
22525
+ }, md);
22526
+ return this.updateCacheLineCount(cache$1, srcLineCount), this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(workingEnv, {
22426
22527
  area: "stream",
22427
22528
  path: "stream-full",
22428
22529
  reason: "initial-parse",
@@ -22435,21 +22536,21 @@ var StreamParser = class {
22435
22536
  path: "stream-cache",
22436
22537
  reason: "same-source"
22437
22538
  }), cached.tokens;
22438
- let appendDelta = src.startsWith(cached.src) ? src.slice(cached.src.length) : null, cachedGlobalStateReason = cached.globalStateReason;
22539
+ let appendDelta = knownAppend !== void 0 ? knownAppend : src.startsWith(cached.src) ? src.slice(cached.src.length) : null, cachedGlobalStateReason = cached.globalStateReason;
22439
22540
  cachedGlobalStateReason === void 0 && (cachedGlobalStateReason = detectGlobalMarkdownState(cached.src), cached.globalStateReason = cachedGlobalStateReason);
22440
22541
  let currentGlobalStateReason = cachedGlobalStateReason ? null : appendDelta !== null ? this.detectGlobalStateForAppend(cached, appendDelta) : detectGlobalMarkdownState(src), nextGlobalStateReason = cachedGlobalStateReason || currentGlobalStateReason;
22441
22542
  if (nextGlobalStateReason) {
22442
22543
  let fallbackEnv$1 = envProvided ?? cached.env;
22443
22544
  resetKnownGlobalMarkdownState(fallbackEnv$1);
22444
- let fallbackGlobalStateReason = detectGlobalMarkdownState(src), parsed$1 = this.parseFullDocument(src, fallbackEnv$1, md), nextTokens$1 = parsed$1.tokens, lineCount = parsed$1.lineCount;
22445
- return this.cache = {
22545
+ let parsed$1 = this.parseFullDocument(src, fallbackEnv$1, md), nextTokens$1 = parsed$1.tokens, lineCount = parsed$1.lineCount, cache$1 = this.setCache({
22446
22546
  src,
22447
22547
  tokens: nextTokens$1,
22448
22548
  env: fallbackEnv$1,
22449
22549
  lineCount,
22450
22550
  lastSegment: void 0,
22451
- globalStateReason: fallbackGlobalStateReason
22452
- }, this.updateCacheLineCount(this.cache, lineCount), this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(fallbackEnv$1, {
22551
+ globalStateReason: parsed$1.globalStateReason
22552
+ }, md);
22553
+ return this.updateCacheLineCount(cache$1, lineCount), this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(fallbackEnv$1, {
22453
22554
  area: "stream",
22454
22555
  path: "stream-full",
22455
22556
  reason: `global-state:${nextGlobalStateReason}`,
@@ -22457,23 +22558,23 @@ var StreamParser = class {
22457
22558
  }), nextTokens$1;
22458
22559
  }
22459
22560
  let threshold = md.options?.streamOptimizationMinSize ?? this.MIN_SIZE_FOR_OPTIMIZATION;
22460
- if (cached.src.length < threshold && src.length < threshold * 1.5 && !src.startsWith(cached.src)) {
22461
- let fallbackEnv$1 = envProvided ?? cached.env, parsed$1 = this.parseFullDocument(src, fallbackEnv$1, md), nextTokens$1 = parsed$1.tokens, lineCount = parsed$1.lineCount;
22462
- return this.cache = {
22561
+ if (cached.src.length < threshold && src.length < threshold * 1.5 && appendDelta === null) {
22562
+ let fallbackEnv$1 = envProvided ?? cached.env, parsed$1 = this.parseFullDocument(src, fallbackEnv$1, md), nextTokens$1 = parsed$1.tokens, lineCount = parsed$1.lineCount, cache$1 = this.setCache({
22463
22563
  src,
22464
22564
  tokens: nextTokens$1,
22465
22565
  env: fallbackEnv$1,
22466
22566
  lineCount,
22467
22567
  lastSegment: void 0,
22468
- globalStateReason: detectGlobalMarkdownState(src)
22469
- }, this.updateCacheLineCount(this.cache, lineCount), this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(fallbackEnv$1, {
22568
+ globalStateReason: parsed$1.globalStateReason
22569
+ }, md);
22570
+ return this.updateCacheLineCount(cache$1, lineCount), this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(fallbackEnv$1, {
22470
22571
  area: "stream",
22471
22572
  path: "stream-full",
22472
22573
  reason: "small-non-append",
22473
22574
  unbounded: !!getParseDiagnostics(fallbackEnv$1)?.unbounded
22474
22575
  }), nextTokens$1;
22475
22576
  }
22476
- let cachedLastSegment = this.ensureLastSegment(cached), verifiedUntrustedTail = this.tokenMapsTrusted || this.allowUntrustedTailReuse && (cached.lastSegmentVerified === !0 || !!(cachedLastSegment && this.hasVerifiedSegmentAnchor(cached, cachedLastSegment, md))), appended = appendDelta !== null && this.shouldPreferTailReparseForAppend(cached, verifiedUntrustedTail) || !this.tokenMapsTrusted ? null : this.getAppendedSegment(cached, src, appendDelta);
22577
+ let cachedLastSegment = this.ensureLastSegment(cached, knownAppend !== void 0), verifiedUntrustedTail = this.tokenMapsTrusted || this.allowUntrustedTailReuse && (cached.lastSegmentVerified === !0 || !!(cachedLastSegment && this.hasVerifiedSegmentAnchor(cached, cachedLastSegment, md))), appended = appendDelta !== null && this.shouldPreferTailReparseForAppend(cached, verifiedUntrustedTail) || !this.tokenMapsTrusted ? null : this.getAppendedSegment(cached, src, appendDelta);
22477
22578
  if (appended) {
22478
22579
  let cachedLineCount = cached.lineCount ?? countLines(cached.src), ctxLines = 3;
22479
22580
  appended.length > 5e3 ? ctxLines = 8 : appended.length > 1e3 ? ctxLines = 6 : appended.length > 200 && (ctxLines = 4), ctxLines = Math.min(ctxLines, cachedLineCount);
@@ -22548,11 +22649,16 @@ var StreamParser = class {
22548
22649
  }
22549
22650
  dup > 0 && (appendedTokenStart += dup), a.length > appendedTokenStart && this.appendTokens(cached.tokens, a, appendedTokenStart);
22550
22651
  }
22551
- if (this.updateFenceMarkerCacheForAppend(cached, appended), cached.src = src, cached.globalStateReason = null, cached.lineCount = cachedLineCount + (appendedLineCount ?? countAppendedLines()), cached.tokens.length > appendStart) {
22652
+ if (cached.boundary ? this.updateBoundaryStateForAppend(cached, appended) : this.updateFenceMarkerCacheForAppend(cached, appended), cached.src = src, cached.globalStateReason = null, cached.lineCount = cachedLineCount + (appendedLineCount ?? countAppendedLines()), cached.tokens.length > appendStart) {
22552
22653
  let appendedLastSegment = this.getLastSegment(cached.tokens, src, appendStart, cached.tokens.length, src.length - appended.length, cachedLineCount);
22553
- appendedLastSegment ? cached.lastSegment = appendedLastSegment : cached.lastSegment = void 0;
22654
+ if (appendedLastSegment) {
22655
+ cached.lastSegment = appendedLastSegment;
22656
+ let appendedOffset = src.length - appended.length;
22657
+ cached.lastSegmentSource = appended.slice(Math.max(0, appendedLastSegment.srcOffset - appendedOffset));
22658
+ } else
22659
+ cached.lastSegment = void 0, cached.lastSegmentSource = void 0;
22554
22660
  } else
22555
- cached.lastSegment = void 0;
22661
+ cached.lastSegment = void 0, cached.lastSegmentSource = void 0;
22556
22662
  return cached.lastSegmentVerified = void 0, this.stats.total += 1, this.stats.appendHits += 1, useUnboundedAppend && (this.stats.unboundedAppendHits = (this.stats.unboundedAppendHits || 0) + 1), this.stats.lastMode = "append", setStrategyDiagnostics(cached.env, {
22557
22663
  area: "stream",
22558
22664
  path: useUnboundedAppend ? "stream-unbounded-append" : "stream-append",
@@ -22560,7 +22666,7 @@ var StreamParser = class {
22560
22666
  unbounded: useUnboundedAppend
22561
22667
  }), cached.tokens;
22562
22668
  }
22563
- let fallbackEnv = envProvided ?? cached.env, tailReparsed = verifiedUntrustedTail ? this.tryTailSegmentReparse(src, cached, fallbackEnv, md, cachedLastSegment ?? void 0) : this.allowUntrustedTailReuse ? this.tryUntrustedParagraphTailReparse(src, cached, fallbackEnv, md) : null;
22669
+ let fallbackEnv = envProvided ?? cached.env, tailReparsed = verifiedUntrustedTail ? this.tryTailSegmentReparse(src, cached, fallbackEnv, md, cachedLastSegment ?? void 0, appendDelta ?? void 0) : this.allowUntrustedTailReuse ? this.tryUntrustedParagraphTailReparse(src, cached, fallbackEnv, md) : null;
22564
22670
  if (tailReparsed)
22565
22671
  return this.stats.total += 1, this.stats.tailHits += 1, this.stats.lastMode = "tail", setStrategyDiagnostics(fallbackEnv, {
22566
22672
  area: "stream",
@@ -22577,26 +22683,28 @@ var StreamParser = class {
22577
22683
  maxChunkLines: useLines,
22578
22684
  fenceAware: recommendation?.fenceAware ?? chunkFenceAware,
22579
22685
  maxChunks: useMaxChunks
22580
- });
22581
- return this.cache = {
22686
+ }), globalStateReason = getParseDiagnostics(fallbackEnv)?.chunk?.globalStateDetected ?? null, cache$1 = this.setCache({
22582
22687
  src,
22583
22688
  tokens,
22584
22689
  env: fallbackEnv,
22585
22690
  lineCount: srcLineCount2,
22586
22691
  lastSegment: void 0,
22587
- globalStateReason: detectGlobalMarkdownState(src)
22588
- }, this.updateCacheLineCount(this.cache, srcLineCount2), this.recordChunkedParseResult(fallbackEnv, wantsChunking ? "explicit-fallback-large-doc" : "default-fallback-large-doc"), tokens;
22692
+ globalStateReason
22693
+ }, md);
22694
+ return this.updateCacheLineCount(cache$1, srcLineCount2), this.recordChunkedParseResult(fallbackEnv, wantsChunking ? "explicit-fallback-large-doc" : "default-fallback-large-doc"), tokens;
22589
22695
  }
22590
22696
  }
22591
22697
  let parsed = this.parseFullDocument(src, fallbackEnv, md, srcLineCount2), nextTokens = parsed.tokens;
22592
- return srcLineCount2 = parsed.lineCount, this.cache = {
22698
+ srcLineCount2 = parsed.lineCount;
22699
+ let cache = this.setCache({
22593
22700
  src,
22594
22701
  tokens: nextTokens,
22595
22702
  env: fallbackEnv,
22596
22703
  lineCount: srcLineCount2,
22597
22704
  lastSegment: void 0,
22598
- globalStateReason: detectGlobalMarkdownState(src)
22599
- }, this.updateCacheLineCount(this.cache, srcLineCount2), this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(fallbackEnv, {
22705
+ globalStateReason: parsed.globalStateReason
22706
+ }, md);
22707
+ return this.updateCacheLineCount(cache, srcLineCount2), this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(fallbackEnv, {
22600
22708
  area: "stream",
22601
22709
  path: "stream-full",
22602
22710
  reason: "fallback-full",
@@ -22622,11 +22730,10 @@ var StreamParser = class {
22622
22730
  });
22623
22731
  }
22624
22732
  parseFullDocument(src, env, md, knownLineCount, needLineCount = !0) {
22625
- let currentGlobalStateReason = detectGlobalMarkdownState(src);
22626
22733
  getKnownGlobalMarkdownState(env) && resetKnownGlobalMarkdownState(env);
22627
22734
  let autoUnboundedDecision = typeof md.__canUseImplicitLargeInputStrategy != "function" || md.__canUseImplicitLargeInputStrategy() ? getAutoUnboundedDecision(md, src.length, knownLineCount) : "no";
22628
22735
  if (autoUnboundedDecision === "yes") {
22629
- let tokens = parseStringUnbounded(md, src, env);
22736
+ let tokens = parseStringUnbounded(md, src, env), globalStateReason = getParseDiagnostics(env)?.unbounded?.globalStateDetected ?? null;
22630
22737
  return setStrategyDiagnostics(env, {
22631
22738
  area: "stream",
22632
22739
  path: "stream-full",
@@ -22634,12 +22741,13 @@ var StreamParser = class {
22634
22741
  unbounded: !0
22635
22742
  }), {
22636
22743
  tokens,
22637
- lineCount: knownLineCount ?? (needLineCount ? countLines(src) : 0)
22744
+ lineCount: knownLineCount ?? (needLineCount ? countLines(src) : 0),
22745
+ globalStateReason
22638
22746
  };
22639
22747
  }
22640
22748
  let lineCount = knownLineCount;
22641
22749
  if (autoUnboundedDecision === "need-lines" && (lineCount = countLines(src), shouldAutoUseUnbounded(md, src.length, lineCount))) {
22642
- let tokens = parseStringUnbounded(md, src, env);
22750
+ let tokens = parseStringUnbounded(md, src, env), globalStateReason = getParseDiagnostics(env)?.unbounded?.globalStateDetected ?? null;
22643
22751
  return setStrategyDiagnostics(env, {
22644
22752
  area: "stream",
22645
22753
  path: "stream-full",
@@ -22647,12 +22755,16 @@ var StreamParser = class {
22647
22755
  unbounded: !0
22648
22756
  }), {
22649
22757
  tokens,
22650
- lineCount
22758
+ lineCount,
22759
+ globalStateReason
22651
22760
  };
22652
22761
  }
22653
- return lineCount === void 0 && (lineCount = needLineCount ? countLines(src) : 0), {
22762
+ lineCount === void 0 && (lineCount = needLineCount ? countLines(src) : 0);
22763
+ let currentGlobalStateReason = detectGlobalMarkdownState(src);
22764
+ return {
22654
22765
  tokens: runWithKnownGlobalMarkdownState(env, currentGlobalStateReason, () => this.core.parse(src, env, md).tokens),
22655
- lineCount
22766
+ lineCount,
22767
+ globalStateReason: currentGlobalStateReason
22656
22768
  };
22657
22769
  }
22658
22770
  shouldUseUnboundedAppend(src, _cached, appended) {
@@ -22660,8 +22772,8 @@ var StreamParser = class {
22660
22772
  }
22661
22773
  getAppendedSegment(cache, next, knownAppend) {
22662
22774
  let prev = cache.src;
22663
- if (knownAppend === null || knownAppend === void 0 && !next.startsWith(prev) || !prev.endsWith(`
22664
- `))
22775
+ if (knownAppend === null || knownAppend === void 0 && !next.startsWith(prev) || (knownAppend !== void 0 ? !this.ensureBoundaryState(cache).endsWithNewline : !prev.endsWith(`
22776
+ `)))
22665
22777
  return null;
22666
22778
  let segment = knownAppend ?? next.slice(prev.length);
22667
22779
  if (!segment)
@@ -22678,47 +22790,69 @@ var StreamParser = class {
22678
22790
  if (trimmedFirstLine.length === 0)
22679
22791
  return null;
22680
22792
  if (/^[-=]+$/.test(trimmedFirstLine)) {
22681
- let prevWithoutTrailingNewline = prev.slice(0, -1), lastBreak = prevWithoutTrailingNewline.lastIndexOf(`
22793
+ let previousLineNonBlank;
22794
+ if (knownAppend !== void 0)
22795
+ previousLineNonBlank = this.ensureBoundaryState(cache).previousLineNonBlank;
22796
+ else {
22797
+ let prevWithoutTrailingNewline = prev.slice(0, -1), lastBreak = prevWithoutTrailingNewline.lastIndexOf(`
22682
22798
  `);
22683
- if (prevWithoutTrailingNewline.slice(lastBreak + 1).trim().length > 0)
22799
+ previousLineNonBlank = prevWithoutTrailingNewline.slice(lastBreak + 1).trim().length > 0;
22800
+ }
22801
+ if (previousLineNonBlank)
22684
22802
  return null;
22685
22803
  }
22686
- let scanStart = this.tokenMapsTrusted ? this.ensureLastSegment(cache)?.srcOffset ?? 0 : 0;
22687
- return (this.tokenMapsTrusted || this.cacheHasFenceMarker(cache)) && this.endsInsideOpenFence(prev, scanStart) || this.mayContainReferenceDefinition(segment) ? null : segment;
22804
+ if (knownAppend !== void 0) {
22805
+ let lastSegment = this.ensureLastSegment(cache);
22806
+ if (lastSegment && this.segmentHasFence(cache, lastSegment)) {
22807
+ let scanStart = this.tokenMapsTrusted ? this.ensureSegmentSourceOffset(cache, lastSegment) : 0;
22808
+ if (this.endsInsideOpenFence(prev, scanStart))
22809
+ return null;
22810
+ }
22811
+ } else {
22812
+ let scanStart = this.tokenMapsTrusted ? this.ensureLastSegment(cache)?.srcOffset ?? 0 : 0;
22813
+ if ((this.tokenMapsTrusted || this.cacheHasFenceMarker(cache)) && this.endsInsideOpenFence(prev, scanStart))
22814
+ return null;
22815
+ }
22816
+ return this.mayContainReferenceDefinition(segment) ? null : segment;
22688
22817
  }
22689
- tryTailSegmentReparse(src, cached, env, md, segmentOverride) {
22818
+ tryTailSegmentReparse(src, cached, env, md, segmentOverride, knownAppend) {
22690
22819
  let lastSegment = segmentOverride ?? this.ensureLastSegment(cached);
22691
- if (!lastSegment || lastSegment.srcOffset <= 0 && lastSegment.tokenStart <= 0)
22820
+ if (!lastSegment)
22692
22821
  return null;
22693
- let stablePrefix = cached.src.slice(0, lastSegment.srcOffset);
22694
- if (!src.startsWith(stablePrefix))
22822
+ let directAppend = knownAppend !== void 0;
22823
+ if (directAppend && this.ensureSegmentSourceOffset(cached, lastSegment), lastSegment.srcOffset <= 0 && lastSegment.tokenStart <= 0)
22695
22824
  return null;
22696
- let prevTail = cached.src.slice(lastSegment.srcOffset), nextTail = src.slice(lastSegment.srcOffset);
22825
+ if (!directAppend) {
22826
+ let stablePrefix = cached.src.slice(0, lastSegment.srcOffset);
22827
+ if (!src.startsWith(stablePrefix))
22828
+ return null;
22829
+ }
22830
+ let prevTail = directAppend ? cached.lastSegmentSource ?? cached.src.slice(lastSegment.srcOffset) : cached.src.slice(lastSegment.srcOffset), nextTail = directAppend ? prevTail + knownAppend : src.slice(lastSegment.srcOffset);
22697
22831
  if (nextTail === prevTail)
22698
22832
  return null;
22699
- let appended = src.startsWith(cached.src) ? src.slice(cached.src.length) : null, postBlockSrc = this.getNormalizedUpdatedSource(cached, src);
22833
+ let appended = directAppend ? knownAppend : src.startsWith(cached.src) ? src.slice(cached.src.length) : null, postBlockSrc = directAppend && this.tokenMapsTrusted ? src : this.getNormalizedUpdatedSource(cached, src, knownAppend);
22700
22834
  if (appended) {
22701
22835
  let merged = this.tryContainerTailAppendMerge(src, cached, env, md, lastSegment, appended, postBlockSrc);
22702
22836
  if (merged)
22703
- return merged;
22837
+ return cached.lastSegmentSource = directAppend ? nextTail : void 0, merged;
22704
22838
  }
22705
22839
  if (this.mayContainReferenceDefinition(prevTail) || this.mayContainReferenceDefinition(nextTail))
22706
22840
  return null;
22707
22841
  try {
22708
22842
  let parsedTail = this.parseAtLineOffset(nextTail, env, md, lastSegment.lineStart, postBlockSrc), tailState = parsedTail.state, localLastSegment = this.getLastSegment(tailState.tokens, nextTail, 0, tailState.tokens.length, parsedTail.mapsShifted ? 0 : void 0, parsedTail.mapsShifted ? lastSegment.lineStart : void 0);
22709
- return lastSegment.lineStart > 0 && !parsedTail.mapsShifted && this.shiftTokenLines(tailState.tokens, lastSegment.lineStart), appended ? this.updateFenceMarkerCacheForAppend(cached, appended) : cached.hasFenceMarker = void 0, cached.src = src, cached.normalizedSrc = postBlockSrc, cached.env = env, cached.globalStateReason = null, cached.globalStateCarry = void 0, cached.tokens.length = lastSegment.tokenStart, this.appendTokens(cached.tokens, tailState.tokens), cached.lineCount = lastSegment.lineStart + countLines(nextTail), localLastSegment ? cached.lastSegment = {
22843
+ return lastSegment.lineStart > 0 && !parsedTail.mapsShifted && this.shiftTokenLines(tailState.tokens, lastSegment.lineStart), appended ? directAppend ? this.updateBoundaryStateForAppend(cached, appended) : this.updateFenceMarkerCacheForAppend(cached, appended) : (cached.boundary = void 0, cached.hasFenceMarker = void 0), cached.src = src, cached.normalizedSrc = postBlockSrc, cached.env = env, cached.globalStateReason = null, (!directAppend || !appended) && (cached.globalStateCarry = void 0), cached.tokens.length = lastSegment.tokenStart, this.appendTokens(cached.tokens, tailState.tokens), cached.lineCount = lastSegment.lineStart + countLines(nextTail), localLastSegment ? (cached.lastSegment = {
22710
22844
  tokenStart: lastSegment.tokenStart + localLastSegment.tokenStart,
22711
22845
  tokenEnd: lastSegment.tokenStart + localLastSegment.tokenEnd,
22712
22846
  lineStart: parsedTail.mapsShifted ? localLastSegment.lineStart : lastSegment.lineStart + localLastSegment.lineStart,
22713
22847
  lineEnd: parsedTail.mapsShifted ? localLastSegment.lineEnd : lastSegment.lineStart + localLastSegment.lineEnd,
22714
22848
  srcOffset: lastSegment.srcOffset + localLastSegment.srcOffset
22715
- } : cached.lastSegment = null, cached.lastSegmentVerified = void 0, cached.tokens;
22849
+ }, cached.lastSegmentSource = directAppend ? nextTail.slice(localLastSegment.srcOffset) : void 0) : (cached.lastSegment = null, cached.lastSegmentSource = void 0), cached.lastSegmentVerified = void 0, cached.tokens;
22716
22850
  } catch {
22717
22851
  return null;
22718
22852
  }
22719
22853
  }
22720
22854
  tryUntrustedParagraphTailReparse(src, cached, env, md) {
22721
- if (this.endsWithBlankLine(cached.src))
22855
+ if (cached.boundary ? cached.boundary.endsWithBlankLine : this.endsWithBlankLine(cached.src))
22722
22856
  return null;
22723
22857
  let lastSegment = this.ensureLastSegment(cached);
22724
22858
  if (!lastSegment || cached.tokens[lastSegment.tokenStart]?.type !== "paragraph_open")
@@ -22749,6 +22883,7 @@ var StreamParser = class {
22749
22883
  return count;
22750
22884
  }
22751
22885
  hasVerifiedSegmentAnchor(cache, segment, md) {
22886
+ segment.srcOffset < 0 && this.ensureSegmentSourceOffset(cache, segment);
22752
22887
  let lineCount = cache.lineCount ?? countLines(cache.src), docLineCount = this.getDocLineCount(cache.src, lineCount);
22753
22888
  if (!(segment.lineStart >= 0 && segment.lineStart <= segment.lineEnd && segment.lineEnd <= docLineCount && segment.srcOffset < cache.src.length))
22754
22889
  return !1;
@@ -22775,6 +22910,10 @@ var StreamParser = class {
22775
22910
  return !1;
22776
22911
  }
22777
22912
  }
22913
+ normalizeSource(src) {
22914
+ return src.replace(/\r\n?/g, `
22915
+ `).replace(/\0/g, "\uFFFD");
22916
+ }
22778
22917
  cacheHasFenceMarker(cache) {
22779
22918
  return cache.hasFenceMarker === void 0 && (cache.hasFenceMarker = cache.src.includes("```") || cache.src.includes("~~~")), cache.hasFenceMarker;
22780
22919
  }
@@ -22784,16 +22923,12 @@ var StreamParser = class {
22784
22923
  let boundary = cache.src.slice(-2) + appended;
22785
22924
  cache.hasFenceMarker = boundary.includes("```") || boundary.includes("~~~");
22786
22925
  }
22787
- normalizeSource(src) {
22788
- return src.replace(/\r\n?/g, `
22789
- `).replace(/\0/g, "\uFFFD");
22790
- }
22791
- getNormalizedUpdatedSource(cache, next) {
22926
+ getNormalizedUpdatedSource(cache, next, knownAppend) {
22792
22927
  if (!this.normalizeLineEndings)
22793
22928
  return next;
22794
- if (!next.startsWith(cache.src))
22929
+ if (knownAppend === void 0 && !next.startsWith(cache.src))
22795
22930
  return this.normalizeSource(next);
22796
- let normalizedCached = cache.normalizedSrc ?? this.normalizeSource(cache.src), appended = next.slice(cache.src.length), normalizedAppend = this.normalizeSource(appended);
22931
+ let normalizedCached = cache.normalizedSrc ?? this.normalizeSource(cache.src), appended = knownAppend ?? next.slice(cache.src.length), normalizedAppend = this.normalizeSource(appended);
22797
22932
  return cache.src.endsWith("\r") && appended.startsWith(`
22798
22933
  `) && (normalizedAppend = normalizedAppend.slice(1)), normalizedCached + normalizedAppend;
22799
22934
  }
@@ -22880,15 +23015,26 @@ var StreamParser = class {
22880
23015
  peek() {
22881
23016
  return this.cache?.tokens ?? EMPTY_TOKENS;
22882
23017
  }
23018
+ hasCache() {
23019
+ return this.cache !== null;
23020
+ }
22883
23021
  getStats() {
22884
23022
  return { ...this.stats };
22885
23023
  }
23024
+ setCache(cache, md) {
23025
+ let snapshotState = this.cache?.snapshotState, nextCache = {
23026
+ ...cache,
23027
+ config: copyParserConfig(md),
23028
+ snapshotState
23029
+ };
23030
+ return snapshotState && (snapshotState.cache = nextCache), this.cache = nextCache, nextCache;
23031
+ }
22886
23032
  appendTokens(target, source, start = 0, end = source.length) {
22887
23033
  for (let i = start; i < end; i++)
22888
23034
  target.push(source[i]);
22889
23035
  }
22890
23036
  updateCacheLineCount(cache, lineCount) {
22891
- cache.lineCount = lineCount ?? countLines(cache.src), cache.lastSegment = void 0, cache.lastSegmentVerified = void 0, cache.normalizedSrc = void 0, cache.globalStateCarry = void 0;
23037
+ cache.lineCount = lineCount ?? countLines(cache.src), cache.lastSegment = void 0, cache.lastSegmentVerified = void 0, cache.normalizedSrc = void 0, cache.globalStateCarry = cache.src.slice(-GLOBAL_STATE_APPEND_SCAN_WINDOW), cache.boundary = void 0, cache.lastSegmentSource = void 0;
22892
23038
  }
22893
23039
  detectGlobalStateForAppend(cache, appended) {
22894
23040
  if (cache.globalStateReason)
@@ -22896,10 +23042,10 @@ var StreamParser = class {
22896
23042
  let text$1 = (cache.globalStateCarry ?? cache.src.slice(-GLOBAL_STATE_APPEND_SCAN_WINDOW)) + appended, reason = detectGlobalMarkdownState(text$1);
22897
23043
  return cache.globalStateCarry = text$1.length > GLOBAL_STATE_APPEND_SCAN_WINDOW ? text$1.slice(text$1.length - GLOBAL_STATE_APPEND_SCAN_WINDOW) : text$1, reason && (cache.globalStateReason = reason), reason;
22898
23044
  }
22899
- ensureLastSegment(cache) {
22900
- return cache.lastSegment !== void 0 || (cache.lastSegment = this.getLastSegment(cache.tokens, cache.src)), cache.lastSegment;
23045
+ ensureLastSegment(cache, skipSourceOffset = !1) {
23046
+ return cache.lastSegment !== void 0 || (cache.lastSegment = this.getLastSegment(cache.tokens, cache.src, 0, cache.tokens.length, void 0, void 0, skipSourceOffset)), cache.lastSegment;
22901
23047
  }
22902
- getLastSegment(tokens, src, tokenStart = 0, tokenEnd = tokens.length, knownSrcOffset, knownLineStart) {
23048
+ getLastSegment(tokens, src, tokenStart = 0, tokenEnd = tokens.length, knownSrcOffset, knownLineStart, skipSourceOffset = !1) {
22903
23049
  if (tokenEnd <= tokenStart)
22904
23050
  return null;
22905
23051
  let lineStart = Number.POSITIVE_INFINITY, lineEnd$2 = -1, depth = 0;
@@ -22917,7 +23063,7 @@ var StreamParser = class {
22917
23063
  tokenEnd,
22918
23064
  lineStart: resolvedStart,
22919
23065
  lineEnd: resolvedEnd,
22920
- srcOffset: this.getLineStartOffset(src, resolvedStart, knownSrcOffset, knownLineStart)
23066
+ srcOffset: skipSourceOffset ? -1 : this.getLineStartOffset(src, resolvedStart, knownSrcOffset, knownLineStart)
22921
23067
  };
22922
23068
  }
22923
23069
  continue;
@@ -22929,12 +23075,38 @@ var StreamParser = class {
22929
23075
  tokenEnd,
22930
23076
  lineStart: resolvedStart,
22931
23077
  lineEnd: resolvedEnd,
22932
- srcOffset: this.getLineStartOffset(src, resolvedStart, knownSrcOffset, knownLineStart)
23078
+ srcOffset: skipSourceOffset ? -1 : this.getLineStartOffset(src, resolvedStart, knownSrcOffset, knownLineStart)
22933
23079
  };
22934
23080
  }
22935
23081
  }
22936
23082
  return null;
22937
23083
  }
23084
+ segmentHasFence(cache, segment) {
23085
+ let end = Math.min(segment.tokenEnd, cache.tokens.length);
23086
+ for (let i = segment.tokenStart; i < end; i++)
23087
+ if (cache.tokens[i].type === "fence")
23088
+ return !0;
23089
+ return !1;
23090
+ }
23091
+ ensureSegmentSourceOffset(cache, segment) {
23092
+ if (segment.srcOffset < 0) {
23093
+ let lineCount = cache.lineCount;
23094
+ segment.srcOffset = lineCount !== void 0 && segment.lineStart <= lineCount && segment.lineEnd <= lineCount + 1 ? this.getLineStartOffsetFromEnd(cache.src, segment.lineStart, lineCount) : this.getLineStartOffset(cache.src, segment.lineStart);
23095
+ }
23096
+ return segment.srcOffset;
23097
+ }
23098
+ getLineStartOffsetFromEnd(src, line, lineCount) {
23099
+ if (line <= 0)
23100
+ return 0;
23101
+ let remaining = lineCount - line + 1, pos = src.length;
23102
+ for (; remaining > 0; ) {
23103
+ if (pos = src.lastIndexOf(`
23104
+ `, pos - 1), pos < 0)
23105
+ return 0;
23106
+ remaining--;
23107
+ }
23108
+ return pos + 1;
23109
+ }
22938
23110
  getLineStartOffset(src, line, knownSrcOffset, knownLineStart) {
22939
23111
  return knownSrcOffset !== void 0 && knownLineStart !== void 0 && line >= knownLineStart ? this.getLineStartOffsetFrom(src, knownSrcOffset, line - knownLineStart) : this.getLineStartOffsetFrom(src, 0, line);
22940
23112
  }
@@ -22961,7 +23133,7 @@ var StreamParser = class {
22961
23133
  return src.includes("]:") ? /(?:^|\n)[ \t]{0,3}\[[^\]\n]+\]:/.test(src) : !1;
22962
23134
  }
22963
23135
  canDirectlyParseAppend(cache) {
22964
- if (!this.tokenMapsTrusted || !this.endsWithBlankLine(cache.src))
23136
+ if (!this.tokenMapsTrusted || !(cache.boundary ? cache.boundary.endsWithBlankLine : this.endsWithBlankLine(cache.src)))
22965
23137
  return !1;
22966
23138
  let lastSegment = this.ensureLastSegment(cache);
22967
23139
  if (!lastSegment)
@@ -22994,8 +23166,9 @@ var StreamParser = class {
22994
23166
  }
22995
23167
  }
22996
23168
  tryListTailAppendMerge(src, cached, env, md, lastSegment, appended, listOpen, postBlockSrc) {
22997
- if (cached.src.length === 0 || cached.src.charCodeAt(cached.src.length - 1) !== 10)
23169
+ if (cached.src.length === 0 || !(cached.boundary ? cached.boundary.endsWithNewline : cached.src.charCodeAt(cached.src.length - 1) === 10))
22998
23170
  return null;
23171
+ this.ensureSegmentSourceOffset(cached, lastSegment);
22999
23172
  let segmentLineSpan = lastSegment.lineEnd - lastSegment.lineStart, segmentChars = cached.src.length - lastSegment.srcOffset;
23000
23173
  if (segmentLineSpan < this.MIN_LIST_LINES_FOR_MERGE && segmentChars < this.MIN_LIST_CHARS_FOR_MERGE)
23001
23174
  return null;
@@ -23013,10 +23186,10 @@ var StreamParser = class {
23013
23186
  return null;
23014
23187
  lineOffset > 0 && !mapsShifted && this.shiftTokenLines(inserted, lineOffset);
23015
23188
  let existingMode = this.getListParagraphMode(cached.tokens, lastSegment.tokenStart, cached.tokens.length, listOpen.level), appendedMode = this.getListParagraphMode(parsed, 0, parsed.length, 0);
23016
- (existingMode === "loose" || appendedMode === "loose" || this.endsWithBlankLine(cached.src) || (parsed[0]?.map?.[0] ?? 0) - (mapsShifted ? lineOffset : 0) > 0) && (this.setListParagraphVisibility(cached.tokens, lastSegment.tokenStart, cached.tokens.length, listOpen.level, !1), this.setListParagraphVisibility(inserted, 0, inserted.length, listOpen.level, !1)), cached.tokens.splice(cached.tokens.length - 1, 0, ...inserted), this.updateFenceMarkerCacheForAppend(cached, appended), cached.src = src, cached.normalizedSrc = postBlockSrc, cached.env = env, cached.globalStateReason = null;
23189
+ (existingMode === "loose" || appendedMode === "loose" || (cached.boundary ? cached.boundary.endsWithBlankLine : this.endsWithBlankLine(cached.src)) || (parsed[0]?.map?.[0] ?? 0) - (mapsShifted ? lineOffset : 0) > 0) && (this.setListParagraphVisibility(cached.tokens, lastSegment.tokenStart, cached.tokens.length, listOpen.level, !1), this.setListParagraphVisibility(inserted, 0, inserted.length, listOpen.level, !1)), cached.tokens.splice(cached.tokens.length - 1, 0, ...inserted), cached.boundary ? this.updateBoundaryStateForAppend(cached, appended) : this.updateFenceMarkerCacheForAppend(cached, appended), cached.src = src, cached.normalizedSrc = postBlockSrc, cached.env = env, cached.globalStateReason = null;
23017
23190
  let nextLineCount = lineOffset + countLines(appended);
23018
23191
  cached.lineCount = nextLineCount;
23019
- let nextDocLineCount = this.getDocLineCount(src, nextLineCount);
23192
+ let nextDocLineCount = this.getCachedDocLineCount(cached, nextLineCount);
23020
23193
  return listOpen.map && (listOpen.map[1] = nextDocLineCount), cached.lastSegment = {
23021
23194
  tokenStart: lastSegment.tokenStart,
23022
23195
  tokenEnd: cached.tokens.length,
@@ -23026,8 +23199,9 @@ var StreamParser = class {
23026
23199
  }, cached.lastSegmentVerified = !0, cached.tokens;
23027
23200
  }
23028
23201
  tryTableTailAppendMerge(src, cached, env, md, lastSegment, appended, tableOpen, postBlockSrc) {
23029
- if (cached.src.length === 0 || cached.src.charCodeAt(cached.src.length - 1) !== 10 || /(?:^|\n)[ \t]*\n/.test(appended))
23202
+ if (cached.src.length === 0 || !(cached.boundary ? cached.boundary.endsWithNewline : cached.src.charCodeAt(cached.src.length - 1) === 10) || /(?:^|\n)[ \t]*\n/.test(appended))
23030
23203
  return null;
23204
+ this.ensureSegmentSourceOffset(cached, lastSegment);
23031
23205
  let segmentLineSpan = lastSegment.lineEnd - lastSegment.lineStart, segmentChars = cached.src.length - lastSegment.srcOffset;
23032
23206
  if (segmentLineSpan < this.MIN_TABLE_LINES_FOR_MERGE && segmentChars < this.MIN_TABLE_CHARS_FOR_MERGE)
23033
23207
  return null;
@@ -23051,10 +23225,10 @@ var StreamParser = class {
23051
23225
  return null;
23052
23226
  lineOffset !== 0 && !mapsShifted && this.shiftTokenLines(inserted, lineOffset);
23053
23227
  let insertAt = cachedSection.tbodyCloseIndex >= 0 ? cachedSection.tbodyCloseIndex : cachedSection.tableCloseIndex, previousLineCount = cached.lineCount ?? countLines(cached.src);
23054
- cached.tokens.splice(insertAt, 0, ...inserted), this.updateFenceMarkerCacheForAppend(cached, appended), cached.src = src, cached.normalizedSrc = postBlockSrc, cached.env = env, cached.globalStateReason = null;
23228
+ cached.tokens.splice(insertAt, 0, ...inserted), cached.boundary ? this.updateBoundaryStateForAppend(cached, appended) : this.updateFenceMarkerCacheForAppend(cached, appended), cached.src = src, cached.normalizedSrc = postBlockSrc, cached.env = env, cached.globalStateReason = null;
23055
23229
  let nextLineCount = previousLineCount + countLines(appended);
23056
23230
  cached.lineCount = nextLineCount;
23057
- let nextDocLineCount = this.getDocLineCount(src, nextLineCount);
23231
+ let nextDocLineCount = this.getCachedDocLineCount(cached, nextLineCount);
23058
23232
  if (tableOpen.map && (tableOpen.map[1] = nextDocLineCount), cachedSection.tbodyOpenIndex >= 0) {
23059
23233
  let tbodyOpen = cached.tokens[cachedSection.tbodyOpenIndex];
23060
23234
  tbodyOpen?.map && (tbodyOpen.map[1] = nextDocLineCount);
@@ -23161,7 +23335,7 @@ var StreamParser = class {
23161
23335
  case "paragraph_open":
23162
23336
  case "code_block":
23163
23337
  case "html_block":
23164
- return !this.endsWithBlankLine(cache.src);
23338
+ return !(cache.boundary ? cache.boundary.endsWithBlankLine : this.endsWithBlankLine(cache.src));
23165
23339
  default:
23166
23340
  return lastToken?.nesting === 1;
23167
23341
  }
@@ -23181,9 +23355,41 @@ var StreamParser = class {
23181
23355
  }
23182
23356
  return !0;
23183
23357
  }
23358
+ ensureBoundaryState(cache) {
23359
+ if (cache.boundary)
23360
+ return cache.boundary;
23361
+ let src = cache.src, len = src.length, endsWithNewline = len > 0 && src.charCodeAt(len - 1) === 10, lineEnd$2 = endsWithNewline ? len - 1 : len, lineStart = lineEnd$2 - 1;
23362
+ for (; lineStart >= 0 && src.charCodeAt(lineStart) !== 10; )
23363
+ lineStart--;
23364
+ let lineNonBlank = !1;
23365
+ for (let i = lineStart + 1; i < lineEnd$2; i++) {
23366
+ let ch = src.charCodeAt(i);
23367
+ if (ch !== 32 && ch !== 9) {
23368
+ lineNonBlank = !0;
23369
+ break;
23370
+ }
23371
+ }
23372
+ return cache.boundary = {
23373
+ currentLineNonBlank: endsWithNewline ? !1 : lineNonBlank,
23374
+ previousLineNonBlank: endsWithNewline ? lineNonBlank : !1,
23375
+ endsWithNewline,
23376
+ endsWithBlankLine: this.endsWithBlankLine(src)
23377
+ }, cache.boundary;
23378
+ }
23379
+ updateBoundaryStateForAppend(cache, appended) {
23380
+ let boundary = this.ensureBoundaryState(cache), currentLineNonBlank = boundary.currentLineNonBlank, previousLineNonBlank = boundary.previousLineNonBlank;
23381
+ for (let i = 0; i < appended.length; i++) {
23382
+ let ch = appended.charCodeAt(i);
23383
+ ch === 10 ? (previousLineNonBlank = currentLineNonBlank, currentLineNonBlank = !1) : ch !== 32 && ch !== 9 && (currentLineNonBlank = !0);
23384
+ }
23385
+ boundary.currentLineNonBlank = currentLineNonBlank, boundary.previousLineNonBlank = previousLineNonBlank, boundary.endsWithNewline = appended.length > 0 ? appended.charCodeAt(appended.length - 1) === 10 : boundary.endsWithNewline, boundary.endsWithBlankLine = cache.src.length + appended.length >= 2 && boundary.endsWithNewline && !previousLineNonBlank;
23386
+ }
23184
23387
  getDocLineCount(src, lineCount = countLines(src)) {
23185
23388
  return src.length === 0 ? 0 : src.charCodeAt(src.length - 1) === 10 ? lineCount : lineCount + 1;
23186
23389
  }
23390
+ getCachedDocLineCount(cache, lineCount) {
23391
+ return cache.src.length === 0 ? 0 : cache.boundary ? cache.boundary.endsWithNewline ? lineCount : lineCount + 1 : this.getDocLineCount(cache.src, lineCount);
23392
+ }
23187
23393
  shiftTokenLines(tokens, offset) {
23188
23394
  if (offset === 0)
23189
23395
  return;
@@ -23570,9 +23776,25 @@ function markdownIt(presetName, options) {
23570
23776
  parse(src, env) {
23571
23777
  return md.stream.enabled ? getStreamParser().parse(src, env, md) : md.parse(src, env ?? {});
23572
23778
  },
23779
+ append(segment, env) {
23780
+ if (!md.stream.enabled)
23781
+ throw new Error("Stream append requires stream mode");
23782
+ return getStreamParser().append(segment, env, md);
23783
+ },
23784
+ snapshot() {
23785
+ return streamParser ? streamParser.snapshot() : null;
23786
+ },
23787
+ restore(snapshot) {
23788
+ if (!md.stream.enabled)
23789
+ throw new Error("Stream restore requires stream mode");
23790
+ return getStreamParser().restore(snapshot, md);
23791
+ },
23573
23792
  reset() {
23574
23793
  getStreamParser().reset();
23575
23794
  },
23795
+ hasCache() {
23796
+ return streamParser?.hasCache() ?? !1;
23797
+ },
23576
23798
  peek() {
23577
23799
  return streamParser ? streamParser.peek() : [];
23578
23800
  },
@@ -24125,9 +24347,9 @@ function applyContainers(md) {
24125
24347
  function escapeTagForRegExp(tag) {
24126
24348
  return tag.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
24127
24349
  }
24128
- function findTagCloseIndexOutsideQuotes(input) {
24350
+ function findTagCloseIndexOutsideQuotes(input, start = 0) {
24129
24351
  let inSingle = !1, inDouble = !1;
24130
- for (let i = 0; i < input.length; i++) {
24352
+ for (let i = start; i < input.length; i++) {
24131
24353
  let ch = input[i];
24132
24354
  if (ch === "\\") {
24133
24355
  i++;
@@ -24998,7 +25220,7 @@ function createChildParseContext(parent, options = parent, overrides = {}) {
24998
25220
  ...overrides
24999
25221
  });
25000
25222
  }
25001
- var FILENAMEISH_EXTENSION_RE = /\.([a-z0-9]{1,15})$/i, FILENAMEISH_SEGMENT_RE = /[_()[\]{}<>]/u, URL_PREFIX_HINT_RE = /^(?:https?:\/\/|ftp:\/\/|mailto:|www\.)/i, URL_QUERY_OR_AUTH_HINT_RE = /[?#@]/u, PATH_SEPARATOR_RE = /[\\/]/u, DOMAINISH_TEXT_RE = /^[\p{L}\p{N}./\\-]+$/u, DOMAIN_LABEL_RE = /^[A-Za-z0-9-]{1,63}$/u, PUNYCODE_TLD_RE = /^xn--[a-z0-9-]{2,59}$/i, MARKET_TICKER_SYMBOL_RE = /^(?:[A-Z]{1,6}|\d{1,8})$/u, MARKET_TICKER_CONTEXT_SYMBOL_RE = /^(?=.{1,12}$)[A-Z0-9]+(?:[-.][A-Z0-9]+)*$/iu, EXPLICIT_FILENAME_CONTEXT_RE = /文件名\s*[::]?|附件\s*[::]?|路径\s*[::]?|路徑\s*[::]?|文件列表\s*[::]?|文档列表\s*[::]?|文檔列表\s*[::]?|\bfile\s*names?\b\s*[::]?|\battachments?\b\s*[::]?|\bpaths?\b\s*[::]?|\bfile\s+lists?\b\s*[::]?|\bdocument\s+lists?\b\s*[::]?/iu, FILENAME_CONTEXT_RE = /文件名\s*[::]?|文件\s*[::]?|附件\s*[::]?|档案\s*[::]?|檔案\s*[::]?|文档\s*[::]?|文檔\s*[::]?|资料\s*[::]?|資料\s*[::]?|路径\s*[::]?|路徑\s*[::]?|\bfile\s*name\b\s*[::]?|\battachments?\b\s*[::]?|\bfiles?\b\s*[::]?|\bdocuments?\b\s*[::]?|\bdocs?\b\s*[::]?|\bpaths?\b\s*[::]?/iu, MARKET_TICKER_CONTEXT_RE = /股票代码|股票代碼|证券代码|證券代碼|(?:代码|代碼|交易所|后缀|後綴|市场|市場)(?=$|[\s::/|,,、()()])|\btickers?\b|\bsymbols?\b|\bexchanges?\b/iu, LINKIFY_DEMOTION_CONTEXT_CACHE_LIMIT = 2e3, LINKIFY_DEMOTION_CONTEXT_CACHE_MAX_TEXT_LENGTH = 512, EMPTY_LINKIFY_DEMOTION_CONTEXT = {}, AMBIGUOUS_BARE_DOMAIN_EXTENSIONS = /* @__PURE__ */ new Set([
25223
+ var FILENAMEISH_EXTENSION_RE = /\.([a-z0-9]{1,15})$/i, FILENAMEISH_SEGMENT_RE = /[_()[\]{}<>]/u, URL_PREFIX_HINT_RE = /^(?:https?:\/\/|ftp:\/\/|mailto:|www\.)/i, URL_QUERY_OR_AUTH_HINT_RE = /[?#@]/u, PATH_SEPARATOR_RE = /[\\/]/u, DOMAINISH_TEXT_RE = /^[\p{L}\p{N}./\\-]+$/u, DOMAIN_LABEL_RE = /^[A-Za-z0-9-]{1,63}$/u, PUNYCODE_TLD_RE = /^xn--[a-z0-9-]{2,59}$/i, MARKET_TICKER_SYMBOL_RE = /^(?:[A-Z]{1,6}|\d{1,8})$/u, MARKET_TICKER_CONTEXT_SYMBOL_RE = /^(?=.{1,12}$)[A-Z0-9]+(?:[-.][A-Z0-9]+)*$/iu, EXPLICIT_FILENAME_CONTEXT_RE = /文件名\s*[::]?|附件\s*[::]?|路径\s*[::]?|路徑\s*[::]?|文件列表\s*[::]?|文档列表\s*[::]?|文檔列表\s*[::]?|\bfile\s*names?\b\s*[::]?|\battachments?\b\s*[::]?|\bpaths?\b\s*[::]?|\bfile\s+lists?\b\s*[::]?|\bdocument\s+lists?\b\s*[::]?/iu, FILENAME_CONTEXT_RE = /文件名\s*[::]?|文件\s*[::]?|附件\s*[::]?|档案\s*[::]?|檔案\s*[::]?|文档\s*[::]?|文檔\s*[::]?|资料\s*[::]?|資料\s*[::]?|路径\s*[::]?|路徑\s*[::]?|\bfile\s*name\b\s*[::]?|\battachments?\b\s*[::]?|\bfiles?\b\s*[::]?|\bdocuments?\b\s*[::]?|\bdocs?\b\s*[::]?|\bpaths?\b\s*[::]?/iu, MARKET_TICKER_CONTEXT_RE = /股票代码|股票代碼|证券代码|證券代碼|(?:代码|代碼|交易所|后缀|後綴|市场|市場)(?=$|[\s::/|,,、()()])|\btickers?\b|\bsymbols?\b|\bexchanges?\b/iu, LINKIFY_DEMOTION_CONTEXT_CACHE_LIMIT = 2e3, LINKIFY_DEMOTION_CONTEXT_CACHE_MAX_TEXT_LENGTH = 16384, LINKIFY_DEMOTION_CONTEXT_CACHE_MAX_TOTAL_TEXT_LENGTH = 512 * LINKIFY_DEMOTION_CONTEXT_CACHE_LIMIT, EMPTY_LINKIFY_DEMOTION_CONTEXT = {}, AMBIGUOUS_BARE_DOMAIN_EXTENSIONS = /* @__PURE__ */ new Set([
25002
25224
  "ai",
25003
25225
  "md",
25004
25226
  "py",
@@ -25118,15 +25340,15 @@ var FILENAMEISH_EXTENSION_RE = /\.([a-z0-9]{1,15})$/i, FILENAMEISH_SEGMENT_RE =
25118
25340
  "yml",
25119
25341
  "zip",
25120
25342
  "zsh"
25121
- ]), linkifyDemotionContextCache = /* @__PURE__ */ new Map();
25343
+ ]), linkifyDemotionContextCache = /* @__PURE__ */ new Map(), linkifyDemotionContextCacheTextLength = 0;
25122
25344
  function rememberLinkifyDemotionContext(text$1, context) {
25123
25345
  if (!text$1 || text$1.length > LINKIFY_DEMOTION_CONTEXT_CACHE_MAX_TEXT_LENGTH)
25124
25346
  return context;
25125
- for (linkifyDemotionContextCache.set(text$1, context); linkifyDemotionContextCache.size > LINKIFY_DEMOTION_CONTEXT_CACHE_LIMIT; ) {
25347
+ for (linkifyDemotionContextCache.has(text$1) || (linkifyDemotionContextCacheTextLength += text$1.length), linkifyDemotionContextCache.set(text$1, context); linkifyDemotionContextCache.size > LINKIFY_DEMOTION_CONTEXT_CACHE_LIMIT || linkifyDemotionContextCacheTextLength > LINKIFY_DEMOTION_CONTEXT_CACHE_MAX_TOTAL_TEXT_LENGTH; ) {
25126
25348
  let oldestKey = linkifyDemotionContextCache.keys().next().value;
25127
25349
  if (!oldestKey)
25128
25350
  break;
25129
- linkifyDemotionContextCache.delete(oldestKey);
25351
+ linkifyDemotionContextCache.delete(oldestKey), linkifyDemotionContextCacheTextLength -= oldestKey.length;
25130
25352
  }
25131
25353
  return context;
25132
25354
  }
@@ -25174,7 +25396,7 @@ function inferContinuationLinkifyContext(raw, inherited) {
25174
25396
  })) && (continuation.filename = !0), inherited?.explicitFilename && continuation.filename && (continuation.explicitFilename = !0), inherited?.marketTicker && parts.every((part) => shouldDemoteFilenameLikeLinkify(part, { marketTicker: !0 })) && (continuation.marketTicker = !0), hasLinkifyDemotionContext(continuation) ? continuation : void 0;
25175
25397
  }
25176
25398
  function createLinkifyDemotionContextTracker(options, sticky = !1) {
25177
- let context;
25399
+ let context = ensureParseContext(options).linkifyDemotionSeedContext;
25178
25400
  return {
25179
25401
  options(raw) {
25180
25402
  return sticky || raw == null ? withLinkifyDemotionContext(options, context) : withLinkifyDemotionContext(options, mergeLinkifyDemotionContext(inferNextBlockLinkifyContext(raw), inferContinuationLinkifyContext(raw, context)));
@@ -25185,6 +25407,9 @@ function createLinkifyDemotionContextTracker(options, sticky = !1) {
25185
25407
  },
25186
25408
  reset() {
25187
25409
  context = void 0;
25410
+ },
25411
+ snapshot() {
25412
+ return context;
25188
25413
  }
25189
25414
  };
25190
25415
  }
@@ -25221,11 +25446,11 @@ function mayContainLinkifyDemotionContext(text$1) {
25221
25446
  }
25222
25447
  function inferLinkifyDemotionContext(contextText) {
25223
25448
  let text$1 = String(contextText ?? ""), cached = linkifyDemotionContextCache.get(text$1);
25224
- return cached ? (linkifyDemotionContextCache.delete(text$1), linkifyDemotionContextCache.set(text$1, cached), cached) : mayContainLinkifyDemotionContext(text$1) ? rememberLinkifyDemotionContext(text$1, {
25449
+ return cached || (mayContainLinkifyDemotionContext(text$1) ? rememberLinkifyDemotionContext(text$1, {
25225
25450
  explicitFilename: EXPLICIT_FILENAME_CONTEXT_RE.test(text$1),
25226
25451
  filename: FILENAME_CONTEXT_RE.test(text$1),
25227
25452
  marketTicker: MARKET_TICKER_CONTEXT_RE.test(text$1)
25228
- }) : rememberLinkifyDemotionContext(text$1, EMPTY_LINKIFY_DEMOTION_CONTEXT);
25453
+ }) : rememberLinkifyDemotionContext(text$1, EMPTY_LINKIFY_DEMOTION_CONTEXT));
25229
25454
  }
25230
25455
  function hasDomainAuthorityPrefix(text$1) {
25231
25456
  return isPlausibleBareDomain(text$1.split(/[\\/]/)[0] ?? "");
@@ -25730,7 +25955,7 @@ function fixStrongTokens(tokens) {
25730
25955
  for (; k < tokens.length && tokens[k].type === "text" && tokens[k].content === ""; )
25731
25956
  k++;
25732
25957
  let postToken = tokens[k];
25733
- markup === "__" && (preToken?.content?.endsWith("_") || postToken?.content?.startsWith("_") || postToken?.markup?.includes("_")) && (t.type = "text", t.tag = "", t.content = markup, t.raw = markup, t.markup = "", t.attrs = null, t.map = null, t.info = "", t.meta = null, cleansStrong.add(strongIndex));
25958
+ markup === "__" && (preToken?.content?.endsWith("_") || postToken?.content?.startsWith("_")) && (t.type = "text", t.tag = "", t.content = markup, t.raw = markup, t.markup = "", t.attrs = null, t.map = null, t.info = "", t.meta = null, cleansStrong.add(strongIndex));
25734
25959
  } else if (type === "strong_close")
25735
25960
  cleansStrong.has(strongIndex) && t.markup === "__" && (t.type = "text", t.content = t.markup, t.raw = String(t.markup ?? ""), t.tag = "", t.markup = "", t.attrs = null, t.map = null, t.info = "", t.meta = null), strongIndex--, strongIndex < 0 && (strongIndex = 0);
25736
25961
  else if (type === "em_open") {
@@ -25742,7 +25967,7 @@ function fixStrongTokens(tokens) {
25742
25967
  for (; k < tokens.length && tokens[k].type === "text" && tokens[k].content === ""; )
25743
25968
  k++;
25744
25969
  let postToken = tokens[k];
25745
- markup === "_" && (preToken?.content?.endsWith("_") || postToken?.content?.startsWith("_") || postToken?.markup?.includes("_")) && (t.type = "text", t.tag = "", t.content = markup, t.raw = markup, t.markup = "", t.attrs = null, t.map = null, t.info = "", t.meta = null, cleansEm.add(emIndex));
25970
+ markup === "_" && (preToken?.content?.endsWith("_") || postToken?.content?.startsWith("_")) && (t.type = "text", t.tag = "", t.content = markup, t.raw = markup, t.markup = "", t.attrs = null, t.map = null, t.info = "", t.meta = null, cleansEm.add(emIndex));
25746
25971
  } else
25747
25972
  type === "em_close" && (cleansEm.has(emIndex) && t.markup === "_" && (t.type = "text", t.content = t.markup, t.raw = String(t.markup ?? ""), t.tag = "", t.markup = "", t.attrs = null, t.map = null, t.info = "", t.meta = null), emIndex--, emIndex < 0 && (emIndex = 0));
25748
25973
  }
@@ -26051,36 +26276,35 @@ function hasTrailingPipeHeaderRowWithoutColon(line) {
26051
26276
  return cells !== null && cells.every((cell) => !cell.includes(":"));
26052
26277
  }
26053
26278
  function fixTableTokens(tokens, final = !1, source = "") {
26054
- let fixedTokens = [...tokens];
26055
26279
  if (tokens.length < 3)
26056
- return fixedTokens;
26280
+ return tokens;
26057
26281
  let i = tokens.length - 2, token = tokens[i];
26058
- if (token.type === "inline") {
26059
- let sourceMap = tokens[i - 1]?.map, tcontent = String(token.content ?? ""), headerContent = tcontent.split(`
26282
+ if (token.type !== "inline")
26283
+ return tokens;
26284
+ let sourceMap = tokens[i - 1]?.map, tcontent = String(token.content ?? ""), headerContent = tcontent.split(`
26060
26285
  `)[0] ?? "", [headerLine = "", separatorLine = "", ...rest] = tcontent.split(`
26061
26286
  `), hasTrailingNewlineSeparatorStart = !final && !tcontent.includes(`
26062
- `) && /\r?\n$/.test(source) && hasTrailingPipeHeaderRow(tcontent);
26063
- if (!final && (tcontent.includes(`
26287
+ `) && /\r?\n$/.test(source) && hasTrailingPipeHeaderRow(tcontent), fixedTokens = null;
26288
+ if (!final && (tcontent.includes(`
26064
26289
  `) && rest.length === 0 && hasTrailingPipeHeaderRow(headerLine) && isTableSeparatorRowWithPartialTail(separatorLine) || hasTrailingNewlineSeparatorStart)) {
26065
- let body = headerContent.slice(1, -1).split("|").map((i$1) => i$1.trim()).flatMap((i$1) => createTh(i$1)), insert = [
26066
- ...createStart(sourceMap),
26067
- ...body,
26068
- ...createEnd()
26069
- ];
26070
- fixedTokens.splice(i - 1, 3, ...insert);
26071
- } else if (tcontent.includes(`
26290
+ let body = headerContent.slice(1, -1).split("|").map((i$1) => i$1.trim()).flatMap((i$1) => createTh(i$1)), insert = [
26291
+ ...createStart(sourceMap),
26292
+ ...body,
26293
+ ...createEnd()
26294
+ ];
26295
+ fixedTokens = [...tokens], fixedTokens.splice(i - 1, 3, ...insert);
26296
+ } else if (tcontent.includes(`
26072
26297
  `) && rest.length === 0 && hasTrailingPipeHeaderRow(headerLine) && isTableSeparatorRow(separatorLine)) {
26073
- let body = headerContent.slice(1, -1).split("|").map((i$1) => i$1.trim()).flatMap((i$1) => createTh(i$1)), insert = [
26074
- ...createStart(sourceMap),
26075
- ...body,
26076
- ...createEnd()
26077
- ];
26078
- fixedTokens.splice(i - 1, 3, ...insert);
26079
- } else
26080
- tcontent.includes(`
26081
- `) && rest.length === 0 && hasTrailingPipeHeaderRowWithoutColon(headerLine) && isTruncatedSeparatorRow(separatorLine) && (token.content = tcontent.slice(0, -2), token.children.splice(2, 1));
26082
- }
26083
- return fixedTokens;
26298
+ let body = headerContent.slice(1, -1).split("|").map((i$1) => i$1.trim()).flatMap((i$1) => createTh(i$1)), insert = [
26299
+ ...createStart(sourceMap),
26300
+ ...body,
26301
+ ...createEnd()
26302
+ ];
26303
+ fixedTokens = [...tokens], fixedTokens.splice(i - 1, 3, ...insert);
26304
+ } else if (tcontent.includes(`
26305
+ `) && rest.length === 0 && hasTrailingPipeHeaderRowWithoutColon(headerLine) && isTruncatedSeparatorRow(separatorLine))
26306
+ return token.content = tcontent.slice(0, -2), token.children.splice(2, 1), tokens;
26307
+ return fixedTokens ?? tokens;
26084
26308
  }
26085
26309
  function findMatchingClose(src, startIdx, open, close) {
26086
26310
  let len = src.length;
@@ -26571,27 +26795,36 @@ function hashTolerantBoundaryContent(content) {
26571
26795
  hash = hash * 31 + content.charCodeAt(index) | 0;
26572
26796
  return hash.toString(36);
26573
26797
  }
26574
- function getTolerantBoundaryScanWindow(source) {
26798
+ function getTolerantBoundaryScanWindow(source, cache) {
26575
26799
  if (source.length <= TOLERANT_BOUNDARY_SCAN_TAIL_CHARS)
26576
26800
  return {
26577
26801
  source,
26578
26802
  lineOffset: 0
26579
26803
  };
26804
+ if (cache) {
26805
+ let cut = source.length - TOLERANT_BOUNDARY_SCAN_TAIL_CHARS, start$1 = source.indexOf(`
26806
+ `, cut);
26807
+ start$1 = start$1 === -1 ? source.length : start$1 + 1;
26808
+ let lineOffset$1 = cache.lineOffset + countLineBreaks(source.slice(cache.windowStart, start$1));
26809
+ return cache.lineOffset = lineOffset$1, cache.windowStart = start$1, {
26810
+ source: source.slice(start$1),
26811
+ lineOffset: lineOffset$1
26812
+ };
26813
+ }
26580
26814
  let start = source.length - TOLERANT_BOUNDARY_SCAN_TAIL_CHARS, nextLineBreak = source.indexOf(`
26581
26815
  `, start);
26582
- return nextLineBreak === -1 ? {
26583
- source: "",
26584
- lineOffset: countLineBreaks(source)
26585
- } : (start = nextLineBreak + 1, {
26816
+ start = nextLineBreak === -1 ? source.length : nextLineBreak + 1;
26817
+ let lineOffset = countLineBreaks(source.slice(0, start));
26818
+ return {
26586
26819
  source: source.slice(start),
26587
- lineOffset: countLineBreaks(source.slice(0, start))
26588
- });
26820
+ lineOffset
26821
+ };
26589
26822
  }
26590
- function mayContainTolerantMathBlockBoundaryOpener(markdown) {
26823
+ function mayContainTolerantMathBlockBoundaryOpener(markdown, scanWindowCache) {
26591
26824
  let fullSource = String(markdown ?? "");
26592
26825
  if (!fullSource || !fullSource.includes("$$") && !fullSource.includes("\\["))
26593
26826
  return !1;
26594
- let { source } = getTolerantBoundaryScanWindow(fullSource);
26827
+ let { source } = getTolerantBoundaryScanWindow(fullSource, scanWindowCache);
26595
26828
  if (!source)
26596
26829
  return !1;
26597
26830
  let lines = source.split(/\r?\n/), startLine = Math.max(0, lines.length - TOLERANT_BOUNDARY_SCAN_MAX_LINES - 2), delimiters = [["$$", "$$"], ["\\[", "\\]"]];
@@ -26605,11 +26838,11 @@ function mayContainTolerantMathBlockBoundaryOpener(markdown) {
26605
26838
  }
26606
26839
  return !1;
26607
26840
  }
26608
- function getTolerantMathBlockBoundaryStreamKey(markdown) {
26841
+ function getTolerantMathBlockBoundaryStreamKey(markdown, scanWindowCache) {
26609
26842
  let fullSource = String(markdown ?? "");
26610
26843
  if (!fullSource || !fullSource.includes("$$") && !fullSource.includes("\\["))
26611
26844
  return null;
26612
- let { source, lineOffset } = getTolerantBoundaryScanWindow(fullSource);
26845
+ let { source, lineOffset } = getTolerantBoundaryScanWindow(fullSource, scanWindowCache);
26613
26846
  if (!source)
26614
26847
  return null;
26615
26848
  let lines = source.split(/\r?\n/), startLine = Math.max(0, lines.length - TOLERANT_BOUNDARY_SCAN_MAX_LINES - 2), delimiters = [["$$", "$$"], ["\\[", "\\]"]];
@@ -27103,7 +27336,7 @@ function applyRenderRules(md) {
27103
27336
  return `<pre class="${info ? `language-${md.utils.escapeHtml(info.split(/\s+/g)[0])}` : ""}"><code>${md.utils.escapeHtml(String(tokenShape.content ?? ""))}</code></pre>`;
27104
27337
  });
27105
27338
  }
27106
- var HTML_LINK_OPEN_RE = /^<a[>\s]/i, HTML_LINK_CLOSE_RE = /^<\/a\s*>/i;
27339
+ var HTML_LINK_OPEN_RE = /^<a[>\s]/i, HTML_LINK_CLOSE_RE = /^<\/a\s*>/i, LINKIFY_SEED_RE = /[@:]|\/\/|\.\S/;
27107
27340
  function inlineTokenMayNeedLinkify(token, linkify$2) {
27108
27341
  if (token?.type !== "inline")
27109
27342
  return !1;
@@ -27129,13 +27362,33 @@ function inlineTokenMayNeedLinkify(token, linkify$2) {
27129
27362
  }
27130
27363
  function applyLinkifyCandidateFilter(md) {
27131
27364
  let ruler = md.core?.ruler, original = ruler.getNamedRules?.().find((rule) => rule.name === "linkify")?.fn;
27132
- typeof original == "function" && ruler.at("linkify", (state) => {
27365
+ if (typeof original != "function")
27366
+ return;
27367
+ let nativeLinkify = md.options.linkify ? md.linkify : void 0, nativeTest = nativeLinkify?.test, nativeMatch = nativeLinkify?.match, nativeBuilderPrototype = nativeLinkify?.re && Object.getPrototypeOf(nativeLinkify.re), screenedCache, seedSafe = !1;
27368
+ ruler.at("linkify", (state) => {
27133
27369
  if (!state.md?.options?.linkify)
27134
27370
  return;
27135
27371
  let tokens = Array.isArray(state.tokens) ? state.tokens : [], linkify$2 = state.md.linkify;
27136
- if (!linkify$2)
27372
+ if (!linkify$2 || !tokens.some((token) => token?.type === "inline"))
27137
27373
  return;
27138
- let candidates = tokens.filter((token) => inlineTokenMayNeedLinkify(token, linkify$2));
27374
+ let re = linkify$2.re, nativeBuilder = re && Object.getPrototypeOf(re) === nativeBuilderPrototype && !Object.values(re).some((value) => typeof value == "function"), nativeMethods = linkify$2.test === nativeTest && linkify$2.match === nativeMatch;
27375
+ if (nativeMethods && nativeBuilder && screenedCache !== re.cache) {
27376
+ screenedCache = re.cache;
27377
+ let { schema_names: schemas = [], tlds = [] } = re.opts;
27378
+ seedSafe = schemas.every((name) => name === "//" || name.endsWith(":")) && tlds.every((tld) => /^[\p{L}\p{N}-]+$/u.test(tld));
27379
+ }
27380
+ let canScreen = !!nativeMethods && !!nativeBuilder && seedSafe && (state.env?.__markstreamFinal !== !1 || !!re?.cache.link_fuzzy_search), candidates = tokens.filter((token) => {
27381
+ if (canScreen && token?.type === "inline") {
27382
+ let children = token.children;
27383
+ if (Array.isArray(children) && children.length > 0) {
27384
+ if (!children.some((child) => child?.type === "text" && LINKIFY_SEED_RE.test(String(child.content ?? ""))))
27385
+ return !1;
27386
+ } else if (!LINKIFY_SEED_RE.test(String(token.content ?? "")))
27387
+ return !1;
27388
+ canScreen = !1;
27389
+ }
27390
+ return inlineTokenMayNeedLinkify(token, linkify$2);
27391
+ });
27139
27392
  if (candidates.length)
27140
27393
  return original(Object.assign(Object.create(Object.getPrototypeOf(state)), state, { tokens: candidates }));
27141
27394
  });
@@ -27192,7 +27445,17 @@ function factory(opts = {}) {
27192
27445
  ...opts.mathOptions ?? {}
27193
27446
  }), (opts.enableContainers ?? !0) && applyContainers(md), opts.enableFixIndentedCodeBlock !== !1 && applyFixIndentedCodeBlock(md), applyFixLinkTokens(md), applyFixStrongTokens(md), applyFixListItem(md), applyFixTableTokens(md), applyRenderRules(md), applyFixHtmlInlineTokens(md, { customHtmlTags: opts.customHtmlTags }), md;
27194
27447
  }
27195
- var NOT_WHITESPACE = /\S/;
27448
+ var regexCache = /* @__PURE__ */ new Map();
27449
+ function getCachedRegex(pattern, flags) {
27450
+ let key = flags ? `${pattern}:::${flags}` : pattern, regex = regexCache.get(key);
27451
+ if (!regex && (regex = new RegExp(pattern, flags), regexCache.set(key, regex), regexCache.size > 200)) {
27452
+ let keysToDelete = Array.from(regexCache.keys()).slice(0, 50);
27453
+ for (let keyToDelete of keysToDelete)
27454
+ regexCache.delete(keyToDelete);
27455
+ }
27456
+ return regex.lastIndex = 0, regex;
27457
+ }
27458
+ var NOT_WHITESPACE = /\S/, STARTS_LIKE_HTML_DOCUMENT_RE = /^(?:<!doctype\s+html[^>]*>\s*)?<html(?:\s[^>]*)?>/i, ENDS_WITH_HTML_CLOSE_RE = /<\/html>\s*$/i, NON_ELEMENT_MARKUP_START_RE = /^<\s*[!?]/, MARKUP_TAG_NAME_RE = /^([A-Z][\w:-]*)/i, SELF_CLOSING_END_RE$1 = /\/\s*>$/;
27196
27459
  function parseStandaloneHtmlDocument(markdown) {
27197
27460
  let firstNonWhitespace = markdown.search(NOT_WHITESPACE);
27198
27461
  if (firstNonWhitespace === -1 || markdown.charCodeAt(firstNonWhitespace) !== 60)
@@ -27200,7 +27463,7 @@ function parseStandaloneHtmlDocument(markdown) {
27200
27463
  let trimmed = markdown.trim();
27201
27464
  if (!trimmed)
27202
27465
  return null;
27203
- let startsLikeHtmlDocument = /^(?:<!doctype\s+html[^>]*>\s*)?<html(?:\s[^>]*)?>/i.test(trimmed), endsWithHtmlClose = /<\/html>\s*$/i.test(trimmed);
27466
+ let startsLikeHtmlDocument = STARTS_LIKE_HTML_DOCUMENT_RE.test(trimmed), endsWithHtmlClose = ENDS_WITH_HTML_CLOSE_RE.test(trimmed);
27204
27467
  return !startsLikeHtmlDocument || !endsWithHtmlClose ? null : [{
27205
27468
  type: "html_block",
27206
27469
  tag: "html",
@@ -27220,7 +27483,7 @@ function isCloseOnlyHtmlBlockForTag(node, tag) {
27220
27483
  if (node.type !== "html_block" || !tag)
27221
27484
  return !1;
27222
27485
  let raw = String(node.raw ?? node.content ?? "");
27223
- return new RegExp(String.raw`^\s*<\s*\/\s*${escapeTagForRegExp(tag)}\s*>\s*$`, "i").test(raw);
27486
+ return getCachedRegex(String.raw`^\s*<\s*\/\s*${escapeTagForRegExp(tag)}\s*>\s*$`, "i").test(raw);
27224
27487
  }
27225
27488
  var RAW_TEXT_HTML_TAGS = /* @__PURE__ */ new Set([
27226
27489
  "iframe",
@@ -27251,11 +27514,11 @@ function findNextHtmlBlockFromSource(source, tag, startIndex) {
27251
27514
  tag: ""
27252
27515
  };
27253
27516
  }
27254
- let endRel = findTagCloseIndexOutsideQuotes(source.slice(start$1));
27255
- if (endRel === -1)
27517
+ let closeIndex = findTagCloseIndexOutsideQuotes(source, start$1);
27518
+ if (closeIndex === -1)
27256
27519
  return null;
27257
- let end = start$1 + endRel + 1, raw = source.slice(start$1, end);
27258
- if (/^<\s*[!?]/.test(raw))
27520
+ let end = closeIndex + 1, raw = source.slice(start$1, end);
27521
+ if (NON_ELEMENT_MARKUP_START_RE.test(raw))
27259
27522
  return {
27260
27523
  closing: !1,
27261
27524
  end,
@@ -27264,11 +27527,11 @@ function findNextHtmlBlockFromSource(source, tag, startIndex) {
27264
27527
  };
27265
27528
  let body = raw.slice(1).trimStart(), closing = body.startsWith("/");
27266
27529
  closing && (body = body.slice(1).trimStart());
27267
- let tagMatch = body.match(/^([A-Z][\w:-]*)/i);
27530
+ let tagMatch = body.match(MARKUP_TAG_NAME_RE);
27268
27531
  return tagMatch?.[1] ? {
27269
27532
  closing,
27270
27533
  end,
27271
- selfClosing: /\/\s*>$/.test(raw),
27534
+ selfClosing: SELF_CLOSING_END_RE$1.test(raw),
27272
27535
  tag: tagMatch[1].toLowerCase()
27273
27536
  } : {
27274
27537
  closing: !1,
@@ -27277,7 +27540,7 @@ function findNextHtmlBlockFromSource(source, tag, startIndex) {
27277
27540
  tag: ""
27278
27541
  };
27279
27542
  }, findRawTextClose = (rawTextTag, from) => {
27280
- let closeRe = new RegExp(String.raw`<\s*\/\s*${escapeTagForRegExp(rawTextTag)}(?=\s|>)`, "gi");
27543
+ let closeRe = getCachedRegex(String.raw`<\s*\/\s*${escapeTagForRegExp(rawTextTag)}(?=\s|>)`, "gi");
27281
27544
  closeRe.lastIndex = from;
27282
27545
  let match = closeRe.exec(source);
27283
27546
  if (!match || match.index == null)
@@ -27308,7 +27571,7 @@ function findNextHtmlBlockFromSource(source, tag, startIndex) {
27308
27571
  if (start === -1 || openEnd === -1)
27309
27572
  return null;
27310
27573
  let openTag = source.slice(start, openEnd + 1);
27311
- if (VOID_HTML_TAGS.has(lowerTag) || /\/\s*>$/.test(openTag))
27574
+ if (VOID_HTML_TAGS.has(lowerTag) || SELF_CLOSING_END_RE$1.test(openTag))
27312
27575
  return {
27313
27576
  raw: openTag,
27314
27577
  start,
@@ -27412,13 +27675,14 @@ function extendHtmlBlockCloseToLineEnding(source, startIndex) {
27412
27675
  ` ? end + 1 : startIndex;
27413
27676
  }
27414
27677
  function findLastClosingTagStart(raw, tag) {
27415
- let closeRe = new RegExp(String.raw`<\s*\/\s*${escapeTagForRegExp(tag)}(?=\s|>)`, "gi"), last = -1, match;
27678
+ let closeRe = getCachedRegex(String.raw`<\s*\/\s*${escapeTagForRegExp(tag)}(?=\s|>)`, "gi"), last = -1, match;
27416
27679
  for (; (match = closeRe.exec(raw)) !== null; )
27417
27680
  last = match.index;
27418
27681
  return last;
27419
27682
  }
27683
+ var NON_ELEMENT_HTML_BLOCK_START_RE = /^\s*(?:<!--|<!|<\?)/, FIRST_TAG_NAME_RE = /^\s*<([A-Z][\w:-]*)/i, SELF_CLOSING_END_RE = /\/\s*>$/, TRAILING_UNCLOSED_TAG_RE = /<[^>]*$/;
27420
27684
  function findMatchingCloseTagEnd(rawHtml, tag, startIndex) {
27421
- let lowerTag = tag.toLowerCase(), openTagRe = new RegExp(String.raw`^<\s*${lowerTag}(?=\s|>|/)`, "i"), closeTagRe = new RegExp(String.raw`^<\s*\/\s*${lowerTag}(?=\s|>)`, "i"), depth = 0, index = Math.max(0, startIndex);
27685
+ let lowerTag = tag.toLowerCase(), openTagRe = getCachedRegex(String.raw`^<\s*${lowerTag}(?=\s|>|/)`, "i"), closeTagRe = getCachedRegex(String.raw`^<\s*\/\s*${lowerTag}(?=\s|>)`, "i"), depth = 0, index = Math.max(0, startIndex);
27422
27686
  for (; index < rawHtml.length; ) {
27423
27687
  let lt = rawHtml.indexOf("<", index);
27424
27688
  if (lt === -1)
@@ -27438,7 +27702,7 @@ function findMatchingCloseTagEnd(rawHtml, tag, startIndex) {
27438
27702
  if (endRel === -1)
27439
27703
  return -1;
27440
27704
  let rawTag = slice.slice(0, endRel + 1);
27441
- /\/\s*>$/.test(rawTag) || depth++, index = lt + endRel + 1;
27705
+ SELF_CLOSING_END_RE.test(rawTag) || depth++, index = lt + endRel + 1;
27442
27706
  continue;
27443
27707
  }
27444
27708
  index = lt + 1;
@@ -27447,7 +27711,7 @@ function findMatchingCloseTagEnd(rawHtml, tag, startIndex) {
27447
27711
  }
27448
27712
  function parseHtmlBlock(token) {
27449
27713
  let raw = String(token.content ?? "");
27450
- if (/^\s*<!--/.test(raw) || /^\s*<!/.test(raw) || /^\s*<\?/.test(raw))
27714
+ if (NON_ELEMENT_HTML_BLOCK_START_RE.test(raw))
27451
27715
  return {
27452
27716
  type: "html_block",
27453
27717
  content: raw,
@@ -27455,7 +27719,7 @@ function parseHtmlBlock(token) {
27455
27719
  tag: "",
27456
27720
  loading: !1
27457
27721
  };
27458
- let tag = (raw.match(/^\s*<([A-Z][\w:-]*)/i)?.[1] || "").toLowerCase();
27722
+ let tag = (raw.match(FIRST_TAG_NAME_RE)?.[1] || "").toLowerCase();
27459
27723
  if (!tag)
27460
27724
  return {
27461
27725
  type: "html_block",
@@ -27464,10 +27728,10 @@ function parseHtmlBlock(token) {
27464
27728
  tag: "",
27465
27729
  loading: !1
27466
27730
  };
27467
- let openEnd = findTagCloseIndexOutsideQuotes(raw), openTag = openEnd === -1 ? raw : raw.slice(0, openEnd + 1), selfClosing = openEnd !== -1 && /\/\s*>$/.test(openTag), isVoid = VOID_HTML_TAGS.has(tag), attrs = parseTagAttrs(openTag), hasClosing = (openEnd === -1 ? -1 : findMatchingCloseTagEnd(raw, tag, openEnd + 1)) !== -1, loading = !(isVoid || selfClosing || hasClosing);
27731
+ let openEnd = findTagCloseIndexOutsideQuotes(raw), openTag = openEnd === -1 ? raw : raw.slice(0, openEnd + 1), selfClosing = openEnd !== -1 && SELF_CLOSING_END_RE.test(openTag), isVoid = VOID_HTML_TAGS.has(tag), attrs = parseTagAttrs(openTag), hasClosing = (openEnd === -1 ? -1 : findMatchingCloseTagEnd(raw, tag, openEnd + 1)) !== -1, loading = !(isVoid || selfClosing || hasClosing);
27468
27732
  return {
27469
27733
  type: "html_block",
27470
- content: loading ? `${raw.replace(/<[^>]*$/, "")}
27734
+ content: loading ? `${raw.replace(TRAILING_UNCLOSED_TAG_RE, "")}
27471
27735
  </${tag}>` : raw,
27472
27736
  raw,
27473
27737
  tag,
@@ -27821,12 +28085,16 @@ function createExplicitBracketMathContext() {
27821
28085
  function cloneExplicitBracketMathContext(context) {
27822
28086
  return { ...context };
27823
28087
  }
27824
- function setTolerantMathBoundaryStreamCache(runtime, source, key, explicitBracketMath = scanExplicitBracketMathStreamState(source).state) {
28088
+ function setTolerantMathBoundaryStreamCache(runtime, source, key, explicitBracketMath = scanExplicitBracketMathStreamState(source).state, scanWindow = {
28089
+ lineOffset: 0,
28090
+ windowStart: 0
28091
+ }) {
27825
28092
  runtime.tolerantMathBoundary = {
27826
28093
  explicitBracketMath,
27827
28094
  source,
27828
28095
  key,
27829
- pendingCandidate: key === null && mayContainTolerantMathBlockBoundaryOpener(source)
28096
+ pendingCandidate: key === null && mayContainTolerantMathBlockBoundaryOpener(source, scanWindow),
28097
+ scanWindow
27830
28098
  };
27831
28099
  }
27832
28100
  function sourceEndsWithSplitTolerantBoundaryPrefix(source) {
@@ -28075,7 +28343,7 @@ function stripPendingExplicitMathTail(markdown, runtime, useCache = !0) {
28075
28343
  let md = runtime.markdownIt;
28076
28344
  if (!hasMarkstreamMathPlugin(md))
28077
28345
  return markdown;
28078
- let previous = useCache ? runtime.pendingExplicitMathTail : void 0, state = previous?.source === markdown ? previous.state : previous && markdown.startsWith(previous.source) ? updateExplicitBracketMathStreamState(previous.state, markdown.slice(previous.source.length), previous.source.length - previous.state.lineBuffer.length).state : scanExplicitBracketMathStreamState(markdown).state;
28346
+ let previous = useCache ? runtime.pendingExplicitMathTail : void 0, state = previous?.source === markdown ? previous.state : previous && runtime.sourceExtends(previous.source, markdown) ? updateExplicitBracketMathStreamState(previous.state, markdown.slice(previous.source.length), previous.source.length - previous.state.lineBuffer.length).state : scanExplicitBracketMathStreamState(markdown).state;
28079
28347
  useCache && (runtime.pendingExplicitMathTail = {
28080
28348
  source: markdown,
28081
28349
  state
@@ -28135,13 +28403,16 @@ function syncTolerantMathBoundaryStreamCache(runtime, source) {
28135
28403
  let previous = runtime.tolerantMathBoundary;
28136
28404
  if (previous?.source === source)
28137
28405
  return;
28138
- let sourceExtendsPrevious = previous ? source.startsWith(previous.source) : !1, appended = sourceExtendsPrevious && previous ? source.slice(previous.source.length) : "", explicitBracketMathUpdate = sourceExtendsPrevious && previous ? updateExplicitBracketMathStreamState(previous.explicitBracketMath, appended, previous.source.length - previous.explicitBracketMath.lineBuffer.length) : scanExplicitBracketMathStreamState(source), nextExplicitBracketMath = explicitBracketMathUpdate.state, completesExplicitBracketMathClose = sourceExtendsPrevious && previous ? explicitBracketMathUpdate.closedOpenMath : !1;
28406
+ let sourceExtendsPrevious = previous ? runtime.sourceExtends(previous.source, source) : !1, appended = sourceExtendsPrevious && previous ? source.slice(previous.source.length) : "", explicitBracketMathUpdate = sourceExtendsPrevious && previous ? updateExplicitBracketMathStreamState(previous.explicitBracketMath, appended, previous.source.length - previous.explicitBracketMath.lineBuffer.length) : scanExplicitBracketMathStreamState(source), nextExplicitBracketMath = explicitBracketMathUpdate.state, completesExplicitBracketMathClose = sourceExtendsPrevious && previous ? explicitBracketMathUpdate.closedOpenMath : !1;
28139
28407
  if (previous && sourceExtendsPrevious && previous.key === null && previous.pendingCandidate === !1 && !completesExplicitBracketMathClose && !appendedChunkMayAffectTolerantMathBoundary(previous.source, appended) && !sourceEndsWithSplitTolerantBoundaryPrefix(source)) {
28140
28408
  previous.source = source, previous.explicitBracketMath = nextExplicitBracketMath;
28141
28409
  return;
28142
28410
  }
28143
- let nextKey = getTolerantMathBlockBoundaryStreamKey(source);
28144
- (previous && (previous && !sourceExtendsPrevious || previous.key !== nextKey || completesExplicitBracketMathClose) || !previous && nextKey) && runtime.resetStreamOnly(), setTolerantMathBoundaryStreamCache(runtime, source, nextKey, nextExplicitBracketMath);
28411
+ let scanWindow = sourceExtendsPrevious && previous ? previous.scanWindow : {
28412
+ lineOffset: 0,
28413
+ windowStart: 0
28414
+ }, nextKey = getTolerantMathBlockBoundaryStreamKey(source, scanWindow);
28415
+ (previous && (previous && !sourceExtendsPrevious || previous.key !== nextKey || completesExplicitBracketMathClose) || !previous && nextKey) && runtime.resetStreamOnly(), setTolerantMathBoundaryStreamCache(runtime, source, nextKey, nextExplicitBracketMath, scanWindow);
28145
28416
  }
28146
28417
  function shouldUseSyncParseForPendingTolerantMathBoundary(runtime) {
28147
28418
  let cache = runtime.tolerantMathBoundary;
@@ -28309,6 +28580,7 @@ var REUSABLE_INLINE_TOKEN_TYPES = /* @__PURE__ */ new Set([
28309
28580
  "code_block",
28310
28581
  "fence",
28311
28582
  "hr",
28583
+ "html_block",
28312
28584
  "inline",
28313
28585
  "math_block"
28314
28586
  ]);
@@ -28411,7 +28683,7 @@ function sameTokenAttrs(left, right) {
28411
28683
  function isSameTokenShapeForReuse(left, right) {
28412
28684
  return !!left && !!right && left.type === right.type && left.tag === right.tag && left.nesting === right.nesting && left.level === right.level && left.markup === right.markup && left.content === right.content && left.info === right.info && sameTokenMap(left, right) && sameTokenAttrs(left, right);
28413
28685
  }
28414
- function updateStructuredStreamCache(runtime, source, tokens, groups, nodes, options, previousSeed) {
28686
+ function updateStructuredStreamCache(runtime, source, tokens, groups, nodes, options, linkifyDemotionContexts, linkifyDemotionContextOffset = 0, fallbackLinkifyDemotionContext) {
28415
28687
  let groupStarts = groups.starts;
28416
28688
  if (groupStarts.length === 0 || nodes.length !== groupStarts.length) {
28417
28689
  runtime.structuredStream = void 0;
@@ -28424,7 +28696,7 @@ function updateStructuredStreamCache(runtime, source, tokens, groups, nodes, opt
28424
28696
  lastToken: tokens[end - 1],
28425
28697
  tokenCount: end - start
28426
28698
  };
28427
- }), stableGroupCount = groups.mixed ? Math.max(0, groupStarts.length - 1) : sourceEndsWithBlankLine(source) ? groupStarts.length : Math.max(0, groupStarts.length - 1), seed = previousSeed && previousSeed.length >= stableGroupCount ? previousSeed.slice(0, stableGroupCount).concat(nodes.slice(stableGroupCount).map((node) => String(node.raw ?? ""))) : nodes.map((node) => String(node.raw ?? ""));
28699
+ }), stableGroupCount = groups.mixed ? Math.max(0, groupStarts.length - 1) : sourceEndsWithBlankLine(source) ? groupStarts.length : Math.max(0, groupStarts.length - 1), linkifyContextIndex = stableGroupCount - linkifyDemotionContextOffset - 1, linkifyDemotionContext = linkifyContextIndex >= 0 ? linkifyDemotionContexts?.[linkifyContextIndex] : fallbackLinkifyDemotionContext;
28428
28700
  runtime.structuredStream = {
28429
28701
  groupBoundaries,
28430
28702
  groupStarts,
@@ -28433,7 +28705,7 @@ function updateStructuredStreamCache(runtime, source, tokens, groups, nodes, opt
28433
28705
  mixed: groups.mixed,
28434
28706
  source,
28435
28707
  nodes,
28436
- seed,
28708
+ linkifyDemotionContext,
28437
28709
  stableGroupCount,
28438
28710
  requireClosingStrong: options.requireClosingStrong,
28439
28711
  validateLink: options.validateLink
@@ -28470,18 +28742,18 @@ function processTopLevelTokensWithReuse(runtime, source, tokens, options, callba
28470
28742
  if (!groups)
28471
28743
  return runtime.structuredStream = void 0, callbacks.processTokens(tokens, options);
28472
28744
  let groupStarts = groups.starts, stableGroupCount = previous && groups.mixed ? Math.min(previous.stableGroupCount, Math.max(0, previous.groupBoundaries.length - 1)) : previous?.stableGroupCount ?? 0;
28473
- if (previous && stableGroupCount > 0 && previous.requireClosingStrong === options.requireClosingStrong && previous.validateLink === options.validateLink && source.startsWith(previous.source) && groupStarts.length >= stableGroupCount && (mode === "append" || mode === "tail") && hasStableStructuredStreamGroupBoundaries(previous, tokens, groupStarts, stableGroupCount)) {
28474
- let tailStart = groupStarts[stableGroupCount] ?? tokens.length, tailNodes = callbacks.processTokens(tokens.slice(tailStart), {
28745
+ if (previous && stableGroupCount > 0 && previous.requireClosingStrong === options.requireClosingStrong && previous.validateLink === options.validateLink && runtime.sourceExtends(previous.source, source) && groupStarts.length >= stableGroupCount && (mode === "append" || mode === "tail") && hasStableStructuredStreamGroupBoundaries(previous, tokens, groupStarts, stableGroupCount)) {
28746
+ let tailStart = groupStarts[stableGroupCount] ?? tokens.length, tailOptions = {
28475
28747
  ...options,
28476
- linkifyDemotionSeed: previous.seed.slice(0, stableGroupCount)
28477
- }), expectedTailNodes = groupStarts.length - stableGroupCount;
28748
+ linkifyDemotionSeedContext: previous.linkifyDemotionContext
28749
+ }, tailNodes = callbacks.processTokens(tokens.slice(tailStart), tailOptions), expectedTailNodes = groupStarts.length - stableGroupCount;
28478
28750
  if (tailNodes.length === expectedTailNodes) {
28479
28751
  let result$1 = previous.nodes.slice(0, stableGroupCount).concat(tailNodes);
28480
- return runtime.structuredReuseTailStart = stableGroupCount, callbacks.recordReusedTopLevelNodes?.(stableGroupCount), updateStructuredStreamCache(runtime, source, tokens, groups, result$1, options, previous.seed), result$1;
28752
+ return runtime.structuredReuseTailStart = stableGroupCount, callbacks.recordReusedTopLevelNodes?.(stableGroupCount), updateStructuredStreamCache(runtime, source, tokens, groups, result$1, options, tailOptions.linkifyDemotionResultContexts, stableGroupCount, previous.linkifyDemotionContext), result$1;
28481
28753
  }
28482
28754
  }
28483
28755
  let result = callbacks.processTokens(tokens, options);
28484
- return updateStructuredStreamCache(runtime, source, tokens, groups, result, options), result;
28756
+ return updateStructuredStreamCache(runtime, source, tokens, groups, result, options, options.linkifyDemotionResultContexts), result;
28485
28757
  }
28486
28758
  function isDetailsOpenHtmlBlock(node) {
28487
28759
  if (node.type !== "html_block" || String(node.tag ?? "").toLowerCase() !== "details")
@@ -28566,7 +28838,7 @@ function parseSiblingHtmlBlockChildren(blocks, context, options, final, useCache
28566
28838
  validateLink: options.validateLink
28567
28839
  }), children.flat();
28568
28840
  }
28569
- function structureGenericHtmlBlockChildren(nodes, context, options, final, tailStart = 0) {
28841
+ function structureGenericHtmlBlockChildren(nodes, context, options, final) {
28570
28842
  let processNode = (node) => {
28571
28843
  if (node?.type !== "html_block")
28572
28844
  return node;
@@ -28583,12 +28855,9 @@ function structureGenericHtmlBlockChildren(nodes, context, options, final, tailS
28583
28855
  if (!innerRaw.trim() || !hasStructuredHtmlWrapperMarkers(innerRaw))
28584
28856
  return node;
28585
28857
  let childOptions = buildDetailsChildParseOptions(options, final), siblingHtmlBlocks = hasClose ? null : splitSiblingHtmlBlockFragments(innerRaw), useSiblingCache = !options.isFragment && typeof options.preTransformTokens != "function" && typeof options.postTransformTokens != "function" && typeof options.postTransformNodes != "function" && context.markdownIt.__markstreamHasCustomParserExtensions === !1 && isCacheStableLinkValidator(options.validateLink), children = siblingHtmlBlocks ? parseSiblingHtmlBlockChildren(siblingHtmlBlocks, context, childOptions, final, useSiblingCache) : parseDetailsFragmentChildren(innerRaw, context, childOptions);
28586
- return shouldStructureGenericHtmlBlockChildren(children) ? {
28587
- ...node,
28588
- children
28589
- } : node;
28858
+ return shouldStructureGenericHtmlBlockChildren(children) && (fields.children = children), node;
28590
28859
  };
28591
- return tailStart <= 0 ? nodes.map(processNode) : nodes.slice(0, tailStart).concat(nodes.slice(tailStart).map(processNode));
28860
+ return nodes.map(processNode);
28592
28861
  }
28593
28862
  function hasTopLevelHtmlBlock(nodes, start = 0) {
28594
28863
  for (let i = start; i < nodes.length; i++)
@@ -28699,12 +28968,18 @@ function combineStructuredDetailsHtmlBlocks(nodes, source, context, options, fin
28699
28968
  }
28700
28969
  return [merged, cursor];
28701
28970
  }
28702
- function mergeSplitTopLevelHtmlBlocks(nodes, final, source, context, options) {
28971
+ function findNodeRawPosition(node, nodeRaw, source, cursor, context) {
28972
+ if (!nodeRaw)
28973
+ return -1;
28974
+ let anchor = context.getInternalNodeSourceRange(node)?.start ?? -1, anchored = anchor >= cursor && source.startsWith(nodeRaw, anchor);
28975
+ return node?.type === "html_block" ? anchored && anchor === cursor ? anchor : source.indexOf(nodeRaw, cursor) : anchor < 0 ? source.indexOf(nodeRaw, cursor) : anchored ? anchor : -1;
28976
+ }
28977
+ function mergeSplitTopLevelHtmlBlocks(nodes, final, source, context, options, initialSourceCursor = 0) {
28703
28978
  if (!source)
28704
28979
  return nodes;
28705
- let merged = nodes.slice(), sourceHtmlCursor = 0;
28980
+ let merged = nodes.slice(), sourceHtmlCursor = initialSourceCursor;
28706
28981
  for (let i = 0; i < merged.length; i++) {
28707
- let node = merged[i], nodeRaw = getMergeableNodeRaw(node), nodePos = nodeRaw ? source.indexOf(nodeRaw, sourceHtmlCursor) : -1;
28982
+ let node = merged[i], nodeRaw = getMergeableNodeRaw(node), nodePos = findNodeRawPosition(node, nodeRaw, source, sourceHtmlCursor, context);
28708
28983
  if (node?.type !== "html_block") {
28709
28984
  nodePos !== -1 && (sourceHtmlCursor = nodePos + nodeRaw.length);
28710
28985
  continue;
@@ -28812,7 +29087,7 @@ function parseEmphasisToken(tokens, startIndex, parseInlineTokens$1, options) {
28812
29087
  };
28813
29088
  }
28814
29089
  function TRAILING_OWN_FENCE_CANDIDATE_LINE_RE(marker) {
28815
- return /* @__PURE__ */ new RegExp(`(?:^|\\r\\n|\\n|\\r) {0,3}${marker}+[ \\t]*$`);
29090
+ return getCachedRegex(`(?:^|\\r\\n|\\n|\\r) {0,3}${marker}+[ \\t]*$`);
28816
29091
  }
28817
29092
  var DIFF_HEADER_PREFIXES = [
28818
29093
  "diff ",
@@ -30351,7 +30626,7 @@ function handleTextToken(state, token) {
30351
30626
  }
30352
30627
  trailingTextStart < state.result.length && (content.startsWith(trailingTextContent) ? (state.currentTextNode = null, state.result.length = trailingTextStart) : state.currentTextNode = state.result[state.result.length - 1]);
30353
30628
  let nextToken = state.tokens[state.index + 1];
30354
- if ((content === "`" || content === "|" || content === "$") && !hasEscapedMarkup(token, `\\${content}`) || /^\*+$/.test(content) && !hasEscapedMarkup(token, "\\*")) {
30629
+ if (state.options?.final !== !0 && ((content === "`" || content === "|" || content === "$") && !hasEscapedMarkup(token, `\\${content}`) || /^\*+$/.test(content) && !hasEscapedMarkup(token, "\\*"))) {
30355
30630
  state.index++;
30356
30631
  return;
30357
30632
  }
@@ -30551,9 +30826,20 @@ function dispatchInlineToken(state, token) {
30551
30826
  function handleReference(state, token) {
30552
30827
  state.resetCurrentTextNode(), state.pushParsed(parseReferenceToken(token)), state.index++;
30553
30828
  }
30829
+ var TEXT_RECOVERY_MARKER_RE = /[!$(*[\\\]_`|~]/;
30554
30830
  function parseInlineTokens(tokens, raw, pPreToken, options) {
30555
30831
  if (!tokens || tokens.length === 0)
30556
30832
  return [];
30833
+ if (tokens.length === 1 && tokens[0].type === "text") {
30834
+ let content = tokens[0].content;
30835
+ if (typeof content == "string" && content && content !== "<" && !content.endsWith("undefined") && !TEXT_RECOVERY_MARKER_RE.test(content))
30836
+ return [{
30837
+ type: "text",
30838
+ content,
30839
+ raw: content,
30840
+ center: !1
30841
+ }];
30842
+ }
30557
30843
  let parseContext = ensureParseContext(options), inheritedContext = parseContext.linkifyDemotionContext, inferredContext = inferLinkifyDemotionContext(raw), linkifyDemotionContext = {
30558
30844
  filename: inheritedContext?.filename || inferredContext.filename,
30559
30845
  explicitFilename: inheritedContext?.explicitFilename || inferredContext.explicitFilename,
@@ -31341,7 +31627,7 @@ function parseBasicBlockToken(tokens, index, options, parseInlineTokens$1) {
31341
31627
  return includeSourceMap && applyNodeSourceMap(paragraphNode, token, options), [paragraphNode, index + 1];
31342
31628
  }
31343
31629
  if (htmlBlockNode.tag && tagSets?.customTagSet?.has(htmlBlockNode.tag)) {
31344
- let tag = htmlBlockNode.tag, context = isParseContext(options) ? options : void 0, source = String(context?.sourceMarkdown ?? ""), cursor = Number(context?.customHtmlBlockCursor ?? 0), mappedLineStart = Array.isArray(token.map) ? lineToIndex(source, Number(token.map?.[0] ?? 0)) : 0, fromSource = findNextCustomHtmlBlockFromSource(source, tag, Math.max(clampNonNegative(cursor), clampNonNegative(mappedLineStart)));
31630
+ let tag = htmlBlockNode.tag, context = isParseContext(options) ? options : void 0, source = String(context?.sourceMarkdown ?? ""), cursor = Number(context?.customHtmlBlockCursor ?? 0), mappedLine = Number(token.map?.[0] ?? 0), mappedLineStart = Array.isArray(token.map) ? context?.sourceLineOffsets?.[mappedLine] ?? lineToIndex(source, mappedLine) : 0, fromSource = findNextCustomHtmlBlockFromSource(source, tag, Math.max(clampNonNegative(cursor), clampNonNegative(mappedLineStart)));
31345
31631
  fromSource && context && (context.customHtmlBlockCursor = fromSource.end);
31346
31632
  let rawHtml = String(fromSource?.raw ?? htmlBlockNode.raw ?? ""), openEnd = findTagCloseIndexOutsideQuotes(rawHtml), openTag = openEnd !== -1 ? rawHtml.slice(0, openEnd + 1) : rawHtml, selfClosing = openEnd !== -1 && /\/\s*>\s*$/.test(openTag), closeRange = openEnd === -1 ? null : findMatchingCloseTagRange(rawHtml, tag, openEnd + 1), closeIndex = closeRange?.start ?? -1, inner = "";
31347
31633
  openEnd !== -1 && (closeIndex !== -1 && openEnd < closeIndex ? inner = rawHtml.slice(openEnd + 1, closeIndex) : inner = rawHtml.slice(openEnd + 1)), closeIndex === -1 && (inner = stripTrailingPartialClosingTag(inner, tag));
@@ -31521,15 +31807,11 @@ function maybePromoteCustomNodeFromParagraph(node, options) {
31521
31807
  function processTokensWithContext(tokens, options, parseInlineTokens$1) {
31522
31808
  if (!tokens || !Array.isArray(tokens))
31523
31809
  return [];
31524
- let result = [], linkifyContext = createLinkifyDemotionContextTracker(options), seedRaws = options.linkifyDemotionSeed;
31525
- if (Array.isArray(seedRaws) && seedRaws.length)
31526
- for (let raw of seedRaws)
31527
- linkifyContext.remember(String(raw ?? ""));
31528
- let includeSourceMap = options?.includeSourceMap === !0, i = 0;
31810
+ let result = [], resultContexts = [], linkifyContext = createLinkifyDemotionContextTracker(options), includeSourceMap = options?.includeSourceMap === !0, i = 0;
31529
31811
  for (; i < tokens.length; ) {
31530
31812
  let handled = parseCommonBlockToken(tokens, i, linkifyContext.options(), containerTokenHandlers, parseInlineTokens$1);
31531
31813
  if (handled) {
31532
- recordInternalNodeSourceRange(handled[0], tokens[i], options), result.push(handled[0]), linkifyContext.remember(handled[0].raw), i = handled[1];
31814
+ recordInternalNodeSourceRange(handled[0], tokens[i], options), result.push(handled[0]), linkifyContext.remember(handled[0].raw), resultContexts.push(linkifyContext.snapshot()), i = handled[1];
31533
31815
  continue;
31534
31816
  }
31535
31817
  let token = tokens[i];
@@ -31619,42 +31901,52 @@ function processTokensWithContext(tokens, options, parseInlineTokens$1) {
31619
31901
  i += 1;
31620
31902
  break;
31621
31903
  }
31904
+ let context = linkifyContext.snapshot();
31905
+ for (; resultContexts.length < result.length; )
31906
+ resultContexts.push(context);
31622
31907
  }
31623
- return result;
31908
+ return options.linkifyDemotionResultContexts = resultContexts, result;
31624
31909
  }
31625
31910
  function getCachedSourceLineOffsets(runtime, source) {
31626
31911
  let cached = runtime.sourceLineOffsets;
31627
- if (cached && cached.source === source)
31912
+ if (cached?.source === source)
31628
31913
  return cached.offsets;
31629
- if (cached && source.length > cached.source.length && source.startsWith(cached.source)) {
31914
+ if (cached && source.length > cached.source.length && runtime.sourceExtends(cached.source, source)) {
31630
31915
  let offsets$1 = cached.offsets;
31631
31916
  for (let i = cached.source.length; i < source.length; i++)
31632
31917
  source.charCodeAt(i) === 10 && offsets$1.push(i + 1);
31633
31918
  return cached.source = source, offsets$1;
31634
31919
  }
31635
- let offsets = [0];
31636
- for (let i = 0; i < source.length; i++)
31637
- source.charCodeAt(i) === 10 && offsets.push(i + 1);
31920
+ let offsets = computeSourceLineOffsets(source);
31638
31921
  return runtime.sourceLineOffsets = {
31639
31922
  source,
31640
31923
  offsets
31641
31924
  }, offsets;
31642
31925
  }
31926
+ function computeSourceLineOffsets(source) {
31927
+ let offsets = [0];
31928
+ for (let i = 0; i < source.length; i++)
31929
+ source.charCodeAt(i) === 10 && offsets.push(i + 1);
31930
+ return offsets;
31931
+ }
31643
31932
  var parserRuntimes = /* @__PURE__ */ new WeakMap(), wrappedMarkdownItInstances = /* @__PURE__ */ new WeakSet(), wrappedStreamInstances = /* @__PURE__ */ new WeakSet();
31644
31933
  function sameSemantics(left, right) {
31645
31934
  return left.customHtmlTags === right.customHtmlTags && left.hasCustomParserExtensions === right.hasCustomParserExtensions && left.includeSourceMap === right.includeSourceMap && left.postTransformNodes === right.postTransformNodes && left.postTransformTokens === right.postTransformTokens && left.preTransformTokens === right.preTransformTokens && left.requireClosingStrong === right.requireClosingStrong && left.reuseStableTopLevelNodes === right.reuseStableTopLevelNodes && left.streamParse === right.streamParse && left.validateLink === right.validateLink;
31646
31935
  }
31647
31936
  var ParserRuntime = class {
31648
31937
  constructor(markdownIt$1) {
31649
- this.streamParseEnvs = /* @__PURE__ */ new Map(), this.detailsStitchCache = /* @__PURE__ */ new WeakMap(), this.nodeSourceRanges = /* @__PURE__ */ new WeakMap(), this.finalized = !1, this.resettingStream = !1, this.streamStateActive = !1, this.streamResetInCurrentRootParse = !1, this.markdownIt = markdownIt$1;
31938
+ this.streamParseEnvs = /* @__PURE__ */ new Map(), this.htmlPassIdentityPreserving = !1, this.detailsStitchCache = /* @__PURE__ */ new WeakMap(), this.nodeSourceRanges = /* @__PURE__ */ new WeakMap(), this.finalized = !1, this.resettingStream = !1, this.streamStateActive = !1, this.streamResetInCurrentRootParse = !1, this.markdownIt = markdownIt$1;
31939
+ }
31940
+ sourceExtends(previousSource, currentSource) {
31941
+ return this.sourceRelationPrevious === previousSource && this.sourceRelationCurrent === currentSource ? !0 : currentSource.startsWith(previousSource) ? (this.sourceRelationPrevious = previousSource, this.sourceRelationCurrent = currentSource, !0) : !1;
31650
31942
  }
31651
31943
  beginRootParse(source, semantics) {
31652
31944
  this.streamResetInCurrentRootParse = !1;
31653
- let sourceChangedNonAppend = this.documentSource !== void 0 && source !== this.documentSource && !source.startsWith(this.documentSource), semanticsChanged = this.semantics !== void 0 && !sameSemantics(this.semantics, semantics);
31945
+ let sourceChangedNonAppend = this.documentSource !== void 0 && source !== this.documentSource && !this.sourceExtends(this.documentSource, source), semanticsChanged = this.semantics !== void 0 && !sameSemantics(this.semantics, semantics);
31654
31946
  (this.finalized || sourceChangedNonAppend || semanticsChanged) && this.resetDocument(this.streamStateActive), this.finalized = !1, this.documentSource = source, this.semantics = semantics;
31655
31947
  }
31656
31948
  finishRootParse(final) {
31657
- final && (this.clearDocumentCaches(), this.documentSource = void 0, this.semantics = void 0, this.finalized = !0);
31949
+ this.sourceRelationPrevious = void 0, this.sourceRelationCurrent = void 0, final && (this.clearDocumentCaches(), this.documentSource = void 0, this.semantics = void 0, this.finalized = !0);
31658
31950
  }
31659
31951
  resetForFinalAutoParse() {
31660
31952
  this.streamResetInCurrentRootParse || this.resetStreamOnly(), this.clearDocumentCaches();
@@ -31689,7 +31981,7 @@ var ParserRuntime = class {
31689
31981
  this.resetDocument(!0), parserRuntimes.delete(this.markdownIt);
31690
31982
  }
31691
31983
  clearDocumentCaches() {
31692
- this.safeMarkdown = void 0, this.tolerantMathBoundary = void 0, this.pendingExplicitMathTail = void 0, this.streamParseEnvs.clear(), this.topLevelStreamParseMode = void 0, this.structuredStream = void 0, this.siblingHtmlChildren = void 0, this.detailsStitchCache = /* @__PURE__ */ new WeakMap(), this.nodeSourceRanges = /* @__PURE__ */ new WeakMap(), this.sourceLineOffsets = void 0;
31984
+ this.safeMarkdown = void 0, this.tolerantMathBoundary = void 0, this.pendingExplicitMathTail = void 0, this.streamParseEnvs.clear(), this.topLevelStreamParseMode = void 0, this.structuredStream = void 0, this.htmlPassIdentityPreserving = !1, this.siblingHtmlChildren = void 0, this.detailsStitchCache = /* @__PURE__ */ new WeakMap(), this.nodeSourceRanges = /* @__PURE__ */ new WeakMap(), this.sourceLineOffsets = void 0, this.sourceRelationPrevious = void 0, this.sourceRelationCurrent = void 0;
31693
31985
  }
31694
31986
  };
31695
31987
  function wrapMarkdownItBoundaries(md) {
@@ -31828,6 +32120,11 @@ function createSourceLineMapper(source, parsedSource) {
31828
32120
  };
31829
32121
  };
31830
32122
  }
32123
+ var closingTagBlankLineReCache = /* @__PURE__ */ new Map();
32124
+ function getClosingTagBlankLineRe(tag) {
32125
+ let re = closingTagBlankLineReCache.get(tag);
32126
+ return re || (re = new RegExp(String.raw`(^[\t ]*<\s*\/\s*${tag}\s*>[\t ]*)(\r?\n)(?![\t ]*\r?\n|$)`, "gim"), closingTagBlankLineReCache.size >= 64 && closingTagBlankLineReCache.clear(), closingTagBlankLineReCache.set(tag, re)), re;
32127
+ }
31831
32128
  function stripDanglingHtmlLikeTail(markdown) {
31832
32129
  let isWs = (ch) => ch === " " || ch === " " || ch === `
31833
32130
  ` || ch === "\r", isLikelyHtmlTagPrefix = (tail$1) => {
@@ -31888,8 +32185,8 @@ function stripDanglingHtmlLikeTail(markdown) {
31888
32185
  }
31889
32186
  }
31890
32187
  return !0;
31891
- }, isInsideFencedCodeBlock = (src, pos) => isInsideOpenMarkdownFenceBeforeOffset(src, pos), s = String(markdown ?? ""), lastLt = s.lastIndexOf("<");
31892
- if (lastLt === -1 || isInsideFencedCodeBlock(s, lastLt))
32188
+ }, s = String(markdown ?? ""), lastLt = s.lastIndexOf("<");
32189
+ if (lastLt === -1)
31893
32190
  return s;
31894
32191
  if (lastLt > 0) {
31895
32192
  let prev = s[lastLt - 1], prevIsWs = prev === " " || prev === " " || prev === `
@@ -31899,7 +32196,7 @@ function stripDanglingHtmlLikeTail(markdown) {
31899
32196
  }
31900
32197
  let tail = s.slice(lastLt);
31901
32198
  return tail.includes(">") || tail.length > 1 && (tail[1] === " " || tail[1] === " " || tail[1] === `
31902
- ` || tail[1] === "\r") || !isLikelyHtmlTagPrefix(tail) ? s : s.slice(0, lastLt);
32199
+ ` || tail[1] === "\r") || !isLikelyHtmlTagPrefix(tail) || isInsideOpenMarkdownFenceBeforeOffset(s, lastLt) ? s : s.slice(0, lastLt);
31903
32200
  }
31904
32201
  function ensureBlankLineBeforeInlineMultilineCustomHtmlBlocks(markdown, tags) {
31905
32202
  if (!markdown || !tags.length)
@@ -32445,10 +32742,8 @@ function normalizeStreamingCustomHtmlSource(markdown, customHtmlTags, isFinal) {
32445
32742
  if (customHtmlTags?.length && safeMarkdown.includes("<")) {
32446
32743
  let tags = normalizeCustomHtmlTags(customHtmlTags);
32447
32744
  if (tags.length && (safeMarkdown = ensureBlankLineBeforeInlineMultilineCustomHtmlBlocks(safeMarkdown, tags), safeMarkdown = normalizeCustomHtmlOpeningTagSameLine(safeMarkdown, tags), safeMarkdown = ensureBlankLineBeforeCustomHtmlBlocks(safeMarkdown, tags), safeMarkdown = ensureBlankLineAfterCustomHtmlCloseBeforeBlockMarkerSameLine(safeMarkdown, tags), safeMarkdown.includes("</")))
32448
- for (let tag of tags) {
32449
- let re = new RegExp(String.raw`(^[\t ]*<\s*\/\s*${tag}\s*>[\t ]*)(\r?\n)(?![\t ]*\r?\n|$)`, "gim");
32450
- safeMarkdown = safeMarkdown.replace(re, "$1$2$2");
32451
- }
32745
+ for (let tag of tags)
32746
+ safeMarkdown = safeMarkdown.replace(getClosingTagBlankLineRe(tag), "$1$2$2");
32452
32747
  }
32453
32748
  return isFinal || (safeMarkdown = stripDanglingHtmlLikeTail(safeMarkdown)), safeMarkdown;
32454
32749
  }
@@ -32475,7 +32770,7 @@ function transformStreamingSafeMarkdown(source, isFinal, options) {
32475
32770
  }
32476
32771
  function getSafeMarkdown(runtime, sourceMarkdown, isFinal, options) {
32477
32772
  let mode = `${isFinal ? "final" : "stream"}:${(options.customHtmlTags ?? []).join(",")}`, previous = options.isFragment ? void 0 : runtime.safeMarkdown, safeMarkdown;
32478
- if (!isFinal && !options.customHtmlTags?.length && previous && previous.mode === mode && sourceMarkdown.length >= previous.source.length && sourceMarkdown.startsWith(previous.source)) {
32773
+ if (!isFinal && !options.customHtmlTags?.length && previous && previous.mode === mode && sourceMarkdown.length >= previous.source.length && runtime.sourceExtends(previous.source, sourceMarkdown)) {
32479
32774
  let windowStart = Math.max(0, previous.source.length - SAFE_MARKDOWN_WINDOW_MARGIN - SAFE_MARKDOWN_WINDOW_OVERLAP), transformed = transformStreamingSafeMarkdown(sourceMarkdown.slice(windowStart), isFinal, options), overlapLength = previous.source.length - windowStart;
32480
32775
  safeMarkdown = transformed.length >= overlapLength && transformed.slice(0, overlapLength) === previous.safeMarkdown.slice(-overlapLength) ? previous.safeMarkdown.slice(0, previous.safeMarkdown.length - overlapLength) + transformed : transformStreamingSafeMarkdown(sourceMarkdown, isFinal, options);
32481
32776
  } else
@@ -32546,7 +32841,7 @@ function parseMarkdownWithContext(markdown, inputContext) {
32546
32841
  ...options,
32547
32842
  sourceLineMapper: options.includeSourceMap === !0 ? createSourceLineMapper(sourceMarkdown, safeMarkdown) : void 0,
32548
32843
  sourceMarkdown: safeMarkdown,
32549
- sourceLineOffsets: getCachedSourceLineOffsets(runtime, safeMarkdown),
32844
+ sourceLineOffsets: options.isFragment ? computeSourceLineOffsets(safeMarkdown) : getCachedSourceLineOffsets(runtime, safeMarkdown),
32550
32845
  customHtmlBlockCursor: 0
32551
32846
  }, result = processTopLevelTokensWithReuse(runtime, safeMarkdown, transformedTokens, internalOptions, {
32552
32847
  processTokens: (nextTokens, nextOptions) => processTokensWithTiming(nextTokens, nextOptions, timing),
@@ -32568,9 +32863,18 @@ function parseMarkdownWithContext(markdown, inputContext) {
32568
32863
  getInternalNodeSourceRange: (node) => getInternalNodeSourceRange(node, runtime),
32569
32864
  markdownIt: md,
32570
32865
  parseFragment: (fragment, fragmentOptions) => parseMarkdownWithContext(fragment, fragmentOptions)
32571
- };
32572
- result = mergeSplitTopLevelHtmlBlocks(result, isFinal, safeMarkdown, htmlStructureContext, internalOptions), result = combineStructuredDetailsHtmlBlocks(result, safeMarkdown, htmlStructureContext, internalOptions, isFinal)[0], result = structureGenericHtmlBlockChildren(result, htmlStructureContext, internalOptions, isFinal, tailStart), timing && addTiming(timing, "htmlBlockPassesMs", getParserNow() - htmlPassesStartedAt);
32573
- }
32866
+ }, canReuseHtmlPrefix = tailStart > 0 && runtime.htmlPassIdentityPreserving, tailSourceStart = canReuseHtmlPrefix ? getInternalNodeSourceRange(result[tailStart], runtime)?.start : void 0, hasDetailsInput = !1;
32867
+ for (let i = canReuseHtmlPrefix ? tailStart : 0; i < result.length; i++) {
32868
+ let node = result[i];
32869
+ if (node.type === "html_block" && String(node.tag ?? "").toLowerCase() === "details") {
32870
+ hasDetailsInput = !0;
32871
+ break;
32872
+ }
32873
+ }
32874
+ let useHtmlTail = canReuseHtmlPrefix && !hasDetailsInput && tailSourceStart != null, prefix = useHtmlTail ? result.slice(0, tailStart) : [], htmlInput = useHtmlTail ? result.slice(tailStart) : result, htmlSourceStart = useHtmlTail ? tailSourceStart : 0, htmlResult = mergeSplitTopLevelHtmlBlocks(htmlInput, isFinal, safeMarkdown, htmlStructureContext, internalOptions, htmlSourceStart), mergeIdentityPreserving = htmlResult.length === htmlInput.length && htmlResult.every((node, index) => node === htmlInput[index]);
32875
+ hasDetailsInput && (htmlResult = combineStructuredDetailsHtmlBlocks(htmlResult, safeMarkdown, htmlStructureContext, internalOptions, isFinal, htmlSourceStart)[0]), htmlResult = structureGenericHtmlBlockChildren(htmlResult, htmlStructureContext, internalOptions, isFinal), result = useHtmlTail ? prefix.concat(htmlResult) : htmlResult, runtime.htmlPassIdentityPreserving = !hasDetailsInput && mergeIdentityPreserving, timing && addTiming(timing, "htmlBlockPassesMs", getParserNow() - htmlPassesStartedAt);
32876
+ } else
32877
+ runtime.htmlPassIdentityPreserving = !0;
32574
32878
  return isFinal && finalizeHtmlBlockLoading(result), result = applyPostTransformNodes(result, options), options.debug && console.log("Parsed Markdown Tree Structure:", result), finishTimedParse(result, timing, parseStartedAt);
32575
32879
  }
32576
32880
  function parseMarkdownToStructure(markdown, md, options = {}) {
@@ -32708,11 +33012,13 @@ function getMarkdown(msgId = `editor-${Date.now()}`, options = {}) {
32708
33012
  md.use(applyInlinePairs), md.use(sup_plugin), md.use(ins_plugin$1);
32709
33013
  let checkboxModule = import_markdown_it_task_checkbox, markdownItCheckboxPlugin = checkboxModule.default ?? checkboxModule;
32710
33014
  md.use(markdownItCheckboxPlugin), md.use(ins_plugin), md.use(footnote_plugin), md.core.ruler.after("block", "mark_fence_closed", (state) => {
32711
- let s = state, src = s.src, envFinal = !!s.env?.__markstreamFinal, lines = src.split(/\r?\n/);
33015
+ let s = state, src = s.src, envFinal = !!s.env?.__markstreamFinal, lines;
32712
33016
  for (let token of s.tokens) {
32713
33017
  if (token.type !== "fence" || !token.map || !token.markup)
32714
33018
  continue;
32715
- let openLine = token.map[0], endLine = token.map[1], markup = token.markup, marker = markup[0], minLen = markup.length, line = lines[Math.max(0, endLine - 1)] ?? "", i = 0;
33019
+ let openLine = token.map[0], endLine = token.map[1], markup = token.markup, marker = markup[0], minLen = markup.length, lineIdx = Math.max(0, endLine - 1);
33020
+ lines ?? (lines = src.split(/\r?\n/));
33021
+ let line = lines[lineIdx] ?? "", i = 0;
32716
33022
  for (; i < line.length && (line[i] === " " || line[i] === " "); )
32717
33023
  i++;
32718
33024
  let count = 0;
@@ -34981,7 +35287,11 @@ var TVirtualMarkdown = (0, import_vue33.defineComponent)({
34981
35287
  return withTextWidthProvider(
34982
35288
  widthProvider,
34983
35289
  () => terminalSelectionRowSpans(range, cols, rows.value.length).map((span) => {
34984
- let text2 = sliceByCellsRange(rows.value[span.y]?.plainText ?? "", span.x0, span.x1);
35290
+ let text2 = sliceByCellsRangeForSelection(
35291
+ rows.value[span.y]?.plainText ?? "",
35292
+ span.x0,
35293
+ span.x1
35294
+ );
34985
35295
  return span.x1 >= cols ? text2.trimEnd() : text2;
34986
35296
  }).join(`
34987
35297
  `)