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