@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/css/content-theme/dark.css +7 -2
- package/dist/index.css +53 -10
- package/dist/index.js +362 -106
- package/dist/index.min.js +1 -1
- package/dist/method.js +362 -106
- package/dist/method.min.js +1 -1
- package/dist/ts/util/attachLineNumbers.d.ts +6 -5
- package/package.json +2 -2
- package/src/assets/less/_line-number.less +23 -13
- package/src/ts/util/attachLineNumbers.ts +382 -98
package/dist/method.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Vditor v0.0.
|
|
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.
|
|
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.
|
|
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
|
-
* -
|
|
3443
|
-
* -
|
|
3444
|
-
*
|
|
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
|
|
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
|
-
|
|
3493
|
-
var
|
|
3494
|
-
|
|
3495
|
-
lineLookup.
|
|
3496
|
-
|
|
3497
|
-
|
|
3498
|
-
|
|
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
|
-
|
|
3534
|
-
var
|
|
3535
|
-
|
|
3536
|
-
|
|
3537
|
-
|
|
3538
|
-
|
|
3539
|
-
|
|
3540
|
-
|
|
3541
|
-
|
|
3542
|
-
|
|
3543
|
-
unorderedLookup.
|
|
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
|
-
|
|
3590
|
-
var
|
|
3591
|
-
|
|
3592
|
-
|
|
3593
|
-
|
|
3594
|
-
|
|
3595
|
-
|
|
3596
|
-
|
|
3597
|
-
|
|
3598
|
-
|
|
3599
|
-
orderedLookup.
|
|
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
|
-
|
|
3604
|
-
|
|
3605
|
-
|
|
3606
|
-
|
|
3607
|
-
|
|
3608
|
-
|
|
3609
|
-
|
|
3610
|
-
|
|
3611
|
-
|
|
3612
|
-
|
|
3613
|
-
|
|
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
|
-
|
|
3616
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
3785
|
-
|
|
3786
|
-
|
|
3787
|
-
|
|
3788
|
-
|
|
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.
|
|
3841
|
-
|
|
3842
|
-
|
|
3843
|
-
|
|
3844
|
-
|
|
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.
|
|
3851
|
-
|
|
3852
|
-
|
|
3853
|
-
|
|
3854
|
-
|
|
3855
|
-
|
|
3856
|
-
|
|
3857
|
-
|
|
3858
|
-
|
|
3859
|
-
|
|
3860
|
-
|
|
3861
|
-
|
|
3862
|
-
|
|
3863
|
-
|
|
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
|