@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/method.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
  *
@@ -45,7 +45,7 @@ return /******/ (() => { // webpackBootstrap
45
45
  /* harmony export */ "g": () => (/* binding */ Constants)
46
46
  /* harmony export */ });
47
47
  /* unused harmony export VDITOR_VERSION */
48
- var _VDITOR_VERSION = (/* unused pure expression or super */ null && ("0.0.13"));
48
+ var _VDITOR_VERSION = (/* unused pure expression or super */ null && ("0.0.14"));
49
49
 
50
50
  var Constants = /** @class */ (function () {
51
51
  function Constants() {
@@ -347,7 +347,7 @@ var Constants = /** @class */ (function () {
347
347
  "c#",
348
348
  "bat",
349
349
  ];
350
- Constants.CDN = "https://webcdn.wujieai.com/vditor@".concat("0.0.13");
350
+ Constants.CDN = "https://webcdn.wujieai.com/vditor@".concat("0.0.14");
351
351
  Constants.MARKDOWN_OPTIONS = {
352
352
  autoSpace: false,
353
353
  gfmAutoLink: true,
@@ -3438,16 +3438,28 @@ var addStyle = function (url, id) {
3438
3438
  /* harmony export */ "g": () => (/* binding */ attachLineNumbersToBlocksThrottled)
3439
3439
  /* harmony export */ });
3440
3440
  /**
3441
- * 为编辑区域添加行号标记:
3442
- * - 为所有包含 `data-block` 的块级节点写入 `data-linenumber`
3443
- * - 额外为每个 `ul` 的直接 `li` 子元素写入 `data-linenumber`(不修改 `ul` 本身)
3444
- * 通过解析传入的 Markdown 源文本,建立内容到源文件行号的映射,
3445
- * 兼顾多行文本、嵌套列表、重复内容及空白/特殊字符,并提供基础错误保护。
3441
+ * 功能:为编辑区域批量添加行号与列表/表格标记(O(n))
3442
+ * - 块级:为所有 `data-block` 写入 `data-linenumber`
3443
+ * - 列表:为 `ul/ol > li` 写入 `data-linenumber`、`data-list-level`、`data-list-number`
3444
+ * - 表格:为 `table` 的 `tr` 写入 `data-linenumber`(不为 `th` 设置)
3445
+ * - 性能:一次解析 Markdown 建索引,批量收集并一次性更新属性,缓存避免重复计算
3446
+ * - 精度:支持嵌套列表、换行列表项、多级序号;表格跨页连续行号,容忍合并单元格
3446
3447
  */
3447
3448
  var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3449
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
3448
3450
  if (!root || !sourceMarkdown) {
3449
3451
  return;
3450
3452
  }
3453
+ var t0 = performance.now();
3454
+ var computeHash = function (s) {
3455
+ var h = 0;
3456
+ for (var i = 0; i < s.length; i++) {
3457
+ h = (h * 31 + s.charCodeAt(i)) | 0;
3458
+ }
3459
+ return "".concat(s.length, ":").concat(h);
3460
+ };
3461
+ var GLOBAL_CACHE = globalThis.__VDITOR_LINE_CACHE__ || new Map();
3462
+ globalThis.__VDITOR_LINE_CACHE__ = GLOBAL_CACHE;
3451
3463
  var ZWSP = "\u200b";
3452
3464
  var normalize = function (text) {
3453
3465
  return text
@@ -3458,7 +3470,10 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3458
3470
  .replace(/[\t\f\v ]+/g, " ");
3459
3471
  };
3460
3472
  var srcNorm = normalize(sourceMarkdown);
3461
- var srcLines = srcNorm.split("\n");
3473
+ var tNorm = performance.now();
3474
+ var hash = computeHash(srcNorm);
3475
+ var cached = GLOBAL_CACHE.get(hash);
3476
+ var srcLines = (_a = cached === null || cached === void 0 ? void 0 : cached.srcLines) !== null && _a !== void 0 ? _a : srcNorm.split("\n");
3462
3477
  var stripInlineMD = function (text) {
3463
3478
  return (text
3464
3479
  .replace(/\\([*_`~])/g, "$1")
@@ -3487,15 +3502,17 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3487
3502
  .replace(/[{}]/g, "")
3488
3503
  .trim());
3489
3504
  };
3490
- var strippedLines = srcLines.map(function (l) { return stripInlineMD(l); });
3491
- var lineLookup = new Map();
3492
- for (var i = 0; i < strippedLines.length; i++) {
3493
- var key = strippedLines[i];
3494
- if (!lineLookup.has(key)) {
3495
- lineLookup.set(key, [i + 1]);
3496
- }
3497
- else {
3498
- lineLookup.get(key).push(i + 1);
3505
+ var strippedLines = (_b = cached === null || cached === void 0 ? void 0 : cached.strippedLines) !== null && _b !== void 0 ? _b : srcLines.map(function (l) { return stripInlineMD(l); });
3506
+ var lineLookup = (_c = cached === null || cached === void 0 ? void 0 : cached.lineLookup) !== null && _c !== void 0 ? _c : new Map();
3507
+ if (!cached) {
3508
+ for (var i = 0; i < strippedLines.length; i++) {
3509
+ var key = strippedLines[i];
3510
+ if (!lineLookup.has(key)) {
3511
+ lineLookup.set(key, [i + 1]);
3512
+ }
3513
+ else {
3514
+ lineLookup.get(key).push(i + 1);
3515
+ }
3499
3516
  }
3500
3517
  }
3501
3518
  var usedLines = new Set();
@@ -3527,20 +3544,25 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3527
3544
  * 预处理:收集 Markdown 中所有无序列表(ul)行及其去除行内标记后的内容,构建快速查找结构。
3528
3545
  * 仅匹配以 `*`、`-`、`+` 开头的条目,支持任务列表如 `- [ ]`、`* [x]`。
3529
3546
  */
3530
- var unorderedListEntries = [];
3531
- var unorderedLookup = new Map();
3547
+ var unorderedListEntries = (_d = cached === null || cached === void 0 ? void 0 : cached.unorderedListEntries) !== null && _d !== void 0 ? _d : [];
3548
+ var unorderedLookup = (_e = cached === null || cached === void 0 ? void 0 : cached.unorderedLookup) !== null && _e !== void 0 ? _e : new Map();
3532
3549
  var usedUnorderedLines = new Set();
3533
- for (var i = 0; i < srcLines.length; i++) {
3534
- var raw = srcLines[i];
3535
- var m = raw.match(/^\s*[*+-]\s+(?:\[(?: |x|X)\]\s+)?(.*)$/);
3536
- if (m && typeof m[1] === "string") {
3537
- var contentStripped = stripInlineForList(m[1]);
3538
- unorderedListEntries.push({ ln: i + 1, content: contentStripped });
3539
- if (!unorderedLookup.has(contentStripped)) {
3540
- unorderedLookup.set(contentStripped, [i + 1]);
3541
- }
3542
- else {
3543
- unorderedLookup.get(contentStripped).push(i + 1);
3550
+ if (!cached) {
3551
+ for (var i = 0; i < srcLines.length; i++) {
3552
+ var raw = srcLines[i];
3553
+ var m = raw.match(/^\s*[*+-]\s+(?:\[(?: |x|X)\]\s+)?(.*)$/);
3554
+ if (m && typeof m[1] === "string") {
3555
+ var contentStripped = stripInlineForList(m[1]);
3556
+ unorderedListEntries.push({
3557
+ ln: i + 1,
3558
+ content: contentStripped,
3559
+ });
3560
+ if (!unorderedLookup.has(contentStripped)) {
3561
+ unorderedLookup.set(contentStripped, [i + 1]);
3562
+ }
3563
+ else {
3564
+ unorderedLookup.get(contentStripped).push(i + 1);
3565
+ }
3544
3566
  }
3545
3567
  }
3546
3568
  }
@@ -3581,44 +3603,48 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3581
3603
  /**
3582
3604
  * 预处理:收集 Markdown 中所有有序列表(ol)行及其内容,支持 `1.` 或 `1)` 以及任务列表前缀。
3583
3605
  */
3584
- var orderedListEntries = [];
3585
- var orderedLookup = new Map();
3606
+ var orderedListEntries = (_f = cached === null || cached === void 0 ? void 0 : cached.orderedListEntries) !== null && _f !== void 0 ? _f : [];
3607
+ var orderedLookup = (_g = cached === null || cached === void 0 ? void 0 : cached.orderedLookup) !== null && _g !== void 0 ? _g : new Map();
3586
3608
  var usedOrderedLines = new Set();
3587
3609
  var ORDERED_RE = /\s*\d+(?:[.)、.。]|[\uFF0E\uFF09\u3001])\s+(?:\[(?: |x|X)\]\s+)?(.*)/;
3588
3610
  var ORDERED_FULL = new RegExp("^".concat(ORDERED_RE.source, "$"));
3589
- for (var i = 0; i < srcLines.length; i++) {
3590
- var raw = srcLines[i];
3591
- var m = raw.match(ORDERED_FULL);
3592
- if (m && typeof m[1] === "string") {
3593
- var contentStripped = stripInlineForList(m[1]);
3594
- orderedListEntries.push({ ln: i + 1, content: contentStripped });
3595
- if (!orderedLookup.has(contentStripped)) {
3596
- orderedLookup.set(contentStripped, [i + 1]);
3597
- }
3598
- else {
3599
- orderedLookup.get(contentStripped).push(i + 1);
3611
+ if (!cached) {
3612
+ for (var i = 0; i < srcLines.length; i++) {
3613
+ var raw = srcLines[i];
3614
+ var m = raw.match(ORDERED_FULL);
3615
+ if (m && typeof m[1] === "string") {
3616
+ var contentStripped = stripInlineForList(m[1]);
3617
+ orderedListEntries.push({
3618
+ ln: i + 1,
3619
+ content: contentStripped,
3620
+ });
3621
+ if (!orderedLookup.has(contentStripped)) {
3622
+ orderedLookup.set(contentStripped, [i + 1]);
3623
+ }
3624
+ else {
3625
+ orderedLookup.get(contentStripped).push(i + 1);
3626
+ }
3600
3627
  }
3601
3628
  }
3602
3629
  }
3603
- console.debug("[LineNumber][ol:index]", {
3604
- total: orderedListEntries.length,
3605
- });
3606
- var orderedGroups = [];
3607
- for (var i = 0; i < srcLines.length;) {
3608
- var raw = srcLines[i];
3609
- if (ORDERED_FULL.test(raw)) {
3610
- var group = [];
3611
- while (i < srcLines.length && ORDERED_FULL.test(srcLines[i])) {
3612
- group.push(i + 1);
3613
- i++;
3630
+ var orderedGroups = (_h = cached === null || cached === void 0 ? void 0 : cached.orderedGroups) !== null && _h !== void 0 ? _h : [];
3631
+ if (!cached) {
3632
+ for (var i = 0; i < srcLines.length;) {
3633
+ var raw = srcLines[i];
3634
+ if (ORDERED_FULL.test(raw)) {
3635
+ var group = [];
3636
+ while (i < srcLines.length && ORDERED_FULL.test(srcLines[i])) {
3637
+ group.push(i + 1);
3638
+ i++;
3639
+ }
3640
+ if (group.length > 0) {
3641
+ orderedGroups.push(group);
3642
+ }
3614
3643
  }
3615
- if (group.length > 0) {
3616
- orderedGroups.push(group);
3644
+ else {
3645
+ i++;
3617
3646
  }
3618
3647
  }
3619
- else {
3620
- i++;
3621
- }
3622
3648
  }
3623
3649
  /**
3624
3650
  * 为给定文本在有序列表候选中选择行号,精确匹配优先,包含匹配回退。
@@ -3670,6 +3696,7 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3670
3696
  });
3671
3697
  return buf;
3672
3698
  };
3699
+ var attrUpdates = [];
3673
3700
  var blocks = root.querySelectorAll("[data-block]");
3674
3701
  blocks.forEach(function (el) {
3675
3702
  try {
@@ -3678,22 +3705,26 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3678
3705
  if (dataType === "math-block" || dataType === "code-block") {
3679
3706
  return;
3680
3707
  }
3681
- // 仅 li 需要行号:跳过并清理 ul/ol 自身及其内部嵌套的 p/div 等块
3682
3708
  var tagName = container.tagName;
3683
3709
  if (tagName === "UL" || tagName === "OL") {
3684
- container.removeAttribute("data-linenumber");
3710
+ if (container.getAttribute("data-linenumber")) {
3711
+ attrUpdates.push([container, "data-linenumber", ""]);
3712
+ }
3685
3713
  return;
3686
3714
  }
3687
3715
  var liAncestor = container.closest("li");
3688
3716
  if (liAncestor) {
3689
- container.removeAttribute("data-linenumber");
3717
+ if (container.getAttribute("data-linenumber")) {
3718
+ attrUpdates.push([container, "data-linenumber", ""]);
3719
+ }
3690
3720
  return;
3691
3721
  }
3692
3722
  var text = container.textContent || "";
3693
3723
  var normText = normalize(text);
3694
- // 跳过纯空白块
3695
3724
  if (!normText.trim()) {
3696
- container.removeAttribute("data-linenumber");
3725
+ if (container.getAttribute("data-linenumber")) {
3726
+ attrUpdates.push([container, "data-linenumber", ""]);
3727
+ }
3697
3728
  return;
3698
3729
  }
3699
3730
  var lineNumber = -1;
@@ -3720,13 +3751,18 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3720
3751
  }
3721
3752
  if (lineNumber !== -1) {
3722
3753
  usedLines.add(lineNumber);
3723
- container.setAttribute("data-linenumber", String(lineNumber));
3754
+ var cur = container.getAttribute("data-linenumber");
3755
+ var val = String(lineNumber);
3756
+ if (cur !== val) {
3757
+ attrUpdates.push([container, "data-linenumber", val]);
3758
+ }
3724
3759
  }
3725
3760
  }
3726
3761
  catch (_a) {
3727
3762
  void 0;
3728
3763
  }
3729
3764
  });
3765
+ var tBlockDone = performance.now();
3730
3766
  /**
3731
3767
  * 为所有 `ul` 下的每个直接 `li` 子元素追加 `data-linenumber`,不修改 `ul` 本身。
3732
3768
  * 支持多层嵌套与非文本起始节点(如加粗/行内代码)。
@@ -3735,60 +3771,93 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3735
3771
  ulElements.forEach(function (ul) {
3736
3772
  try {
3737
3773
  var children = Array.from(ul.children);
3738
- for (var _i = 0, children_1 = children; _i < children_1.length; _i++) {
3739
- var child = children_1[_i];
3774
+ var _loop_1 = function (child) {
3740
3775
  if (child.tagName !== "LI")
3741
- continue;
3776
+ return "continue";
3742
3777
  var li = child;
3743
3778
  var rawText = getImmediateLiText(li);
3744
3779
  var norm = normalize(rawText);
3745
3780
  var firstLine = norm.split("\n").find(function (l) { return l.trim().length > 0; }) || norm;
3746
3781
  var ln = findUnorderedListLineNumber(firstLine);
3782
+ var level = (function () {
3783
+ var depth = 0;
3784
+ var p = li;
3785
+ while (p) {
3786
+ p = p.parentElement;
3787
+ if (!p)
3788
+ break;
3789
+ var tag = p.tagName;
3790
+ if (tag === "UL" || tag === "OL")
3791
+ depth++;
3792
+ }
3793
+ return depth;
3794
+ })();
3795
+ var levelStr = String(level);
3796
+ var curLevel = li.getAttribute("data-list-level");
3797
+ if (curLevel !== levelStr) {
3798
+ attrUpdates.push([li, "data-list-level", levelStr]);
3799
+ }
3747
3800
  if (ln !== -1) {
3748
3801
  usedUnorderedLines.add(ln);
3749
- li.setAttribute("data-linenumber", String(ln));
3802
+ var curLn = li.getAttribute("data-linenumber");
3803
+ var val = String(ln);
3804
+ if (curLn !== val) {
3805
+ attrUpdates.push([li, "data-linenumber", val]);
3806
+ }
3750
3807
  }
3751
3808
  else {
3752
- li.setAttribute("data-linenumber", "");
3809
+ if (li.getAttribute("data-linenumber")) {
3810
+ attrUpdates.push([li, "data-linenumber", ""]);
3811
+ }
3753
3812
  }
3813
+ };
3814
+ for (var _i = 0, children_1 = children; _i < children_1.length; _i++) {
3815
+ var child = children_1[_i];
3816
+ _loop_1(child);
3754
3817
  }
3755
3818
  }
3756
3819
  catch (_a) {
3757
3820
  void 0;
3758
3821
  }
3759
3822
  });
3823
+ var tUlDone = performance.now();
3760
3824
  /**
3761
3825
  * 为所有 `ol` 下的每个直接 `li` 子元素追加 `data-linenumber`,不修改 `ol` 本身。
3762
3826
  */
3763
3827
  var olElements = root.querySelectorAll("ol");
3828
+ var orderedIndexMap = new WeakMap();
3764
3829
  olElements.forEach(function (ol) {
3765
3830
  try {
3766
3831
  var currentGroupIdx = -1;
3767
3832
  var lastAssigned_1 = -1;
3833
+ var startAttr = Number(ol.getAttribute("start"));
3834
+ var start = Number.isFinite(startAttr) && startAttr > 0 ? startAttr : 1;
3768
3835
  var children = Array.from(ol.children);
3836
+ var seq = start;
3769
3837
  for (var _i = 0, children_2 = children; _i < children_2.length; _i++) {
3770
3838
  var child = children_2[_i];
3771
3839
  if (child.tagName !== "LI")
3772
3840
  continue;
3841
+ orderedIndexMap.set(child, seq++);
3842
+ }
3843
+ var _loop_2 = function (child) {
3844
+ if (child.tagName !== "LI")
3845
+ return "continue";
3773
3846
  var li = child;
3774
3847
  var rawText = getImmediateLiText(li);
3775
3848
  var norm = normalize(rawText);
3776
3849
  var firstLine = norm.split("\n").find(function (l) { return l.trim().length > 0; }) || norm;
3777
3850
  var stripped0 = stripInlineForList(firstLine);
3778
3851
  var stripped = stripped0 || stripInlineMD(firstLine);
3779
- var candidates = orderedLookup.get(stripped) || [];
3780
- var available = candidates.filter(function (n) { return !usedOrderedLines.has(n); });
3852
+ orderedLookup.get(stripped);
3781
3853
  var ln = findOrderedListLineNumber(firstLine);
3782
3854
  if (ln !== -1) {
3783
3855
  usedOrderedLines.add(ln);
3784
- li.setAttribute("data-linenumber", String(ln));
3785
- // 成功映射日志
3786
- console.debug("[LineNumber][ol>li]", {
3787
- text: firstLine,
3788
- stripped: stripped,
3789
- line: ln,
3790
- });
3791
- // 记录当前组
3856
+ var cur = li.getAttribute("data-linenumber");
3857
+ var val = String(ln);
3858
+ if (cur !== val) {
3859
+ attrUpdates.push([li, "data-linenumber", val]);
3860
+ }
3792
3861
  for (var gi = 0; gi < orderedGroups.length; gi++) {
3793
3862
  if (orderedGroups[gi].includes(ln)) {
3794
3863
  currentGroupIdx = gi;
@@ -3798,13 +3867,11 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3798
3867
  lastAssigned_1 = ln;
3799
3868
  }
3800
3869
  else {
3801
- // 顺序回退:基于当前组或猜测组,按序分配下一未使用行
3802
3870
  var assigned = -1;
3803
3871
  var pickNextFromGroup = function (gi) {
3804
3872
  if (gi < 0 || gi >= orderedGroups.length)
3805
3873
  return -1;
3806
3874
  var lines = orderedGroups[gi];
3807
- // 优先从上次分配后续查找
3808
3875
  var startIdx = 0;
3809
3876
  if (lastAssigned_1 !== -1) {
3810
3877
  var idx = lines.indexOf(lastAssigned_1);
@@ -3826,7 +3893,6 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3826
3893
  assigned = pickNextFromGroup(currentGroupIdx);
3827
3894
  }
3828
3895
  if (assigned === -1) {
3829
- // 猜测组:选择拥有可用行的首个组
3830
3896
  for (var gi = 0; gi < orderedGroups.length && assigned === -1; gi++) {
3831
3897
  var cand = pickNextFromGroup(gi);
3832
3898
  if (cand !== -1) {
@@ -3837,39 +3903,229 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3837
3903
  }
3838
3904
  if (assigned !== -1) {
3839
3905
  usedOrderedLines.add(assigned);
3840
- li.setAttribute("data-linenumber", String(assigned));
3841
- console.debug("[LineNumber][ol>li][fallback-seq]", {
3842
- text: firstLine,
3843
- stripped: stripped,
3844
- line: assigned,
3845
- group: currentGroupIdx,
3846
- });
3906
+ var cur = li.getAttribute("data-linenumber");
3907
+ var val = String(assigned);
3908
+ if (cur !== val) {
3909
+ attrUpdates.push([li, "data-linenumber", val]);
3910
+ }
3847
3911
  lastAssigned_1 = assigned;
3848
3912
  }
3849
3913
  else {
3850
- li.setAttribute("data-linenumber", "");
3851
- // 失败诊断日志
3852
- console.warn("[LineNumber][ol>li][missing]", {
3853
- text: firstLine,
3854
- stripped: stripped,
3855
- candidates: candidates,
3856
- available: available,
3857
- reason: !stripped0
3858
- ? "empty-after-strip"
3859
- : candidates.length === 0
3860
- ? "no-index-candidates"
3861
- : available.length === 0
3862
- ? "all-candidates-consumed"
3863
- : "fallback-no-match",
3864
- });
3914
+ if (li.getAttribute("data-linenumber")) {
3915
+ attrUpdates.push([li, "data-linenumber", ""]);
3916
+ }
3917
+ }
3918
+ }
3919
+ var level = (function () {
3920
+ var depth = 0;
3921
+ var p = li;
3922
+ while (p) {
3923
+ p = p.parentElement;
3924
+ if (!p)
3925
+ break;
3926
+ var tag = p.tagName;
3927
+ if (tag === "UL" || tag === "OL")
3928
+ depth++;
3865
3929
  }
3930
+ return depth;
3931
+ })();
3932
+ var levelStr = String(level);
3933
+ var curLevel = li.getAttribute("data-list-level");
3934
+ if (curLevel !== levelStr) {
3935
+ attrUpdates.push([li, "data-list-level", levelStr]);
3866
3936
  }
3937
+ var numbering = (function () {
3938
+ var _a;
3939
+ var parts = [];
3940
+ var node = li;
3941
+ while (node) {
3942
+ var parentOl = node.closest("ol");
3943
+ if (!parentOl)
3944
+ break;
3945
+ var parentLi = ((_a = parentOl.parentElement) === null || _a === void 0 ? void 0 : _a.closest("li")) ||
3946
+ parentOl.parentElement;
3947
+ var idx = orderedIndexMap.get(node);
3948
+ if (typeof idx === "number") {
3949
+ parts.push(idx);
3950
+ }
3951
+ node = parentLi;
3952
+ }
3953
+ return parts.reverse().join(".");
3954
+ })();
3955
+ var curNum = li.getAttribute("data-list-number") || "";
3956
+ if (numbering && curNum !== numbering) {
3957
+ attrUpdates.push([li, "data-list-number", numbering]);
3958
+ }
3959
+ };
3960
+ for (var _a = 0, children_3 = children; _a < children_3.length; _a++) {
3961
+ var child = children_3[_a];
3962
+ _loop_2(child);
3867
3963
  }
3868
3964
  }
3965
+ catch (_b) {
3966
+ void 0;
3967
+ }
3968
+ });
3969
+ var tOlDone = performance.now();
3970
+ var tableRowLookup = (_j = cached === null || cached === void 0 ? void 0 : cached.tableRowLookup) !== null && _j !== void 0 ? _j : new Map();
3971
+ var tableGroups = (_k = cached === null || cached === void 0 ? void 0 : cached.tableGroups) !== null && _k !== void 0 ? _k : [];
3972
+ if (!cached) {
3973
+ var isTableRowLine = function (line) {
3974
+ return /^\s*\|.*\|\s*$/.test(line);
3975
+ };
3976
+ var isAlignLine = function (line) {
3977
+ return /^\s*\|?(?:\s*:?-{2,}:?\s*\|)+\s*:?-{2,}:?\s*\|?\s*$/.test(line);
3978
+ };
3979
+ for (var i = 0; i < srcLines.length;) {
3980
+ var header = srcLines[i];
3981
+ var align = srcLines[i + 1];
3982
+ if (isTableRowLine(header) && isAlignLine(align || "")) {
3983
+ var groupRows = [i + 1];
3984
+ var groupRowTexts = [
3985
+ stripInlineMD(header.replace(/^\s*\|?|\|?\s*$/g, "")),
3986
+ ];
3987
+ i += 2;
3988
+ while (i < srcLines.length && isTableRowLine(srcLines[i])) {
3989
+ groupRows.push(i + 1);
3990
+ groupRowTexts.push(stripInlineMD(srcLines[i].replace(/^\s*\|?|\|?\s*$/g, "")));
3991
+ i++;
3992
+ }
3993
+ tableGroups.push({
3994
+ rows: groupRows,
3995
+ rowTexts: groupRowTexts,
3996
+ });
3997
+ for (var t = 0; t < groupRowTexts.length; t++) {
3998
+ var key = groupRowTexts[t];
3999
+ var ln = groupRows[t];
4000
+ var arr = tableRowLookup.get(key);
4001
+ if (arr)
4002
+ arr.push(ln);
4003
+ else
4004
+ tableRowLookup.set(key, [ln]);
4005
+ }
4006
+ }
4007
+ else {
4008
+ i++;
4009
+ }
4010
+ }
4011
+ }
4012
+ var usedTableLines = new Set();
4013
+ var tIndexDone = performance.now();
4014
+ var tables = root.querySelectorAll("table");
4015
+ var groupPtr = 0;
4016
+ tables.forEach(function (table) {
4017
+ try {
4018
+ var trs = table.querySelectorAll("tr");
4019
+ trs.forEach(function (tr) {
4020
+ var cells = Array.from(tr.cells);
4021
+ var rowText = cells.map(function (c) { return c.textContent || ""; }).join("|");
4022
+ var normRow = stripInlineMD(normalize(rowText));
4023
+ var ln = pickFirstUnused(tableRowLookup.get(normRow));
4024
+ if (ln === -1) {
4025
+ while (groupPtr < tableGroups.length &&
4026
+ tableGroups[groupPtr].rows.every(function (r) {
4027
+ return usedTableLines.has(r);
4028
+ })) {
4029
+ groupPtr++;
4030
+ }
4031
+ if (groupPtr < tableGroups.length) {
4032
+ var g = tableGroups[groupPtr];
4033
+ var chosen = -1;
4034
+ for (var k = 0; k < g.rows.length; k++) {
4035
+ var cand = g.rows[k];
4036
+ if (!usedTableLines.has(cand)) {
4037
+ chosen = cand;
4038
+ break;
4039
+ }
4040
+ }
4041
+ ln = chosen;
4042
+ }
4043
+ }
4044
+ if (ln !== -1) {
4045
+ usedTableLines.add(ln);
4046
+ var cur = tr.getAttribute("data-linenumber");
4047
+ var val = String(ln);
4048
+ if (cur !== val) {
4049
+ attrUpdates.push([
4050
+ tr,
4051
+ "data-linenumber",
4052
+ val,
4053
+ ]);
4054
+ }
4055
+ }
4056
+ else {
4057
+ var cur = tr.getAttribute("data-linenumber");
4058
+ if (cur) {
4059
+ attrUpdates.push([
4060
+ tr,
4061
+ "data-linenumber",
4062
+ "",
4063
+ ]);
4064
+ }
4065
+ }
4066
+ var ths = tr.querySelectorAll("th");
4067
+ ths.forEach(function (th) {
4068
+ var curTh = th.getAttribute("data-linenumber");
4069
+ if (curTh) {
4070
+ attrUpdates.push([
4071
+ th,
4072
+ "data-linenumber",
4073
+ "",
4074
+ ]);
4075
+ }
4076
+ });
4077
+ });
4078
+ }
3869
4079
  catch (_a) {
3870
4080
  void 0;
3871
4081
  }
3872
4082
  });
4083
+ var tTableDone = performance.now();
4084
+ for (var _i = 0, attrUpdates_1 = attrUpdates; _i < attrUpdates_1.length; _i++) {
4085
+ var _l = attrUpdates_1[_i], el = _l[0], attr = _l[1], val = _l[2];
4086
+ if (val === "") {
4087
+ el.removeAttribute(attr);
4088
+ }
4089
+ else {
4090
+ el.setAttribute(attr, val);
4091
+ }
4092
+ }
4093
+ var tApplyDone = performance.now();
4094
+ if (!cached) {
4095
+ GLOBAL_CACHE.set(hash, {
4096
+ srcNorm: srcNorm,
4097
+ srcLines: srcLines,
4098
+ strippedLines: strippedLines,
4099
+ lineLookup: lineLookup,
4100
+ unorderedListEntries: unorderedListEntries,
4101
+ unorderedLookup: unorderedLookup,
4102
+ orderedListEntries: orderedListEntries,
4103
+ orderedLookup: orderedLookup,
4104
+ orderedGroups: orderedGroups,
4105
+ tableRowLookup: tableRowLookup,
4106
+ tableGroups: tableGroups,
4107
+ });
4108
+ }
4109
+ console.log("[LineNumber][perf]", {
4110
+ cached: !!cached,
4111
+ times: {
4112
+ normalize: Math.round((tNorm - t0) * 100) / 100,
4113
+ index: Math.round((tIndexDone - tNorm) * 100) / 100,
4114
+ blocks: Math.round((tBlockDone - tIndexDone) * 100) / 100,
4115
+ ul: Math.round((tUlDone - tBlockDone) * 100) / 100,
4116
+ ol: Math.round((tOlDone - tUlDone) * 100) / 100,
4117
+ table: Math.round((tTableDone - tIndexDone) * 100) / 100,
4118
+ apply: Math.round((tApplyDone - tTableDone) * 100) / 100,
4119
+ total: Math.round((tApplyDone - t0) * 100) / 100,
4120
+ },
4121
+ counts: {
4122
+ blocks: blocks.length,
4123
+ ul: ulElements.length,
4124
+ ol: olElements.length,
4125
+ tables: tables.length,
4126
+ updates: attrUpdates.length,
4127
+ },
4128
+ });
3873
4129
  };
3874
4130
  /**
3875
4131
  * 节流后的行号更新函数,避免频繁更新 data-linenumber