@8btc/mditor 0.0.7 → 0.0.8
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/index.css +6 -2
- package/dist/index.d.ts +7 -0
- package/dist/index.js +2787 -2687
- package/dist/index.min.js +1 -1
- package/dist/method.d.ts +14 -10
- package/dist/method.js +527 -3
- package/dist/method.min.js +1 -1
- package/package.json +1 -1
- package/src/assets/less/_line-number.less +6 -1
- package/src/index.ts +50 -0
package/dist/method.d.ts
CHANGED
|
@@ -9,28 +9,28 @@ declare class Vditor {
|
|
|
9
9
|
/** 对 graphviz 进行渲染 */
|
|
10
10
|
static graphvizRender: (element: HTMLElement, cdn?: string) => void;
|
|
11
11
|
/** 为 element 中的代码块进行高亮渲染 */
|
|
12
|
-
static highlightRender: (hljsOption?: IHljs, element?:
|
|
12
|
+
static highlightRender: (hljsOption?: IHljs, element?: HTMLElement | Document, cdn?: string) => void;
|
|
13
13
|
/** 对数学公式进行渲染 */
|
|
14
|
-
static mathRender: (element?:
|
|
14
|
+
static mathRender: (element?: HTMLElement | Document, options?: {
|
|
15
15
|
cdn?: string;
|
|
16
16
|
math?: IMath;
|
|
17
17
|
}) => void;
|
|
18
18
|
/** 流程图/时序图/甘特图渲染 */
|
|
19
|
-
static mermaidRender: (element:
|
|
19
|
+
static mermaidRender: (element: HTMLElement | Document, cdn: string, theme: string) => void;
|
|
20
20
|
/** 化学物质结构渲染 */
|
|
21
|
-
static SMILESRender: (element:
|
|
21
|
+
static SMILESRender: (element: HTMLElement | Document, cdn: string, theme: string) => void;
|
|
22
22
|
/** 支持 markdown 的思维导图 */
|
|
23
|
-
static markmapRender: (element?:
|
|
23
|
+
static markmapRender: (element?: HTMLElement | Document, cdn?: string) => void;
|
|
24
24
|
/** flowchart.js 渲染 */
|
|
25
25
|
static flowchartRender: (element: HTMLElement, cdn?: string) => void;
|
|
26
26
|
/** 图表渲染 */
|
|
27
|
-
static chartRender: (element:
|
|
27
|
+
static chartRender: (element: HTMLElement | Document, cdn: string, theme: string) => void;
|
|
28
28
|
/** 五线谱渲染 */
|
|
29
|
-
static abcRender: (element?:
|
|
29
|
+
static abcRender: (element?: HTMLElement | Document, cdn?: string) => void;
|
|
30
30
|
/** 脑图渲染 */
|
|
31
|
-
static mindmapRender: (element:
|
|
31
|
+
static mindmapRender: (element: HTMLElement | Document, cdn: string, theme: string) => void;
|
|
32
32
|
/** plantuml渲染 */
|
|
33
|
-
static plantumlRender: (element?:
|
|
33
|
+
static plantumlRender: (element?: HTMLElement | Document, cdn?: string) => void;
|
|
34
34
|
/** 大纲渲染 */
|
|
35
35
|
static outlineRender: (contentElement: HTMLElement, targetElement: Element, vditor?: IVditor) => string;
|
|
36
36
|
/** 为[特定链接](https://github.com/Vanessa219/vditor/issues/7)分别渲染为视频、音频、嵌入的 iframe */
|
|
@@ -38,7 +38,7 @@ declare class Vditor {
|
|
|
38
38
|
/** 对选中的文字进行阅读 */
|
|
39
39
|
static speechRender: (element: HTMLElement, lang?: keyof II18n) => void;
|
|
40
40
|
/** 对图片进行懒加载 */
|
|
41
|
-
static lazyLoadImageRender: (element?:
|
|
41
|
+
static lazyLoadImageRender: (element?: HTMLElement | Document) => boolean;
|
|
42
42
|
/** Markdown 文本转换为 HTML,该方法需使用[异步编程](https://ld246.com/article/1546828434083?r=Vaness) */
|
|
43
43
|
static md2html: (mdText: string, options?: IPreviewOptions) => Promise<string>;
|
|
44
44
|
/** 页面 Markdown 文章渲染 */
|
|
@@ -47,5 +47,9 @@ declare class Vditor {
|
|
|
47
47
|
static setCodeTheme: (codeTheme: string, cdn?: string) => void;
|
|
48
48
|
/** 设置内容主题 */
|
|
49
49
|
static setContentTheme: (contentTheme: string, path: string) => void;
|
|
50
|
+
/**
|
|
51
|
+
* 外部更新行号:传入实例并根据配置进行同步/节流更新
|
|
52
|
+
*/
|
|
53
|
+
static updateLineNumbers(instance: any, immediate?: boolean): void;
|
|
50
54
|
}
|
|
51
55
|
export default Vditor;
|
package/dist/method.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Vditor v0.0.
|
|
2
|
+
* Vditor v0.0.7 - 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.7"));
|
|
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.7");
|
|
351
351
|
Constants.MARKDOWN_OPTIONS = {
|
|
352
352
|
autoSpace: false,
|
|
353
353
|
gfmAutoLink: true,
|
|
@@ -1789,6 +1789,30 @@ var flowchartRender = function (element, cdn) {
|
|
|
1789
1789
|
};
|
|
1790
1790
|
|
|
1791
1791
|
|
|
1792
|
+
/***/ }),
|
|
1793
|
+
|
|
1794
|
+
/***/ 210:
|
|
1795
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1796
|
+
|
|
1797
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1798
|
+
/* harmony export */ "O": () => (/* binding */ getMarkdown)
|
|
1799
|
+
/* harmony export */ });
|
|
1800
|
+
/* harmony import */ var _util_code160to32__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(105);
|
|
1801
|
+
|
|
1802
|
+
var getMarkdown = function (vditor) {
|
|
1803
|
+
if (vditor.currentMode === "sv") {
|
|
1804
|
+
return (0,_util_code160to32__WEBPACK_IMPORTED_MODULE_0__/* .code160to32 */ .X)("".concat(vditor.sv.element.textContent, "\n").replace(/\n\n$/, "\n"));
|
|
1805
|
+
}
|
|
1806
|
+
else if (vditor.currentMode === "wysiwyg") {
|
|
1807
|
+
return vditor.lute.VditorDOM2Md(vditor.wysiwyg.element.innerHTML);
|
|
1808
|
+
}
|
|
1809
|
+
else if (vditor.currentMode === "ir") {
|
|
1810
|
+
return vditor.lute.VditorIRDOM2Md(vditor.ir.element.innerHTML);
|
|
1811
|
+
}
|
|
1812
|
+
return "";
|
|
1813
|
+
};
|
|
1814
|
+
|
|
1815
|
+
|
|
1792
1816
|
/***/ }),
|
|
1793
1817
|
|
|
1794
1818
|
/***/ 483:
|
|
@@ -3371,6 +3395,479 @@ var addStyle = function (url, id) {
|
|
|
3371
3395
|
};
|
|
3372
3396
|
|
|
3373
3397
|
|
|
3398
|
+
/***/ }),
|
|
3399
|
+
|
|
3400
|
+
/***/ 626:
|
|
3401
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3402
|
+
|
|
3403
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
3404
|
+
/* harmony export */ "t": () => (/* binding */ attachLineNumbersToBlocks),
|
|
3405
|
+
/* harmony export */ "g": () => (/* binding */ attachLineNumbersToBlocksThrottled)
|
|
3406
|
+
/* harmony export */ });
|
|
3407
|
+
/**
|
|
3408
|
+
* 为编辑区域添加行号标记:
|
|
3409
|
+
* - 为所有包含 `data-block` 的块级节点写入 `data-linenumber`
|
|
3410
|
+
* - 额外为每个 `ul` 的直接 `li` 子元素写入 `data-linenumber`(不修改 `ul` 本身)
|
|
3411
|
+
* 通过解析传入的 Markdown 源文本,建立内容到源文件行号的映射,
|
|
3412
|
+
* 兼顾多行文本、嵌套列表、重复内容及空白/特殊字符,并提供基础错误保护。
|
|
3413
|
+
*/
|
|
3414
|
+
var attachLineNumbersToBlocks = function (root, sourceMarkdown) {
|
|
3415
|
+
if (!root || !sourceMarkdown) {
|
|
3416
|
+
return;
|
|
3417
|
+
}
|
|
3418
|
+
var ZWSP = "\u200b";
|
|
3419
|
+
var normalize = function (text) {
|
|
3420
|
+
return text
|
|
3421
|
+
.replace(/\r\n|\r/g, "\n")
|
|
3422
|
+
.replace(new RegExp(ZWSP, "g"), "")
|
|
3423
|
+
.replace(/\u00a0/g, " ")
|
|
3424
|
+
.replace(/\u2006/g, "")
|
|
3425
|
+
.replace(/[\t\f\v ]+/g, " ");
|
|
3426
|
+
};
|
|
3427
|
+
var srcNorm = normalize(sourceMarkdown);
|
|
3428
|
+
var srcLines = srcNorm.split("\n");
|
|
3429
|
+
var stripInlineMD = function (text) {
|
|
3430
|
+
return (text
|
|
3431
|
+
.replace(/\\([*_`~])/g, "$1")
|
|
3432
|
+
.replace(/\*\*|__/g, "")
|
|
3433
|
+
.replace(/\*|_/g, "")
|
|
3434
|
+
.replace(/~~/g, "")
|
|
3435
|
+
.replace(/`+/g, "")
|
|
3436
|
+
// 数学行内分隔符:保留内容,仅移除分隔符
|
|
3437
|
+
.replace(/\\\(/g, "(")
|
|
3438
|
+
.replace(/\\\)/g, ")")
|
|
3439
|
+
.replace(/\\\[/g, "[")
|
|
3440
|
+
.replace(/\\\]/g, "]")
|
|
3441
|
+
.replace(/\$/g, "")
|
|
3442
|
+
.trim());
|
|
3443
|
+
};
|
|
3444
|
+
var stripInlineForList = function (text) {
|
|
3445
|
+
return (stripInlineMD(text)
|
|
3446
|
+
// 移除 $...$(行内公式整体)
|
|
3447
|
+
.replace(/\$(?:\\.|[^$])*\$/g, "")
|
|
3448
|
+
// 移除 \(...\)、\[...\](行内/行间公式整体)
|
|
3449
|
+
.replace(/\\\([^)]*\\\)/g, "")
|
|
3450
|
+
.replace(/\\\[[^\]]*\\\]/g, "")
|
|
3451
|
+
// 去除通用 TeX 命令,如 \alpha、\mathbf 等
|
|
3452
|
+
.replace(/\\[a-zA-Z]+/g, "")
|
|
3453
|
+
// 去除多余大括号
|
|
3454
|
+
.replace(/[{}]/g, "")
|
|
3455
|
+
.trim());
|
|
3456
|
+
};
|
|
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);
|
|
3466
|
+
}
|
|
3467
|
+
}
|
|
3468
|
+
var usedLines = new Set();
|
|
3469
|
+
var pickFirstUnused = function (candidates) {
|
|
3470
|
+
if (!candidates || candidates.length === 0)
|
|
3471
|
+
return -1;
|
|
3472
|
+
for (var _i = 0, candidates_1 = candidates; _i < candidates_1.length; _i++) {
|
|
3473
|
+
var ln = candidates_1[_i];
|
|
3474
|
+
if (!usedLines.has(ln))
|
|
3475
|
+
return ln;
|
|
3476
|
+
}
|
|
3477
|
+
return -1;
|
|
3478
|
+
};
|
|
3479
|
+
var findLineNumberByText = function (text) {
|
|
3480
|
+
var stripped = stripInlineMD(text);
|
|
3481
|
+
var ln = pickFirstUnused(lineLookup.get(stripped));
|
|
3482
|
+
if (ln !== -1)
|
|
3483
|
+
return ln;
|
|
3484
|
+
for (var i = 0; i < strippedLines.length; i++) {
|
|
3485
|
+
if (!usedLines.has(i + 1) &&
|
|
3486
|
+
stripped &&
|
|
3487
|
+
strippedLines[i].indexOf(stripped) !== -1) {
|
|
3488
|
+
return i + 1;
|
|
3489
|
+
}
|
|
3490
|
+
}
|
|
3491
|
+
return -1;
|
|
3492
|
+
};
|
|
3493
|
+
/**
|
|
3494
|
+
* 预处理:收集 Markdown 中所有无序列表(ul)行及其去除行内标记后的内容,构建快速查找结构。
|
|
3495
|
+
* 仅匹配以 `*`、`-`、`+` 开头的条目,支持任务列表如 `- [ ]`、`* [x]`。
|
|
3496
|
+
*/
|
|
3497
|
+
var unorderedListEntries = [];
|
|
3498
|
+
var unorderedLookup = new Map();
|
|
3499
|
+
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);
|
|
3511
|
+
}
|
|
3512
|
+
}
|
|
3513
|
+
}
|
|
3514
|
+
/**
|
|
3515
|
+
* 从无序列表候选行中为给定文本选择一个行号。
|
|
3516
|
+
* 优先精确匹配(去标记后完全相同),否则回退到包含匹配。
|
|
3517
|
+
*/
|
|
3518
|
+
var pickFirstUnusedUnordered = function (candidates) {
|
|
3519
|
+
if (!candidates || candidates.length === 0)
|
|
3520
|
+
return -1;
|
|
3521
|
+
for (var _i = 0, candidates_2 = candidates; _i < candidates_2.length; _i++) {
|
|
3522
|
+
var ln = candidates_2[_i];
|
|
3523
|
+
if (!usedUnorderedLines.has(ln))
|
|
3524
|
+
return ln;
|
|
3525
|
+
}
|
|
3526
|
+
return -1;
|
|
3527
|
+
};
|
|
3528
|
+
var findUnorderedListLineNumber = function (text) {
|
|
3529
|
+
var stripped = stripInlineForList(text);
|
|
3530
|
+
// 先尝试精确匹配
|
|
3531
|
+
var exact = pickFirstUnusedUnordered(unorderedLookup.get(stripped));
|
|
3532
|
+
if (exact !== -1)
|
|
3533
|
+
return exact;
|
|
3534
|
+
// 回退到包含匹配
|
|
3535
|
+
for (var i = 0; i < unorderedListEntries.length; i++) {
|
|
3536
|
+
var entry = unorderedListEntries[i];
|
|
3537
|
+
if (usedUnorderedLines.has(entry.ln))
|
|
3538
|
+
continue;
|
|
3539
|
+
if (!stripped)
|
|
3540
|
+
continue;
|
|
3541
|
+
if (entry.content.indexOf(stripped) !== -1 ||
|
|
3542
|
+
stripped.indexOf(entry.content) !== -1) {
|
|
3543
|
+
return entry.ln;
|
|
3544
|
+
}
|
|
3545
|
+
}
|
|
3546
|
+
return -1;
|
|
3547
|
+
};
|
|
3548
|
+
/**
|
|
3549
|
+
* 预处理:收集 Markdown 中所有有序列表(ol)行及其内容,支持 `1.` 或 `1)` 以及任务列表前缀。
|
|
3550
|
+
*/
|
|
3551
|
+
var orderedListEntries = [];
|
|
3552
|
+
var orderedLookup = new Map();
|
|
3553
|
+
var usedOrderedLines = new Set();
|
|
3554
|
+
var ORDERED_RE = /\s*\d+(?:[.)、.。]|[\uFF0E\uFF09\u3001])\s+(?:\[(?: |x|X)\]\s+)?(.*)/;
|
|
3555
|
+
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);
|
|
3567
|
+
}
|
|
3568
|
+
}
|
|
3569
|
+
}
|
|
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++;
|
|
3581
|
+
}
|
|
3582
|
+
if (group.length > 0) {
|
|
3583
|
+
orderedGroups.push(group);
|
|
3584
|
+
}
|
|
3585
|
+
}
|
|
3586
|
+
else {
|
|
3587
|
+
i++;
|
|
3588
|
+
}
|
|
3589
|
+
}
|
|
3590
|
+
/**
|
|
3591
|
+
* 为给定文本在有序列表候选中选择行号,精确匹配优先,包含匹配回退。
|
|
3592
|
+
*/
|
|
3593
|
+
var pickFirstUnusedOrdered = function (candidates) {
|
|
3594
|
+
if (!candidates || candidates.length === 0)
|
|
3595
|
+
return -1;
|
|
3596
|
+
for (var _i = 0, candidates_3 = candidates; _i < candidates_3.length; _i++) {
|
|
3597
|
+
var ln = candidates_3[_i];
|
|
3598
|
+
if (!usedOrderedLines.has(ln))
|
|
3599
|
+
return ln;
|
|
3600
|
+
}
|
|
3601
|
+
return -1;
|
|
3602
|
+
};
|
|
3603
|
+
var findOrderedListLineNumber = function (text) {
|
|
3604
|
+
var stripped = stripInlineForList(text);
|
|
3605
|
+
var exact = pickFirstUnusedOrdered(orderedLookup.get(stripped));
|
|
3606
|
+
if (exact !== -1)
|
|
3607
|
+
return exact;
|
|
3608
|
+
for (var i = 0; i < orderedListEntries.length; i++) {
|
|
3609
|
+
var entry = orderedListEntries[i];
|
|
3610
|
+
if (usedOrderedLines.has(entry.ln))
|
|
3611
|
+
continue;
|
|
3612
|
+
if (!stripped)
|
|
3613
|
+
continue;
|
|
3614
|
+
if (entry.content.indexOf(stripped) !== -1 ||
|
|
3615
|
+
stripped.indexOf(entry.content) !== -1) {
|
|
3616
|
+
return entry.ln;
|
|
3617
|
+
}
|
|
3618
|
+
}
|
|
3619
|
+
return -1;
|
|
3620
|
+
};
|
|
3621
|
+
/**
|
|
3622
|
+
* 获取 `li` 的直接内容文本:仅拼接其直系子节点中的文本,排除嵌套的 `UL/OL` 列表。
|
|
3623
|
+
* 以便在嵌套列表场景下准确定位每个条目对应的源行。
|
|
3624
|
+
*/
|
|
3625
|
+
var getImmediateLiText = function (li) {
|
|
3626
|
+
var buf = "";
|
|
3627
|
+
li.childNodes.forEach(function (node) {
|
|
3628
|
+
var _a;
|
|
3629
|
+
if (node.nodeType === 3) {
|
|
3630
|
+
buf += node.data;
|
|
3631
|
+
}
|
|
3632
|
+
else if (node.tagName !== "UL" &&
|
|
3633
|
+
node.tagName !== "OL" &&
|
|
3634
|
+
!((_a = node.classList) === null || _a === void 0 ? void 0 : _a.contains("katex"))) {
|
|
3635
|
+
buf += node.textContent || "";
|
|
3636
|
+
}
|
|
3637
|
+
});
|
|
3638
|
+
return buf;
|
|
3639
|
+
};
|
|
3640
|
+
var blocks = root.querySelectorAll("[data-block]");
|
|
3641
|
+
blocks.forEach(function (el) {
|
|
3642
|
+
try {
|
|
3643
|
+
var container = el;
|
|
3644
|
+
var dataType = container.getAttribute("data-type") || "";
|
|
3645
|
+
if (dataType === "math-block" || dataType === "code-block") {
|
|
3646
|
+
return;
|
|
3647
|
+
}
|
|
3648
|
+
// 仅 li 需要行号:跳过并清理 ul/ol 自身及其内部嵌套的 p/div 等块
|
|
3649
|
+
var tagName = container.tagName;
|
|
3650
|
+
if (tagName === "UL" || tagName === "OL") {
|
|
3651
|
+
container.removeAttribute("data-linenumber");
|
|
3652
|
+
return;
|
|
3653
|
+
}
|
|
3654
|
+
var liAncestor = container.closest("li");
|
|
3655
|
+
if (liAncestor) {
|
|
3656
|
+
container.removeAttribute("data-linenumber");
|
|
3657
|
+
return;
|
|
3658
|
+
}
|
|
3659
|
+
var text = container.textContent || "";
|
|
3660
|
+
var normText = normalize(text);
|
|
3661
|
+
// 跳过纯空白块
|
|
3662
|
+
if (!normText.trim()) {
|
|
3663
|
+
container.removeAttribute("data-linenumber");
|
|
3664
|
+
return;
|
|
3665
|
+
}
|
|
3666
|
+
var lineNumber = -1;
|
|
3667
|
+
if (tagName === "BLOCKQUOTE") {
|
|
3668
|
+
var firstLine = normText.split("\n").find(function (l) { return l.trim().length > 0; }) ||
|
|
3669
|
+
normText;
|
|
3670
|
+
var stripped = stripInlineMD(firstLine);
|
|
3671
|
+
for (var i = 0; i < srcLines.length; i++) {
|
|
3672
|
+
if (usedLines.has(i + 1))
|
|
3673
|
+
continue;
|
|
3674
|
+
if (/^\s*>+\s/.test(srcLines[i])) {
|
|
3675
|
+
var content = stripInlineMD(srcLines[i].replace(/^\s*>+\s+/, ""));
|
|
3676
|
+
if (content.indexOf(stripped) !== -1) {
|
|
3677
|
+
lineNumber = i + 1;
|
|
3678
|
+
break;
|
|
3679
|
+
}
|
|
3680
|
+
}
|
|
3681
|
+
}
|
|
3682
|
+
}
|
|
3683
|
+
else {
|
|
3684
|
+
var firstLine = normText.split("\n").find(function (l) { return l.trim().length > 0; }) ||
|
|
3685
|
+
normText;
|
|
3686
|
+
lineNumber = findLineNumberByText(firstLine);
|
|
3687
|
+
}
|
|
3688
|
+
if (lineNumber !== -1) {
|
|
3689
|
+
usedLines.add(lineNumber);
|
|
3690
|
+
container.setAttribute("data-linenumber", String(lineNumber));
|
|
3691
|
+
}
|
|
3692
|
+
}
|
|
3693
|
+
catch (_a) {
|
|
3694
|
+
void 0;
|
|
3695
|
+
}
|
|
3696
|
+
});
|
|
3697
|
+
/**
|
|
3698
|
+
* 为所有 `ul` 下的每个直接 `li` 子元素追加 `data-linenumber`,不修改 `ul` 本身。
|
|
3699
|
+
* 支持多层嵌套与非文本起始节点(如加粗/行内代码)。
|
|
3700
|
+
*/
|
|
3701
|
+
var ulElements = root.querySelectorAll("ul");
|
|
3702
|
+
ulElements.forEach(function (ul) {
|
|
3703
|
+
try {
|
|
3704
|
+
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];
|
|
3707
|
+
if (child.tagName !== "LI")
|
|
3708
|
+
continue;
|
|
3709
|
+
var li = child;
|
|
3710
|
+
var rawText = getImmediateLiText(li);
|
|
3711
|
+
var norm = normalize(rawText);
|
|
3712
|
+
var firstLine = norm.split("\n").find(function (l) { return l.trim().length > 0; }) || norm;
|
|
3713
|
+
var ln = findUnorderedListLineNumber(firstLine);
|
|
3714
|
+
if (ln !== -1) {
|
|
3715
|
+
usedUnorderedLines.add(ln);
|
|
3716
|
+
li.setAttribute("data-linenumber", String(ln));
|
|
3717
|
+
}
|
|
3718
|
+
else {
|
|
3719
|
+
li.setAttribute("data-linenumber", "");
|
|
3720
|
+
}
|
|
3721
|
+
}
|
|
3722
|
+
}
|
|
3723
|
+
catch (_a) {
|
|
3724
|
+
void 0;
|
|
3725
|
+
}
|
|
3726
|
+
});
|
|
3727
|
+
/**
|
|
3728
|
+
* 为所有 `ol` 下的每个直接 `li` 子元素追加 `data-linenumber`,不修改 `ol` 本身。
|
|
3729
|
+
*/
|
|
3730
|
+
var olElements = root.querySelectorAll("ol");
|
|
3731
|
+
olElements.forEach(function (ol) {
|
|
3732
|
+
try {
|
|
3733
|
+
var currentGroupIdx = -1;
|
|
3734
|
+
var lastAssigned_1 = -1;
|
|
3735
|
+
var children = Array.from(ol.children);
|
|
3736
|
+
for (var _i = 0, children_2 = children; _i < children_2.length; _i++) {
|
|
3737
|
+
var child = children_2[_i];
|
|
3738
|
+
if (child.tagName !== "LI")
|
|
3739
|
+
continue;
|
|
3740
|
+
var li = child;
|
|
3741
|
+
var rawText = getImmediateLiText(li);
|
|
3742
|
+
var norm = normalize(rawText);
|
|
3743
|
+
var firstLine = norm.split("\n").find(function (l) { return l.trim().length > 0; }) || norm;
|
|
3744
|
+
var stripped0 = stripInlineForList(firstLine);
|
|
3745
|
+
var stripped = stripped0 || stripInlineMD(firstLine);
|
|
3746
|
+
var candidates = orderedLookup.get(stripped) || [];
|
|
3747
|
+
var available = candidates.filter(function (n) { return !usedOrderedLines.has(n); });
|
|
3748
|
+
var ln = findOrderedListLineNumber(firstLine);
|
|
3749
|
+
if (ln !== -1) {
|
|
3750
|
+
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
|
+
// 记录当前组
|
|
3759
|
+
for (var gi = 0; gi < orderedGroups.length; gi++) {
|
|
3760
|
+
if (orderedGroups[gi].includes(ln)) {
|
|
3761
|
+
currentGroupIdx = gi;
|
|
3762
|
+
break;
|
|
3763
|
+
}
|
|
3764
|
+
}
|
|
3765
|
+
lastAssigned_1 = ln;
|
|
3766
|
+
}
|
|
3767
|
+
else {
|
|
3768
|
+
// 顺序回退:基于当前组或猜测组,按序分配下一未使用行
|
|
3769
|
+
var assigned = -1;
|
|
3770
|
+
var pickNextFromGroup = function (gi) {
|
|
3771
|
+
if (gi < 0 || gi >= orderedGroups.length)
|
|
3772
|
+
return -1;
|
|
3773
|
+
var lines = orderedGroups[gi];
|
|
3774
|
+
// 优先从上次分配后续查找
|
|
3775
|
+
var startIdx = 0;
|
|
3776
|
+
if (lastAssigned_1 !== -1) {
|
|
3777
|
+
var idx = lines.indexOf(lastAssigned_1);
|
|
3778
|
+
startIdx = idx >= 0 ? idx + 1 : 0;
|
|
3779
|
+
}
|
|
3780
|
+
for (var k = startIdx; k < lines.length; k++) {
|
|
3781
|
+
var cand = lines[k];
|
|
3782
|
+
if (!usedOrderedLines.has(cand))
|
|
3783
|
+
return cand;
|
|
3784
|
+
}
|
|
3785
|
+
for (var k = 0; k < startIdx; k++) {
|
|
3786
|
+
var cand = lines[k];
|
|
3787
|
+
if (!usedOrderedLines.has(cand))
|
|
3788
|
+
return cand;
|
|
3789
|
+
}
|
|
3790
|
+
return -1;
|
|
3791
|
+
};
|
|
3792
|
+
if (currentGroupIdx !== -1) {
|
|
3793
|
+
assigned = pickNextFromGroup(currentGroupIdx);
|
|
3794
|
+
}
|
|
3795
|
+
if (assigned === -1) {
|
|
3796
|
+
// 猜测组:选择拥有可用行的首个组
|
|
3797
|
+
for (var gi = 0; gi < orderedGroups.length && assigned === -1; gi++) {
|
|
3798
|
+
var cand = pickNextFromGroup(gi);
|
|
3799
|
+
if (cand !== -1) {
|
|
3800
|
+
currentGroupIdx = gi;
|
|
3801
|
+
assigned = cand;
|
|
3802
|
+
}
|
|
3803
|
+
}
|
|
3804
|
+
}
|
|
3805
|
+
if (assigned !== -1) {
|
|
3806
|
+
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
|
+
});
|
|
3814
|
+
lastAssigned_1 = assigned;
|
|
3815
|
+
}
|
|
3816
|
+
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
|
+
});
|
|
3832
|
+
}
|
|
3833
|
+
}
|
|
3834
|
+
}
|
|
3835
|
+
}
|
|
3836
|
+
catch (_a) {
|
|
3837
|
+
void 0;
|
|
3838
|
+
}
|
|
3839
|
+
});
|
|
3840
|
+
};
|
|
3841
|
+
/**
|
|
3842
|
+
* 节流后的行号更新函数,避免频繁更新 data-linenumber
|
|
3843
|
+
*/
|
|
3844
|
+
var attachLineNumbersToBlocksThrottled = (function () {
|
|
3845
|
+
var last = 0;
|
|
3846
|
+
var timer = 0;
|
|
3847
|
+
var lastArgs = null;
|
|
3848
|
+
var wait = 500;
|
|
3849
|
+
var invoke = function () {
|
|
3850
|
+
timer = 0;
|
|
3851
|
+
last = Date.now();
|
|
3852
|
+
var args = lastArgs;
|
|
3853
|
+
lastArgs = null;
|
|
3854
|
+
if (args) {
|
|
3855
|
+
attachLineNumbersToBlocks(args[0], args[1]);
|
|
3856
|
+
}
|
|
3857
|
+
};
|
|
3858
|
+
return function (root, source) {
|
|
3859
|
+
var now = Date.now();
|
|
3860
|
+
lastArgs = [root, source];
|
|
3861
|
+
if (now - last >= wait) {
|
|
3862
|
+
invoke();
|
|
3863
|
+
}
|
|
3864
|
+
else if (!timer) {
|
|
3865
|
+
timer = window.setTimeout(invoke, wait - (now - last));
|
|
3866
|
+
}
|
|
3867
|
+
};
|
|
3868
|
+
})();
|
|
3869
|
+
|
|
3870
|
+
|
|
3374
3871
|
/***/ }),
|
|
3375
3872
|
|
|
3376
3873
|
/***/ 105:
|
|
@@ -4450,6 +4947,10 @@ var previewRender = function (previewElement, markdown, options) { return __awai
|
|
|
4450
4947
|
var preview_image = __webpack_require__(190);
|
|
4451
4948
|
// EXTERNAL MODULE: ./src/ts/ui/setCodeTheme.ts
|
|
4452
4949
|
var setCodeTheme = __webpack_require__(580);
|
|
4950
|
+
// EXTERNAL MODULE: ./src/ts/markdown/getMarkdown.ts
|
|
4951
|
+
var getMarkdown = __webpack_require__(210);
|
|
4952
|
+
// EXTERNAL MODULE: ./src/ts/util/attachLineNumbers.ts
|
|
4953
|
+
var attachLineNumbers = __webpack_require__(626);
|
|
4453
4954
|
;// CONCATENATED MODULE: ./src/method.ts
|
|
4454
4955
|
|
|
4455
4956
|
|
|
@@ -4469,12 +4970,35 @@ var setCodeTheme = __webpack_require__(580);
|
|
|
4469
4970
|
|
|
4470
4971
|
|
|
4471
4972
|
|
|
4973
|
+
|
|
4974
|
+
|
|
4472
4975
|
|
|
4473
4976
|
|
|
4474
4977
|
|
|
4475
4978
|
var Vditor = /** @class */ (function () {
|
|
4476
4979
|
function Vditor() {
|
|
4477
4980
|
}
|
|
4981
|
+
/**
|
|
4982
|
+
* 外部更新行号:传入实例并根据配置进行同步/节流更新
|
|
4983
|
+
*/
|
|
4984
|
+
Vditor.updateLineNumbers = function (instance, immediate) {
|
|
4985
|
+
var _a, _b;
|
|
4986
|
+
if (immediate === void 0) { immediate = false; }
|
|
4987
|
+
try {
|
|
4988
|
+
var v = (_a = instance === null || instance === void 0 ? void 0 : instance.vditor) !== null && _a !== void 0 ? _a : instance;
|
|
4989
|
+
if (!((_b = v === null || v === void 0 ? void 0 : v.options) === null || _b === void 0 ? void 0 : _b.lineNumber))
|
|
4990
|
+
return;
|
|
4991
|
+
var text = (0,getMarkdown/* getMarkdown */.O)(v);
|
|
4992
|
+
var root = v[v.currentMode].element;
|
|
4993
|
+
if (immediate) {
|
|
4994
|
+
(0,attachLineNumbers/* attachLineNumbersToBlocks */.t)(root, text);
|
|
4995
|
+
}
|
|
4996
|
+
else {
|
|
4997
|
+
(0,attachLineNumbers/* attachLineNumbersToBlocksThrottled */.g)(root, text);
|
|
4998
|
+
}
|
|
4999
|
+
}
|
|
5000
|
+
catch (_c) { }
|
|
5001
|
+
};
|
|
4478
5002
|
/** 点击图片放大 */
|
|
4479
5003
|
Vditor.adapterRender = adapterRender;
|
|
4480
5004
|
/** 点击图片放大 */
|