wikiparser-node 1.0.0-beta.0 → 1.0.0-beta.2
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/config/.schema.json +26 -0
- package/dist/index.d.ts +11 -9
- package/dist/index.js +22 -24
- package/dist/internal.d.ts +44 -0
- package/dist/lib/element.d.ts +42 -32
- package/dist/lib/element.js +59 -56
- package/dist/lib/node.d.ts +29 -36
- package/dist/lib/node.js +33 -48
- package/dist/lib/range.d.ts +132 -0
- package/dist/lib/range.js +387 -0
- package/dist/lib/ranges.d.ts +2 -12
- package/dist/lib/ranges.js +6 -11
- package/dist/lib/text.d.ts +11 -5
- package/dist/lib/text.js +25 -13
- package/dist/lib/title.d.ts +4 -5
- package/dist/lib/title.js +17 -7
- package/dist/mixin/attributesParent.js +6 -3
- package/dist/mixin/fixed.js +8 -5
- package/dist/mixin/hidden.js +7 -3
- package/dist/mixin/singleLine.js +6 -3
- package/dist/mixin/sol.js +6 -3
- package/dist/parser/{brackets.js → braces.js} +34 -26
- package/dist/parser/commentAndExt.js +25 -15
- package/dist/parser/converter.js +16 -9
- package/dist/parser/externalLinks.js +15 -9
- package/dist/parser/hrAndDoubleUnderscore.js +17 -10
- package/dist/parser/html.js +18 -9
- package/dist/parser/links.js +22 -14
- package/dist/parser/list.js +20 -10
- package/dist/parser/magicLinks.js +14 -7
- package/dist/parser/quotes.js +21 -11
- package/dist/parser/selector.js +19 -12
- package/dist/parser/table.js +25 -16
- package/dist/src/arg.d.ts +7 -8
- package/dist/src/arg.js +27 -24
- package/dist/src/atom.d.ts +4 -5
- package/dist/src/atom.js +9 -7
- package/dist/src/attribute.d.ts +13 -13
- package/dist/src/attribute.js +28 -25
- package/dist/src/attributes.d.ts +11 -10
- package/dist/src/attributes.js +40 -45
- package/dist/src/converter.d.ts +5 -7
- package/dist/src/converter.js +22 -16
- package/dist/src/converterFlags.d.ts +11 -12
- package/dist/src/converterFlags.js +17 -14
- package/dist/src/converterRule.d.ts +9 -10
- package/dist/src/converterRule.js +27 -27
- package/dist/src/extLink.d.ts +4 -6
- package/dist/src/extLink.js +25 -22
- package/dist/src/gallery.d.ts +9 -13
- package/dist/src/gallery.js +28 -23
- package/dist/src/heading.d.ts +11 -11
- package/dist/src/heading.js +19 -19
- package/dist/src/hidden.d.ts +4 -5
- package/dist/src/hidden.js +10 -8
- package/dist/src/html.d.ts +15 -12
- package/dist/src/html.js +18 -15
- package/dist/src/imageParameter.d.ts +11 -13
- package/dist/src/imageParameter.js +21 -16
- package/dist/src/imagemap.d.ts +11 -15
- package/dist/src/imagemap.js +26 -21
- package/dist/src/imagemapLink.d.ts +12 -17
- package/dist/src/imagemapLink.js +19 -14
- package/dist/src/index.d.ts +24 -20
- package/dist/src/index.js +65 -75
- package/dist/src/link/base.d.ts +8 -10
- package/dist/src/link/base.js +28 -22
- package/dist/src/link/category.d.ts +2 -3
- package/dist/src/link/category.js +7 -5
- package/dist/src/link/file.d.ts +9 -11
- package/dist/src/link/file.js +53 -26
- package/dist/src/link/galleryImage.d.ts +8 -8
- package/dist/src/link/galleryImage.js +18 -16
- package/dist/src/link/index.d.ts +6 -6
- package/dist/src/link/index.js +14 -16
- package/dist/src/magicLink.d.ts +9 -6
- package/dist/src/magicLink.js +23 -18
- package/dist/src/nested.d.ts +10 -10
- package/dist/src/nested.js +25 -17
- package/dist/src/nowiki/base.d.ts +7 -8
- package/dist/src/nowiki/base.js +10 -8
- package/dist/src/nowiki/comment.d.ts +7 -7
- package/dist/src/nowiki/comment.js +12 -9
- package/dist/src/nowiki/dd.d.ts +2 -3
- package/dist/src/nowiki/dd.js +7 -11
- package/dist/src/nowiki/doubleUnderscore.d.ts +5 -7
- package/dist/src/nowiki/doubleUnderscore.js +11 -8
- package/dist/src/nowiki/hr.d.ts +6 -7
- package/dist/src/nowiki/hr.js +11 -8
- package/dist/src/nowiki/index.d.ts +5 -7
- package/dist/src/nowiki/index.js +8 -6
- package/dist/src/nowiki/list.d.ts +4 -4
- package/dist/src/nowiki/list.js +8 -6
- package/dist/src/nowiki/noinclude.d.ts +3 -3
- package/dist/src/nowiki/noinclude.js +8 -6
- package/dist/src/nowiki/quote.d.ts +6 -7
- package/dist/src/nowiki/quote.js +11 -8
- package/dist/src/onlyinclude.d.ts +3 -5
- package/dist/src/onlyinclude.js +9 -7
- package/dist/src/paramTag/index.d.ts +8 -10
- package/dist/src/paramTag/index.js +15 -13
- package/dist/src/paramTag/inputbox.d.ts +4 -6
- package/dist/src/paramTag/inputbox.js +10 -8
- package/dist/src/parameter.d.ts +11 -12
- package/dist/src/parameter.js +25 -22
- package/dist/src/pre.d.ts +5 -10
- package/dist/src/pre.js +16 -11
- package/dist/src/syntax.d.ts +6 -7
- package/dist/src/syntax.js +12 -10
- package/dist/src/table/base.d.ts +14 -9
- package/dist/src/table/base.js +18 -15
- package/dist/src/table/index.d.ts +24 -17
- package/dist/src/table/index.js +39 -67
- package/dist/src/table/td.d.ts +17 -21
- package/dist/src/table/td.js +20 -28
- package/dist/src/table/tr.d.ts +6 -11
- package/dist/src/table/tr.js +8 -6
- package/dist/src/table/trBase.d.ts +12 -22
- package/dist/src/table/trBase.js +23 -19
- package/dist/src/tagPair/ext.d.ts +10 -10
- package/dist/src/tagPair/ext.js +47 -24
- package/dist/src/tagPair/include.d.ts +6 -7
- package/dist/src/tagPair/include.js +11 -8
- package/dist/src/tagPair/index.d.ts +12 -11
- package/dist/src/tagPair/index.js +13 -11
- package/dist/src/transclude.d.ts +8 -10
- package/dist/src/transclude.js +70 -77
- package/dist/util/debug.js +2 -12
- package/dist/util/diff.js +4 -2
- package/dist/util/lint.js +5 -5
- package/dist/util/string.js +2 -31
- package/package.json +13 -13
- package/dist/util/base.js +0 -26
package/dist/mixin/fixed.js
CHANGED
|
@@ -1,23 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fixed = void 0;
|
|
4
|
+
const index_1 = require("../index");
|
|
3
5
|
/**
|
|
4
6
|
* 不可增删子节点的类
|
|
5
7
|
* @param constructor 基类
|
|
6
8
|
*/
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
7
10
|
const fixed = (constructor) => {
|
|
8
11
|
/** 不可增删子节点的类 */
|
|
9
12
|
class FixedToken extends constructor {
|
|
10
13
|
static fixed = true;
|
|
11
14
|
/**
|
|
12
15
|
* @override
|
|
13
|
-
* @throws `Error`
|
|
16
|
+
* @throws `Error` 不可用
|
|
14
17
|
*/
|
|
15
18
|
removeAt() {
|
|
16
19
|
throw new Error(`${this.constructor.name} 不可删除元素!`);
|
|
17
20
|
}
|
|
18
21
|
/** @ignore */
|
|
19
22
|
insertAt(token, i = this.length) {
|
|
20
|
-
if (
|
|
23
|
+
if (index_1.default.running) {
|
|
21
24
|
return super.insertAt(token, i);
|
|
22
25
|
}
|
|
23
26
|
throw new Error(`${this.constructor.name} 不可插入元素!`);
|
|
@@ -25,5 +28,5 @@ const fixed = (constructor) => {
|
|
|
25
28
|
}
|
|
26
29
|
return FixedToken;
|
|
27
30
|
};
|
|
28
|
-
|
|
29
|
-
|
|
31
|
+
exports.fixed = fixed;
|
|
32
|
+
index_1.default.mixins['fixed'] = __filename;
|
package/dist/mixin/hidden.js
CHANGED
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hidden = void 0;
|
|
4
|
+
const index_1 = require("../index");
|
|
3
5
|
/**
|
|
4
6
|
* 解析后不可见的类
|
|
5
7
|
* @param constructor 基类
|
|
6
8
|
*/
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
7
10
|
const hidden = (constructor) => {
|
|
8
11
|
/** 解析后不可见的类 */
|
|
9
12
|
class AnyHiddenToken extends constructor {
|
|
10
13
|
static hidden = true;
|
|
11
14
|
/** 没有可见部分 */
|
|
15
|
+
// eslint-disable-next-line class-methods-use-this
|
|
12
16
|
text() {
|
|
13
17
|
return '';
|
|
14
18
|
}
|
|
15
19
|
}
|
|
16
20
|
return AnyHiddenToken;
|
|
17
21
|
};
|
|
18
|
-
|
|
19
|
-
|
|
22
|
+
exports.hidden = hidden;
|
|
23
|
+
index_1.default.mixins['hidden'] = __filename;
|
package/dist/mixin/singleLine.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.singleLine = void 0;
|
|
4
|
+
const index_1 = require("../index");
|
|
3
5
|
/**
|
|
4
6
|
* 不可包含换行符的类
|
|
5
7
|
* @param constructor 基类
|
|
6
8
|
*/
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
7
10
|
const singleLine = (constructor) => {
|
|
8
11
|
/** 不可包含换行符的类 */
|
|
9
12
|
class SingleLineToken extends constructor {
|
|
@@ -19,5 +22,5 @@ const singleLine = (constructor) => {
|
|
|
19
22
|
Object.defineProperty(SingleLineToken, 'name', { value: `SingleLine${constructor.name}` });
|
|
20
23
|
return SingleLineToken;
|
|
21
24
|
};
|
|
22
|
-
|
|
23
|
-
|
|
25
|
+
exports.singleLine = singleLine;
|
|
26
|
+
index_1.default.mixins['singleLine'] = __filename;
|
package/dist/mixin/sol.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sol = void 0;
|
|
4
|
+
const index_1 = require("../index");
|
|
3
5
|
/**
|
|
4
6
|
* 只能位于行首的类
|
|
5
7
|
* @param constructor 基类
|
|
6
8
|
*/
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
7
10
|
const sol = (constructor) => {
|
|
8
11
|
/** 只能位于行首的类 */
|
|
9
12
|
class SolToken extends constructor {
|
|
@@ -37,5 +40,5 @@ const sol = (constructor) => {
|
|
|
37
40
|
}
|
|
38
41
|
return SolToken;
|
|
39
42
|
};
|
|
40
|
-
|
|
41
|
-
|
|
43
|
+
exports.sol = sol;
|
|
44
|
+
index_1.default.mixins['sol'] = __filename;
|
|
@@ -1,42 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseBraces = void 0;
|
|
2
4
|
const string_1 = require("../util/string");
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
5
|
+
const index_1 = require("../index");
|
|
6
|
+
const heading_1 = require("../src/heading");
|
|
7
|
+
const transclude_1 = require("../src/transclude");
|
|
8
|
+
const arg_1 = require("../src/arg");
|
|
7
9
|
/**
|
|
8
10
|
* 解析花括号
|
|
11
|
+
* @param wikitext
|
|
12
|
+
* @param config
|
|
13
|
+
* @param accum
|
|
9
14
|
* @throws TranscludeToken.constructor()
|
|
10
15
|
*/
|
|
11
|
-
const
|
|
12
|
-
const source = `${config.excludes?.includes('heading') ? '' : '^(\0\\d+c\x7F)*={1,6}|'}\\[\\[|\\{{2,}|-\\{(?!\\{)`, { parserFunction: [, , , subst] } = config, stack = [], closes = { '=': '\n', '{': '\\}{2,}|\\|', '-': '\\}-', '[': '\\]\\]' }, marks =
|
|
13
|
-
let
|
|
14
|
-
while (mt ||
|
|
16
|
+
const parseBraces = (wikitext, config = index_1.default.getConfig(), accum = []) => {
|
|
17
|
+
const source = `${config.excludes?.includes('heading') ? '' : '^(\0\\d+c\x7F)*={1,6}|'}\\[\\[|\\{{2,}|-\\{(?!\\{)`, { parserFunction: [, , , subst] } = config, stack = [], closes = { '=': '\n', '{': '\\}{2,}|\\|', '-': '\\}-', '[': '\\]\\]' }, marks = new Map([['!', '!'], ['!!', '+'], ['(!', '{'], ['!)', '}'], ['!-', '-'], ['=', '~']]);
|
|
18
|
+
let regex = new RegExp(source, 'gmu'), mt = regex.exec(wikitext), moreBraces = wikitext.includes('}}'), lastIndex;
|
|
19
|
+
while (mt || lastIndex !== undefined && lastIndex <= wikitext.length && stack.at(-1)?.[0]?.startsWith('=')) {
|
|
15
20
|
if (mt?.[1]) {
|
|
16
21
|
const [, { length }] = mt;
|
|
17
22
|
mt[0] = mt[0].slice(length);
|
|
18
23
|
mt.index += length;
|
|
19
24
|
}
|
|
20
|
-
const { 0: syntax, index: curIndex } = mt ?? { 0: '\n', index:
|
|
25
|
+
const { 0: syntax, index: curIndex } = mt ?? { 0: '\n', index: wikitext.length }, top = stack.pop() ?? {}, { 0: open, index, parts, findEqual: topFindEqual, pos: topPos } = top, innerEqual = syntax === '=' && topFindEqual;
|
|
21
26
|
if (syntax === ']]' || syntax === '}-') { // 情形1:闭合内链或转换
|
|
22
27
|
lastIndex = curIndex + 2;
|
|
23
28
|
}
|
|
24
29
|
else if (syntax === '\n') { // 情形2:闭合标题或文末
|
|
25
30
|
lastIndex = curIndex + 1;
|
|
26
31
|
const { pos, findEqual } = stack.at(-1) ?? {};
|
|
27
|
-
if (pos === undefined || findEqual || (0, string_1.removeComment)(
|
|
32
|
+
if (pos === undefined || findEqual || (0, string_1.removeComment)(wikitext.slice(pos, index)) !== '') {
|
|
28
33
|
const rmt = /^(={1,6})(.+)\1((?:\s|\0\d+c\x7F)*)$/u
|
|
29
|
-
.exec(
|
|
34
|
+
.exec(wikitext.slice(index, curIndex));
|
|
30
35
|
if (rmt) {
|
|
31
|
-
|
|
36
|
+
wikitext = `${wikitext.slice(0, index)}\0${accum.length}h\x7F${wikitext.slice(curIndex)}`;
|
|
32
37
|
lastIndex = index + 4 + String(accum.length).length;
|
|
33
|
-
|
|
38
|
+
// @ts-expect-error abstract class
|
|
39
|
+
new heading_1.HeadingToken(rmt[1].length, rmt.slice(2), config, accum);
|
|
34
40
|
}
|
|
35
41
|
}
|
|
36
42
|
}
|
|
37
43
|
else if (syntax === '|' || innerEqual) { // 情形3:模板内部,含行首单个'='
|
|
38
44
|
lastIndex = curIndex + 1;
|
|
39
|
-
parts.at(-1).push(
|
|
45
|
+
parts.at(-1).push(wikitext.slice(topPos, curIndex));
|
|
40
46
|
if (syntax === '|') {
|
|
41
47
|
parts.push([]);
|
|
42
48
|
}
|
|
@@ -47,21 +53,23 @@ const parseBrackets = (wikitext, config = Parser.getConfig(), accum = []) => {
|
|
|
47
53
|
else if (syntax.startsWith('}}')) { // 情形4:闭合模板
|
|
48
54
|
const close = syntax.slice(0, Math.min(open.length, 3)), rest = open.length - close.length, { length } = accum;
|
|
49
55
|
lastIndex = curIndex + close.length; // 这不是最终的lastIndex
|
|
50
|
-
parts.at(-1).push(
|
|
56
|
+
parts.at(-1).push(wikitext.slice(topPos, curIndex));
|
|
51
57
|
let skip = false, ch = 't';
|
|
52
58
|
if (close.length === 3) {
|
|
53
59
|
const argParts = parts.map(part => part.join('=')), str = argParts.length > 1 && (0, string_1.removeComment)(argParts[1]).trim();
|
|
54
|
-
|
|
60
|
+
// @ts-expect-error abstract class
|
|
61
|
+
new arg_1.ArgToken(argParts, config, accum);
|
|
55
62
|
if (str && str.endsWith(':') && subst.includes(str.slice(0, -1).toLowerCase())) {
|
|
56
63
|
ch = 's';
|
|
57
64
|
}
|
|
58
65
|
}
|
|
59
66
|
else {
|
|
60
67
|
try {
|
|
61
|
-
|
|
68
|
+
// @ts-expect-error absstract class
|
|
69
|
+
new transclude_1.TranscludeToken(parts[0][0], parts.slice(1), config, accum);
|
|
62
70
|
const name = (0, string_1.removeComment)(parts[0][0]).trim();
|
|
63
|
-
if (
|
|
64
|
-
ch = marks
|
|
71
|
+
if (marks.has(name)) {
|
|
72
|
+
ch = marks.get(name); // 标记{{!}}等
|
|
65
73
|
}
|
|
66
74
|
else if (/^(?:filepath|(?:full|canonical)urle?):.|^server$/iu.test(name)) {
|
|
67
75
|
ch = 'm';
|
|
@@ -81,12 +89,12 @@ const parseBrackets = (wikitext, config = Parser.getConfig(), accum = []) => {
|
|
|
81
89
|
}
|
|
82
90
|
}
|
|
83
91
|
if (!skip) {
|
|
84
|
-
|
|
92
|
+
wikitext = `${wikitext.slice(0, index + rest)}\0${length}${ch}\x7F${wikitext.slice(lastIndex)}`;
|
|
85
93
|
lastIndex = index + rest + 3 + String(length).length;
|
|
86
94
|
if (rest > 1) {
|
|
87
95
|
stack.push({ 0: open.slice(0, rest), index: index, pos: index + rest, parts: [[]] });
|
|
88
96
|
}
|
|
89
|
-
else if (rest === 1 &&
|
|
97
|
+
else if (rest === 1 && wikitext[index - 1] === '-') {
|
|
90
98
|
stack.push({ 0: '-{', index: index - 1, pos: index + 1, parts: [[]] });
|
|
91
99
|
}
|
|
92
100
|
}
|
|
@@ -99,7 +107,7 @@ const parseBrackets = (wikitext, config = Parser.getConfig(), accum = []) => {
|
|
|
99
107
|
}
|
|
100
108
|
stack.push(...'0' in top ? [top] : [], mt);
|
|
101
109
|
}
|
|
102
|
-
moreBraces &&=
|
|
110
|
+
moreBraces &&= wikitext.slice(lastIndex).includes('}}');
|
|
103
111
|
let curTop = stack.at(-1);
|
|
104
112
|
if (!moreBraces && curTop?.[0]?.startsWith('{')) {
|
|
105
113
|
stack.pop();
|
|
@@ -109,9 +117,9 @@ const parseBrackets = (wikitext, config = Parser.getConfig(), accum = []) => {
|
|
|
109
117
|
? `|${closes[curTop[0][0]]}${curTop.findEqual ? '|=' : ''}`
|
|
110
118
|
: ''), 'gmu');
|
|
111
119
|
regex.lastIndex = lastIndex;
|
|
112
|
-
mt = regex.exec(
|
|
120
|
+
mt = regex.exec(wikitext);
|
|
113
121
|
}
|
|
114
|
-
return
|
|
122
|
+
return wikitext;
|
|
115
123
|
};
|
|
116
|
-
|
|
117
|
-
|
|
124
|
+
exports.parseBraces = parseBraces;
|
|
125
|
+
index_1.default.parsers['parseBraces'] = __filename;
|
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseCommentAndExt = void 0;
|
|
4
|
+
const index_1 = require("../index");
|
|
5
|
+
const onlyinclude_1 = require("../src/onlyinclude");
|
|
6
|
+
const noinclude_1 = require("../src/nowiki/noinclude");
|
|
7
|
+
const include_1 = require("../src/tagPair/include");
|
|
8
|
+
const ext_1 = require("../src/tagPair/ext");
|
|
9
|
+
const comment_1 = require("../src/nowiki/comment");
|
|
8
10
|
/**
|
|
9
11
|
* 解析HTML注释和扩展标签
|
|
12
|
+
* @param wikitext
|
|
13
|
+
* @param config
|
|
14
|
+
* @param accum
|
|
10
15
|
* @param includeOnly 是否嵌入
|
|
11
16
|
*/
|
|
12
|
-
const parseCommentAndExt = (wikitext, config =
|
|
17
|
+
const parseCommentAndExt = (wikitext, config = index_1.default.getConfig(), accum = [], includeOnly = false) => {
|
|
13
18
|
const onlyinclude = /<onlyinclude>(.*?)<\/onlyinclude>/gsu;
|
|
14
19
|
if (includeOnly && wikitext.search(onlyinclude) !== -1) { // `<onlyinclude>`拥有最高优先级
|
|
15
20
|
return wikitext.replace(onlyinclude, (_, inner) => {
|
|
16
21
|
const str = `\0${accum.length}e\x7F`;
|
|
17
|
-
new OnlyincludeToken(inner, config, accum);
|
|
22
|
+
new onlyinclude_1.OnlyincludeToken(inner, config, accum);
|
|
18
23
|
return str;
|
|
19
24
|
}).replace(/(?<=^|\0\d+e\x7F)[^\0]+(?=$|\0\d+e\x7F)/gu, substr => {
|
|
20
|
-
|
|
25
|
+
// @ts-expect-error abstract class
|
|
26
|
+
new noinclude_1.NoincludeToken(substr, config, accum);
|
|
21
27
|
return `\0${accum.length - 1}c\x7F`;
|
|
22
28
|
});
|
|
23
29
|
}
|
|
@@ -29,20 +35,24 @@ const parseCommentAndExt = (wikitext, config = Parser.getConfig(), accum = [], i
|
|
|
29
35
|
return wikitext.replace(regex, (substr, name, attr, inner, closing, include, includeAttr, includeInner, includeClosing) => {
|
|
30
36
|
const str = `\0${accum.length}${name ? 'e' : 'c'}\x7F`;
|
|
31
37
|
if (name) {
|
|
32
|
-
|
|
38
|
+
// @ts-expect-error abstract class
|
|
39
|
+
new ext_1.ExtToken(name, attr, inner, closing, config, accum);
|
|
33
40
|
}
|
|
34
41
|
else if (substr.startsWith('<!--')) {
|
|
35
42
|
const closed = substr.endsWith('-->');
|
|
36
|
-
|
|
43
|
+
// @ts-expect-error abstract class
|
|
44
|
+
new comment_1.CommentToken(substr.slice(4, closed ? -3 : undefined), closed, config, accum);
|
|
37
45
|
}
|
|
38
46
|
else if (include) {
|
|
39
|
-
|
|
47
|
+
// @ts-expect-error abstract class
|
|
48
|
+
new include_1.IncludeToken(include, includeAttr, includeInner, includeClosing, config, accum);
|
|
40
49
|
}
|
|
41
50
|
else {
|
|
42
|
-
|
|
51
|
+
// @ts-expect-error abstract class
|
|
52
|
+
new noinclude_1.NoincludeToken(substr, config, accum);
|
|
43
53
|
}
|
|
44
54
|
return str;
|
|
45
55
|
});
|
|
46
56
|
};
|
|
47
|
-
|
|
48
|
-
|
|
57
|
+
exports.parseCommentAndExt = parseCommentAndExt;
|
|
58
|
+
index_1.default.parsers['parseCommentAndExt'] = __filename;
|
package/dist/parser/converter.js
CHANGED
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseConverter = void 0;
|
|
4
|
+
const index_1 = require("../index");
|
|
5
|
+
const converter_1 = require("../src/converter");
|
|
6
|
+
/**
|
|
7
|
+
* 解析语言变体转换
|
|
8
|
+
* @param wikitext
|
|
9
|
+
* @param config
|
|
10
|
+
* @param accum
|
|
11
|
+
*/
|
|
12
|
+
const parseConverter = (wikitext, config = index_1.default.getConfig(), accum = []) => {
|
|
6
13
|
const regex1 = /-\{/gu, regex2 = /-\{|\}-/gu, stack = [];
|
|
7
14
|
let regex = regex1, text = wikitext, mt = regex.exec(text);
|
|
8
15
|
while (mt) {
|
|
9
16
|
const { 0: syntax, index } = mt;
|
|
10
17
|
if (syntax === '}-') {
|
|
11
|
-
const top = stack.pop(), { length } = accum, str = text.slice(top.index + 2, index), i = str.indexOf('|'), [flags, raw] = i === -1 ? [[], str] : [str.slice(0, i).split(';'), str.slice(i + 1)], temp = raw.replace(/(&[#a-z\d]+);/giu, '$1\x01'),
|
|
12
|
-
variants = `(?:${config.variants.join('|')})`, rules = temp.split(new RegExp(`;(?=\\s*(?:${variants}|[^;]*?=>\\s*${variants})\\s*:)`, 'u'))
|
|
18
|
+
const top = stack.pop(), { length } = accum, str = text.slice(top.index + 2, index), i = str.indexOf('|'), [flags, raw] = i === -1 ? [[], str] : [str.slice(0, i).split(';'), str.slice(i + 1)], temp = raw.replace(/(&[#a-z\d]+);/giu, '$1\x01'), variants = `(?:${config.variants.join('|')})`, rules = temp.split(new RegExp(`;(?=\\s*(?:${variants}|[^;]*?=>\\s*${variants})\\s*:)`, 'u'))
|
|
13
19
|
.map(rule => rule.replaceAll('\x01', ';'));
|
|
14
|
-
|
|
20
|
+
// @ts-expect-error abstract class
|
|
21
|
+
new converter_1.ConverterToken(flags, rules, config, accum);
|
|
15
22
|
text = `${text.slice(0, top.index)}\0${length}v\x7F${text.slice(index + 2)}`;
|
|
16
23
|
if (stack.length === 0) {
|
|
17
24
|
regex = regex1;
|
|
@@ -27,5 +34,5 @@ const parseConverter = (wikitext, config = Parser.getConfig(), accum = []) => {
|
|
|
27
34
|
}
|
|
28
35
|
return text;
|
|
29
36
|
};
|
|
30
|
-
|
|
31
|
-
|
|
37
|
+
exports.parseConverter = parseConverter;
|
|
38
|
+
index_1.default.parsers['parseConverter'] = __filename;
|
|
@@ -1,22 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseExternalLinks = void 0;
|
|
2
4
|
const string_1 = require("../util/string");
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
/**
|
|
6
|
-
|
|
5
|
+
const index_1 = require("../index");
|
|
6
|
+
const extLink_1 = require("../src/extLink");
|
|
7
|
+
/**
|
|
8
|
+
* 解析外部链接
|
|
9
|
+
* @param wikitext
|
|
10
|
+
* @param config
|
|
11
|
+
* @param accum
|
|
12
|
+
*/
|
|
13
|
+
const parseExternalLinks = (wikitext, config = index_1.default.getConfig(), accum = []) => {
|
|
7
14
|
const regex = new RegExp(`\\[((?:(?:${config.protocol}|//)${string_1.extUrlCharFirst}|\0\\d+m\x7F)${string_1.extUrlChar})(\\p{Zs}*)([^\\]\x01-\x08\x0A-\x1F\uFFFD]*)\\]`, 'giu');
|
|
8
15
|
return wikitext.replace(regex, (_, url, space, text) => {
|
|
9
16
|
const { length } = accum, mt = /&[lg]t;/u.exec(url);
|
|
10
17
|
if (mt) {
|
|
11
|
-
/* eslint-disable no-param-reassign */
|
|
12
18
|
url = url.slice(0, mt.index);
|
|
13
19
|
space = '';
|
|
14
20
|
text = `${url.slice(mt.index)}${space}${text}`;
|
|
15
|
-
/* eslint-enable no-param-reassign */
|
|
16
21
|
}
|
|
17
|
-
|
|
22
|
+
// @ts-expect-error abstract class
|
|
23
|
+
new extLink_1.ExtLinkToken(url, space, text, config, accum);
|
|
18
24
|
return `\0${length}w\x7F`;
|
|
19
25
|
});
|
|
20
26
|
};
|
|
21
|
-
|
|
22
|
-
|
|
27
|
+
exports.parseExternalLinks = parseExternalLinks;
|
|
28
|
+
index_1.default.parsers['parseExternalLinks'] = __filename;
|
|
@@ -1,33 +1,40 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseHrAndDoubleUnderscore = void 0;
|
|
4
|
+
const index_1 = require("../index");
|
|
5
|
+
const hr_1 = require("../src/nowiki/hr");
|
|
6
|
+
const doubleUnderscore_1 = require("../src/nowiki/doubleUnderscore");
|
|
7
|
+
const heading_1 = require("../src/heading");
|
|
6
8
|
/**
|
|
7
9
|
* 解析`<hr>`和状态开关
|
|
8
10
|
* @param {Token} root 根节点
|
|
11
|
+
* @param config
|
|
12
|
+
* @param accum
|
|
9
13
|
*/
|
|
10
|
-
const parseHrAndDoubleUnderscore = ({ firstChild, type, name }, config =
|
|
14
|
+
const parseHrAndDoubleUnderscore = ({ firstChild, type, name }, config = index_1.default.getConfig(), accum = []) => {
|
|
11
15
|
const { doubleUnderscore } = config, insensitive = new Set(doubleUnderscore[0]), sensitive = new Set(doubleUnderscore[1]);
|
|
12
16
|
let { data } = firstChild;
|
|
13
17
|
if (type !== 'root' && (type !== 'ext-inner' || name !== 'poem')) {
|
|
14
18
|
data = `\0${data}`;
|
|
15
19
|
}
|
|
16
20
|
data = data.replace(/^((?:\0\d+c\x7F)*)(-{4,})/gmu, (_, lead, m) => {
|
|
17
|
-
|
|
21
|
+
// @ts-expect-error abstract class
|
|
22
|
+
new hr_1.HrToken(m.length, config, accum);
|
|
18
23
|
return `${lead}\0${accum.length - 1}r\x7F`;
|
|
19
24
|
}).replace(new RegExp(`__(${doubleUnderscore.flat().join('|')})__`, 'giu'), (m, p1) => {
|
|
20
25
|
if (insensitive.has(p1.toLowerCase()) || sensitive.has(p1)) {
|
|
21
|
-
|
|
26
|
+
// @ts-expect-error abstract class
|
|
27
|
+
new doubleUnderscore_1.DoubleUnderscoreToken(p1, config, accum);
|
|
22
28
|
return `\0${accum.length - 1}u\x7F`;
|
|
23
29
|
}
|
|
24
30
|
return m;
|
|
25
31
|
}).replace(/^((?:\0\d+c\x7F)*)(={1,6})(.+)\2((?:[^\S\n]|\0\d+c\x7F)*)$/gmu, (_, lead, equals, heading, trail) => {
|
|
26
32
|
const text = `${lead}\0${accum.length}h\x7F`;
|
|
27
|
-
|
|
33
|
+
// @ts-expect-error abstract class
|
|
34
|
+
new heading_1.HeadingToken(equals.length, [heading, trail], config, accum);
|
|
28
35
|
return text;
|
|
29
36
|
});
|
|
30
37
|
return type === 'root' || type === 'ext-inner' && name === 'poem' ? data : data.slice(1);
|
|
31
38
|
};
|
|
32
|
-
|
|
33
|
-
|
|
39
|
+
exports.parseHrAndDoubleUnderscore = parseHrAndDoubleUnderscore;
|
|
40
|
+
index_1.default.parsers['parseHrAndDoubleUnderscore'] = __filename;
|
package/dist/parser/html.js
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
const
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseHtml = void 0;
|
|
4
|
+
const index_1 = require("../index");
|
|
5
|
+
const attributes_1 = require("../src/attributes");
|
|
6
|
+
const html_1 = require("../src/html");
|
|
7
|
+
/**
|
|
8
|
+
* 解析HTML标签
|
|
9
|
+
* @param wikitext
|
|
10
|
+
* @param config
|
|
11
|
+
* @param accum
|
|
12
|
+
*/
|
|
13
|
+
const parseHtml = (wikitext, config = index_1.default.getConfig(), accum = []) => {
|
|
7
14
|
const regex = /^(\/?)([a-z][^\s/>]*)((?:\s|\/(?!>))[^>]*?)?(\/?>)([^<]*)$/iu, elements = new Set(config.html.flat()), bits = wikitext.split('<');
|
|
8
15
|
let text = bits.shift();
|
|
9
16
|
for (const x of bits) {
|
|
@@ -13,7 +20,8 @@ const parseHtml = (wikitext, config = Parser.getConfig(), accum = []) => {
|
|
|
13
20
|
continue;
|
|
14
21
|
}
|
|
15
22
|
const [, slash, , params = '', brace, rest] = mt,
|
|
16
|
-
|
|
23
|
+
// @ts-expect-error abstract class
|
|
24
|
+
attr = new attributes_1.AttributesToken(params, 'html-attrs', name, config, accum), itemprop = attr.getAttr('itemprop');
|
|
17
25
|
if (name === 'meta' && (itemprop === undefined || attr.getAttr('content') === undefined)
|
|
18
26
|
|| name === 'link' && (itemprop === undefined || attr.getAttr('href') === undefined)) {
|
|
19
27
|
text += `<${x}`;
|
|
@@ -21,9 +29,10 @@ const parseHtml = (wikitext, config = Parser.getConfig(), accum = []) => {
|
|
|
21
29
|
continue;
|
|
22
30
|
}
|
|
23
31
|
text += `\0${accum.length}x\x7F${rest}`;
|
|
24
|
-
|
|
32
|
+
// @ts-expect-error abstract class
|
|
33
|
+
new html_1.HtmlToken(t, attr, slash === '/', brace === '/>', config, accum);
|
|
25
34
|
}
|
|
26
35
|
return text;
|
|
27
36
|
};
|
|
28
|
-
|
|
29
|
-
|
|
37
|
+
exports.parseHtml = parseHtml;
|
|
38
|
+
index_1.default.parsers['parseHtml'] = __filename;
|
package/dist/parser/links.js
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseLinks = void 0;
|
|
4
|
+
const index_1 = require("../index");
|
|
5
|
+
const link_1 = require("../src/link");
|
|
6
|
+
const file_1 = require("../src/link/file");
|
|
7
|
+
const category_1 = require("../src/link/category");
|
|
8
|
+
/**
|
|
9
|
+
* 解析内部链接
|
|
10
|
+
* @param wikitext
|
|
11
|
+
* @param config
|
|
12
|
+
* @param accum
|
|
13
|
+
*/
|
|
14
|
+
const parseLinks = (wikitext, config = index_1.default.getConfig(), accum = []) => {
|
|
15
|
+
const { parseQuotes } = require('./quotes.js');
|
|
9
16
|
const regex = /^((?:(?!\0\d+!\x7F)[^\n<>[\]{}|])+)(?:(\||\0\d+!\x7F)(.*?[^\]]))?\]\](.*)$/su, regexImg = /^((?:(?!\0\d+!\x7F)[^\n<>[\]{}|])+)(\||\0\d+!\x7F)(.*)$/su, regexExt = new RegExp(`^\\s*(?:${config.protocol})`, 'iu'), bits = wikitext.split('[[');
|
|
10
17
|
let s = bits.shift();
|
|
11
18
|
for (let i = 0; i < bits.length; i++) {
|
|
@@ -34,7 +41,7 @@ const parseLinks = (wikitext, config = Parser.getConfig(), accum = []) => {
|
|
|
34
41
|
s += `[[${x}`;
|
|
35
42
|
continue;
|
|
36
43
|
}
|
|
37
|
-
const title =
|
|
44
|
+
const title = index_1.default.normalizeTitle(link, 0, false, config, true, true, true), { ns, interwiki, valid } = title;
|
|
38
45
|
if (!valid) {
|
|
39
46
|
s += `[[${x}`;
|
|
40
47
|
continue;
|
|
@@ -61,7 +68,7 @@ const parseLinks = (wikitext, config = Parser.getConfig(), accum = []) => {
|
|
|
61
68
|
break;
|
|
62
69
|
}
|
|
63
70
|
}
|
|
64
|
-
text = parseLinks(text, config, accum);
|
|
71
|
+
text = (0, exports.parseLinks)(text, config, accum);
|
|
65
72
|
if (!found) {
|
|
66
73
|
s += `[[${link}${delimiter}${text}`;
|
|
67
74
|
continue;
|
|
@@ -69,18 +76,19 @@ const parseLinks = (wikitext, config = Parser.getConfig(), accum = []) => {
|
|
|
69
76
|
}
|
|
70
77
|
text &&= parseQuotes(text, config, accum);
|
|
71
78
|
s += `\0${accum.length}l\x7F${after}`;
|
|
72
|
-
let SomeLinkToken = LinkToken;
|
|
79
|
+
let SomeLinkToken = link_1.LinkToken;
|
|
73
80
|
if (!force) {
|
|
74
81
|
if (!interwiki && ns === 6) {
|
|
75
|
-
SomeLinkToken = FileToken;
|
|
82
|
+
SomeLinkToken = file_1.FileToken;
|
|
76
83
|
}
|
|
77
84
|
else if (!interwiki && ns === 14) {
|
|
78
|
-
SomeLinkToken = CategoryToken;
|
|
85
|
+
SomeLinkToken = category_1.CategoryToken;
|
|
79
86
|
}
|
|
80
87
|
}
|
|
88
|
+
// @ts-expect-error abstract class
|
|
81
89
|
new SomeLinkToken(link, text, config, accum, delimiter);
|
|
82
90
|
}
|
|
83
91
|
return s;
|
|
84
92
|
};
|
|
85
|
-
|
|
86
|
-
|
|
93
|
+
exports.parseLinks = parseLinks;
|
|
94
|
+
index_1.default.parsers['parseLinks'] = __filename;
|
package/dist/parser/list.js
CHANGED
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
const
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseList = void 0;
|
|
4
|
+
const index_1 = require("../index");
|
|
5
|
+
const list_1 = require("../src/nowiki/list");
|
|
6
|
+
const dd_1 = require("../src/nowiki/dd");
|
|
7
|
+
/**
|
|
8
|
+
* 解析列表
|
|
9
|
+
* @param wikitext
|
|
10
|
+
* @param config
|
|
11
|
+
* @param accum
|
|
12
|
+
*/
|
|
13
|
+
const parseList = (wikitext, config = index_1.default.getConfig(), accum = []) => {
|
|
7
14
|
const mt = /^((?:\0\d+c\x7F)*)([;:*#]+)/u.exec(wikitext);
|
|
8
15
|
if (!mt) {
|
|
9
16
|
return wikitext;
|
|
10
17
|
}
|
|
11
18
|
const [total, comment, prefix] = mt;
|
|
12
19
|
let text = `${comment}\0${accum.length}d\x7F${wikitext.slice(total.length)}`, dt = prefix.split(';').length - 1;
|
|
13
|
-
|
|
20
|
+
// @ts-expect-error abstract class
|
|
21
|
+
new list_1.ListToken(prefix, config, accum);
|
|
14
22
|
if (!dt) {
|
|
15
23
|
return text;
|
|
16
24
|
}
|
|
@@ -19,13 +27,15 @@ const parseList = (wikitext, config = Parser.getConfig(), accum = []) => {
|
|
|
19
27
|
const { 0: syntax, index } = ex;
|
|
20
28
|
if (syntax.startsWith(':')) {
|
|
21
29
|
if (syntax.length >= dt) {
|
|
22
|
-
|
|
30
|
+
// @ts-expect-error abstract class
|
|
31
|
+
new dd_1.DdToken(':'.repeat(dt), config, accum);
|
|
23
32
|
return `${text.slice(0, index)}\0${accum.length - 1}d\x7F${text.slice(index + dt)}`;
|
|
24
33
|
}
|
|
25
34
|
text = `${text.slice(0, index)}\0${accum.length}d\x7F${text.slice(regex.lastIndex)}`;
|
|
26
35
|
dt -= syntax.length;
|
|
27
36
|
regex.lastIndex = index + 4 + String(accum.length).length;
|
|
28
|
-
|
|
37
|
+
// @ts-expect-error abstract class
|
|
38
|
+
new dd_1.DdToken(syntax, config, accum);
|
|
29
39
|
}
|
|
30
40
|
else if (syntax === '-{') {
|
|
31
41
|
if (!lc) {
|
|
@@ -47,5 +57,5 @@ const parseList = (wikitext, config = Parser.getConfig(), accum = []) => {
|
|
|
47
57
|
}
|
|
48
58
|
return text;
|
|
49
59
|
};
|
|
50
|
-
|
|
51
|
-
|
|
60
|
+
exports.parseList = parseList;
|
|
61
|
+
index_1.default.parsers['parseList'] = __filename;
|