@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/css/content-theme/dark.css +24 -3
- package/dist/index.css +53 -10
- package/dist/index.js +430 -147
- package/dist/index.min.js +1 -1
- package/dist/method.d.ts +2 -0
- package/dist/method.js +402 -106
- package/dist/method.min.js +1 -1
- package/dist/ts/util/attachLineNumbers.d.ts +6 -5
- package/package.json +1 -1
- package/src/assets/less/_line-number.less +22 -10
- package/src/method.ts +4 -1
- package/src/ts/markdown/previewRender.ts +24 -22
- package/src/ts/util/attachLineNumbers.ts +382 -98
- package/src/ts/wysiwyg/index.ts +27 -21
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,
|
|
@@ -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
|
-
* -
|
|
3410
|
-
* -
|
|
3411
|
-
*
|
|
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
|
|
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
|
-
|
|
3460
|
-
var
|
|
3461
|
-
|
|
3462
|
-
lineLookup.
|
|
3463
|
-
|
|
3464
|
-
|
|
3465
|
-
|
|
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
|
-
|
|
3501
|
-
var
|
|
3502
|
-
|
|
3503
|
-
|
|
3504
|
-
|
|
3505
|
-
|
|
3506
|
-
|
|
3507
|
-
|
|
3508
|
-
|
|
3509
|
-
|
|
3510
|
-
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
|
+
}
|
|
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
|
-
|
|
3557
|
-
var
|
|
3558
|
-
|
|
3559
|
-
|
|
3560
|
-
|
|
3561
|
-
|
|
3562
|
-
|
|
3563
|
-
|
|
3564
|
-
|
|
3565
|
-
|
|
3566
|
-
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
|
+
}
|
|
3567
3627
|
}
|
|
3568
3628
|
}
|
|
3569
3629
|
}
|
|
3570
|
-
|
|
3571
|
-
|
|
3572
|
-
|
|
3573
|
-
|
|
3574
|
-
|
|
3575
|
-
|
|
3576
|
-
|
|
3577
|
-
|
|
3578
|
-
|
|
3579
|
-
|
|
3580
|
-
|
|
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
|
-
|
|
3583
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
3752
|
-
|
|
3753
|
-
|
|
3754
|
-
|
|
3755
|
-
|
|
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.
|
|
3808
|
-
|
|
3809
|
-
|
|
3810
|
-
|
|
3811
|
-
|
|
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.
|
|
3818
|
-
|
|
3819
|
-
|
|
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) */
|