@8btc/mditor 0.0.12 → 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.12 - 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.12"));
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.12");
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,
@@ -3190,6 +3190,39 @@ var plantumlRender = function (element, cdn) {
3190
3190
  };
3191
3191
 
3192
3192
 
3193
+ /***/ }),
3194
+
3195
+ /***/ 616:
3196
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3197
+
3198
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3199
+ /* harmony export */ "V": () => (/* binding */ selectionRender)
3200
+ /* harmony export */ });
3201
+ /**
3202
+ * 渲染 selection 代码块为文件选择标签
3203
+ */
3204
+ var selectionRender = function (element) {
3205
+ element.querySelectorAll("pre > code.language-selection").forEach(function (codeElement) {
3206
+ var preElement = codeElement.parentElement;
3207
+ var content = codeElement.textContent.trim();
3208
+ var lines = content.split('\n');
3209
+ var tags = lines.map(function (line) {
3210
+ var match = line.trim().match(/^(.+?)\s+(\d+-\d+)$/);
3211
+ if (match) {
3212
+ var filename = match[1], lineRange = match[2];
3213
+ return "<div class=\"vditor-selection-tag\">\n <span class=\"vditor-selection-tag__file\">".concat(filename, "</span>\n <span class=\"vditor-selection-tag__lines\">").concat(lineRange, "</span>\n </div>");
3214
+ }
3215
+ return '';
3216
+ }).filter(function (tag) { return tag; }).join('');
3217
+ if (tags) {
3218
+ var container = document.createElement('div');
3219
+ container.innerHTML = tags;
3220
+ preElement.parentNode.replaceChild(container, preElement);
3221
+ }
3222
+ });
3223
+ };
3224
+
3225
+
3193
3226
  /***/ }),
3194
3227
 
3195
3228
  /***/ 214:
@@ -3405,16 +3438,28 @@ var addStyle = function (url, id) {
3405
3438
  /* harmony export */ "g": () => (/* binding */ attachLineNumbersToBlocksThrottled)
3406
3439
  /* harmony export */ });
3407
3440
  /**
3408
- * 为编辑区域添加行号标记:
3409
- * - 为所有包含 `data-block` 的块级节点写入 `data-linenumber`
3410
- * - 额外为每个 `ul` 的直接 `li` 子元素写入 `data-linenumber`(不修改 `ul` 本身)
3411
- * 通过解析传入的 Markdown 源文本,建立内容到源文件行号的映射,
3412
- * 兼顾多行文本、嵌套列表、重复内容及空白/特殊字符,并提供基础错误保护。
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
+ * - 精度:支持嵌套列表、换行列表项、多级序号;表格跨页连续行号,容忍合并单元格
3413
3447
  */
3414
3448
  var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3449
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
3415
3450
  if (!root || !sourceMarkdown) {
3416
3451
  return;
3417
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;
3418
3463
  var ZWSP = "\u200b";
3419
3464
  var normalize = function (text) {
3420
3465
  return text
@@ -3425,7 +3470,10 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3425
3470
  .replace(/[\t\f\v ]+/g, " ");
3426
3471
  };
3427
3472
  var srcNorm = normalize(sourceMarkdown);
3428
- 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");
3429
3477
  var stripInlineMD = function (text) {
3430
3478
  return (text
3431
3479
  .replace(/\\([*_`~])/g, "$1")
@@ -3454,15 +3502,17 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3454
3502
  .replace(/[{}]/g, "")
3455
3503
  .trim());
3456
3504
  };
3457
- var strippedLines = srcLines.map(function (l) { return stripInlineMD(l); });
3458
- var lineLookup = new Map();
3459
- for (var i = 0; i < strippedLines.length; i++) {
3460
- var key = strippedLines[i];
3461
- if (!lineLookup.has(key)) {
3462
- lineLookup.set(key, [i + 1]);
3463
- }
3464
- else {
3465
- 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
+ }
3466
3516
  }
3467
3517
  }
3468
3518
  var usedLines = new Set();
@@ -3494,20 +3544,25 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3494
3544
  * 预处理:收集 Markdown 中所有无序列表(ul)行及其去除行内标记后的内容,构建快速查找结构。
3495
3545
  * 仅匹配以 `*`、`-`、`+` 开头的条目,支持任务列表如 `- [ ]`、`* [x]`。
3496
3546
  */
3497
- var unorderedListEntries = [];
3498
- 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();
3499
3549
  var usedUnorderedLines = new Set();
3500
- for (var i = 0; i < srcLines.length; i++) {
3501
- var raw = srcLines[i];
3502
- var m = raw.match(/^\s*[*+-]\s+(?:\[(?: |x|X)\]\s+)?(.*)$/);
3503
- if (m && typeof m[1] === "string") {
3504
- var contentStripped = stripInlineForList(m[1]);
3505
- unorderedListEntries.push({ ln: i + 1, content: contentStripped });
3506
- if (!unorderedLookup.has(contentStripped)) {
3507
- unorderedLookup.set(contentStripped, [i + 1]);
3508
- }
3509
- else {
3510
- 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
+ }
3511
3566
  }
3512
3567
  }
3513
3568
  }
@@ -3548,44 +3603,48 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3548
3603
  /**
3549
3604
  * 预处理:收集 Markdown 中所有有序列表(ol)行及其内容,支持 `1.` 或 `1)` 以及任务列表前缀。
3550
3605
  */
3551
- var orderedListEntries = [];
3552
- 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();
3553
3608
  var usedOrderedLines = new Set();
3554
3609
  var ORDERED_RE = /\s*\d+(?:[.)、.。]|[\uFF0E\uFF09\u3001])\s+(?:\[(?: |x|X)\]\s+)?(.*)/;
3555
3610
  var ORDERED_FULL = new RegExp("^".concat(ORDERED_RE.source, "$"));
3556
- for (var i = 0; i < srcLines.length; i++) {
3557
- var raw = srcLines[i];
3558
- var m = raw.match(ORDERED_FULL);
3559
- if (m && typeof m[1] === "string") {
3560
- var contentStripped = stripInlineForList(m[1]);
3561
- orderedListEntries.push({ ln: i + 1, content: contentStripped });
3562
- if (!orderedLookup.has(contentStripped)) {
3563
- orderedLookup.set(contentStripped, [i + 1]);
3564
- }
3565
- else {
3566
- 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
+ }
3567
3627
  }
3568
3628
  }
3569
3629
  }
3570
- console.debug("[LineNumber][ol:index]", {
3571
- total: orderedListEntries.length,
3572
- });
3573
- var orderedGroups = [];
3574
- for (var i = 0; i < srcLines.length;) {
3575
- var raw = srcLines[i];
3576
- if (ORDERED_FULL.test(raw)) {
3577
- var group = [];
3578
- while (i < srcLines.length && ORDERED_FULL.test(srcLines[i])) {
3579
- group.push(i + 1);
3580
- 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
+ }
3581
3643
  }
3582
- if (group.length > 0) {
3583
- orderedGroups.push(group);
3644
+ else {
3645
+ i++;
3584
3646
  }
3585
3647
  }
3586
- else {
3587
- i++;
3588
- }
3589
3648
  }
3590
3649
  /**
3591
3650
  * 为给定文本在有序列表候选中选择行号,精确匹配优先,包含匹配回退。
@@ -3637,6 +3696,7 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3637
3696
  });
3638
3697
  return buf;
3639
3698
  };
3699
+ var attrUpdates = [];
3640
3700
  var blocks = root.querySelectorAll("[data-block]");
3641
3701
  blocks.forEach(function (el) {
3642
3702
  try {
@@ -3645,22 +3705,26 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3645
3705
  if (dataType === "math-block" || dataType === "code-block") {
3646
3706
  return;
3647
3707
  }
3648
- // 仅 li 需要行号:跳过并清理 ul/ol 自身及其内部嵌套的 p/div 等块
3649
3708
  var tagName = container.tagName;
3650
3709
  if (tagName === "UL" || tagName === "OL") {
3651
- container.removeAttribute("data-linenumber");
3710
+ if (container.getAttribute("data-linenumber")) {
3711
+ attrUpdates.push([container, "data-linenumber", ""]);
3712
+ }
3652
3713
  return;
3653
3714
  }
3654
3715
  var liAncestor = container.closest("li");
3655
3716
  if (liAncestor) {
3656
- container.removeAttribute("data-linenumber");
3717
+ if (container.getAttribute("data-linenumber")) {
3718
+ attrUpdates.push([container, "data-linenumber", ""]);
3719
+ }
3657
3720
  return;
3658
3721
  }
3659
3722
  var text = container.textContent || "";
3660
3723
  var normText = normalize(text);
3661
- // 跳过纯空白块
3662
3724
  if (!normText.trim()) {
3663
- container.removeAttribute("data-linenumber");
3725
+ if (container.getAttribute("data-linenumber")) {
3726
+ attrUpdates.push([container, "data-linenumber", ""]);
3727
+ }
3664
3728
  return;
3665
3729
  }
3666
3730
  var lineNumber = -1;
@@ -3687,13 +3751,18 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3687
3751
  }
3688
3752
  if (lineNumber !== -1) {
3689
3753
  usedLines.add(lineNumber);
3690
- 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
+ }
3691
3759
  }
3692
3760
  }
3693
3761
  catch (_a) {
3694
3762
  void 0;
3695
3763
  }
3696
3764
  });
3765
+ var tBlockDone = performance.now();
3697
3766
  /**
3698
3767
  * 为所有 `ul` 下的每个直接 `li` 子元素追加 `data-linenumber`,不修改 `ul` 本身。
3699
3768
  * 支持多层嵌套与非文本起始节点(如加粗/行内代码)。
@@ -3702,60 +3771,93 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3702
3771
  ulElements.forEach(function (ul) {
3703
3772
  try {
3704
3773
  var children = Array.from(ul.children);
3705
- for (var _i = 0, children_1 = children; _i < children_1.length; _i++) {
3706
- var child = children_1[_i];
3774
+ var _loop_1 = function (child) {
3707
3775
  if (child.tagName !== "LI")
3708
- continue;
3776
+ return "continue";
3709
3777
  var li = child;
3710
3778
  var rawText = getImmediateLiText(li);
3711
3779
  var norm = normalize(rawText);
3712
3780
  var firstLine = norm.split("\n").find(function (l) { return l.trim().length > 0; }) || norm;
3713
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
+ }
3714
3800
  if (ln !== -1) {
3715
3801
  usedUnorderedLines.add(ln);
3716
- 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
+ }
3717
3807
  }
3718
3808
  else {
3719
- li.setAttribute("data-linenumber", "");
3809
+ if (li.getAttribute("data-linenumber")) {
3810
+ attrUpdates.push([li, "data-linenumber", ""]);
3811
+ }
3720
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);
3721
3817
  }
3722
3818
  }
3723
3819
  catch (_a) {
3724
3820
  void 0;
3725
3821
  }
3726
3822
  });
3823
+ var tUlDone = performance.now();
3727
3824
  /**
3728
3825
  * 为所有 `ol` 下的每个直接 `li` 子元素追加 `data-linenumber`,不修改 `ol` 本身。
3729
3826
  */
3730
3827
  var olElements = root.querySelectorAll("ol");
3828
+ var orderedIndexMap = new WeakMap();
3731
3829
  olElements.forEach(function (ol) {
3732
3830
  try {
3733
3831
  var currentGroupIdx = -1;
3734
3832
  var lastAssigned_1 = -1;
3833
+ var startAttr = Number(ol.getAttribute("start"));
3834
+ var start = Number.isFinite(startAttr) && startAttr > 0 ? startAttr : 1;
3735
3835
  var children = Array.from(ol.children);
3836
+ var seq = start;
3736
3837
  for (var _i = 0, children_2 = children; _i < children_2.length; _i++) {
3737
3838
  var child = children_2[_i];
3738
3839
  if (child.tagName !== "LI")
3739
3840
  continue;
3841
+ orderedIndexMap.set(child, seq++);
3842
+ }
3843
+ var _loop_2 = function (child) {
3844
+ if (child.tagName !== "LI")
3845
+ return "continue";
3740
3846
  var li = child;
3741
3847
  var rawText = getImmediateLiText(li);
3742
3848
  var norm = normalize(rawText);
3743
3849
  var firstLine = norm.split("\n").find(function (l) { return l.trim().length > 0; }) || norm;
3744
3850
  var stripped0 = stripInlineForList(firstLine);
3745
3851
  var stripped = stripped0 || stripInlineMD(firstLine);
3746
- var candidates = orderedLookup.get(stripped) || [];
3747
- var available = candidates.filter(function (n) { return !usedOrderedLines.has(n); });
3852
+ orderedLookup.get(stripped);
3748
3853
  var ln = findOrderedListLineNumber(firstLine);
3749
3854
  if (ln !== -1) {
3750
3855
  usedOrderedLines.add(ln);
3751
- li.setAttribute("data-linenumber", String(ln));
3752
- // 成功映射日志
3753
- console.debug("[LineNumber][ol>li]", {
3754
- text: firstLine,
3755
- stripped: stripped,
3756
- line: ln,
3757
- });
3758
- // 记录当前组
3856
+ var cur = li.getAttribute("data-linenumber");
3857
+ var val = String(ln);
3858
+ if (cur !== val) {
3859
+ attrUpdates.push([li, "data-linenumber", val]);
3860
+ }
3759
3861
  for (var gi = 0; gi < orderedGroups.length; gi++) {
3760
3862
  if (orderedGroups[gi].includes(ln)) {
3761
3863
  currentGroupIdx = gi;
@@ -3765,13 +3867,11 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3765
3867
  lastAssigned_1 = ln;
3766
3868
  }
3767
3869
  else {
3768
- // 顺序回退:基于当前组或猜测组,按序分配下一未使用行
3769
3870
  var assigned = -1;
3770
3871
  var pickNextFromGroup = function (gi) {
3771
3872
  if (gi < 0 || gi >= orderedGroups.length)
3772
3873
  return -1;
3773
3874
  var lines = orderedGroups[gi];
3774
- // 优先从上次分配后续查找
3775
3875
  var startIdx = 0;
3776
3876
  if (lastAssigned_1 !== -1) {
3777
3877
  var idx = lines.indexOf(lastAssigned_1);
@@ -3793,7 +3893,6 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3793
3893
  assigned = pickNextFromGroup(currentGroupIdx);
3794
3894
  }
3795
3895
  if (assigned === -1) {
3796
- // 猜测组:选择拥有可用行的首个组
3797
3896
  for (var gi = 0; gi < orderedGroups.length && assigned === -1; gi++) {
3798
3897
  var cand = pickNextFromGroup(gi);
3799
3898
  if (cand !== -1) {
@@ -3804,39 +3903,229 @@ var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
3804
3903
  }
3805
3904
  if (assigned !== -1) {
3806
3905
  usedOrderedLines.add(assigned);
3807
- li.setAttribute("data-linenumber", String(assigned));
3808
- console.debug("[LineNumber][ol>li][fallback-seq]", {
3809
- text: firstLine,
3810
- stripped: stripped,
3811
- line: assigned,
3812
- group: currentGroupIdx,
3813
- });
3906
+ var cur = li.getAttribute("data-linenumber");
3907
+ var val = String(assigned);
3908
+ if (cur !== val) {
3909
+ attrUpdates.push([li, "data-linenumber", val]);
3910
+ }
3814
3911
  lastAssigned_1 = assigned;
3815
3912
  }
3816
3913
  else {
3817
- li.setAttribute("data-linenumber", "");
3818
- // 失败诊断日志
3819
- console.warn("[LineNumber][ol>li][missing]", {
3820
- text: firstLine,
3821
- stripped: stripped,
3822
- candidates: candidates,
3823
- available: available,
3824
- reason: !stripped0
3825
- ? "empty-after-strip"
3826
- : candidates.length === 0
3827
- ? "no-index-candidates"
3828
- : available.length === 0
3829
- ? "all-candidates-consumed"
3830
- : "fallback-no-match",
3831
- });
3914
+ if (li.getAttribute("data-linenumber")) {
3915
+ attrUpdates.push([li, "data-linenumber", ""]);
3916
+ }
3832
3917
  }
3833
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++;
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]);
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);
3834
3963
  }
3835
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
+ }
3836
4079
  catch (_a) {
3837
4080
  void 0;
3838
4081
  }
3839
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
+ });
3840
4129
  };
3841
4130
  /**
3842
4131
  * 节流后的行号更新函数,避免频繁更新 data-linenumber
@@ -4726,6 +5015,8 @@ var speechRender = function (element, lang) {
4726
5015
  });
4727
5016
  };
4728
5017
 
5018
+ // EXTERNAL MODULE: ./src/ts/markdown/selectionRender.ts
5019
+ var selectionRender = __webpack_require__(616);
4729
5020
  ;// CONCATENATED MODULE: ./src/ts/markdown/previewRender.ts
4730
5021
  var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
4731
5022
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
@@ -4783,6 +5074,7 @@ var __generator = (undefined && undefined.__generator) || function (thisArg, bod
4783
5074
 
4784
5075
 
4785
5076
 
5077
+
4786
5078
 
4787
5079
 
4788
5080
  var mergeOptions = function (options) {
@@ -4913,6 +5205,7 @@ var previewRender = function (previewElement, markdown, options) { return __awai
4913
5205
  (0,mindmapRender/* mindmapRender */.P)(previewElement, mergedOptions.cdn, mergedOptions.mode);
4914
5206
  (0,plantumlRender/* plantumlRender */.B)(previewElement, mergedOptions.cdn);
4915
5207
  (0,abcRender/* abcRender */.Q)(previewElement, mergedOptions.cdn);
5208
+ (0,selectionRender/* selectionRender */.V)(previewElement);
4916
5209
  if (mergedOptions.render.media.enable) {
4917
5210
  (0,mediaRender/* mediaRender */.Y)(previewElement);
4918
5211
  }
@@ -4973,6 +5266,7 @@ var attachLineNumbers = __webpack_require__(626);
4973
5266
 
4974
5267
 
4975
5268
 
5269
+
4976
5270
 
4977
5271
 
4978
5272
  var Vditor = /** @class */ (function () {
@@ -5033,6 +5327,8 @@ var Vditor = /** @class */ (function () {
5033
5327
  Vditor.mediaRender = mediaRender/* mediaRender */.Y;
5034
5328
  /** 对选中的文字进行阅读 */
5035
5329
  Vditor.speechRender = speechRender;
5330
+ /** 渲染 selection 代码块为文件选择标签 */
5331
+ Vditor.selectionRender = selectionRender/* selectionRender */.V;
5036
5332
  /** 对图片进行懒加载 */
5037
5333
  Vditor.lazyLoadImageRender = lazyLoadImageRender;
5038
5334
  /** Markdown 文本转换为 HTML,该方法需使用[异步编程](https://ld246.com/article/1546828434083?r=Vaness) */