@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/markdown.cjs CHANGED
@@ -853,6 +853,19 @@ function sliceByCellsRange(text2, startCells, endCells, provider = currentTextWi
853
853
  out.push(g), cells = next;
854
854
  }), out.length ? out.join("") : "";
855
855
  }
856
+ function sliceByCellsRangeForSelection(text2, startCells, endCells, provider = currentTextWidthProvider()) {
857
+ if (startCells = Math.max(0, Math.floor(startCells)), endCells = Math.max(0, Math.floor(endCells)), endCells <= startCells || !text2)
858
+ return "";
859
+ if (hasAsciiFastPath(provider) && isAscii(text2))
860
+ return text2.slice(startCells, endCells);
861
+ let out = [], cells = 0;
862
+ return forEachGrapheme(text2, (g) => {
863
+ let leadingCell = cells;
864
+ if (cells += charCellWidth(g, provider), leadingCell >= endCells)
865
+ return !1;
866
+ leadingCell >= startCells && out.push(g);
867
+ }), out.join("");
868
+ }
856
869
  var textWidthCache = /* @__PURE__ */ new Map(), MAX_TEXT_WIDTH_CACHE = 1024;
857
870
  function textWidthCacheGet(text2) {
858
871
  let cached = textWidthCache.get(text2);
@@ -1279,7 +1292,7 @@ function loadBuiltinMathRasterizer() {
1279
1292
  })()), builtinRasterizerLoad;
1280
1293
  }
1281
1294
 
1282
- // node_modules/.pnpm/stream-markdown-parser@1.2.12/node_modules/stream-markdown-parser/dist/index.js
1295
+ // node_modules/.pnpm/stream-markdown-parser@1.2.19/node_modules/stream-markdown-parser/dist/index.js
1283
1296
  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() {
1284
1297
  return mod || (0, cb[__getOwnPropNames2(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
1285
1298
  }, __export$1 = (all) => {
@@ -4606,6 +4619,30 @@ function inline(state) {
4606
4619
  }
4607
4620
  }
4608
4621
  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;
4622
+ function hasLinkifySeed(text$1) {
4623
+ return text$1.includes(".") || text$1.includes("@") || text$1.includes(":");
4624
+ }
4625
+ var linkifySeedSafety = /* @__PURE__ */ new WeakMap();
4626
+ function isLinkifySeedSafe(linkify$2) {
4627
+ let schemaSearch = linkify$2.re?.get_schema_search?.();
4628
+ if (!schemaSearch)
4629
+ return !1;
4630
+ let cached = linkifySeedSafety.get(linkify$2);
4631
+ if (cached && cached.schemaSearch === schemaSearch)
4632
+ return cached.safe;
4633
+ let schemas = linkify$2.__schemas__, safe = !0;
4634
+ if (schemas) {
4635
+ for (let name in schemas)
4636
+ if (name.charCodeAt(name.length - 1) !== 58) {
4637
+ safe = !1;
4638
+ break;
4639
+ }
4640
+ }
4641
+ return linkifySeedSafety.set(linkify$2, {
4642
+ schemaSearch,
4643
+ safe
4644
+ }), safe;
4645
+ }
4609
4646
  function isLinkOpen(str) {
4610
4647
  return /^<a[>\s]/i.test(str);
4611
4648
  }
@@ -4631,55 +4668,57 @@ function trimCjkPrefixFromFuzzyLink(linkify$2, link$1) {
4631
4668
  }
4632
4669
  function linkify(state) {
4633
4670
  let blockTokens = state.tokens;
4634
- if (state.md?.options?.linkify)
4635
- for (let j = 0; j < blockTokens.length; j++) {
4636
- let blockToken$1 = blockTokens[j];
4637
- if (blockToken$1.type !== "inline" || !state.md.linkify.test(blockToken$1.content))
4671
+ if (!state.md?.options?.linkify)
4672
+ return;
4673
+ let seedSafe = isLinkifySeedSafe(state.md.linkify), mayMatch = (text$1) => seedSafe ? hasLinkifySeed(text$1) : !0;
4674
+ for (let j = 0; j < blockTokens.length; j++) {
4675
+ let blockToken$1 = blockTokens[j];
4676
+ if (blockToken$1.type !== "inline" || !mayMatch(blockToken$1.content))
4677
+ continue;
4678
+ let tokens = blockToken$1.children;
4679
+ tokens || (tokens = [], blockToken$1.children = tokens);
4680
+ let htmlLinkLevel = 0;
4681
+ for (let i = tokens.length - 1; i >= 0; i--) {
4682
+ let currentToken = tokens[i];
4683
+ if (currentToken.type === "link_close") {
4684
+ for (i--; i >= 0 && tokens[i].level !== currentToken.level && tokens[i].type !== "link_open"; )
4685
+ i--;
4638
4686
  continue;
4639
- let tokens = blockToken$1.children;
4640
- tokens || (tokens = [], blockToken$1.children = tokens);
4641
- let htmlLinkLevel = 0;
4642
- for (let i = tokens.length - 1; i >= 0; i--) {
4643
- let currentToken = tokens[i];
4644
- if (currentToken.type === "link_close") {
4645
- for (i--; i >= 0 && tokens[i].level !== currentToken.level && tokens[i].type !== "link_open"; )
4646
- i--;
4647
- continue;
4648
- }
4649
- 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))
4650
- continue;
4651
- let text$1 = currentToken.content, links = (state.md.linkify.match(text$1) || []).map((link$1) => trimCjkPrefixFromFuzzyLink(state.md.linkify, link$1));
4652
- if (links.length === 0)
4687
+ }
4688
+ if (currentToken.type === "html_inline" && (isLinkOpen(currentToken.content) && htmlLinkLevel > 0 && htmlLinkLevel--, isLinkClose(currentToken.content) && htmlLinkLevel++), htmlLinkLevel > 0 || currentToken.type !== "text" || !mayMatch(currentToken.content))
4689
+ continue;
4690
+ let text$1 = currentToken.content, links = (state.md.linkify.match(text$1) || []).map((link$1) => trimCjkPrefixFromFuzzyLink(state.md.linkify, link$1));
4691
+ if (links.length === 0)
4692
+ continue;
4693
+ let nodes = [], level = currentToken.level, lastPos = 0;
4694
+ links.length > 0 && links[0].index === 0 && i > 0 && tokens[i - 1].type === "text_special" && (links = links.slice(1));
4695
+ for (let ln = 0; ln < links.length; ln++) {
4696
+ let link$1 = links[ln], fullUrl = state.md.normalizeLink(link$1.url);
4697
+ if (!state.md.validateLink(fullUrl))
4653
4698
  continue;
4654
- let nodes = [], level = currentToken.level, lastPos = 0;
4655
- links.length > 0 && links[0].index === 0 && i > 0 && tokens[i - 1].type === "text_special" && (links = links.slice(1));
4656
- for (let ln = 0; ln < links.length; ln++) {
4657
- let link$1 = links[ln], fullUrl = state.md.normalizeLink(link$1.url);
4658
- if (!state.md.validateLink(fullUrl))
4659
- continue;
4660
- let urlText = link$1.text;
4661
- 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:\/\//, "");
4662
- let pos = link$1.index;
4663
- if (pos > lastPos) {
4664
- let textToken$1 = new Token("text", "", 0);
4665
- textToken$1.content = text$1.slice(lastPos, pos), textToken$1.level = level, nodes.push(textToken$1);
4666
- }
4667
- let tokenOpen = new Token("link_open", "a", 1);
4668
- tokenOpen.attrs = [["href", fullUrl]], tokenOpen.level = level++, tokenOpen.markup = "linkify", tokenOpen.info = "auto", nodes.push(tokenOpen);
4669
- let tokenText = new Token("text", "", 0);
4670
- tokenText.content = urlText, tokenText.level = level, nodes.push(tokenText);
4671
- let tokenClose = new Token("link_close", "a", -1);
4672
- tokenClose.level = --level, tokenClose.markup = "linkify", tokenClose.info = "auto", nodes.push(tokenClose), lastPos = link$1.lastIndex;
4699
+ let urlText = link$1.text;
4700
+ 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:\/\//, "");
4701
+ let pos = link$1.index;
4702
+ if (pos > lastPos) {
4703
+ let textToken$1 = new Token("text", "", 0);
4704
+ textToken$1.content = text$1.slice(lastPos, pos), textToken$1.level = level, nodes.push(textToken$1);
4673
4705
  }
4674
- if (lastPos !== 0) {
4675
- if (lastPos < text$1.length) {
4676
- let textToken$1 = new Token("text", "", 0);
4677
- textToken$1.content = text$1.slice(lastPos), textToken$1.level = level, nodes.push(textToken$1);
4678
- }
4679
- tokens.splice(i, 1, ...nodes);
4706
+ let tokenOpen = new Token("link_open", "a", 1);
4707
+ tokenOpen.attrs = [["href", fullUrl]], tokenOpen.level = level++, tokenOpen.markup = "linkify", tokenOpen.info = "auto", nodes.push(tokenOpen);
4708
+ let tokenText = new Token("text", "", 0);
4709
+ tokenText.content = urlText, tokenText.level = level, nodes.push(tokenText);
4710
+ let tokenClose = new Token("link_close", "a", -1);
4711
+ tokenClose.level = --level, tokenClose.markup = "linkify", tokenClose.info = "auto", nodes.push(tokenClose), lastPos = link$1.lastIndex;
4712
+ }
4713
+ if (lastPos !== 0) {
4714
+ if (lastPos < text$1.length) {
4715
+ let textToken$1 = new Token("text", "", 0);
4716
+ textToken$1.content = text$1.slice(lastPos), textToken$1.level = level, nodes.push(textToken$1);
4680
4717
  }
4718
+ tokens.splice(i, 1, ...nodes);
4681
4719
  }
4682
4720
  }
4721
+ }
4683
4722
  }
4684
4723
  var NEWLINES_RE = /\r\n?|\n/g, NULL_RE = /\0/g;
4685
4724
  function normalize(state) {
@@ -4855,7 +4894,7 @@ function process_inlines(tokens, state) {
4855
4894
  nextChar = tokens[j].content.charCodeAt(0);
4856
4895
  break;
4857
4896
  }
4858
- let isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar)), isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar)), isLastWhiteSpace = isWhiteSpace(lastChar), isNextWhiteSpace = isWhiteSpace(nextChar);
4897
+ let isLastPunctChar = isPunctCode(lastChar), isNextPunctChar = isPunctCode(nextChar), isLastWhiteSpace = isWhiteSpace(lastChar), isNextWhiteSpace = isWhiteSpace(nextChar);
4859
4898
  if (isNextWhiteSpace ? canOpen = !1 : isNextPunctChar && (isLastWhiteSpace || isLastPunctChar || (canOpen = !1)), isLastWhiteSpace ? canClose = !1 : isLastPunctChar && (isNextWhiteSpace || isNextPunctChar || (canClose = !1)), nextChar === 34 && t[0] === '"' && lastChar >= 48 && lastChar <= 57 && (canClose = canOpen = !1), canOpen && canClose && (canOpen = isLastPunctChar, canClose = isNextPunctChar), !canOpen && !canClose) {
4860
4899
  isSingle && (token.content = replaceAt(token.content, t.index, APOSTROPHE));
4861
4900
  continue;
@@ -4910,28 +4949,30 @@ var BAD_PROTO_RE = /^(?:vbscript|javascript|file|data):/, GOOD_DATA_RE = /^data:
4910
4949
  "http:",
4911
4950
  "https:",
4912
4951
  "mailto:"
4913
- ];
4952
+ ], 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;
4914
4953
  function validateLink(url) {
4915
4954
  let str = url.trim().toLowerCase();
4916
4955
  return BAD_PROTO_RE.test(str) ? GOOD_DATA_RE.test(str) : !0;
4917
4956
  }
4918
4957
  function normalizeLink(url) {
4919
4958
  let parsed = parse_default(url, !0);
4920
- if (parsed.hostname && (!parsed.protocol || RECODE_HOSTNAME_FOR.includes(parsed.protocol)))
4959
+ if (parsed.hostname && (!parsed.protocol || RECODE_HOSTNAME_FOR.includes(parsed.protocol)) && NON_ASCII_RE.test(parsed.hostname))
4921
4960
  try {
4922
4961
  parsed.hostname = import_punycode.default.toASCII(parsed.hostname);
4923
4962
  } catch {
4924
4963
  }
4925
- return encode_default(format(parsed));
4964
+ let formatted = format(parsed);
4965
+ return ENCODE_IDENTITY_RE.test(formatted) ? encode_default(formatted) : formatted;
4926
4966
  }
4927
4967
  function normalizeLinkText(url) {
4928
4968
  let parsed = parse_default(url, !0);
4929
- if (parsed.hostname && (!parsed.protocol || RECODE_HOSTNAME_FOR.includes(parsed.protocol)))
4969
+ if (parsed.hostname && (!parsed.protocol || RECODE_HOSTNAME_FOR.includes(parsed.protocol)) && (NON_ASCII_RE.test(parsed.hostname) || PUNYCODE_LABEL_RE.test(parsed.hostname)))
4930
4970
  try {
4931
4971
  parsed.hostname = import_punycode.default.toUnicode(parsed.hostname);
4932
4972
  } catch {
4933
4973
  }
4934
- return decode_default(format(parsed), `${decode_default.defaultChars}%`);
4974
+ let formatted = format(parsed);
4975
+ return DECODE_SCAN_RE.test(formatted) ? decode_default(formatted, `${decode_default.defaultChars}%`) : formatted;
4935
4976
  }
4936
4977
  function isSpace$7(code$1) {
4937
4978
  switch (code$1) {
@@ -8330,6 +8371,37 @@ var Renderer = class {
8330
8371
  return output;
8331
8372
  }
8332
8373
  }, renderer_default = Renderer, EMPTY_TOKENS = [], GLOBAL_STATE_APPEND_SCAN_WINDOW = 4096;
8374
+ function copyOptions(options) {
8375
+ let copy = { ...options };
8376
+ return Array.isArray(options.quotes) && (copy.quotes = [...options.quotes]), options.experimental && (copy.experimental = { ...options.experimental }), copy;
8377
+ }
8378
+ function optionsEqual(left, right) {
8379
+ let keys = Object.keys(right);
8380
+ return Object.keys(left).length !== keys.length ? !1 : keys.every((key) => {
8381
+ if (!Object.hasOwn(left, key))
8382
+ return !1;
8383
+ let leftValue = left[key], rightValue = right[key];
8384
+ if (Array.isArray(leftValue) && Array.isArray(rightValue))
8385
+ return leftValue.length === rightValue.length && leftValue.every((value, index) => Object.is(value, rightValue[index]));
8386
+ if (key === "experimental" && leftValue && rightValue) {
8387
+ let leftExperimental = leftValue, rightExperimental = rightValue, experimentalKeys = Object.keys(rightExperimental);
8388
+ return Object.keys(leftExperimental).length === experimentalKeys.length && experimentalKeys.every((option) => Object.hasOwn(leftExperimental, option) && Object.is(leftExperimental[option], rightExperimental[option]));
8389
+ }
8390
+ return Object.is(leftValue, rightValue);
8391
+ });
8392
+ }
8393
+ function copyParserConfig(md) {
8394
+ return {
8395
+ options: copyOptions(md.options),
8396
+ coreVersion: md.core.ruler.version,
8397
+ blockVersion: md.block.ruler.version,
8398
+ inlineVersion: md.inline.ruler.version,
8399
+ inline2Version: md.inline.ruler2.version
8400
+ };
8401
+ }
8402
+ function parserConfigEqual(config$1, md) {
8403
+ 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;
8404
+ }
8333
8405
  function appendedHasBlockConstructs(s) {
8334
8406
  let len = s.length, lineStart = 0;
8335
8407
  for (; lineStart <= len; ) {
@@ -8472,9 +8544,9 @@ var StreamParser = class {
8472
8544
  __publicField(this, "core");
8473
8545
  __publicField(this, "anchorBlock", new ParserBlock());
8474
8546
  __publicField(this, "cache", null);
8547
+ __publicField(this, "snapshots", /* @__PURE__ */ new WeakSet());
8475
8548
  __publicField(this, "stats", makeEmptyStats());
8476
8549
  __publicField(this, "normalizeLineEndings", !0);
8477
- __publicField(this, "coreRulerVersion", -1);
8478
8550
  __publicField(this, "tokenMapsTrusted", !0);
8479
8551
  __publicField(this, "allowUntrustedTailReuse", !1);
8480
8552
  __publicField(this, "MIN_SIZE_FOR_OPTIMIZATION", 1e3);
@@ -8497,19 +8569,46 @@ var StreamParser = class {
8497
8569
  let { resets } = this.stats;
8498
8570
  this.stats = makeEmptyStats(), this.stats.resets = resets;
8499
8571
  }
8500
- parse(src, env, md) {
8501
- let priorEnv = this.cache?.env;
8502
- this.coreRulerVersion >= 0 && this.coreRulerVersion !== md.core.ruler.version && (this.cache = null), this.coreRulerVersion = md.core.ruler.version;
8503
- 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");
8572
+ snapshot() {
8573
+ let cache = this.cache;
8574
+ if (!cache)
8575
+ return null;
8576
+ let state = cache.snapshotState ?? { cache };
8577
+ cache.snapshotState = state;
8578
+ let snapshot = {
8579
+ state,
8580
+ get sourceLength() {
8581
+ return this.state.cache.src.length;
8582
+ },
8583
+ get tokenCount() {
8584
+ return this.state.cache.tokens.length;
8585
+ }
8586
+ };
8587
+ return this.snapshots.add(snapshot), snapshot;
8588
+ }
8589
+ restore(snapshot, md) {
8590
+ if (!this.snapshots.has(snapshot))
8591
+ throw new TypeError("Invalid stream snapshot");
8592
+ let cache = snapshot.state.cache;
8593
+ return this.cache = cache, parserConfigEqual(cache.config, md) ? cache.tokens : this.parse(cache.src, cache.env, md);
8594
+ }
8595
+ append(segment, env, md) {
8596
+ let cached = this.cache;
8597
+ if (!cached)
8598
+ throw new Error("Stream append requires cached history; call stream.parse(fullSource) first");
8599
+ return this.ensureBoundaryState(cached), this.parse(cached.src + segment, env, md, segment);
8600
+ }
8601
+ parse(src, env, md, knownAppend) {
8602
+ 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");
8504
8603
  this.normalizeLineEndings = lineNormalizerIndex >= 0 && blockRuleIndex >= 0 && lineNormalizerIndex < blockRuleIndex;
8505
- 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);
8604
+ 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);
8506
8605
  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;
8507
- let cached = customNormalize || nonstandardBuiltinNormalize || unknownPreBlockRule ? null : previousCache;
8606
+ let cached = configChanged || customNormalize || nonstandardBuiltinNormalize || unknownPreBlockRule ? null : previousCache;
8508
8607
  if (beginParseDiagnostics(envProvided ?? previousCache?.env ?? priorEnv), !cached || envProvided && envProvided !== cached.env) {
8509
8608
  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;
8510
- if (largeCachePolicy === "skip" && (shouldSkipLargeCache = src.length >= skipCacheChars, !shouldSkipLargeCache && skipCacheLines !== void 0 && (srcLineCount = countLines(src), shouldSkipLargeCache = srcLineCount >= skipCacheLines)), shouldSkipLargeCache) {
8609
+ if (largeCachePolicy === "skip" && (shouldSkipLargeCache = src.length >= skipCacheChars, !shouldSkipLargeCache && skipCacheLines !== void 0 && (srcLineCount = countLines(src), shouldSkipLargeCache = srcLineCount >= skipCacheLines)), shouldSkipLargeCache && knownAppend === void 0 && !previousCache?.snapshotState) {
8511
8610
  let parsed$2 = this.parseFullDocument(src, workingEnv, md, srcLineCount, !1);
8512
- return this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(workingEnv, {
8611
+ return this.cache = null, this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(workingEnv, {
8513
8612
  area: "stream",
8514
8613
  path: "stream-full",
8515
8614
  reason: "skip-cache-large-one-shot",
@@ -8525,26 +8624,28 @@ var StreamParser = class {
8525
8624
  maxChunkLines: useLines,
8526
8625
  fenceAware: recommendation?.fenceAware ?? chunkFenceAware$1,
8527
8626
  maxChunks: useMaxChunks
8528
- });
8529
- return this.cache = {
8627
+ }), globalStateReason = getParseDiagnostics(workingEnv)?.chunk?.globalStateDetected ?? null, cache$2 = this.setCache({
8530
8628
  src,
8531
8629
  tokens,
8532
8630
  env: workingEnv,
8533
8631
  lineCount: srcLineCount,
8534
8632
  lastSegment: void 0,
8535
- globalStateReason: detectGlobalMarkdownState(src)
8536
- }, this.updateCacheLineCount(this.cache, srcLineCount), this.recordChunkedParseResult(workingEnv, wantsChunking$1 ? "explicit-initial-large-doc" : "default-initial-large-doc"), tokens;
8633
+ globalStateReason
8634
+ }, md);
8635
+ return this.updateCacheLineCount(cache$2, srcLineCount), this.recordChunkedParseResult(workingEnv, wantsChunking$1 ? "explicit-initial-large-doc" : "default-initial-large-doc"), tokens;
8537
8636
  }
8538
8637
  }
8539
8638
  let parsed$1 = this.parseFullDocument(src, workingEnv, md, srcLineCount);
8540
- return srcLineCount = parsed$1.lineCount, this.cache = {
8639
+ srcLineCount = parsed$1.lineCount;
8640
+ let cache$1 = this.setCache({
8541
8641
  src,
8542
8642
  tokens: parsed$1.tokens,
8543
8643
  env: workingEnv,
8544
8644
  lineCount: srcLineCount,
8545
8645
  lastSegment: void 0,
8546
- globalStateReason: detectGlobalMarkdownState(src)
8547
- }, this.updateCacheLineCount(this.cache, srcLineCount), this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(workingEnv, {
8646
+ globalStateReason: parsed$1.globalStateReason
8647
+ }, md);
8648
+ return this.updateCacheLineCount(cache$1, srcLineCount), this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(workingEnv, {
8548
8649
  area: "stream",
8549
8650
  path: "stream-full",
8550
8651
  reason: "initial-parse",
@@ -8557,21 +8658,21 @@ var StreamParser = class {
8557
8658
  path: "stream-cache",
8558
8659
  reason: "same-source"
8559
8660
  }), cached.tokens;
8560
- let appendDelta = src.startsWith(cached.src) ? src.slice(cached.src.length) : null, cachedGlobalStateReason = cached.globalStateReason;
8661
+ let appendDelta = knownAppend !== void 0 ? knownAppend : src.startsWith(cached.src) ? src.slice(cached.src.length) : null, cachedGlobalStateReason = cached.globalStateReason;
8561
8662
  cachedGlobalStateReason === void 0 && (cachedGlobalStateReason = detectGlobalMarkdownState(cached.src), cached.globalStateReason = cachedGlobalStateReason);
8562
8663
  let currentGlobalStateReason = cachedGlobalStateReason ? null : appendDelta !== null ? this.detectGlobalStateForAppend(cached, appendDelta) : detectGlobalMarkdownState(src), nextGlobalStateReason = cachedGlobalStateReason || currentGlobalStateReason;
8563
8664
  if (nextGlobalStateReason) {
8564
8665
  let fallbackEnv$1 = envProvided ?? cached.env;
8565
8666
  resetKnownGlobalMarkdownState(fallbackEnv$1);
8566
- let fallbackGlobalStateReason = detectGlobalMarkdownState(src), parsed$1 = this.parseFullDocument(src, fallbackEnv$1, md), nextTokens$1 = parsed$1.tokens, lineCount = parsed$1.lineCount;
8567
- return this.cache = {
8667
+ let parsed$1 = this.parseFullDocument(src, fallbackEnv$1, md), nextTokens$1 = parsed$1.tokens, lineCount = parsed$1.lineCount, cache$1 = this.setCache({
8568
8668
  src,
8569
8669
  tokens: nextTokens$1,
8570
8670
  env: fallbackEnv$1,
8571
8671
  lineCount,
8572
8672
  lastSegment: void 0,
8573
- globalStateReason: fallbackGlobalStateReason
8574
- }, this.updateCacheLineCount(this.cache, lineCount), this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(fallbackEnv$1, {
8673
+ globalStateReason: parsed$1.globalStateReason
8674
+ }, md);
8675
+ return this.updateCacheLineCount(cache$1, lineCount), this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(fallbackEnv$1, {
8575
8676
  area: "stream",
8576
8677
  path: "stream-full",
8577
8678
  reason: `global-state:${nextGlobalStateReason}`,
@@ -8579,23 +8680,23 @@ var StreamParser = class {
8579
8680
  }), nextTokens$1;
8580
8681
  }
8581
8682
  let threshold = md.options?.streamOptimizationMinSize ?? this.MIN_SIZE_FOR_OPTIMIZATION;
8582
- if (cached.src.length < threshold && src.length < threshold * 1.5 && !src.startsWith(cached.src)) {
8583
- let fallbackEnv$1 = envProvided ?? cached.env, parsed$1 = this.parseFullDocument(src, fallbackEnv$1, md), nextTokens$1 = parsed$1.tokens, lineCount = parsed$1.lineCount;
8584
- return this.cache = {
8683
+ if (cached.src.length < threshold && src.length < threshold * 1.5 && appendDelta === null) {
8684
+ 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({
8585
8685
  src,
8586
8686
  tokens: nextTokens$1,
8587
8687
  env: fallbackEnv$1,
8588
8688
  lineCount,
8589
8689
  lastSegment: void 0,
8590
- globalStateReason: detectGlobalMarkdownState(src)
8591
- }, this.updateCacheLineCount(this.cache, lineCount), this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(fallbackEnv$1, {
8690
+ globalStateReason: parsed$1.globalStateReason
8691
+ }, md);
8692
+ return this.updateCacheLineCount(cache$1, lineCount), this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(fallbackEnv$1, {
8592
8693
  area: "stream",
8593
8694
  path: "stream-full",
8594
8695
  reason: "small-non-append",
8595
8696
  unbounded: !!getParseDiagnostics(fallbackEnv$1)?.unbounded
8596
8697
  }), nextTokens$1;
8597
8698
  }
8598
- 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);
8699
+ 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);
8599
8700
  if (appended) {
8600
8701
  let cachedLineCount = cached.lineCount ?? countLines(cached.src), ctxLines = 3;
8601
8702
  appended.length > 5e3 ? ctxLines = 8 : appended.length > 1e3 ? ctxLines = 6 : appended.length > 200 && (ctxLines = 4), ctxLines = Math.min(ctxLines, cachedLineCount);
@@ -8670,11 +8771,16 @@ var StreamParser = class {
8670
8771
  }
8671
8772
  dup > 0 && (appendedTokenStart += dup), a.length > appendedTokenStart && this.appendTokens(cached.tokens, a, appendedTokenStart);
8672
8773
  }
8673
- if (this.updateFenceMarkerCacheForAppend(cached, appended), cached.src = src, cached.globalStateReason = null, cached.lineCount = cachedLineCount + (appendedLineCount ?? countAppendedLines()), cached.tokens.length > appendStart) {
8774
+ 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) {
8674
8775
  let appendedLastSegment = this.getLastSegment(cached.tokens, src, appendStart, cached.tokens.length, src.length - appended.length, cachedLineCount);
8675
- appendedLastSegment ? cached.lastSegment = appendedLastSegment : cached.lastSegment = void 0;
8776
+ if (appendedLastSegment) {
8777
+ cached.lastSegment = appendedLastSegment;
8778
+ let appendedOffset = src.length - appended.length;
8779
+ cached.lastSegmentSource = appended.slice(Math.max(0, appendedLastSegment.srcOffset - appendedOffset));
8780
+ } else
8781
+ cached.lastSegment = void 0, cached.lastSegmentSource = void 0;
8676
8782
  } else
8677
- cached.lastSegment = void 0;
8783
+ cached.lastSegment = void 0, cached.lastSegmentSource = void 0;
8678
8784
  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, {
8679
8785
  area: "stream",
8680
8786
  path: useUnboundedAppend ? "stream-unbounded-append" : "stream-append",
@@ -8682,7 +8788,7 @@ var StreamParser = class {
8682
8788
  unbounded: useUnboundedAppend
8683
8789
  }), cached.tokens;
8684
8790
  }
8685
- 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;
8791
+ 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;
8686
8792
  if (tailReparsed)
8687
8793
  return this.stats.total += 1, this.stats.tailHits += 1, this.stats.lastMode = "tail", setStrategyDiagnostics(fallbackEnv, {
8688
8794
  area: "stream",
@@ -8699,26 +8805,28 @@ var StreamParser = class {
8699
8805
  maxChunkLines: useLines,
8700
8806
  fenceAware: recommendation?.fenceAware ?? chunkFenceAware,
8701
8807
  maxChunks: useMaxChunks
8702
- });
8703
- return this.cache = {
8808
+ }), globalStateReason = getParseDiagnostics(fallbackEnv)?.chunk?.globalStateDetected ?? null, cache$1 = this.setCache({
8704
8809
  src,
8705
8810
  tokens,
8706
8811
  env: fallbackEnv,
8707
8812
  lineCount: srcLineCount2,
8708
8813
  lastSegment: void 0,
8709
- globalStateReason: detectGlobalMarkdownState(src)
8710
- }, this.updateCacheLineCount(this.cache, srcLineCount2), this.recordChunkedParseResult(fallbackEnv, wantsChunking ? "explicit-fallback-large-doc" : "default-fallback-large-doc"), tokens;
8814
+ globalStateReason
8815
+ }, md);
8816
+ return this.updateCacheLineCount(cache$1, srcLineCount2), this.recordChunkedParseResult(fallbackEnv, wantsChunking ? "explicit-fallback-large-doc" : "default-fallback-large-doc"), tokens;
8711
8817
  }
8712
8818
  }
8713
8819
  let parsed = this.parseFullDocument(src, fallbackEnv, md, srcLineCount2), nextTokens = parsed.tokens;
8714
- return srcLineCount2 = parsed.lineCount, this.cache = {
8820
+ srcLineCount2 = parsed.lineCount;
8821
+ let cache = this.setCache({
8715
8822
  src,
8716
8823
  tokens: nextTokens,
8717
8824
  env: fallbackEnv,
8718
8825
  lineCount: srcLineCount2,
8719
8826
  lastSegment: void 0,
8720
- globalStateReason: detectGlobalMarkdownState(src)
8721
- }, this.updateCacheLineCount(this.cache, srcLineCount2), this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(fallbackEnv, {
8827
+ globalStateReason: parsed.globalStateReason
8828
+ }, md);
8829
+ return this.updateCacheLineCount(cache, srcLineCount2), this.stats.total += 1, this.stats.fullParses += 1, this.stats.lastMode = "full", setStrategyDiagnostics(fallbackEnv, {
8722
8830
  area: "stream",
8723
8831
  path: "stream-full",
8724
8832
  reason: "fallback-full",
@@ -8744,11 +8852,10 @@ var StreamParser = class {
8744
8852
  });
8745
8853
  }
8746
8854
  parseFullDocument(src, env, md, knownLineCount, needLineCount = !0) {
8747
- let currentGlobalStateReason = detectGlobalMarkdownState(src);
8748
8855
  getKnownGlobalMarkdownState(env) && resetKnownGlobalMarkdownState(env);
8749
8856
  let autoUnboundedDecision = typeof md.__canUseImplicitLargeInputStrategy != "function" || md.__canUseImplicitLargeInputStrategy() ? getAutoUnboundedDecision(md, src.length, knownLineCount) : "no";
8750
8857
  if (autoUnboundedDecision === "yes") {
8751
- let tokens = parseStringUnbounded(md, src, env);
8858
+ let tokens = parseStringUnbounded(md, src, env), globalStateReason = getParseDiagnostics(env)?.unbounded?.globalStateDetected ?? null;
8752
8859
  return setStrategyDiagnostics(env, {
8753
8860
  area: "stream",
8754
8861
  path: "stream-full",
@@ -8756,12 +8863,13 @@ var StreamParser = class {
8756
8863
  unbounded: !0
8757
8864
  }), {
8758
8865
  tokens,
8759
- lineCount: knownLineCount ?? (needLineCount ? countLines(src) : 0)
8866
+ lineCount: knownLineCount ?? (needLineCount ? countLines(src) : 0),
8867
+ globalStateReason
8760
8868
  };
8761
8869
  }
8762
8870
  let lineCount = knownLineCount;
8763
8871
  if (autoUnboundedDecision === "need-lines" && (lineCount = countLines(src), shouldAutoUseUnbounded(md, src.length, lineCount))) {
8764
- let tokens = parseStringUnbounded(md, src, env);
8872
+ let tokens = parseStringUnbounded(md, src, env), globalStateReason = getParseDiagnostics(env)?.unbounded?.globalStateDetected ?? null;
8765
8873
  return setStrategyDiagnostics(env, {
8766
8874
  area: "stream",
8767
8875
  path: "stream-full",
@@ -8769,12 +8877,16 @@ var StreamParser = class {
8769
8877
  unbounded: !0
8770
8878
  }), {
8771
8879
  tokens,
8772
- lineCount
8880
+ lineCount,
8881
+ globalStateReason
8773
8882
  };
8774
8883
  }
8775
- return lineCount === void 0 && (lineCount = needLineCount ? countLines(src) : 0), {
8884
+ lineCount === void 0 && (lineCount = needLineCount ? countLines(src) : 0);
8885
+ let currentGlobalStateReason = detectGlobalMarkdownState(src);
8886
+ return {
8776
8887
  tokens: runWithKnownGlobalMarkdownState(env, currentGlobalStateReason, () => this.core.parse(src, env, md).tokens),
8777
- lineCount
8888
+ lineCount,
8889
+ globalStateReason: currentGlobalStateReason
8778
8890
  };
8779
8891
  }
8780
8892
  shouldUseUnboundedAppend(src, _cached, appended) {
@@ -8782,8 +8894,8 @@ var StreamParser = class {
8782
8894
  }
8783
8895
  getAppendedSegment(cache, next, knownAppend) {
8784
8896
  let prev = cache.src;
8785
- if (knownAppend === null || knownAppend === void 0 && !next.startsWith(prev) || !prev.endsWith(`
8786
- `))
8897
+ if (knownAppend === null || knownAppend === void 0 && !next.startsWith(prev) || (knownAppend !== void 0 ? !this.ensureBoundaryState(cache).endsWithNewline : !prev.endsWith(`
8898
+ `)))
8787
8899
  return null;
8788
8900
  let segment = knownAppend ?? next.slice(prev.length);
8789
8901
  if (!segment)
@@ -8800,47 +8912,69 @@ var StreamParser = class {
8800
8912
  if (trimmedFirstLine.length === 0)
8801
8913
  return null;
8802
8914
  if (/^[-=]+$/.test(trimmedFirstLine)) {
8803
- let prevWithoutTrailingNewline = prev.slice(0, -1), lastBreak = prevWithoutTrailingNewline.lastIndexOf(`
8915
+ let previousLineNonBlank;
8916
+ if (knownAppend !== void 0)
8917
+ previousLineNonBlank = this.ensureBoundaryState(cache).previousLineNonBlank;
8918
+ else {
8919
+ let prevWithoutTrailingNewline = prev.slice(0, -1), lastBreak = prevWithoutTrailingNewline.lastIndexOf(`
8804
8920
  `);
8805
- if (prevWithoutTrailingNewline.slice(lastBreak + 1).trim().length > 0)
8921
+ previousLineNonBlank = prevWithoutTrailingNewline.slice(lastBreak + 1).trim().length > 0;
8922
+ }
8923
+ if (previousLineNonBlank)
8806
8924
  return null;
8807
8925
  }
8808
- let scanStart = this.tokenMapsTrusted ? this.ensureLastSegment(cache)?.srcOffset ?? 0 : 0;
8809
- return (this.tokenMapsTrusted || this.cacheHasFenceMarker(cache)) && this.endsInsideOpenFence(prev, scanStart) || this.mayContainReferenceDefinition(segment) ? null : segment;
8926
+ if (knownAppend !== void 0) {
8927
+ let lastSegment = this.ensureLastSegment(cache);
8928
+ if (lastSegment && this.segmentHasFence(cache, lastSegment)) {
8929
+ let scanStart = this.tokenMapsTrusted ? this.ensureSegmentSourceOffset(cache, lastSegment) : 0;
8930
+ if (this.endsInsideOpenFence(prev, scanStart))
8931
+ return null;
8932
+ }
8933
+ } else {
8934
+ let scanStart = this.tokenMapsTrusted ? this.ensureLastSegment(cache)?.srcOffset ?? 0 : 0;
8935
+ if ((this.tokenMapsTrusted || this.cacheHasFenceMarker(cache)) && this.endsInsideOpenFence(prev, scanStart))
8936
+ return null;
8937
+ }
8938
+ return this.mayContainReferenceDefinition(segment) ? null : segment;
8810
8939
  }
8811
- tryTailSegmentReparse(src, cached, env, md, segmentOverride) {
8940
+ tryTailSegmentReparse(src, cached, env, md, segmentOverride, knownAppend) {
8812
8941
  let lastSegment = segmentOverride ?? this.ensureLastSegment(cached);
8813
- if (!lastSegment || lastSegment.srcOffset <= 0 && lastSegment.tokenStart <= 0)
8942
+ if (!lastSegment)
8814
8943
  return null;
8815
- let stablePrefix = cached.src.slice(0, lastSegment.srcOffset);
8816
- if (!src.startsWith(stablePrefix))
8944
+ let directAppend = knownAppend !== void 0;
8945
+ if (directAppend && this.ensureSegmentSourceOffset(cached, lastSegment), lastSegment.srcOffset <= 0 && lastSegment.tokenStart <= 0)
8817
8946
  return null;
8818
- let prevTail = cached.src.slice(lastSegment.srcOffset), nextTail = src.slice(lastSegment.srcOffset);
8947
+ if (!directAppend) {
8948
+ let stablePrefix = cached.src.slice(0, lastSegment.srcOffset);
8949
+ if (!src.startsWith(stablePrefix))
8950
+ return null;
8951
+ }
8952
+ let prevTail = directAppend ? cached.lastSegmentSource ?? cached.src.slice(lastSegment.srcOffset) : cached.src.slice(lastSegment.srcOffset), nextTail = directAppend ? prevTail + knownAppend : src.slice(lastSegment.srcOffset);
8819
8953
  if (nextTail === prevTail)
8820
8954
  return null;
8821
- let appended = src.startsWith(cached.src) ? src.slice(cached.src.length) : null, postBlockSrc = this.getNormalizedUpdatedSource(cached, src);
8955
+ let appended = directAppend ? knownAppend : src.startsWith(cached.src) ? src.slice(cached.src.length) : null, postBlockSrc = directAppend && this.tokenMapsTrusted ? src : this.getNormalizedUpdatedSource(cached, src, knownAppend);
8822
8956
  if (appended) {
8823
8957
  let merged = this.tryContainerTailAppendMerge(src, cached, env, md, lastSegment, appended, postBlockSrc);
8824
8958
  if (merged)
8825
- return merged;
8959
+ return cached.lastSegmentSource = directAppend ? nextTail : void 0, merged;
8826
8960
  }
8827
8961
  if (this.mayContainReferenceDefinition(prevTail) || this.mayContainReferenceDefinition(nextTail))
8828
8962
  return null;
8829
8963
  try {
8830
8964
  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);
8831
- 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 = {
8965
+ 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 = {
8832
8966
  tokenStart: lastSegment.tokenStart + localLastSegment.tokenStart,
8833
8967
  tokenEnd: lastSegment.tokenStart + localLastSegment.tokenEnd,
8834
8968
  lineStart: parsedTail.mapsShifted ? localLastSegment.lineStart : lastSegment.lineStart + localLastSegment.lineStart,
8835
8969
  lineEnd: parsedTail.mapsShifted ? localLastSegment.lineEnd : lastSegment.lineStart + localLastSegment.lineEnd,
8836
8970
  srcOffset: lastSegment.srcOffset + localLastSegment.srcOffset
8837
- } : cached.lastSegment = null, cached.lastSegmentVerified = void 0, cached.tokens;
8971
+ }, cached.lastSegmentSource = directAppend ? nextTail.slice(localLastSegment.srcOffset) : void 0) : (cached.lastSegment = null, cached.lastSegmentSource = void 0), cached.lastSegmentVerified = void 0, cached.tokens;
8838
8972
  } catch {
8839
8973
  return null;
8840
8974
  }
8841
8975
  }
8842
8976
  tryUntrustedParagraphTailReparse(src, cached, env, md) {
8843
- if (this.endsWithBlankLine(cached.src))
8977
+ if (cached.boundary ? cached.boundary.endsWithBlankLine : this.endsWithBlankLine(cached.src))
8844
8978
  return null;
8845
8979
  let lastSegment = this.ensureLastSegment(cached);
8846
8980
  if (!lastSegment || cached.tokens[lastSegment.tokenStart]?.type !== "paragraph_open")
@@ -8871,6 +9005,7 @@ var StreamParser = class {
8871
9005
  return count;
8872
9006
  }
8873
9007
  hasVerifiedSegmentAnchor(cache, segment, md) {
9008
+ segment.srcOffset < 0 && this.ensureSegmentSourceOffset(cache, segment);
8874
9009
  let lineCount = cache.lineCount ?? countLines(cache.src), docLineCount = this.getDocLineCount(cache.src, lineCount);
8875
9010
  if (!(segment.lineStart >= 0 && segment.lineStart <= segment.lineEnd && segment.lineEnd <= docLineCount && segment.srcOffset < cache.src.length))
8876
9011
  return !1;
@@ -8897,6 +9032,10 @@ var StreamParser = class {
8897
9032
  return !1;
8898
9033
  }
8899
9034
  }
9035
+ normalizeSource(src) {
9036
+ return src.replace(/\r\n?/g, `
9037
+ `).replace(/\0/g, "\uFFFD");
9038
+ }
8900
9039
  cacheHasFenceMarker(cache) {
8901
9040
  return cache.hasFenceMarker === void 0 && (cache.hasFenceMarker = cache.src.includes("```") || cache.src.includes("~~~")), cache.hasFenceMarker;
8902
9041
  }
@@ -8906,16 +9045,12 @@ var StreamParser = class {
8906
9045
  let boundary = cache.src.slice(-2) + appended;
8907
9046
  cache.hasFenceMarker = boundary.includes("```") || boundary.includes("~~~");
8908
9047
  }
8909
- normalizeSource(src) {
8910
- return src.replace(/\r\n?/g, `
8911
- `).replace(/\0/g, "\uFFFD");
8912
- }
8913
- getNormalizedUpdatedSource(cache, next) {
9048
+ getNormalizedUpdatedSource(cache, next, knownAppend) {
8914
9049
  if (!this.normalizeLineEndings)
8915
9050
  return next;
8916
- if (!next.startsWith(cache.src))
9051
+ if (knownAppend === void 0 && !next.startsWith(cache.src))
8917
9052
  return this.normalizeSource(next);
8918
- let normalizedCached = cache.normalizedSrc ?? this.normalizeSource(cache.src), appended = next.slice(cache.src.length), normalizedAppend = this.normalizeSource(appended);
9053
+ let normalizedCached = cache.normalizedSrc ?? this.normalizeSource(cache.src), appended = knownAppend ?? next.slice(cache.src.length), normalizedAppend = this.normalizeSource(appended);
8919
9054
  return cache.src.endsWith("\r") && appended.startsWith(`
8920
9055
  `) && (normalizedAppend = normalizedAppend.slice(1)), normalizedCached + normalizedAppend;
8921
9056
  }
@@ -9002,15 +9137,26 @@ var StreamParser = class {
9002
9137
  peek() {
9003
9138
  return this.cache?.tokens ?? EMPTY_TOKENS;
9004
9139
  }
9140
+ hasCache() {
9141
+ return this.cache !== null;
9142
+ }
9005
9143
  getStats() {
9006
9144
  return { ...this.stats };
9007
9145
  }
9146
+ setCache(cache, md) {
9147
+ let snapshotState = this.cache?.snapshotState, nextCache = {
9148
+ ...cache,
9149
+ config: copyParserConfig(md),
9150
+ snapshotState
9151
+ };
9152
+ return snapshotState && (snapshotState.cache = nextCache), this.cache = nextCache, nextCache;
9153
+ }
9008
9154
  appendTokens(target, source, start = 0, end = source.length) {
9009
9155
  for (let i = start; i < end; i++)
9010
9156
  target.push(source[i]);
9011
9157
  }
9012
9158
  updateCacheLineCount(cache, lineCount) {
9013
- cache.lineCount = lineCount ?? countLines(cache.src), cache.lastSegment = void 0, cache.lastSegmentVerified = void 0, cache.normalizedSrc = void 0, cache.globalStateCarry = void 0;
9159
+ 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;
9014
9160
  }
9015
9161
  detectGlobalStateForAppend(cache, appended) {
9016
9162
  if (cache.globalStateReason)
@@ -9018,10 +9164,10 @@ var StreamParser = class {
9018
9164
  let text$1 = (cache.globalStateCarry ?? cache.src.slice(-GLOBAL_STATE_APPEND_SCAN_WINDOW)) + appended, reason = detectGlobalMarkdownState(text$1);
9019
9165
  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;
9020
9166
  }
9021
- ensureLastSegment(cache) {
9022
- return cache.lastSegment !== void 0 || (cache.lastSegment = this.getLastSegment(cache.tokens, cache.src)), cache.lastSegment;
9167
+ ensureLastSegment(cache, skipSourceOffset = !1) {
9168
+ return cache.lastSegment !== void 0 || (cache.lastSegment = this.getLastSegment(cache.tokens, cache.src, 0, cache.tokens.length, void 0, void 0, skipSourceOffset)), cache.lastSegment;
9023
9169
  }
9024
- getLastSegment(tokens, src, tokenStart = 0, tokenEnd = tokens.length, knownSrcOffset, knownLineStart) {
9170
+ getLastSegment(tokens, src, tokenStart = 0, tokenEnd = tokens.length, knownSrcOffset, knownLineStart, skipSourceOffset = !1) {
9025
9171
  if (tokenEnd <= tokenStart)
9026
9172
  return null;
9027
9173
  let lineStart = Number.POSITIVE_INFINITY, lineEnd$2 = -1, depth = 0;
@@ -9039,7 +9185,7 @@ var StreamParser = class {
9039
9185
  tokenEnd,
9040
9186
  lineStart: resolvedStart,
9041
9187
  lineEnd: resolvedEnd,
9042
- srcOffset: this.getLineStartOffset(src, resolvedStart, knownSrcOffset, knownLineStart)
9188
+ srcOffset: skipSourceOffset ? -1 : this.getLineStartOffset(src, resolvedStart, knownSrcOffset, knownLineStart)
9043
9189
  };
9044
9190
  }
9045
9191
  continue;
@@ -9051,12 +9197,38 @@ var StreamParser = class {
9051
9197
  tokenEnd,
9052
9198
  lineStart: resolvedStart,
9053
9199
  lineEnd: resolvedEnd,
9054
- srcOffset: this.getLineStartOffset(src, resolvedStart, knownSrcOffset, knownLineStart)
9200
+ srcOffset: skipSourceOffset ? -1 : this.getLineStartOffset(src, resolvedStart, knownSrcOffset, knownLineStart)
9055
9201
  };
9056
9202
  }
9057
9203
  }
9058
9204
  return null;
9059
9205
  }
9206
+ segmentHasFence(cache, segment) {
9207
+ let end = Math.min(segment.tokenEnd, cache.tokens.length);
9208
+ for (let i = segment.tokenStart; i < end; i++)
9209
+ if (cache.tokens[i].type === "fence")
9210
+ return !0;
9211
+ return !1;
9212
+ }
9213
+ ensureSegmentSourceOffset(cache, segment) {
9214
+ if (segment.srcOffset < 0) {
9215
+ let lineCount = cache.lineCount;
9216
+ 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);
9217
+ }
9218
+ return segment.srcOffset;
9219
+ }
9220
+ getLineStartOffsetFromEnd(src, line, lineCount) {
9221
+ if (line <= 0)
9222
+ return 0;
9223
+ let remaining = lineCount - line + 1, pos = src.length;
9224
+ for (; remaining > 0; ) {
9225
+ if (pos = src.lastIndexOf(`
9226
+ `, pos - 1), pos < 0)
9227
+ return 0;
9228
+ remaining--;
9229
+ }
9230
+ return pos + 1;
9231
+ }
9060
9232
  getLineStartOffset(src, line, knownSrcOffset, knownLineStart) {
9061
9233
  return knownSrcOffset !== void 0 && knownLineStart !== void 0 && line >= knownLineStart ? this.getLineStartOffsetFrom(src, knownSrcOffset, line - knownLineStart) : this.getLineStartOffsetFrom(src, 0, line);
9062
9234
  }
@@ -9083,7 +9255,7 @@ var StreamParser = class {
9083
9255
  return src.includes("]:") ? /(?:^|\n)[ \t]{0,3}\[[^\]\n]+\]:/.test(src) : !1;
9084
9256
  }
9085
9257
  canDirectlyParseAppend(cache) {
9086
- if (!this.tokenMapsTrusted || !this.endsWithBlankLine(cache.src))
9258
+ if (!this.tokenMapsTrusted || !(cache.boundary ? cache.boundary.endsWithBlankLine : this.endsWithBlankLine(cache.src)))
9087
9259
  return !1;
9088
9260
  let lastSegment = this.ensureLastSegment(cache);
9089
9261
  if (!lastSegment)
@@ -9116,8 +9288,9 @@ var StreamParser = class {
9116
9288
  }
9117
9289
  }
9118
9290
  tryListTailAppendMerge(src, cached, env, md, lastSegment, appended, listOpen, postBlockSrc) {
9119
- if (cached.src.length === 0 || cached.src.charCodeAt(cached.src.length - 1) !== 10)
9291
+ if (cached.src.length === 0 || !(cached.boundary ? cached.boundary.endsWithNewline : cached.src.charCodeAt(cached.src.length - 1) === 10))
9120
9292
  return null;
9293
+ this.ensureSegmentSourceOffset(cached, lastSegment);
9121
9294
  let segmentLineSpan = lastSegment.lineEnd - lastSegment.lineStart, segmentChars = cached.src.length - lastSegment.srcOffset;
9122
9295
  if (segmentLineSpan < this.MIN_LIST_LINES_FOR_MERGE && segmentChars < this.MIN_LIST_CHARS_FOR_MERGE)
9123
9296
  return null;
@@ -9135,10 +9308,10 @@ var StreamParser = class {
9135
9308
  return null;
9136
9309
  lineOffset > 0 && !mapsShifted && this.shiftTokenLines(inserted, lineOffset);
9137
9310
  let existingMode = this.getListParagraphMode(cached.tokens, lastSegment.tokenStart, cached.tokens.length, listOpen.level), appendedMode = this.getListParagraphMode(parsed, 0, parsed.length, 0);
9138
- (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;
9311
+ (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;
9139
9312
  let nextLineCount = lineOffset + countLines(appended);
9140
9313
  cached.lineCount = nextLineCount;
9141
- let nextDocLineCount = this.getDocLineCount(src, nextLineCount);
9314
+ let nextDocLineCount = this.getCachedDocLineCount(cached, nextLineCount);
9142
9315
  return listOpen.map && (listOpen.map[1] = nextDocLineCount), cached.lastSegment = {
9143
9316
  tokenStart: lastSegment.tokenStart,
9144
9317
  tokenEnd: cached.tokens.length,
@@ -9148,8 +9321,9 @@ var StreamParser = class {
9148
9321
  }, cached.lastSegmentVerified = !0, cached.tokens;
9149
9322
  }
9150
9323
  tryTableTailAppendMerge(src, cached, env, md, lastSegment, appended, tableOpen, postBlockSrc) {
9151
- if (cached.src.length === 0 || cached.src.charCodeAt(cached.src.length - 1) !== 10 || /(?:^|\n)[ \t]*\n/.test(appended))
9324
+ if (cached.src.length === 0 || !(cached.boundary ? cached.boundary.endsWithNewline : cached.src.charCodeAt(cached.src.length - 1) === 10) || /(?:^|\n)[ \t]*\n/.test(appended))
9152
9325
  return null;
9326
+ this.ensureSegmentSourceOffset(cached, lastSegment);
9153
9327
  let segmentLineSpan = lastSegment.lineEnd - lastSegment.lineStart, segmentChars = cached.src.length - lastSegment.srcOffset;
9154
9328
  if (segmentLineSpan < this.MIN_TABLE_LINES_FOR_MERGE && segmentChars < this.MIN_TABLE_CHARS_FOR_MERGE)
9155
9329
  return null;
@@ -9173,10 +9347,10 @@ var StreamParser = class {
9173
9347
  return null;
9174
9348
  lineOffset !== 0 && !mapsShifted && this.shiftTokenLines(inserted, lineOffset);
9175
9349
  let insertAt = cachedSection.tbodyCloseIndex >= 0 ? cachedSection.tbodyCloseIndex : cachedSection.tableCloseIndex, previousLineCount = cached.lineCount ?? countLines(cached.src);
9176
- cached.tokens.splice(insertAt, 0, ...inserted), this.updateFenceMarkerCacheForAppend(cached, appended), cached.src = src, cached.normalizedSrc = postBlockSrc, cached.env = env, cached.globalStateReason = null;
9350
+ 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;
9177
9351
  let nextLineCount = previousLineCount + countLines(appended);
9178
9352
  cached.lineCount = nextLineCount;
9179
- let nextDocLineCount = this.getDocLineCount(src, nextLineCount);
9353
+ let nextDocLineCount = this.getCachedDocLineCount(cached, nextLineCount);
9180
9354
  if (tableOpen.map && (tableOpen.map[1] = nextDocLineCount), cachedSection.tbodyOpenIndex >= 0) {
9181
9355
  let tbodyOpen = cached.tokens[cachedSection.tbodyOpenIndex];
9182
9356
  tbodyOpen?.map && (tbodyOpen.map[1] = nextDocLineCount);
@@ -9283,7 +9457,7 @@ var StreamParser = class {
9283
9457
  case "paragraph_open":
9284
9458
  case "code_block":
9285
9459
  case "html_block":
9286
- return !this.endsWithBlankLine(cache.src);
9460
+ return !(cache.boundary ? cache.boundary.endsWithBlankLine : this.endsWithBlankLine(cache.src));
9287
9461
  default:
9288
9462
  return lastToken?.nesting === 1;
9289
9463
  }
@@ -9303,9 +9477,41 @@ var StreamParser = class {
9303
9477
  }
9304
9478
  return !0;
9305
9479
  }
9480
+ ensureBoundaryState(cache) {
9481
+ if (cache.boundary)
9482
+ return cache.boundary;
9483
+ 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;
9484
+ for (; lineStart >= 0 && src.charCodeAt(lineStart) !== 10; )
9485
+ lineStart--;
9486
+ let lineNonBlank = !1;
9487
+ for (let i = lineStart + 1; i < lineEnd$2; i++) {
9488
+ let ch = src.charCodeAt(i);
9489
+ if (ch !== 32 && ch !== 9) {
9490
+ lineNonBlank = !0;
9491
+ break;
9492
+ }
9493
+ }
9494
+ return cache.boundary = {
9495
+ currentLineNonBlank: endsWithNewline ? !1 : lineNonBlank,
9496
+ previousLineNonBlank: endsWithNewline ? lineNonBlank : !1,
9497
+ endsWithNewline,
9498
+ endsWithBlankLine: this.endsWithBlankLine(src)
9499
+ }, cache.boundary;
9500
+ }
9501
+ updateBoundaryStateForAppend(cache, appended) {
9502
+ let boundary = this.ensureBoundaryState(cache), currentLineNonBlank = boundary.currentLineNonBlank, previousLineNonBlank = boundary.previousLineNonBlank;
9503
+ for (let i = 0; i < appended.length; i++) {
9504
+ let ch = appended.charCodeAt(i);
9505
+ ch === 10 ? (previousLineNonBlank = currentLineNonBlank, currentLineNonBlank = !1) : ch !== 32 && ch !== 9 && (currentLineNonBlank = !0);
9506
+ }
9507
+ 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;
9508
+ }
9306
9509
  getDocLineCount(src, lineCount = countLines(src)) {
9307
9510
  return src.length === 0 ? 0 : src.charCodeAt(src.length - 1) === 10 ? lineCount : lineCount + 1;
9308
9511
  }
9512
+ getCachedDocLineCount(cache, lineCount) {
9513
+ return cache.src.length === 0 ? 0 : cache.boundary ? cache.boundary.endsWithNewline ? lineCount : lineCount + 1 : this.getDocLineCount(cache.src, lineCount);
9514
+ }
9309
9515
  shiftTokenLines(tokens, offset) {
9310
9516
  if (offset === 0)
9311
9517
  return;
@@ -9692,9 +9898,25 @@ function markdownIt(presetName, options) {
9692
9898
  parse(src, env) {
9693
9899
  return md.stream.enabled ? getStreamParser().parse(src, env, md) : md.parse(src, env ?? {});
9694
9900
  },
9901
+ append(segment, env) {
9902
+ if (!md.stream.enabled)
9903
+ throw new Error("Stream append requires stream mode");
9904
+ return getStreamParser().append(segment, env, md);
9905
+ },
9906
+ snapshot() {
9907
+ return streamParser ? streamParser.snapshot() : null;
9908
+ },
9909
+ restore(snapshot) {
9910
+ if (!md.stream.enabled)
9911
+ throw new Error("Stream restore requires stream mode");
9912
+ return getStreamParser().restore(snapshot, md);
9913
+ },
9695
9914
  reset() {
9696
9915
  getStreamParser().reset();
9697
9916
  },
9917
+ hasCache() {
9918
+ return streamParser?.hasCache() ?? !1;
9919
+ },
9698
9920
  peek() {
9699
9921
  return streamParser ? streamParser.peek() : [];
9700
9922
  },
@@ -10247,9 +10469,9 @@ function applyContainers(md) {
10247
10469
  function escapeTagForRegExp(tag) {
10248
10470
  return tag.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
10249
10471
  }
10250
- function findTagCloseIndexOutsideQuotes(input) {
10472
+ function findTagCloseIndexOutsideQuotes(input, start = 0) {
10251
10473
  let inSingle = !1, inDouble = !1;
10252
- for (let i = 0; i < input.length; i++) {
10474
+ for (let i = start; i < input.length; i++) {
10253
10475
  let ch = input[i];
10254
10476
  if (ch === "\\") {
10255
10477
  i++;
@@ -11120,7 +11342,7 @@ function createChildParseContext(parent, options = parent, overrides = {}) {
11120
11342
  ...overrides
11121
11343
  });
11122
11344
  }
11123
- 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([
11345
+ 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([
11124
11346
  "ai",
11125
11347
  "md",
11126
11348
  "py",
@@ -11240,15 +11462,15 @@ var FILENAMEISH_EXTENSION_RE = /\.([a-z0-9]{1,15})$/i, FILENAMEISH_SEGMENT_RE =
11240
11462
  "yml",
11241
11463
  "zip",
11242
11464
  "zsh"
11243
- ]), linkifyDemotionContextCache = /* @__PURE__ */ new Map();
11465
+ ]), linkifyDemotionContextCache = /* @__PURE__ */ new Map(), linkifyDemotionContextCacheTextLength = 0;
11244
11466
  function rememberLinkifyDemotionContext(text$1, context) {
11245
11467
  if (!text$1 || text$1.length > LINKIFY_DEMOTION_CONTEXT_CACHE_MAX_TEXT_LENGTH)
11246
11468
  return context;
11247
- for (linkifyDemotionContextCache.set(text$1, context); linkifyDemotionContextCache.size > LINKIFY_DEMOTION_CONTEXT_CACHE_LIMIT; ) {
11469
+ 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; ) {
11248
11470
  let oldestKey = linkifyDemotionContextCache.keys().next().value;
11249
11471
  if (!oldestKey)
11250
11472
  break;
11251
- linkifyDemotionContextCache.delete(oldestKey);
11473
+ linkifyDemotionContextCache.delete(oldestKey), linkifyDemotionContextCacheTextLength -= oldestKey.length;
11252
11474
  }
11253
11475
  return context;
11254
11476
  }
@@ -11296,7 +11518,7 @@ function inferContinuationLinkifyContext(raw, inherited) {
11296
11518
  })) && (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;
11297
11519
  }
11298
11520
  function createLinkifyDemotionContextTracker(options, sticky = !1) {
11299
- let context;
11521
+ let context = ensureParseContext(options).linkifyDemotionSeedContext;
11300
11522
  return {
11301
11523
  options(raw) {
11302
11524
  return sticky || raw == null ? withLinkifyDemotionContext(options, context) : withLinkifyDemotionContext(options, mergeLinkifyDemotionContext(inferNextBlockLinkifyContext(raw), inferContinuationLinkifyContext(raw, context)));
@@ -11307,6 +11529,9 @@ function createLinkifyDemotionContextTracker(options, sticky = !1) {
11307
11529
  },
11308
11530
  reset() {
11309
11531
  context = void 0;
11532
+ },
11533
+ snapshot() {
11534
+ return context;
11310
11535
  }
11311
11536
  };
11312
11537
  }
@@ -11343,11 +11568,11 @@ function mayContainLinkifyDemotionContext(text$1) {
11343
11568
  }
11344
11569
  function inferLinkifyDemotionContext(contextText) {
11345
11570
  let text$1 = String(contextText ?? ""), cached = linkifyDemotionContextCache.get(text$1);
11346
- return cached ? (linkifyDemotionContextCache.delete(text$1), linkifyDemotionContextCache.set(text$1, cached), cached) : mayContainLinkifyDemotionContext(text$1) ? rememberLinkifyDemotionContext(text$1, {
11571
+ return cached || (mayContainLinkifyDemotionContext(text$1) ? rememberLinkifyDemotionContext(text$1, {
11347
11572
  explicitFilename: EXPLICIT_FILENAME_CONTEXT_RE.test(text$1),
11348
11573
  filename: FILENAME_CONTEXT_RE.test(text$1),
11349
11574
  marketTicker: MARKET_TICKER_CONTEXT_RE.test(text$1)
11350
- }) : rememberLinkifyDemotionContext(text$1, EMPTY_LINKIFY_DEMOTION_CONTEXT);
11575
+ }) : rememberLinkifyDemotionContext(text$1, EMPTY_LINKIFY_DEMOTION_CONTEXT));
11351
11576
  }
11352
11577
  function hasDomainAuthorityPrefix(text$1) {
11353
11578
  return isPlausibleBareDomain(text$1.split(/[\\/]/)[0] ?? "");
@@ -11852,7 +12077,7 @@ function fixStrongTokens(tokens) {
11852
12077
  for (; k < tokens.length && tokens[k].type === "text" && tokens[k].content === ""; )
11853
12078
  k++;
11854
12079
  let postToken = tokens[k];
11855
- 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));
12080
+ 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));
11856
12081
  } else if (type === "strong_close")
11857
12082
  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);
11858
12083
  else if (type === "em_open") {
@@ -11864,7 +12089,7 @@ function fixStrongTokens(tokens) {
11864
12089
  for (; k < tokens.length && tokens[k].type === "text" && tokens[k].content === ""; )
11865
12090
  k++;
11866
12091
  let postToken = tokens[k];
11867
- 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));
12092
+ 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));
11868
12093
  } else
11869
12094
  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));
11870
12095
  }
@@ -12173,36 +12398,35 @@ function hasTrailingPipeHeaderRowWithoutColon(line) {
12173
12398
  return cells !== null && cells.every((cell) => !cell.includes(":"));
12174
12399
  }
12175
12400
  function fixTableTokens(tokens, final = !1, source = "") {
12176
- let fixedTokens = [...tokens];
12177
12401
  if (tokens.length < 3)
12178
- return fixedTokens;
12402
+ return tokens;
12179
12403
  let i = tokens.length - 2, token = tokens[i];
12180
- if (token.type === "inline") {
12181
- let sourceMap = tokens[i - 1]?.map, tcontent = String(token.content ?? ""), headerContent = tcontent.split(`
12404
+ if (token.type !== "inline")
12405
+ return tokens;
12406
+ let sourceMap = tokens[i - 1]?.map, tcontent = String(token.content ?? ""), headerContent = tcontent.split(`
12182
12407
  `)[0] ?? "", [headerLine = "", separatorLine = "", ...rest] = tcontent.split(`
12183
12408
  `), hasTrailingNewlineSeparatorStart = !final && !tcontent.includes(`
12184
- `) && /\r?\n$/.test(source) && hasTrailingPipeHeaderRow(tcontent);
12185
- if (!final && (tcontent.includes(`
12409
+ `) && /\r?\n$/.test(source) && hasTrailingPipeHeaderRow(tcontent), fixedTokens = null;
12410
+ if (!final && (tcontent.includes(`
12186
12411
  `) && rest.length === 0 && hasTrailingPipeHeaderRow(headerLine) && isTableSeparatorRowWithPartialTail(separatorLine) || hasTrailingNewlineSeparatorStart)) {
12187
- let body = headerContent.slice(1, -1).split("|").map((i$1) => i$1.trim()).flatMap((i$1) => createTh(i$1)), insert = [
12188
- ...createStart(sourceMap),
12189
- ...body,
12190
- ...createEnd()
12191
- ];
12192
- fixedTokens.splice(i - 1, 3, ...insert);
12193
- } else if (tcontent.includes(`
12412
+ let body = headerContent.slice(1, -1).split("|").map((i$1) => i$1.trim()).flatMap((i$1) => createTh(i$1)), insert = [
12413
+ ...createStart(sourceMap),
12414
+ ...body,
12415
+ ...createEnd()
12416
+ ];
12417
+ fixedTokens = [...tokens], fixedTokens.splice(i - 1, 3, ...insert);
12418
+ } else if (tcontent.includes(`
12194
12419
  `) && rest.length === 0 && hasTrailingPipeHeaderRow(headerLine) && isTableSeparatorRow(separatorLine)) {
12195
- let body = headerContent.slice(1, -1).split("|").map((i$1) => i$1.trim()).flatMap((i$1) => createTh(i$1)), insert = [
12196
- ...createStart(sourceMap),
12197
- ...body,
12198
- ...createEnd()
12199
- ];
12200
- fixedTokens.splice(i - 1, 3, ...insert);
12201
- } else
12202
- tcontent.includes(`
12203
- `) && rest.length === 0 && hasTrailingPipeHeaderRowWithoutColon(headerLine) && isTruncatedSeparatorRow(separatorLine) && (token.content = tcontent.slice(0, -2), token.children.splice(2, 1));
12204
- }
12205
- return fixedTokens;
12420
+ let body = headerContent.slice(1, -1).split("|").map((i$1) => i$1.trim()).flatMap((i$1) => createTh(i$1)), insert = [
12421
+ ...createStart(sourceMap),
12422
+ ...body,
12423
+ ...createEnd()
12424
+ ];
12425
+ fixedTokens = [...tokens], fixedTokens.splice(i - 1, 3, ...insert);
12426
+ } else if (tcontent.includes(`
12427
+ `) && rest.length === 0 && hasTrailingPipeHeaderRowWithoutColon(headerLine) && isTruncatedSeparatorRow(separatorLine))
12428
+ return token.content = tcontent.slice(0, -2), token.children.splice(2, 1), tokens;
12429
+ return fixedTokens ?? tokens;
12206
12430
  }
12207
12431
  function findMatchingClose(src, startIdx, open, close) {
12208
12432
  let len = src.length;
@@ -12693,27 +12917,36 @@ function hashTolerantBoundaryContent(content) {
12693
12917
  hash = hash * 31 + content.charCodeAt(index) | 0;
12694
12918
  return hash.toString(36);
12695
12919
  }
12696
- function getTolerantBoundaryScanWindow(source) {
12920
+ function getTolerantBoundaryScanWindow(source, cache) {
12697
12921
  if (source.length <= TOLERANT_BOUNDARY_SCAN_TAIL_CHARS)
12698
12922
  return {
12699
12923
  source,
12700
12924
  lineOffset: 0
12701
12925
  };
12926
+ if (cache) {
12927
+ let cut = source.length - TOLERANT_BOUNDARY_SCAN_TAIL_CHARS, start$1 = source.indexOf(`
12928
+ `, cut);
12929
+ start$1 = start$1 === -1 ? source.length : start$1 + 1;
12930
+ let lineOffset$1 = cache.lineOffset + countLineBreaks(source.slice(cache.windowStart, start$1));
12931
+ return cache.lineOffset = lineOffset$1, cache.windowStart = start$1, {
12932
+ source: source.slice(start$1),
12933
+ lineOffset: lineOffset$1
12934
+ };
12935
+ }
12702
12936
  let start = source.length - TOLERANT_BOUNDARY_SCAN_TAIL_CHARS, nextLineBreak = source.indexOf(`
12703
12937
  `, start);
12704
- return nextLineBreak === -1 ? {
12705
- source: "",
12706
- lineOffset: countLineBreaks(source)
12707
- } : (start = nextLineBreak + 1, {
12938
+ start = nextLineBreak === -1 ? source.length : nextLineBreak + 1;
12939
+ let lineOffset = countLineBreaks(source.slice(0, start));
12940
+ return {
12708
12941
  source: source.slice(start),
12709
- lineOffset: countLineBreaks(source.slice(0, start))
12710
- });
12942
+ lineOffset
12943
+ };
12711
12944
  }
12712
- function mayContainTolerantMathBlockBoundaryOpener(markdown) {
12945
+ function mayContainTolerantMathBlockBoundaryOpener(markdown, scanWindowCache) {
12713
12946
  let fullSource = String(markdown ?? "");
12714
12947
  if (!fullSource || !fullSource.includes("$$") && !fullSource.includes("\\["))
12715
12948
  return !1;
12716
- let { source } = getTolerantBoundaryScanWindow(fullSource);
12949
+ let { source } = getTolerantBoundaryScanWindow(fullSource, scanWindowCache);
12717
12950
  if (!source)
12718
12951
  return !1;
12719
12952
  let lines = source.split(/\r?\n/), startLine = Math.max(0, lines.length - TOLERANT_BOUNDARY_SCAN_MAX_LINES - 2), delimiters = [["$$", "$$"], ["\\[", "\\]"]];
@@ -12727,11 +12960,11 @@ function mayContainTolerantMathBlockBoundaryOpener(markdown) {
12727
12960
  }
12728
12961
  return !1;
12729
12962
  }
12730
- function getTolerantMathBlockBoundaryStreamKey(markdown) {
12963
+ function getTolerantMathBlockBoundaryStreamKey(markdown, scanWindowCache) {
12731
12964
  let fullSource = String(markdown ?? "");
12732
12965
  if (!fullSource || !fullSource.includes("$$") && !fullSource.includes("\\["))
12733
12966
  return null;
12734
- let { source, lineOffset } = getTolerantBoundaryScanWindow(fullSource);
12967
+ let { source, lineOffset } = getTolerantBoundaryScanWindow(fullSource, scanWindowCache);
12735
12968
  if (!source)
12736
12969
  return null;
12737
12970
  let lines = source.split(/\r?\n/), startLine = Math.max(0, lines.length - TOLERANT_BOUNDARY_SCAN_MAX_LINES - 2), delimiters = [["$$", "$$"], ["\\[", "\\]"]];
@@ -13225,7 +13458,7 @@ function applyRenderRules(md) {
13225
13458
  return `<pre class="${info ? `language-${md.utils.escapeHtml(info.split(/\s+/g)[0])}` : ""}"><code>${md.utils.escapeHtml(String(tokenShape.content ?? ""))}</code></pre>`;
13226
13459
  });
13227
13460
  }
13228
- var HTML_LINK_OPEN_RE = /^<a[>\s]/i, HTML_LINK_CLOSE_RE = /^<\/a\s*>/i;
13461
+ var HTML_LINK_OPEN_RE = /^<a[>\s]/i, HTML_LINK_CLOSE_RE = /^<\/a\s*>/i, LINKIFY_SEED_RE = /[@:]|\/\/|\.\S/;
13229
13462
  function inlineTokenMayNeedLinkify(token, linkify$2) {
13230
13463
  if (token?.type !== "inline")
13231
13464
  return !1;
@@ -13251,13 +13484,33 @@ function inlineTokenMayNeedLinkify(token, linkify$2) {
13251
13484
  }
13252
13485
  function applyLinkifyCandidateFilter(md) {
13253
13486
  let ruler = md.core?.ruler, original = ruler.getNamedRules?.().find((rule) => rule.name === "linkify")?.fn;
13254
- typeof original == "function" && ruler.at("linkify", (state) => {
13487
+ if (typeof original != "function")
13488
+ return;
13489
+ 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;
13490
+ ruler.at("linkify", (state) => {
13255
13491
  if (!state.md?.options?.linkify)
13256
13492
  return;
13257
13493
  let tokens = Array.isArray(state.tokens) ? state.tokens : [], linkify$2 = state.md.linkify;
13258
- if (!linkify$2)
13494
+ if (!linkify$2 || !tokens.some((token) => token?.type === "inline"))
13259
13495
  return;
13260
- let candidates = tokens.filter((token) => inlineTokenMayNeedLinkify(token, linkify$2));
13496
+ 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;
13497
+ if (nativeMethods && nativeBuilder && screenedCache !== re.cache) {
13498
+ screenedCache = re.cache;
13499
+ let { schema_names: schemas = [], tlds = [] } = re.opts;
13500
+ seedSafe = schemas.every((name) => name === "//" || name.endsWith(":")) && tlds.every((tld) => /^[\p{L}\p{N}-]+$/u.test(tld));
13501
+ }
13502
+ let canScreen = !!nativeMethods && !!nativeBuilder && seedSafe && (state.env?.__markstreamFinal !== !1 || !!re?.cache.link_fuzzy_search), candidates = tokens.filter((token) => {
13503
+ if (canScreen && token?.type === "inline") {
13504
+ let children = token.children;
13505
+ if (Array.isArray(children) && children.length > 0) {
13506
+ if (!children.some((child) => child?.type === "text" && LINKIFY_SEED_RE.test(String(child.content ?? ""))))
13507
+ return !1;
13508
+ } else if (!LINKIFY_SEED_RE.test(String(token.content ?? "")))
13509
+ return !1;
13510
+ canScreen = !1;
13511
+ }
13512
+ return inlineTokenMayNeedLinkify(token, linkify$2);
13513
+ });
13261
13514
  if (candidates.length)
13262
13515
  return original(Object.assign(Object.create(Object.getPrototypeOf(state)), state, { tokens: candidates }));
13263
13516
  });
@@ -13314,7 +13567,17 @@ function factory(opts = {}) {
13314
13567
  ...opts.mathOptions ?? {}
13315
13568
  }), (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;
13316
13569
  }
13317
- var NOT_WHITESPACE = /\S/;
13570
+ var regexCache = /* @__PURE__ */ new Map();
13571
+ function getCachedRegex(pattern, flags) {
13572
+ let key = flags ? `${pattern}:::${flags}` : pattern, regex = regexCache.get(key);
13573
+ if (!regex && (regex = new RegExp(pattern, flags), regexCache.set(key, regex), regexCache.size > 200)) {
13574
+ let keysToDelete = Array.from(regexCache.keys()).slice(0, 50);
13575
+ for (let keyToDelete of keysToDelete)
13576
+ regexCache.delete(keyToDelete);
13577
+ }
13578
+ return regex.lastIndex = 0, regex;
13579
+ }
13580
+ 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*>$/;
13318
13581
  function parseStandaloneHtmlDocument(markdown) {
13319
13582
  let firstNonWhitespace = markdown.search(NOT_WHITESPACE);
13320
13583
  if (firstNonWhitespace === -1 || markdown.charCodeAt(firstNonWhitespace) !== 60)
@@ -13322,7 +13585,7 @@ function parseStandaloneHtmlDocument(markdown) {
13322
13585
  let trimmed = markdown.trim();
13323
13586
  if (!trimmed)
13324
13587
  return null;
13325
- let startsLikeHtmlDocument = /^(?:<!doctype\s+html[^>]*>\s*)?<html(?:\s[^>]*)?>/i.test(trimmed), endsWithHtmlClose = /<\/html>\s*$/i.test(trimmed);
13588
+ let startsLikeHtmlDocument = STARTS_LIKE_HTML_DOCUMENT_RE.test(trimmed), endsWithHtmlClose = ENDS_WITH_HTML_CLOSE_RE.test(trimmed);
13326
13589
  return !startsLikeHtmlDocument || !endsWithHtmlClose ? null : [{
13327
13590
  type: "html_block",
13328
13591
  tag: "html",
@@ -13342,7 +13605,7 @@ function isCloseOnlyHtmlBlockForTag(node, tag) {
13342
13605
  if (node.type !== "html_block" || !tag)
13343
13606
  return !1;
13344
13607
  let raw = String(node.raw ?? node.content ?? "");
13345
- return new RegExp(String.raw`^\s*<\s*\/\s*${escapeTagForRegExp(tag)}\s*>\s*$`, "i").test(raw);
13608
+ return getCachedRegex(String.raw`^\s*<\s*\/\s*${escapeTagForRegExp(tag)}\s*>\s*$`, "i").test(raw);
13346
13609
  }
13347
13610
  var RAW_TEXT_HTML_TAGS = /* @__PURE__ */ new Set([
13348
13611
  "iframe",
@@ -13373,11 +13636,11 @@ function findNextHtmlBlockFromSource(source, tag, startIndex) {
13373
13636
  tag: ""
13374
13637
  };
13375
13638
  }
13376
- let endRel = findTagCloseIndexOutsideQuotes(source.slice(start$1));
13377
- if (endRel === -1)
13639
+ let closeIndex = findTagCloseIndexOutsideQuotes(source, start$1);
13640
+ if (closeIndex === -1)
13378
13641
  return null;
13379
- let end = start$1 + endRel + 1, raw = source.slice(start$1, end);
13380
- if (/^<\s*[!?]/.test(raw))
13642
+ let end = closeIndex + 1, raw = source.slice(start$1, end);
13643
+ if (NON_ELEMENT_MARKUP_START_RE.test(raw))
13381
13644
  return {
13382
13645
  closing: !1,
13383
13646
  end,
@@ -13386,11 +13649,11 @@ function findNextHtmlBlockFromSource(source, tag, startIndex) {
13386
13649
  };
13387
13650
  let body = raw.slice(1).trimStart(), closing = body.startsWith("/");
13388
13651
  closing && (body = body.slice(1).trimStart());
13389
- let tagMatch = body.match(/^([A-Z][\w:-]*)/i);
13652
+ let tagMatch = body.match(MARKUP_TAG_NAME_RE);
13390
13653
  return tagMatch?.[1] ? {
13391
13654
  closing,
13392
13655
  end,
13393
- selfClosing: /\/\s*>$/.test(raw),
13656
+ selfClosing: SELF_CLOSING_END_RE$1.test(raw),
13394
13657
  tag: tagMatch[1].toLowerCase()
13395
13658
  } : {
13396
13659
  closing: !1,
@@ -13399,7 +13662,7 @@ function findNextHtmlBlockFromSource(source, tag, startIndex) {
13399
13662
  tag: ""
13400
13663
  };
13401
13664
  }, findRawTextClose = (rawTextTag, from) => {
13402
- let closeRe = new RegExp(String.raw`<\s*\/\s*${escapeTagForRegExp(rawTextTag)}(?=\s|>)`, "gi");
13665
+ let closeRe = getCachedRegex(String.raw`<\s*\/\s*${escapeTagForRegExp(rawTextTag)}(?=\s|>)`, "gi");
13403
13666
  closeRe.lastIndex = from;
13404
13667
  let match = closeRe.exec(source);
13405
13668
  if (!match || match.index == null)
@@ -13430,7 +13693,7 @@ function findNextHtmlBlockFromSource(source, tag, startIndex) {
13430
13693
  if (start === -1 || openEnd === -1)
13431
13694
  return null;
13432
13695
  let openTag = source.slice(start, openEnd + 1);
13433
- if (VOID_HTML_TAGS.has(lowerTag) || /\/\s*>$/.test(openTag))
13696
+ if (VOID_HTML_TAGS.has(lowerTag) || SELF_CLOSING_END_RE$1.test(openTag))
13434
13697
  return {
13435
13698
  raw: openTag,
13436
13699
  start,
@@ -13534,13 +13797,14 @@ function extendHtmlBlockCloseToLineEnding(source, startIndex) {
13534
13797
  ` ? end + 1 : startIndex;
13535
13798
  }
13536
13799
  function findLastClosingTagStart(raw, tag) {
13537
- let closeRe = new RegExp(String.raw`<\s*\/\s*${escapeTagForRegExp(tag)}(?=\s|>)`, "gi"), last = -1, match;
13800
+ let closeRe = getCachedRegex(String.raw`<\s*\/\s*${escapeTagForRegExp(tag)}(?=\s|>)`, "gi"), last = -1, match;
13538
13801
  for (; (match = closeRe.exec(raw)) !== null; )
13539
13802
  last = match.index;
13540
13803
  return last;
13541
13804
  }
13805
+ 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 = /<[^>]*$/;
13542
13806
  function findMatchingCloseTagEnd(rawHtml, tag, startIndex) {
13543
- 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);
13807
+ 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);
13544
13808
  for (; index < rawHtml.length; ) {
13545
13809
  let lt = rawHtml.indexOf("<", index);
13546
13810
  if (lt === -1)
@@ -13560,7 +13824,7 @@ function findMatchingCloseTagEnd(rawHtml, tag, startIndex) {
13560
13824
  if (endRel === -1)
13561
13825
  return -1;
13562
13826
  let rawTag = slice.slice(0, endRel + 1);
13563
- /\/\s*>$/.test(rawTag) || depth++, index = lt + endRel + 1;
13827
+ SELF_CLOSING_END_RE.test(rawTag) || depth++, index = lt + endRel + 1;
13564
13828
  continue;
13565
13829
  }
13566
13830
  index = lt + 1;
@@ -13569,7 +13833,7 @@ function findMatchingCloseTagEnd(rawHtml, tag, startIndex) {
13569
13833
  }
13570
13834
  function parseHtmlBlock(token) {
13571
13835
  let raw = String(token.content ?? "");
13572
- if (/^\s*<!--/.test(raw) || /^\s*<!/.test(raw) || /^\s*<\?/.test(raw))
13836
+ if (NON_ELEMENT_HTML_BLOCK_START_RE.test(raw))
13573
13837
  return {
13574
13838
  type: "html_block",
13575
13839
  content: raw,
@@ -13577,7 +13841,7 @@ function parseHtmlBlock(token) {
13577
13841
  tag: "",
13578
13842
  loading: !1
13579
13843
  };
13580
- let tag = (raw.match(/^\s*<([A-Z][\w:-]*)/i)?.[1] || "").toLowerCase();
13844
+ let tag = (raw.match(FIRST_TAG_NAME_RE)?.[1] || "").toLowerCase();
13581
13845
  if (!tag)
13582
13846
  return {
13583
13847
  type: "html_block",
@@ -13586,10 +13850,10 @@ function parseHtmlBlock(token) {
13586
13850
  tag: "",
13587
13851
  loading: !1
13588
13852
  };
13589
- 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);
13853
+ 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);
13590
13854
  return {
13591
13855
  type: "html_block",
13592
- content: loading ? `${raw.replace(/<[^>]*$/, "")}
13856
+ content: loading ? `${raw.replace(TRAILING_UNCLOSED_TAG_RE, "")}
13593
13857
  </${tag}>` : raw,
13594
13858
  raw,
13595
13859
  tag,
@@ -13943,12 +14207,16 @@ function createExplicitBracketMathContext() {
13943
14207
  function cloneExplicitBracketMathContext(context) {
13944
14208
  return { ...context };
13945
14209
  }
13946
- function setTolerantMathBoundaryStreamCache(runtime, source, key, explicitBracketMath = scanExplicitBracketMathStreamState(source).state) {
14210
+ function setTolerantMathBoundaryStreamCache(runtime, source, key, explicitBracketMath = scanExplicitBracketMathStreamState(source).state, scanWindow = {
14211
+ lineOffset: 0,
14212
+ windowStart: 0
14213
+ }) {
13947
14214
  runtime.tolerantMathBoundary = {
13948
14215
  explicitBracketMath,
13949
14216
  source,
13950
14217
  key,
13951
- pendingCandidate: key === null && mayContainTolerantMathBlockBoundaryOpener(source)
14218
+ pendingCandidate: key === null && mayContainTolerantMathBlockBoundaryOpener(source, scanWindow),
14219
+ scanWindow
13952
14220
  };
13953
14221
  }
13954
14222
  function sourceEndsWithSplitTolerantBoundaryPrefix(source) {
@@ -14197,7 +14465,7 @@ function stripPendingExplicitMathTail(markdown, runtime, useCache = !0) {
14197
14465
  let md = runtime.markdownIt;
14198
14466
  if (!hasMarkstreamMathPlugin(md))
14199
14467
  return markdown;
14200
- 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;
14468
+ 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;
14201
14469
  useCache && (runtime.pendingExplicitMathTail = {
14202
14470
  source: markdown,
14203
14471
  state
@@ -14257,13 +14525,16 @@ function syncTolerantMathBoundaryStreamCache(runtime, source) {
14257
14525
  let previous = runtime.tolerantMathBoundary;
14258
14526
  if (previous?.source === source)
14259
14527
  return;
14260
- 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;
14528
+ 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;
14261
14529
  if (previous && sourceExtendsPrevious && previous.key === null && previous.pendingCandidate === !1 && !completesExplicitBracketMathClose && !appendedChunkMayAffectTolerantMathBoundary(previous.source, appended) && !sourceEndsWithSplitTolerantBoundaryPrefix(source)) {
14262
14530
  previous.source = source, previous.explicitBracketMath = nextExplicitBracketMath;
14263
14531
  return;
14264
14532
  }
14265
- let nextKey = getTolerantMathBlockBoundaryStreamKey(source);
14266
- (previous && (previous && !sourceExtendsPrevious || previous.key !== nextKey || completesExplicitBracketMathClose) || !previous && nextKey) && runtime.resetStreamOnly(), setTolerantMathBoundaryStreamCache(runtime, source, nextKey, nextExplicitBracketMath);
14533
+ let scanWindow = sourceExtendsPrevious && previous ? previous.scanWindow : {
14534
+ lineOffset: 0,
14535
+ windowStart: 0
14536
+ }, nextKey = getTolerantMathBlockBoundaryStreamKey(source, scanWindow);
14537
+ (previous && (previous && !sourceExtendsPrevious || previous.key !== nextKey || completesExplicitBracketMathClose) || !previous && nextKey) && runtime.resetStreamOnly(), setTolerantMathBoundaryStreamCache(runtime, source, nextKey, nextExplicitBracketMath, scanWindow);
14267
14538
  }
14268
14539
  function shouldUseSyncParseForPendingTolerantMathBoundary(runtime) {
14269
14540
  let cache = runtime.tolerantMathBoundary;
@@ -14431,6 +14702,7 @@ var REUSABLE_INLINE_TOKEN_TYPES = /* @__PURE__ */ new Set([
14431
14702
  "code_block",
14432
14703
  "fence",
14433
14704
  "hr",
14705
+ "html_block",
14434
14706
  "inline",
14435
14707
  "math_block"
14436
14708
  ]);
@@ -14533,7 +14805,7 @@ function sameTokenAttrs(left, right) {
14533
14805
  function isSameTokenShapeForReuse(left, right) {
14534
14806
  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);
14535
14807
  }
14536
- function updateStructuredStreamCache(runtime, source, tokens, groups, nodes, options, previousSeed) {
14808
+ function updateStructuredStreamCache(runtime, source, tokens, groups, nodes, options, linkifyDemotionContexts, linkifyDemotionContextOffset = 0, fallbackLinkifyDemotionContext) {
14537
14809
  let groupStarts = groups.starts;
14538
14810
  if (groupStarts.length === 0 || nodes.length !== groupStarts.length) {
14539
14811
  runtime.structuredStream = void 0;
@@ -14546,7 +14818,7 @@ function updateStructuredStreamCache(runtime, source, tokens, groups, nodes, opt
14546
14818
  lastToken: tokens[end - 1],
14547
14819
  tokenCount: end - start
14548
14820
  };
14549
- }), 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 ?? ""));
14821
+ }), 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;
14550
14822
  runtime.structuredStream = {
14551
14823
  groupBoundaries,
14552
14824
  groupStarts,
@@ -14555,7 +14827,7 @@ function updateStructuredStreamCache(runtime, source, tokens, groups, nodes, opt
14555
14827
  mixed: groups.mixed,
14556
14828
  source,
14557
14829
  nodes,
14558
- seed,
14830
+ linkifyDemotionContext,
14559
14831
  stableGroupCount,
14560
14832
  requireClosingStrong: options.requireClosingStrong,
14561
14833
  validateLink: options.validateLink
@@ -14592,18 +14864,18 @@ function processTopLevelTokensWithReuse(runtime, source, tokens, options, callba
14592
14864
  if (!groups)
14593
14865
  return runtime.structuredStream = void 0, callbacks.processTokens(tokens, options);
14594
14866
  let groupStarts = groups.starts, stableGroupCount = previous && groups.mixed ? Math.min(previous.stableGroupCount, Math.max(0, previous.groupBoundaries.length - 1)) : previous?.stableGroupCount ?? 0;
14595
- 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)) {
14596
- let tailStart = groupStarts[stableGroupCount] ?? tokens.length, tailNodes = callbacks.processTokens(tokens.slice(tailStart), {
14867
+ 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)) {
14868
+ let tailStart = groupStarts[stableGroupCount] ?? tokens.length, tailOptions = {
14597
14869
  ...options,
14598
- linkifyDemotionSeed: previous.seed.slice(0, stableGroupCount)
14599
- }), expectedTailNodes = groupStarts.length - stableGroupCount;
14870
+ linkifyDemotionSeedContext: previous.linkifyDemotionContext
14871
+ }, tailNodes = callbacks.processTokens(tokens.slice(tailStart), tailOptions), expectedTailNodes = groupStarts.length - stableGroupCount;
14600
14872
  if (tailNodes.length === expectedTailNodes) {
14601
14873
  let result$1 = previous.nodes.slice(0, stableGroupCount).concat(tailNodes);
14602
- return runtime.structuredReuseTailStart = stableGroupCount, callbacks.recordReusedTopLevelNodes?.(stableGroupCount), updateStructuredStreamCache(runtime, source, tokens, groups, result$1, options, previous.seed), result$1;
14874
+ return runtime.structuredReuseTailStart = stableGroupCount, callbacks.recordReusedTopLevelNodes?.(stableGroupCount), updateStructuredStreamCache(runtime, source, tokens, groups, result$1, options, tailOptions.linkifyDemotionResultContexts, stableGroupCount, previous.linkifyDemotionContext), result$1;
14603
14875
  }
14604
14876
  }
14605
14877
  let result = callbacks.processTokens(tokens, options);
14606
- return updateStructuredStreamCache(runtime, source, tokens, groups, result, options), result;
14878
+ return updateStructuredStreamCache(runtime, source, tokens, groups, result, options, options.linkifyDemotionResultContexts), result;
14607
14879
  }
14608
14880
  function isDetailsOpenHtmlBlock(node) {
14609
14881
  if (node.type !== "html_block" || String(node.tag ?? "").toLowerCase() !== "details")
@@ -14688,7 +14960,7 @@ function parseSiblingHtmlBlockChildren(blocks, context, options, final, useCache
14688
14960
  validateLink: options.validateLink
14689
14961
  }), children.flat();
14690
14962
  }
14691
- function structureGenericHtmlBlockChildren(nodes, context, options, final, tailStart = 0) {
14963
+ function structureGenericHtmlBlockChildren(nodes, context, options, final) {
14692
14964
  let processNode = (node) => {
14693
14965
  if (node?.type !== "html_block")
14694
14966
  return node;
@@ -14705,12 +14977,9 @@ function structureGenericHtmlBlockChildren(nodes, context, options, final, tailS
14705
14977
  if (!innerRaw.trim() || !hasStructuredHtmlWrapperMarkers(innerRaw))
14706
14978
  return node;
14707
14979
  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);
14708
- return shouldStructureGenericHtmlBlockChildren(children) ? {
14709
- ...node,
14710
- children
14711
- } : node;
14980
+ return shouldStructureGenericHtmlBlockChildren(children) && (fields.children = children), node;
14712
14981
  };
14713
- return tailStart <= 0 ? nodes.map(processNode) : nodes.slice(0, tailStart).concat(nodes.slice(tailStart).map(processNode));
14982
+ return nodes.map(processNode);
14714
14983
  }
14715
14984
  function hasTopLevelHtmlBlock(nodes, start = 0) {
14716
14985
  for (let i = start; i < nodes.length; i++)
@@ -14821,12 +15090,18 @@ function combineStructuredDetailsHtmlBlocks(nodes, source, context, options, fin
14821
15090
  }
14822
15091
  return [merged, cursor];
14823
15092
  }
14824
- function mergeSplitTopLevelHtmlBlocks(nodes, final, source, context, options) {
15093
+ function findNodeRawPosition(node, nodeRaw, source, cursor, context) {
15094
+ if (!nodeRaw)
15095
+ return -1;
15096
+ let anchor = context.getInternalNodeSourceRange(node)?.start ?? -1, anchored = anchor >= cursor && source.startsWith(nodeRaw, anchor);
15097
+ return node?.type === "html_block" ? anchored && anchor === cursor ? anchor : source.indexOf(nodeRaw, cursor) : anchor < 0 ? source.indexOf(nodeRaw, cursor) : anchored ? anchor : -1;
15098
+ }
15099
+ function mergeSplitTopLevelHtmlBlocks(nodes, final, source, context, options, initialSourceCursor = 0) {
14825
15100
  if (!source)
14826
15101
  return nodes;
14827
- let merged = nodes.slice(), sourceHtmlCursor = 0;
15102
+ let merged = nodes.slice(), sourceHtmlCursor = initialSourceCursor;
14828
15103
  for (let i = 0; i < merged.length; i++) {
14829
- let node = merged[i], nodeRaw = getMergeableNodeRaw(node), nodePos = nodeRaw ? source.indexOf(nodeRaw, sourceHtmlCursor) : -1;
15104
+ let node = merged[i], nodeRaw = getMergeableNodeRaw(node), nodePos = findNodeRawPosition(node, nodeRaw, source, sourceHtmlCursor, context);
14830
15105
  if (node?.type !== "html_block") {
14831
15106
  nodePos !== -1 && (sourceHtmlCursor = nodePos + nodeRaw.length);
14832
15107
  continue;
@@ -14934,7 +15209,7 @@ function parseEmphasisToken(tokens, startIndex, parseInlineTokens$1, options) {
14934
15209
  };
14935
15210
  }
14936
15211
  function TRAILING_OWN_FENCE_CANDIDATE_LINE_RE(marker) {
14937
- return /* @__PURE__ */ new RegExp(`(?:^|\\r\\n|\\n|\\r) {0,3}${marker}+[ \\t]*$`);
15212
+ return getCachedRegex(`(?:^|\\r\\n|\\n|\\r) {0,3}${marker}+[ \\t]*$`);
14938
15213
  }
14939
15214
  var DIFF_HEADER_PREFIXES = [
14940
15215
  "diff ",
@@ -16473,7 +16748,7 @@ function handleTextToken(state, token) {
16473
16748
  }
16474
16749
  trailingTextStart < state.result.length && (content.startsWith(trailingTextContent) ? (state.currentTextNode = null, state.result.length = trailingTextStart) : state.currentTextNode = state.result[state.result.length - 1]);
16475
16750
  let nextToken = state.tokens[state.index + 1];
16476
- if ((content === "`" || content === "|" || content === "$") && !hasEscapedMarkup(token, `\\${content}`) || /^\*+$/.test(content) && !hasEscapedMarkup(token, "\\*")) {
16751
+ if (state.options?.final !== !0 && ((content === "`" || content === "|" || content === "$") && !hasEscapedMarkup(token, `\\${content}`) || /^\*+$/.test(content) && !hasEscapedMarkup(token, "\\*"))) {
16477
16752
  state.index++;
16478
16753
  return;
16479
16754
  }
@@ -16673,9 +16948,20 @@ function dispatchInlineToken(state, token) {
16673
16948
  function handleReference(state, token) {
16674
16949
  state.resetCurrentTextNode(), state.pushParsed(parseReferenceToken(token)), state.index++;
16675
16950
  }
16951
+ var TEXT_RECOVERY_MARKER_RE = /[!$(*[\\\]_`|~]/;
16676
16952
  function parseInlineTokens(tokens, raw, pPreToken, options) {
16677
16953
  if (!tokens || tokens.length === 0)
16678
16954
  return [];
16955
+ if (tokens.length === 1 && tokens[0].type === "text") {
16956
+ let content = tokens[0].content;
16957
+ if (typeof content == "string" && content && content !== "<" && !content.endsWith("undefined") && !TEXT_RECOVERY_MARKER_RE.test(content))
16958
+ return [{
16959
+ type: "text",
16960
+ content,
16961
+ raw: content,
16962
+ center: !1
16963
+ }];
16964
+ }
16679
16965
  let parseContext = ensureParseContext(options), inheritedContext = parseContext.linkifyDemotionContext, inferredContext = inferLinkifyDemotionContext(raw), linkifyDemotionContext = {
16680
16966
  filename: inheritedContext?.filename || inferredContext.filename,
16681
16967
  explicitFilename: inheritedContext?.explicitFilename || inferredContext.explicitFilename,
@@ -17463,7 +17749,7 @@ function parseBasicBlockToken(tokens, index, options, parseInlineTokens$1) {
17463
17749
  return includeSourceMap && applyNodeSourceMap(paragraphNode, token, options), [paragraphNode, index + 1];
17464
17750
  }
17465
17751
  if (htmlBlockNode.tag && tagSets?.customTagSet?.has(htmlBlockNode.tag)) {
17466
- 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)));
17752
+ 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)));
17467
17753
  fromSource && context && (context.customHtmlBlockCursor = fromSource.end);
17468
17754
  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 = "";
17469
17755
  openEnd !== -1 && (closeIndex !== -1 && openEnd < closeIndex ? inner = rawHtml.slice(openEnd + 1, closeIndex) : inner = rawHtml.slice(openEnd + 1)), closeIndex === -1 && (inner = stripTrailingPartialClosingTag(inner, tag));
@@ -17643,15 +17929,11 @@ function maybePromoteCustomNodeFromParagraph(node, options) {
17643
17929
  function processTokensWithContext(tokens, options, parseInlineTokens$1) {
17644
17930
  if (!tokens || !Array.isArray(tokens))
17645
17931
  return [];
17646
- let result = [], linkifyContext = createLinkifyDemotionContextTracker(options), seedRaws = options.linkifyDemotionSeed;
17647
- if (Array.isArray(seedRaws) && seedRaws.length)
17648
- for (let raw of seedRaws)
17649
- linkifyContext.remember(String(raw ?? ""));
17650
- let includeSourceMap = options?.includeSourceMap === !0, i = 0;
17932
+ let result = [], resultContexts = [], linkifyContext = createLinkifyDemotionContextTracker(options), includeSourceMap = options?.includeSourceMap === !0, i = 0;
17651
17933
  for (; i < tokens.length; ) {
17652
17934
  let handled = parseCommonBlockToken(tokens, i, linkifyContext.options(), containerTokenHandlers, parseInlineTokens$1);
17653
17935
  if (handled) {
17654
- recordInternalNodeSourceRange(handled[0], tokens[i], options), result.push(handled[0]), linkifyContext.remember(handled[0].raw), i = handled[1];
17936
+ recordInternalNodeSourceRange(handled[0], tokens[i], options), result.push(handled[0]), linkifyContext.remember(handled[0].raw), resultContexts.push(linkifyContext.snapshot()), i = handled[1];
17655
17937
  continue;
17656
17938
  }
17657
17939
  let token = tokens[i];
@@ -17741,42 +18023,52 @@ function processTokensWithContext(tokens, options, parseInlineTokens$1) {
17741
18023
  i += 1;
17742
18024
  break;
17743
18025
  }
18026
+ let context = linkifyContext.snapshot();
18027
+ for (; resultContexts.length < result.length; )
18028
+ resultContexts.push(context);
17744
18029
  }
17745
- return result;
18030
+ return options.linkifyDemotionResultContexts = resultContexts, result;
17746
18031
  }
17747
18032
  function getCachedSourceLineOffsets(runtime, source) {
17748
18033
  let cached = runtime.sourceLineOffsets;
17749
- if (cached && cached.source === source)
18034
+ if (cached?.source === source)
17750
18035
  return cached.offsets;
17751
- if (cached && source.length > cached.source.length && source.startsWith(cached.source)) {
18036
+ if (cached && source.length > cached.source.length && runtime.sourceExtends(cached.source, source)) {
17752
18037
  let offsets$1 = cached.offsets;
17753
18038
  for (let i = cached.source.length; i < source.length; i++)
17754
18039
  source.charCodeAt(i) === 10 && offsets$1.push(i + 1);
17755
18040
  return cached.source = source, offsets$1;
17756
18041
  }
17757
- let offsets = [0];
17758
- for (let i = 0; i < source.length; i++)
17759
- source.charCodeAt(i) === 10 && offsets.push(i + 1);
18042
+ let offsets = computeSourceLineOffsets(source);
17760
18043
  return runtime.sourceLineOffsets = {
17761
18044
  source,
17762
18045
  offsets
17763
18046
  }, offsets;
17764
18047
  }
18048
+ function computeSourceLineOffsets(source) {
18049
+ let offsets = [0];
18050
+ for (let i = 0; i < source.length; i++)
18051
+ source.charCodeAt(i) === 10 && offsets.push(i + 1);
18052
+ return offsets;
18053
+ }
17765
18054
  var parserRuntimes = /* @__PURE__ */ new WeakMap(), wrappedMarkdownItInstances = /* @__PURE__ */ new WeakSet(), wrappedStreamInstances = /* @__PURE__ */ new WeakSet();
17766
18055
  function sameSemantics(left, right) {
17767
18056
  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;
17768
18057
  }
17769
18058
  var ParserRuntime = class {
17770
18059
  constructor(markdownIt$1) {
17771
- 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;
18060
+ 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;
18061
+ }
18062
+ sourceExtends(previousSource, currentSource) {
18063
+ return this.sourceRelationPrevious === previousSource && this.sourceRelationCurrent === currentSource ? !0 : currentSource.startsWith(previousSource) ? (this.sourceRelationPrevious = previousSource, this.sourceRelationCurrent = currentSource, !0) : !1;
17772
18064
  }
17773
18065
  beginRootParse(source, semantics) {
17774
18066
  this.streamResetInCurrentRootParse = !1;
17775
- let sourceChangedNonAppend = this.documentSource !== void 0 && source !== this.documentSource && !source.startsWith(this.documentSource), semanticsChanged = this.semantics !== void 0 && !sameSemantics(this.semantics, semantics);
18067
+ let sourceChangedNonAppend = this.documentSource !== void 0 && source !== this.documentSource && !this.sourceExtends(this.documentSource, source), semanticsChanged = this.semantics !== void 0 && !sameSemantics(this.semantics, semantics);
17776
18068
  (this.finalized || sourceChangedNonAppend || semanticsChanged) && this.resetDocument(this.streamStateActive), this.finalized = !1, this.documentSource = source, this.semantics = semantics;
17777
18069
  }
17778
18070
  finishRootParse(final) {
17779
- final && (this.clearDocumentCaches(), this.documentSource = void 0, this.semantics = void 0, this.finalized = !0);
18071
+ this.sourceRelationPrevious = void 0, this.sourceRelationCurrent = void 0, final && (this.clearDocumentCaches(), this.documentSource = void 0, this.semantics = void 0, this.finalized = !0);
17780
18072
  }
17781
18073
  resetForFinalAutoParse() {
17782
18074
  this.streamResetInCurrentRootParse || this.resetStreamOnly(), this.clearDocumentCaches();
@@ -17811,7 +18103,7 @@ var ParserRuntime = class {
17811
18103
  this.resetDocument(!0), parserRuntimes.delete(this.markdownIt);
17812
18104
  }
17813
18105
  clearDocumentCaches() {
17814
- 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;
18106
+ 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;
17815
18107
  }
17816
18108
  };
17817
18109
  function wrapMarkdownItBoundaries(md) {
@@ -17950,6 +18242,11 @@ function createSourceLineMapper(source, parsedSource) {
17950
18242
  };
17951
18243
  };
17952
18244
  }
18245
+ var closingTagBlankLineReCache = /* @__PURE__ */ new Map();
18246
+ function getClosingTagBlankLineRe(tag) {
18247
+ let re = closingTagBlankLineReCache.get(tag);
18248
+ 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;
18249
+ }
17953
18250
  function stripDanglingHtmlLikeTail(markdown) {
17954
18251
  let isWs = (ch) => ch === " " || ch === " " || ch === `
17955
18252
  ` || ch === "\r", isLikelyHtmlTagPrefix = (tail$1) => {
@@ -18010,8 +18307,8 @@ function stripDanglingHtmlLikeTail(markdown) {
18010
18307
  }
18011
18308
  }
18012
18309
  return !0;
18013
- }, isInsideFencedCodeBlock = (src, pos) => isInsideOpenMarkdownFenceBeforeOffset(src, pos), s = String(markdown ?? ""), lastLt = s.lastIndexOf("<");
18014
- if (lastLt === -1 || isInsideFencedCodeBlock(s, lastLt))
18310
+ }, s = String(markdown ?? ""), lastLt = s.lastIndexOf("<");
18311
+ if (lastLt === -1)
18015
18312
  return s;
18016
18313
  if (lastLt > 0) {
18017
18314
  let prev = s[lastLt - 1], prevIsWs = prev === " " || prev === " " || prev === `
@@ -18021,7 +18318,7 @@ function stripDanglingHtmlLikeTail(markdown) {
18021
18318
  }
18022
18319
  let tail = s.slice(lastLt);
18023
18320
  return tail.includes(">") || tail.length > 1 && (tail[1] === " " || tail[1] === " " || tail[1] === `
18024
- ` || tail[1] === "\r") || !isLikelyHtmlTagPrefix(tail) ? s : s.slice(0, lastLt);
18321
+ ` || tail[1] === "\r") || !isLikelyHtmlTagPrefix(tail) || isInsideOpenMarkdownFenceBeforeOffset(s, lastLt) ? s : s.slice(0, lastLt);
18025
18322
  }
18026
18323
  function ensureBlankLineBeforeInlineMultilineCustomHtmlBlocks(markdown, tags) {
18027
18324
  if (!markdown || !tags.length)
@@ -18567,10 +18864,8 @@ function normalizeStreamingCustomHtmlSource(markdown, customHtmlTags, isFinal) {
18567
18864
  if (customHtmlTags?.length && safeMarkdown.includes("<")) {
18568
18865
  let tags = normalizeCustomHtmlTags(customHtmlTags);
18569
18866
  if (tags.length && (safeMarkdown = ensureBlankLineBeforeInlineMultilineCustomHtmlBlocks(safeMarkdown, tags), safeMarkdown = normalizeCustomHtmlOpeningTagSameLine(safeMarkdown, tags), safeMarkdown = ensureBlankLineBeforeCustomHtmlBlocks(safeMarkdown, tags), safeMarkdown = ensureBlankLineAfterCustomHtmlCloseBeforeBlockMarkerSameLine(safeMarkdown, tags), safeMarkdown.includes("</")))
18570
- for (let tag of tags) {
18571
- let re = new RegExp(String.raw`(^[\t ]*<\s*\/\s*${tag}\s*>[\t ]*)(\r?\n)(?![\t ]*\r?\n|$)`, "gim");
18572
- safeMarkdown = safeMarkdown.replace(re, "$1$2$2");
18573
- }
18867
+ for (let tag of tags)
18868
+ safeMarkdown = safeMarkdown.replace(getClosingTagBlankLineRe(tag), "$1$2$2");
18574
18869
  }
18575
18870
  return isFinal || (safeMarkdown = stripDanglingHtmlLikeTail(safeMarkdown)), safeMarkdown;
18576
18871
  }
@@ -18597,7 +18892,7 @@ function transformStreamingSafeMarkdown(source, isFinal, options) {
18597
18892
  }
18598
18893
  function getSafeMarkdown(runtime, sourceMarkdown, isFinal, options) {
18599
18894
  let mode = `${isFinal ? "final" : "stream"}:${(options.customHtmlTags ?? []).join(",")}`, previous = options.isFragment ? void 0 : runtime.safeMarkdown, safeMarkdown;
18600
- if (!isFinal && !options.customHtmlTags?.length && previous && previous.mode === mode && sourceMarkdown.length >= previous.source.length && sourceMarkdown.startsWith(previous.source)) {
18895
+ if (!isFinal && !options.customHtmlTags?.length && previous && previous.mode === mode && sourceMarkdown.length >= previous.source.length && runtime.sourceExtends(previous.source, sourceMarkdown)) {
18601
18896
  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;
18602
18897
  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);
18603
18898
  } else
@@ -18668,7 +18963,7 @@ function parseMarkdownWithContext(markdown, inputContext) {
18668
18963
  ...options,
18669
18964
  sourceLineMapper: options.includeSourceMap === !0 ? createSourceLineMapper(sourceMarkdown, safeMarkdown) : void 0,
18670
18965
  sourceMarkdown: safeMarkdown,
18671
- sourceLineOffsets: getCachedSourceLineOffsets(runtime, safeMarkdown),
18966
+ sourceLineOffsets: options.isFragment ? computeSourceLineOffsets(safeMarkdown) : getCachedSourceLineOffsets(runtime, safeMarkdown),
18672
18967
  customHtmlBlockCursor: 0
18673
18968
  }, result = processTopLevelTokensWithReuse(runtime, safeMarkdown, transformedTokens, internalOptions, {
18674
18969
  processTokens: (nextTokens, nextOptions) => processTokensWithTiming(nextTokens, nextOptions, timing),
@@ -18690,9 +18985,18 @@ function parseMarkdownWithContext(markdown, inputContext) {
18690
18985
  getInternalNodeSourceRange: (node) => getInternalNodeSourceRange(node, runtime),
18691
18986
  markdownIt: md,
18692
18987
  parseFragment: (fragment, fragmentOptions) => parseMarkdownWithContext(fragment, fragmentOptions)
18693
- };
18694
- 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);
18695
- }
18988
+ }, canReuseHtmlPrefix = tailStart > 0 && runtime.htmlPassIdentityPreserving, tailSourceStart = canReuseHtmlPrefix ? getInternalNodeSourceRange(result[tailStart], runtime)?.start : void 0, hasDetailsInput = !1;
18989
+ for (let i = canReuseHtmlPrefix ? tailStart : 0; i < result.length; i++) {
18990
+ let node = result[i];
18991
+ if (node.type === "html_block" && String(node.tag ?? "").toLowerCase() === "details") {
18992
+ hasDetailsInput = !0;
18993
+ break;
18994
+ }
18995
+ }
18996
+ 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]);
18997
+ 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);
18998
+ } else
18999
+ runtime.htmlPassIdentityPreserving = !0;
18696
19000
  return isFinal && finalizeHtmlBlockLoading(result), result = applyPostTransformNodes(result, options), options.debug && console.log("Parsed Markdown Tree Structure:", result), finishTimedParse(result, timing, parseStartedAt);
18697
19001
  }
18698
19002
  function parseMarkdownToStructure(markdown, md, options = {}) {
@@ -18830,11 +19134,13 @@ function getMarkdown(msgId = `editor-${Date.now()}`, options = {}) {
18830
19134
  md.use(applyInlinePairs), md.use(sup_plugin), md.use(ins_plugin$1);
18831
19135
  let checkboxModule = import_markdown_it_task_checkbox, markdownItCheckboxPlugin = checkboxModule.default ?? checkboxModule;
18832
19136
  md.use(markdownItCheckboxPlugin), md.use(ins_plugin), md.use(footnote_plugin), md.core.ruler.after("block", "mark_fence_closed", (state) => {
18833
- let s = state, src = s.src, envFinal = !!s.env?.__markstreamFinal, lines = src.split(/\r?\n/);
19137
+ let s = state, src = s.src, envFinal = !!s.env?.__markstreamFinal, lines;
18834
19138
  for (let token of s.tokens) {
18835
19139
  if (token.type !== "fence" || !token.map || !token.markup)
18836
19140
  continue;
18837
- 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;
19141
+ let openLine = token.map[0], endLine = token.map[1], markup = token.markup, marker = markup[0], minLen = markup.length, lineIdx = Math.max(0, endLine - 1);
19142
+ lines ?? (lines = src.split(/\r?\n/));
19143
+ let line = lines[lineIdx] ?? "", i = 0;
18838
19144
  for (; i < line.length && (line[i] === " " || line[i] === " "); )
18839
19145
  i++;
18840
19146
  let count = 0;
@@ -21777,7 +22083,11 @@ var TVirtualMarkdown = (0, import_vue10.defineComponent)({
21777
22083
  return withTextWidthProvider(
21778
22084
  widthProvider,
21779
22085
  () => terminalSelectionRowSpans(range, cols, rows.value.length).map((span) => {
21780
- let text2 = sliceByCellsRange(rows.value[span.y]?.plainText ?? "", span.x0, span.x1);
22086
+ let text2 = sliceByCellsRangeForSelection(
22087
+ rows.value[span.y]?.plainText ?? "",
22088
+ span.x0,
22089
+ span.x1
22090
+ );
21781
22091
  return span.x1 >= cols ? text2.trimEnd() : text2;
21782
22092
  }).join(`
21783
22093
  `)