@8btc/mditor 0.0.13 → 0.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vditor v0.0.13 - A markdown editor written in TypeScript.
2
+ * Vditor v0.0.14 - A markdown editor written in TypeScript.
3
3
  *
4
4
  * MIT License
5
5
  *
@@ -2825,7 +2825,7 @@ var Vditor = /** @class */ (function () {
2825
2825
  /* harmony export */ "H": () => (/* binding */ _VDITOR_VERSION),
2826
2826
  /* harmony export */ "g": () => (/* binding */ Constants)
2827
2827
  /* harmony export */ });
2828
- var _VDITOR_VERSION = "0.0.13";
2828
+ var _VDITOR_VERSION = "0.0.14";
2829
2829
 
2830
2830
  var Constants = /** @class */ (function () {
2831
2831
  function Constants() {
@@ -3127,7 +3127,7 @@ var Constants = /** @class */ (function () {
3127
3127
  "c#",
3128
3128
  "bat",
3129
3129
  ];
3130
- Constants.CDN = "https://webcdn.wujieai.com/vditor@".concat("0.0.13");
3130
+ Constants.CDN = "https://webcdn.wujieai.com/vditor@".concat("0.0.14");
3131
3131
  Constants.MARKDOWN_OPTIONS = {
3132
3132
  autoSpace: false,
3133
3133
  gfmAutoLink: true,
@@ -6244,16 +6244,28 @@ var addStyle = function (url, id) {
6244
6244
  /* harmony export */ "g": () => (/* binding */ attachLineNumbersToBlocksThrottled)
6245
6245
  /* harmony export */ });
6246
6246
  /**
6247
- * 为编辑区域添加行号标记:
6248
- * - 为所有包含 `data-block` 的块级节点写入 `data-linenumber`
6249
- * - 额外为每个 `ul` 的直接 `li` 子元素写入 `data-linenumber`(不修改 `ul` 本身)
6250
- * 通过解析传入的 Markdown 源文本,建立内容到源文件行号的映射,
6251
- * 兼顾多行文本、嵌套列表、重复内容及空白/特殊字符,并提供基础错误保护。
6247
+ * 功能:为编辑区域批量添加行号与列表/表格标记(O(n))
6248
+ * - 块级:为所有 `data-block` 写入 `data-linenumber`
6249
+ * - 列表:为 `ul/ol > li` 写入 `data-linenumber`、`data-list-level`、`data-list-number`
6250
+ * - 表格:为 `table` 的 `tr` 写入 `data-linenumber`(不为 `th` 设置)
6251
+ * - 性能:一次解析 Markdown 建索引,批量收集并一次性更新属性,缓存避免重复计算
6252
+ * - 精度:支持嵌套列表、换行列表项、多级序号;表格跨页连续行号,容忍合并单元格
6252
6253
  */
6253
6254
  var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
6255
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
6254
6256
  if (!root || !sourceMarkdown) {
6255
6257
  return;
6256
6258
  }
6259
+ var t0 = performance.now();
6260
+ var computeHash = function (s) {
6261
+ var h = 0;
6262
+ for (var i = 0; i < s.length; i++) {
6263
+ h = (h * 31 + s.charCodeAt(i)) | 0;
6264
+ }
6265
+ return "".concat(s.length, ":").concat(h);
6266
+ };
6267
+ var GLOBAL_CACHE = globalThis.__VDITOR_LINE_CACHE__ || new Map();
6268
+ globalThis.__VDITOR_LINE_CACHE__ = GLOBAL_CACHE;
6257
6269
  var ZWSP = "\u200b";
6258
6270
  var normalize = function (text) {
6259
6271
  return text
@@ -6264,7 +6276,10 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
6264
6276
  .replace(/[\t\f\v ]+/g, " ");
6265
6277
  };
6266
6278
  var srcNorm = normalize(sourceMarkdown);
6267
- var srcLines = srcNorm.split("\n");
6279
+ var tNorm = performance.now();
6280
+ var hash = computeHash(srcNorm);
6281
+ var cached = GLOBAL_CACHE.get(hash);
6282
+ var srcLines = (_a = cached === null || cached === void 0 ? void 0 : cached.srcLines) !== null && _a !== void 0 ? _a : srcNorm.split("\n");
6268
6283
  var stripInlineMD = function (text) {
6269
6284
  return (text
6270
6285
  .replace(/\\([*_`~])/g, "$1")
@@ -6293,15 +6308,17 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
6293
6308
  .replace(/[{}]/g, "")
6294
6309
  .trim());
6295
6310
  };
6296
- var strippedLines = srcLines.map(function (l) { return stripInlineMD(l); });
6297
- var lineLookup = new Map();
6298
- for (var i = 0; i < strippedLines.length; i++) {
6299
- var key = strippedLines[i];
6300
- if (!lineLookup.has(key)) {
6301
- lineLookup.set(key, [i + 1]);
6302
- }
6303
- else {
6304
- lineLookup.get(key).push(i + 1);
6311
+ var strippedLines = (_b = cached === null || cached === void 0 ? void 0 : cached.strippedLines) !== null && _b !== void 0 ? _b : srcLines.map(function (l) { return stripInlineMD(l); });
6312
+ var lineLookup = (_c = cached === null || cached === void 0 ? void 0 : cached.lineLookup) !== null && _c !== void 0 ? _c : new Map();
6313
+ if (!cached) {
6314
+ for (var i = 0; i < strippedLines.length; i++) {
6315
+ var key = strippedLines[i];
6316
+ if (!lineLookup.has(key)) {
6317
+ lineLookup.set(key, [i + 1]);
6318
+ }
6319
+ else {
6320
+ lineLookup.get(key).push(i + 1);
6321
+ }
6305
6322
  }
6306
6323
  }
6307
6324
  var usedLines = new Set();
@@ -6333,20 +6350,25 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
6333
6350
  * 预处理:收集 Markdown 中所有无序列表(ul)行及其去除行内标记后的内容,构建快速查找结构。
6334
6351
  * 仅匹配以 `*`、`-`、`+` 开头的条目,支持任务列表如 `- [ ]`、`* [x]`。
6335
6352
  */
6336
- var unorderedListEntries = [];
6337
- var unorderedLookup = new Map();
6353
+ var unorderedListEntries = (_d = cached === null || cached === void 0 ? void 0 : cached.unorderedListEntries) !== null && _d !== void 0 ? _d : [];
6354
+ var unorderedLookup = (_e = cached === null || cached === void 0 ? void 0 : cached.unorderedLookup) !== null && _e !== void 0 ? _e : new Map();
6338
6355
  var usedUnorderedLines = new Set();
6339
- for (var i = 0; i < srcLines.length; i++) {
6340
- var raw = srcLines[i];
6341
- var m = raw.match(/^\s*[*+-]\s+(?:\[(?: |x|X)\]\s+)?(.*)$/);
6342
- if (m && typeof m[1] === "string") {
6343
- var contentStripped = stripInlineForList(m[1]);
6344
- unorderedListEntries.push({ ln: i + 1, content: contentStripped });
6345
- if (!unorderedLookup.has(contentStripped)) {
6346
- unorderedLookup.set(contentStripped, [i + 1]);
6347
- }
6348
- else {
6349
- unorderedLookup.get(contentStripped).push(i + 1);
6356
+ if (!cached) {
6357
+ for (var i = 0; i < srcLines.length; i++) {
6358
+ var raw = srcLines[i];
6359
+ var m = raw.match(/^\s*[*+-]\s+(?:\[(?: |x|X)\]\s+)?(.*)$/);
6360
+ if (m && typeof m[1] === "string") {
6361
+ var contentStripped = stripInlineForList(m[1]);
6362
+ unorderedListEntries.push({
6363
+ ln: i + 1,
6364
+ content: contentStripped,
6365
+ });
6366
+ if (!unorderedLookup.has(contentStripped)) {
6367
+ unorderedLookup.set(contentStripped, [i + 1]);
6368
+ }
6369
+ else {
6370
+ unorderedLookup.get(contentStripped).push(i + 1);
6371
+ }
6350
6372
  }
6351
6373
  }
6352
6374
  }
@@ -6387,44 +6409,48 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
6387
6409
  /**
6388
6410
  * 预处理:收集 Markdown 中所有有序列表(ol)行及其内容,支持 `1.` 或 `1)` 以及任务列表前缀。
6389
6411
  */
6390
- var orderedListEntries = [];
6391
- var orderedLookup = new Map();
6412
+ var orderedListEntries = (_f = cached === null || cached === void 0 ? void 0 : cached.orderedListEntries) !== null && _f !== void 0 ? _f : [];
6413
+ var orderedLookup = (_g = cached === null || cached === void 0 ? void 0 : cached.orderedLookup) !== null && _g !== void 0 ? _g : new Map();
6392
6414
  var usedOrderedLines = new Set();
6393
6415
  var ORDERED_RE = /\s*\d+(?:[.)、.。]|[\uFF0E\uFF09\u3001])\s+(?:\[(?: |x|X)\]\s+)?(.*)/;
6394
6416
  var ORDERED_FULL = new RegExp("^".concat(ORDERED_RE.source, "$"));
6395
- for (var i = 0; i < srcLines.length; i++) {
6396
- var raw = srcLines[i];
6397
- var m = raw.match(ORDERED_FULL);
6398
- if (m && typeof m[1] === "string") {
6399
- var contentStripped = stripInlineForList(m[1]);
6400
- orderedListEntries.push({ ln: i + 1, content: contentStripped });
6401
- if (!orderedLookup.has(contentStripped)) {
6402
- orderedLookup.set(contentStripped, [i + 1]);
6403
- }
6404
- else {
6405
- orderedLookup.get(contentStripped).push(i + 1);
6417
+ if (!cached) {
6418
+ for (var i = 0; i < srcLines.length; i++) {
6419
+ var raw = srcLines[i];
6420
+ var m = raw.match(ORDERED_FULL);
6421
+ if (m && typeof m[1] === "string") {
6422
+ var contentStripped = stripInlineForList(m[1]);
6423
+ orderedListEntries.push({
6424
+ ln: i + 1,
6425
+ content: contentStripped,
6426
+ });
6427
+ if (!orderedLookup.has(contentStripped)) {
6428
+ orderedLookup.set(contentStripped, [i + 1]);
6429
+ }
6430
+ else {
6431
+ orderedLookup.get(contentStripped).push(i + 1);
6432
+ }
6406
6433
  }
6407
6434
  }
6408
6435
  }
6409
- console.debug("[LineNumber][ol:index]", {
6410
- total: orderedListEntries.length,
6411
- });
6412
- var orderedGroups = [];
6413
- for (var i = 0; i < srcLines.length;) {
6414
- var raw = srcLines[i];
6415
- if (ORDERED_FULL.test(raw)) {
6416
- var group = [];
6417
- while (i < srcLines.length && ORDERED_FULL.test(srcLines[i])) {
6418
- group.push(i + 1);
6419
- i++;
6436
+ var orderedGroups = (_h = cached === null || cached === void 0 ? void 0 : cached.orderedGroups) !== null && _h !== void 0 ? _h : [];
6437
+ if (!cached) {
6438
+ for (var i = 0; i < srcLines.length;) {
6439
+ var raw = srcLines[i];
6440
+ if (ORDERED_FULL.test(raw)) {
6441
+ var group = [];
6442
+ while (i < srcLines.length && ORDERED_FULL.test(srcLines[i])) {
6443
+ group.push(i + 1);
6444
+ i++;
6445
+ }
6446
+ if (group.length > 0) {
6447
+ orderedGroups.push(group);
6448
+ }
6420
6449
  }
6421
- if (group.length > 0) {
6422
- orderedGroups.push(group);
6450
+ else {
6451
+ i++;
6423
6452
  }
6424
6453
  }
6425
- else {
6426
- i++;
6427
- }
6428
6454
  }
6429
6455
  /**
6430
6456
  * 为给定文本在有序列表候选中选择行号,精确匹配优先,包含匹配回退。
@@ -6476,6 +6502,7 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
6476
6502
  });
6477
6503
  return buf;
6478
6504
  };
6505
+ var attrUpdates = [];
6479
6506
  var blocks = root.querySelectorAll("[data-block]");
6480
6507
  blocks.forEach(function (el) {
6481
6508
  try {
@@ -6484,22 +6511,26 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
6484
6511
  if (dataType === "math-block" || dataType === "code-block") {
6485
6512
  return;
6486
6513
  }
6487
- // 仅 li 需要行号:跳过并清理 ul/ol 自身及其内部嵌套的 p/div 等块
6488
6514
  var tagName = container.tagName;
6489
6515
  if (tagName === "UL" || tagName === "OL") {
6490
- container.removeAttribute("data-linenumber");
6516
+ if (container.getAttribute("data-linenumber")) {
6517
+ attrUpdates.push([container, "data-linenumber", ""]);
6518
+ }
6491
6519
  return;
6492
6520
  }
6493
6521
  var liAncestor = container.closest("li");
6494
6522
  if (liAncestor) {
6495
- container.removeAttribute("data-linenumber");
6523
+ if (container.getAttribute("data-linenumber")) {
6524
+ attrUpdates.push([container, "data-linenumber", ""]);
6525
+ }
6496
6526
  return;
6497
6527
  }
6498
6528
  var text = container.textContent || "";
6499
6529
  var normText = normalize(text);
6500
- // 跳过纯空白块
6501
6530
  if (!normText.trim()) {
6502
- container.removeAttribute("data-linenumber");
6531
+ if (container.getAttribute("data-linenumber")) {
6532
+ attrUpdates.push([container, "data-linenumber", ""]);
6533
+ }
6503
6534
  return;
6504
6535
  }
6505
6536
  var lineNumber = -1;
@@ -6526,13 +6557,18 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
6526
6557
  }
6527
6558
  if (lineNumber !== -1) {
6528
6559
  usedLines.add(lineNumber);
6529
- container.setAttribute("data-linenumber", String(lineNumber));
6560
+ var cur = container.getAttribute("data-linenumber");
6561
+ var val = String(lineNumber);
6562
+ if (cur !== val) {
6563
+ attrUpdates.push([container, "data-linenumber", val]);
6564
+ }
6530
6565
  }
6531
6566
  }
6532
6567
  catch (_a) {
6533
6568
  void 0;
6534
6569
  }
6535
6570
  });
6571
+ var tBlockDone = performance.now();
6536
6572
  /**
6537
6573
  * 为所有 `ul` 下的每个直接 `li` 子元素追加 `data-linenumber`,不修改 `ul` 本身。
6538
6574
  * 支持多层嵌套与非文本起始节点(如加粗/行内代码)。
@@ -6541,60 +6577,93 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
6541
6577
  ulElements.forEach(function (ul) {
6542
6578
  try {
6543
6579
  var children = Array.from(ul.children);
6544
- for (var _i = 0, children_1 = children; _i < children_1.length; _i++) {
6545
- var child = children_1[_i];
6580
+ var _loop_1 = function (child) {
6546
6581
  if (child.tagName !== "LI")
6547
- continue;
6582
+ return "continue";
6548
6583
  var li = child;
6549
6584
  var rawText = getImmediateLiText(li);
6550
6585
  var norm = normalize(rawText);
6551
6586
  var firstLine = norm.split("\n").find(function (l) { return l.trim().length > 0; }) || norm;
6552
6587
  var ln = findUnorderedListLineNumber(firstLine);
6588
+ var level = (function () {
6589
+ var depth = 0;
6590
+ var p = li;
6591
+ while (p) {
6592
+ p = p.parentElement;
6593
+ if (!p)
6594
+ break;
6595
+ var tag = p.tagName;
6596
+ if (tag === "UL" || tag === "OL")
6597
+ depth++;
6598
+ }
6599
+ return depth;
6600
+ })();
6601
+ var levelStr = String(level);
6602
+ var curLevel = li.getAttribute("data-list-level");
6603
+ if (curLevel !== levelStr) {
6604
+ attrUpdates.push([li, "data-list-level", levelStr]);
6605
+ }
6553
6606
  if (ln !== -1) {
6554
6607
  usedUnorderedLines.add(ln);
6555
- li.setAttribute("data-linenumber", String(ln));
6608
+ var curLn = li.getAttribute("data-linenumber");
6609
+ var val = String(ln);
6610
+ if (curLn !== val) {
6611
+ attrUpdates.push([li, "data-linenumber", val]);
6612
+ }
6556
6613
  }
6557
6614
  else {
6558
- li.setAttribute("data-linenumber", "");
6615
+ if (li.getAttribute("data-linenumber")) {
6616
+ attrUpdates.push([li, "data-linenumber", ""]);
6617
+ }
6559
6618
  }
6619
+ };
6620
+ for (var _i = 0, children_1 = children; _i < children_1.length; _i++) {
6621
+ var child = children_1[_i];
6622
+ _loop_1(child);
6560
6623
  }
6561
6624
  }
6562
6625
  catch (_a) {
6563
6626
  void 0;
6564
6627
  }
6565
6628
  });
6629
+ var tUlDone = performance.now();
6566
6630
  /**
6567
6631
  * 为所有 `ol` 下的每个直接 `li` 子元素追加 `data-linenumber`,不修改 `ol` 本身。
6568
6632
  */
6569
6633
  var olElements = root.querySelectorAll("ol");
6634
+ var orderedIndexMap = new WeakMap();
6570
6635
  olElements.forEach(function (ol) {
6571
6636
  try {
6572
6637
  var currentGroupIdx = -1;
6573
6638
  var lastAssigned_1 = -1;
6639
+ var startAttr = Number(ol.getAttribute("start"));
6640
+ var start = Number.isFinite(startAttr) && startAttr > 0 ? startAttr : 1;
6574
6641
  var children = Array.from(ol.children);
6642
+ var seq = start;
6575
6643
  for (var _i = 0, children_2 = children; _i < children_2.length; _i++) {
6576
6644
  var child = children_2[_i];
6577
6645
  if (child.tagName !== "LI")
6578
6646
  continue;
6647
+ orderedIndexMap.set(child, seq++);
6648
+ }
6649
+ var _loop_2 = function (child) {
6650
+ if (child.tagName !== "LI")
6651
+ return "continue";
6579
6652
  var li = child;
6580
6653
  var rawText = getImmediateLiText(li);
6581
6654
  var norm = normalize(rawText);
6582
6655
  var firstLine = norm.split("\n").find(function (l) { return l.trim().length > 0; }) || norm;
6583
6656
  var stripped0 = stripInlineForList(firstLine);
6584
6657
  var stripped = stripped0 || stripInlineMD(firstLine);
6585
- var candidates = orderedLookup.get(stripped) || [];
6586
- var available = candidates.filter(function (n) { return !usedOrderedLines.has(n); });
6658
+ orderedLookup.get(stripped);
6587
6659
  var ln = findOrderedListLineNumber(firstLine);
6588
6660
  if (ln !== -1) {
6589
6661
  usedOrderedLines.add(ln);
6590
- li.setAttribute("data-linenumber", String(ln));
6591
- // 成功映射日志
6592
- console.debug("[LineNumber][ol>li]", {
6593
- text: firstLine,
6594
- stripped: stripped,
6595
- line: ln,
6596
- });
6597
- // 记录当前组
6662
+ var cur = li.getAttribute("data-linenumber");
6663
+ var val = String(ln);
6664
+ if (cur !== val) {
6665
+ attrUpdates.push([li, "data-linenumber", val]);
6666
+ }
6598
6667
  for (var gi = 0; gi < orderedGroups.length; gi++) {
6599
6668
  if (orderedGroups[gi].includes(ln)) {
6600
6669
  currentGroupIdx = gi;
@@ -6604,13 +6673,11 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
6604
6673
  lastAssigned_1 = ln;
6605
6674
  }
6606
6675
  else {
6607
- // 顺序回退:基于当前组或猜测组,按序分配下一未使用行
6608
6676
  var assigned = -1;
6609
6677
  var pickNextFromGroup = function (gi) {
6610
6678
  if (gi < 0 || gi >= orderedGroups.length)
6611
6679
  return -1;
6612
6680
  var lines = orderedGroups[gi];
6613
- // 优先从上次分配后续查找
6614
6681
  var startIdx = 0;
6615
6682
  if (lastAssigned_1 !== -1) {
6616
6683
  var idx = lines.indexOf(lastAssigned_1);
@@ -6632,7 +6699,6 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
6632
6699
  assigned = pickNextFromGroup(currentGroupIdx);
6633
6700
  }
6634
6701
  if (assigned === -1) {
6635
- // 猜测组:选择拥有可用行的首个组
6636
6702
  for (var gi = 0; gi < orderedGroups.length && assigned === -1; gi++) {
6637
6703
  var cand = pickNextFromGroup(gi);
6638
6704
  if (cand !== -1) {
@@ -6643,39 +6709,229 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
6643
6709
  }
6644
6710
  if (assigned !== -1) {
6645
6711
  usedOrderedLines.add(assigned);
6646
- li.setAttribute("data-linenumber", String(assigned));
6647
- console.debug("[LineNumber][ol>li][fallback-seq]", {
6648
- text: firstLine,
6649
- stripped: stripped,
6650
- line: assigned,
6651
- group: currentGroupIdx,
6652
- });
6712
+ var cur = li.getAttribute("data-linenumber");
6713
+ var val = String(assigned);
6714
+ if (cur !== val) {
6715
+ attrUpdates.push([li, "data-linenumber", val]);
6716
+ }
6653
6717
  lastAssigned_1 = assigned;
6654
6718
  }
6655
6719
  else {
6656
- li.setAttribute("data-linenumber", "");
6657
- // 失败诊断日志
6658
- console.warn("[LineNumber][ol>li][missing]", {
6659
- text: firstLine,
6660
- stripped: stripped,
6661
- candidates: candidates,
6662
- available: available,
6663
- reason: !stripped0
6664
- ? "empty-after-strip"
6665
- : candidates.length === 0
6666
- ? "no-index-candidates"
6667
- : available.length === 0
6668
- ? "all-candidates-consumed"
6669
- : "fallback-no-match",
6670
- });
6720
+ if (li.getAttribute("data-linenumber")) {
6721
+ attrUpdates.push([li, "data-linenumber", ""]);
6722
+ }
6723
+ }
6724
+ }
6725
+ var level = (function () {
6726
+ var depth = 0;
6727
+ var p = li;
6728
+ while (p) {
6729
+ p = p.parentElement;
6730
+ if (!p)
6731
+ break;
6732
+ var tag = p.tagName;
6733
+ if (tag === "UL" || tag === "OL")
6734
+ depth++;
6671
6735
  }
6736
+ return depth;
6737
+ })();
6738
+ var levelStr = String(level);
6739
+ var curLevel = li.getAttribute("data-list-level");
6740
+ if (curLevel !== levelStr) {
6741
+ attrUpdates.push([li, "data-list-level", levelStr]);
6742
+ }
6743
+ var numbering = (function () {
6744
+ var _a;
6745
+ var parts = [];
6746
+ var node = li;
6747
+ while (node) {
6748
+ var parentOl = node.closest("ol");
6749
+ if (!parentOl)
6750
+ break;
6751
+ var parentLi = ((_a = parentOl.parentElement) === null || _a === void 0 ? void 0 : _a.closest("li")) ||
6752
+ parentOl.parentElement;
6753
+ var idx = orderedIndexMap.get(node);
6754
+ if (typeof idx === "number") {
6755
+ parts.push(idx);
6756
+ }
6757
+ node = parentLi;
6758
+ }
6759
+ return parts.reverse().join(".");
6760
+ })();
6761
+ var curNum = li.getAttribute("data-list-number") || "";
6762
+ if (numbering && curNum !== numbering) {
6763
+ attrUpdates.push([li, "data-list-number", numbering]);
6764
+ }
6765
+ };
6766
+ for (var _a = 0, children_3 = children; _a < children_3.length; _a++) {
6767
+ var child = children_3[_a];
6768
+ _loop_2(child);
6769
+ }
6770
+ }
6771
+ catch (_b) {
6772
+ void 0;
6773
+ }
6774
+ });
6775
+ var tOlDone = performance.now();
6776
+ var tableRowLookup = (_j = cached === null || cached === void 0 ? void 0 : cached.tableRowLookup) !== null && _j !== void 0 ? _j : new Map();
6777
+ var tableGroups = (_k = cached === null || cached === void 0 ? void 0 : cached.tableGroups) !== null && _k !== void 0 ? _k : [];
6778
+ if (!cached) {
6779
+ var isTableRowLine = function (line) {
6780
+ return /^\s*\|.*\|\s*$/.test(line);
6781
+ };
6782
+ var isAlignLine = function (line) {
6783
+ return /^\s*\|?(?:\s*:?-{2,}:?\s*\|)+\s*:?-{2,}:?\s*\|?\s*$/.test(line);
6784
+ };
6785
+ for (var i = 0; i < srcLines.length;) {
6786
+ var header = srcLines[i];
6787
+ var align = srcLines[i + 1];
6788
+ if (isTableRowLine(header) && isAlignLine(align || "")) {
6789
+ var groupRows = [i + 1];
6790
+ var groupRowTexts = [
6791
+ stripInlineMD(header.replace(/^\s*\|?|\|?\s*$/g, "")),
6792
+ ];
6793
+ i += 2;
6794
+ while (i < srcLines.length && isTableRowLine(srcLines[i])) {
6795
+ groupRows.push(i + 1);
6796
+ groupRowTexts.push(stripInlineMD(srcLines[i].replace(/^\s*\|?|\|?\s*$/g, "")));
6797
+ i++;
6798
+ }
6799
+ tableGroups.push({
6800
+ rows: groupRows,
6801
+ rowTexts: groupRowTexts,
6802
+ });
6803
+ for (var t = 0; t < groupRowTexts.length; t++) {
6804
+ var key = groupRowTexts[t];
6805
+ var ln = groupRows[t];
6806
+ var arr = tableRowLookup.get(key);
6807
+ if (arr)
6808
+ arr.push(ln);
6809
+ else
6810
+ tableRowLookup.set(key, [ln]);
6672
6811
  }
6673
6812
  }
6813
+ else {
6814
+ i++;
6815
+ }
6816
+ }
6817
+ }
6818
+ var usedTableLines = new Set();
6819
+ var tIndexDone = performance.now();
6820
+ var tables = root.querySelectorAll("table");
6821
+ var groupPtr = 0;
6822
+ tables.forEach(function (table) {
6823
+ try {
6824
+ var trs = table.querySelectorAll("tr");
6825
+ trs.forEach(function (tr) {
6826
+ var cells = Array.from(tr.cells);
6827
+ var rowText = cells.map(function (c) { return c.textContent || ""; }).join("|");
6828
+ var normRow = stripInlineMD(normalize(rowText));
6829
+ var ln = pickFirstUnused(tableRowLookup.get(normRow));
6830
+ if (ln === -1) {
6831
+ while (groupPtr < tableGroups.length &&
6832
+ tableGroups[groupPtr].rows.every(function (r) {
6833
+ return usedTableLines.has(r);
6834
+ })) {
6835
+ groupPtr++;
6836
+ }
6837
+ if (groupPtr < tableGroups.length) {
6838
+ var g = tableGroups[groupPtr];
6839
+ var chosen = -1;
6840
+ for (var k = 0; k < g.rows.length; k++) {
6841
+ var cand = g.rows[k];
6842
+ if (!usedTableLines.has(cand)) {
6843
+ chosen = cand;
6844
+ break;
6845
+ }
6846
+ }
6847
+ ln = chosen;
6848
+ }
6849
+ }
6850
+ if (ln !== -1) {
6851
+ usedTableLines.add(ln);
6852
+ var cur = tr.getAttribute("data-linenumber");
6853
+ var val = String(ln);
6854
+ if (cur !== val) {
6855
+ attrUpdates.push([
6856
+ tr,
6857
+ "data-linenumber",
6858
+ val,
6859
+ ]);
6860
+ }
6861
+ }
6862
+ else {
6863
+ var cur = tr.getAttribute("data-linenumber");
6864
+ if (cur) {
6865
+ attrUpdates.push([
6866
+ tr,
6867
+ "data-linenumber",
6868
+ "",
6869
+ ]);
6870
+ }
6871
+ }
6872
+ var ths = tr.querySelectorAll("th");
6873
+ ths.forEach(function (th) {
6874
+ var curTh = th.getAttribute("data-linenumber");
6875
+ if (curTh) {
6876
+ attrUpdates.push([
6877
+ th,
6878
+ "data-linenumber",
6879
+ "",
6880
+ ]);
6881
+ }
6882
+ });
6883
+ });
6674
6884
  }
6675
6885
  catch (_a) {
6676
6886
  void 0;
6677
6887
  }
6678
6888
  });
6889
+ var tTableDone = performance.now();
6890
+ for (var _i = 0, attrUpdates_1 = attrUpdates; _i < attrUpdates_1.length; _i++) {
6891
+ var _l = attrUpdates_1[_i], el = _l[0], attr = _l[1], val = _l[2];
6892
+ if (val === "") {
6893
+ el.removeAttribute(attr);
6894
+ }
6895
+ else {
6896
+ el.setAttribute(attr, val);
6897
+ }
6898
+ }
6899
+ var tApplyDone = performance.now();
6900
+ if (!cached) {
6901
+ GLOBAL_CACHE.set(hash, {
6902
+ srcNorm: srcNorm,
6903
+ srcLines: srcLines,
6904
+ strippedLines: strippedLines,
6905
+ lineLookup: lineLookup,
6906
+ unorderedListEntries: unorderedListEntries,
6907
+ unorderedLookup: unorderedLookup,
6908
+ orderedListEntries: orderedListEntries,
6909
+ orderedLookup: orderedLookup,
6910
+ orderedGroups: orderedGroups,
6911
+ tableRowLookup: tableRowLookup,
6912
+ tableGroups: tableGroups,
6913
+ });
6914
+ }
6915
+ console.log("[LineNumber][perf]", {
6916
+ cached: !!cached,
6917
+ times: {
6918
+ normalize: Math.round((tNorm - t0) * 100) / 100,
6919
+ index: Math.round((tIndexDone - tNorm) * 100) / 100,
6920
+ blocks: Math.round((tBlockDone - tIndexDone) * 100) / 100,
6921
+ ul: Math.round((tUlDone - tBlockDone) * 100) / 100,
6922
+ ol: Math.round((tOlDone - tUlDone) * 100) / 100,
6923
+ table: Math.round((tTableDone - tIndexDone) * 100) / 100,
6924
+ apply: Math.round((tApplyDone - tTableDone) * 100) / 100,
6925
+ total: Math.round((tApplyDone - t0) * 100) / 100,
6926
+ },
6927
+ counts: {
6928
+ blocks: blocks.length,
6929
+ ul: ulElements.length,
6930
+ ol: olElements.length,
6931
+ tables: tables.length,
6932
+ updates: attrUpdates.length,
6933
+ },
6934
+ });
6679
6935
  };
6680
6936
  /**
6681
6937
  * 节流后的行号更新函数,避免频繁更新 data-linenumber