wikiparser-node 1.0.0-beta.2 → 1.0.0-beta.4
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/minimum.json +136 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -4
- package/dist/internal.d.ts +1 -1
- package/dist/lib/element.d.ts +12 -8
- package/dist/lib/element.js +72 -57
- package/dist/lib/node.js +4 -5
- package/dist/lib/range.js +5 -8
- package/dist/lib/ranges.js +2 -2
- package/dist/lib/text.d.ts +2 -2
- package/dist/lib/text.js +5 -5
- package/dist/lib/title.d.ts +3 -2
- package/dist/lib/title.js +11 -10
- package/dist/mixin/attributesParent.js +2 -2
- package/dist/mixin/fixed.js +3 -3
- package/dist/mixin/hidden.js +2 -2
- package/dist/mixin/singleLine.js +4 -4
- package/dist/mixin/sol.js +6 -6
- package/dist/parser/braces.js +4 -9
- package/dist/parser/commentAndExt.js +24 -18
- package/dist/parser/converter.js +8 -7
- package/dist/parser/externalLinks.js +3 -4
- package/dist/parser/hrAndDoubleUnderscore.js +4 -7
- package/dist/parser/html.js +4 -7
- package/dist/parser/links.js +4 -5
- package/dist/parser/list.js +3 -6
- package/dist/parser/magicLinks.js +3 -3
- package/dist/parser/quotes.js +4 -5
- package/dist/parser/selector.js +4 -7
- package/dist/parser/table.js +6 -15
- package/dist/src/arg.d.ts +6 -5
- package/dist/src/arg.js +31 -27
- package/dist/src/atom.d.ts +2 -1
- package/dist/src/atom.js +4 -4
- package/dist/src/attribute.d.ts +14 -13
- package/dist/src/attribute.js +41 -31
- package/dist/src/attributes.d.ts +4 -3
- package/dist/src/attributes.js +15 -21
- package/dist/src/converter.d.ts +4 -3
- package/dist/src/converter.js +10 -17
- package/dist/src/converterFlags.d.ts +9 -8
- package/dist/src/converterFlags.js +14 -15
- package/dist/src/converterRule.d.ts +4 -3
- package/dist/src/converterRule.js +20 -22
- package/dist/src/extLink.d.ts +5 -4
- package/dist/src/extLink.js +16 -17
- package/dist/src/gallery.d.ts +7 -5
- package/dist/src/gallery.js +15 -19
- package/dist/src/heading.d.ts +12 -10
- package/dist/src/heading.js +17 -18
- package/dist/src/hidden.d.ts +4 -3
- package/dist/src/hidden.js +4 -4
- package/dist/src/html.d.ts +17 -15
- package/dist/src/html.js +25 -23
- package/dist/src/imageParameter.d.ts +5 -4
- package/dist/src/imageParameter.js +22 -23
- package/dist/src/imagemap.d.ts +7 -5
- package/dist/src/imagemap.js +14 -19
- package/dist/src/imagemapLink.d.ts +8 -7
- package/dist/src/imagemapLink.js +4 -8
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.js +48 -46
- package/dist/src/link/base.d.ts +5 -4
- package/dist/src/link/base.js +26 -28
- package/dist/src/link/category.d.ts +1 -1
- package/dist/src/link/category.js +3 -2
- package/dist/src/link/file.d.ts +5 -4
- package/dist/src/link/file.js +22 -20
- package/dist/src/link/galleryImage.d.ts +5 -5
- package/dist/src/link/galleryImage.js +11 -10
- package/dist/src/link/index.d.ts +1 -1
- package/dist/src/link/index.js +8 -6
- package/dist/src/magicLink.d.ts +3 -2
- package/dist/src/magicLink.js +10 -11
- package/dist/src/nested.d.ts +4 -2
- package/dist/src/nested.js +5 -9
- package/dist/src/nowiki/base.d.ts +6 -5
- package/dist/src/nowiki/base.js +4 -4
- package/dist/src/nowiki/comment.d.ts +6 -5
- package/dist/src/nowiki/comment.js +8 -10
- package/dist/src/nowiki/dd.d.ts +1 -1
- package/dist/src/nowiki/dd.js +3 -2
- package/dist/src/nowiki/doubleUnderscore.d.ts +8 -6
- package/dist/src/nowiki/doubleUnderscore.js +13 -13
- package/dist/src/nowiki/hr.d.ts +2 -8
- package/dist/src/nowiki/hr.js +4 -11
- package/dist/src/nowiki/index.d.ts +2 -1
- package/dist/src/nowiki/index.js +6 -5
- package/dist/src/nowiki/list.d.ts +4 -4
- package/dist/src/nowiki/list.js +3 -2
- package/dist/src/nowiki/noinclude.d.ts +2 -2
- package/dist/src/nowiki/noinclude.js +3 -2
- package/dist/src/nowiki/quote.d.ts +1 -8
- package/dist/src/nowiki/quote.js +25 -17
- package/dist/src/onlyinclude.d.ts +5 -4
- package/dist/src/onlyinclude.js +13 -13
- package/dist/src/paramTag/index.d.ts +5 -3
- package/dist/src/paramTag/index.js +7 -7
- package/dist/src/paramTag/inputbox.d.ts +3 -2
- package/dist/src/paramTag/inputbox.js +6 -5
- package/dist/src/parameter.d.ts +11 -10
- package/dist/src/parameter.js +29 -30
- package/dist/src/pre.d.ts +4 -2
- package/dist/src/pre.js +19 -14
- package/dist/src/syntax.d.ts +2 -1
- package/dist/src/syntax.js +7 -7
- package/dist/src/table/base.d.ts +6 -5
- package/dist/src/table/base.js +6 -8
- package/dist/src/table/index.d.ts +9 -8
- package/dist/src/table/index.js +23 -24
- package/dist/src/table/td.d.ts +12 -10
- package/dist/src/table/td.js +19 -20
- package/dist/src/table/tr.d.ts +3 -2
- package/dist/src/table/tr.js +4 -3
- package/dist/src/table/trBase.d.ts +3 -3
- package/dist/src/table/trBase.js +10 -10
- package/dist/src/tagPair/ext.d.ts +7 -6
- package/dist/src/tagPair/ext.js +5 -17
- package/dist/src/tagPair/include.d.ts +5 -5
- package/dist/src/tagPair/include.js +4 -5
- package/dist/src/tagPair/index.d.ts +7 -7
- package/dist/src/tagPair/index.js +13 -19
- package/dist/src/transclude.d.ts +10 -9
- package/dist/src/transclude.js +41 -46
- package/dist/util/lint.js +14 -4
- package/dist/util/string.js +21 -20
- package/package.json +11 -9
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.IncludeToken = void 0;
|
|
4
4
|
const hidden_1 = require("../../mixin/hidden");
|
|
5
|
-
const
|
|
5
|
+
const Parser = require("../../index");
|
|
6
6
|
const _1 = require(".");
|
|
7
7
|
/**
|
|
8
8
|
* `<includeonly>`或`<noinclude>`或`<onlyinclude>`
|
|
@@ -18,14 +18,13 @@ class IncludeToken extends (0, hidden_1.hidden)(_1.TagPairToken) {
|
|
|
18
18
|
* @param inner 内部wikitext
|
|
19
19
|
* @param closed 是否封闭
|
|
20
20
|
*/
|
|
21
|
-
constructor(name, attr = '', inner, closed, config =
|
|
21
|
+
constructor(name, attr = '', inner, closed, config = Parser.getConfig(), accum = []) {
|
|
22
22
|
super(name, attr, inner ?? '', inner === undefined ? closed : closed ?? '', config, accum);
|
|
23
23
|
}
|
|
24
24
|
/** @override */
|
|
25
25
|
cloneNode() {
|
|
26
26
|
const tags = this.getAttribute('tags'), config = this.getAttribute('config'), inner = this.selfClosing ? undefined : this.lastChild.data, closing = this.selfClosing || !this.closed ? undefined : tags[1];
|
|
27
|
-
|
|
28
|
-
return index_1.default.run(() => new IncludeToken(tags[0], this.firstChild.data, inner, closing, config));
|
|
27
|
+
return Parser.run(() => new IncludeToken(tags[0], this.firstChild.data, inner, closing, config));
|
|
29
28
|
}
|
|
30
29
|
/**
|
|
31
30
|
* @override
|
|
@@ -40,4 +39,4 @@ class IncludeToken extends (0, hidden_1.hidden)(_1.TagPairToken) {
|
|
|
40
39
|
}
|
|
41
40
|
}
|
|
42
41
|
exports.IncludeToken = IncludeToken;
|
|
43
|
-
|
|
42
|
+
Parser.classes['IncludeToken'] = __filename;
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
+
import * as Parser from '../../index';
|
|
1
2
|
import { Token } from '..';
|
|
2
3
|
import type { AstNodes } from '../../lib/node';
|
|
3
4
|
declare const TagPairToken_base: ((abstract new (...args: any[]) => {
|
|
4
5
|
removeAt(): never;
|
|
5
|
-
insertAt(token: string, i?: number | undefined):
|
|
6
|
-
insertAt<T extends AstNodes>(token: T, i?: number | undefined): T;
|
|
6
|
+
insertAt(token: string, i?: number | undefined): Parser.AstText;
|
|
7
|
+
insertAt<T extends Parser.AstNodes>(token: T, i?: number | undefined): T;
|
|
7
8
|
length: number;
|
|
8
|
-
toString(
|
|
9
|
-
/** @browser */
|
|
9
|
+
toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
|
|
10
10
|
text(separator?: string | undefined): string;
|
|
11
11
|
}) & {
|
|
12
12
|
readonly fixed: true;
|
|
13
|
-
}) & typeof Token;
|
|
13
|
+
}) & typeof Parser.Token;
|
|
14
14
|
/** 成对标签 */
|
|
15
15
|
export declare abstract class TagPairToken extends TagPairToken_base {
|
|
16
16
|
#private;
|
|
@@ -37,12 +37,12 @@ export declare abstract class TagPairToken extends TagPairToken_base {
|
|
|
37
37
|
* @param inner 内部wikitext
|
|
38
38
|
* @param closed 是否封闭;约定`undefined`表示自封闭,`''`表示未闭合
|
|
39
39
|
*/
|
|
40
|
-
constructor(name: string, attr: string | Token, inner: string | Token, closed?: string, config?:
|
|
40
|
+
constructor(name: string, attr: string | Token, inner: string | Token, closed?: string, config?: Parser.Config, accum?: Token[]);
|
|
41
41
|
/**
|
|
42
42
|
* @override
|
|
43
43
|
* @browser
|
|
44
44
|
*/
|
|
45
|
-
toString(
|
|
45
|
+
toString(omit?: Set<string>): string;
|
|
46
46
|
/**
|
|
47
47
|
* @override
|
|
48
48
|
* @browser
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TagPairToken = void 0;
|
|
4
4
|
const fixed_1 = require("../../mixin/fixed");
|
|
5
|
-
const
|
|
5
|
+
const Parser = require("../../index");
|
|
6
6
|
const __1 = require("..");
|
|
7
7
|
/** 成对标签 */
|
|
8
8
|
class TagPairToken extends (0, fixed_1.fixed)(__1.Token) {
|
|
@@ -28,7 +28,7 @@ class TagPairToken extends (0, fixed_1.fixed)(__1.Token) {
|
|
|
28
28
|
}
|
|
29
29
|
set selfClosing(value) {
|
|
30
30
|
if (value !== this.#selfClosing && this.lastChild.text()) {
|
|
31
|
-
|
|
31
|
+
Parser.warn(`<${this.name}>标签内部的${value ? '文本将被隐藏' : '原有文本将再次可见'}!`);
|
|
32
32
|
}
|
|
33
33
|
this.#selfClosing = value;
|
|
34
34
|
}
|
|
@@ -43,38 +43,32 @@ class TagPairToken extends (0, fixed_1.fixed)(__1.Token) {
|
|
|
43
43
|
* @param inner 内部wikitext
|
|
44
44
|
* @param closed 是否封闭;约定`undefined`表示自封闭,`''`表示未闭合
|
|
45
45
|
*/
|
|
46
|
-
constructor(name, attr, inner, closed, config =
|
|
46
|
+
constructor(name, attr, inner, closed, config = Parser.getConfig(), accum = []) {
|
|
47
47
|
super(undefined, config, true);
|
|
48
48
|
this.setAttribute('name', name.toLowerCase());
|
|
49
49
|
this.#tags = [name, closed || name];
|
|
50
50
|
this.#selfClosing = closed === undefined;
|
|
51
51
|
this.#closed = closed !== '';
|
|
52
52
|
this.append(attr, inner);
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
index = accum.indexOf(inner);
|
|
56
|
-
}
|
|
57
|
-
if (index === -1) {
|
|
58
|
-
index = Infinity;
|
|
59
|
-
}
|
|
60
|
-
accum.splice(index, 0, this);
|
|
53
|
+
const index = typeof attr === 'string' ? -1 : accum.indexOf(attr);
|
|
54
|
+
accum.splice(index === -1 ? Infinity : index, 0, this);
|
|
61
55
|
}
|
|
62
56
|
/**
|
|
63
57
|
* @override
|
|
64
58
|
* @browser
|
|
65
59
|
*/
|
|
66
|
-
toString(
|
|
67
|
-
const { firstChild, lastChild, nextSibling, name } = this, [opening, closing] = this.#tags;
|
|
68
|
-
if (
|
|
60
|
+
toString(omit) {
|
|
61
|
+
const { firstChild, lastChild, nextSibling, name, closed } = this, [opening, closing] = this.#tags;
|
|
62
|
+
if (omit && this.matchesTypes(omit)) {
|
|
69
63
|
return '';
|
|
70
64
|
}
|
|
71
|
-
else if (!
|
|
72
|
-
|
|
65
|
+
else if (!closed && nextSibling) {
|
|
66
|
+
Parser.error(`自动闭合 <${name}>`, lastChild);
|
|
73
67
|
this.#closed = true;
|
|
74
68
|
}
|
|
75
69
|
return this.#selfClosing
|
|
76
|
-
? `<${opening}${firstChild.toString(
|
|
77
|
-
: `<${opening}${firstChild.toString(
|
|
70
|
+
? `<${opening}${firstChild.toString(omit)}/>`
|
|
71
|
+
: `<${opening}${firstChild.toString(omit)}>${lastChild.toString(omit)}${this.closed ? `</${closing}>` : ''}`;
|
|
78
72
|
}
|
|
79
73
|
/**
|
|
80
74
|
* @override
|
|
@@ -110,4 +104,4 @@ class TagPairToken extends (0, fixed_1.fixed)(__1.Token) {
|
|
|
110
104
|
}
|
|
111
105
|
}
|
|
112
106
|
exports.TagPairToken = TagPairToken;
|
|
113
|
-
|
|
107
|
+
Parser.classes['TagPairToken'] = __filename;
|
package/dist/src/transclude.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as Parser from '../index';
|
|
1
2
|
import { Token } from '.';
|
|
2
3
|
import { ParameterToken } from './parameter';
|
|
3
4
|
import { AtomToken } from './atom';
|
|
@@ -7,7 +8,7 @@ import type { LintError } from '../index';
|
|
|
7
8
|
* 模板或魔术字
|
|
8
9
|
* @classdesc `{childNodes: [AtomToken|SyntaxToken, ...AtomToken, ...ParameterToken]}`
|
|
9
10
|
*/
|
|
10
|
-
export declare
|
|
11
|
+
export declare class TranscludeToken extends Token {
|
|
11
12
|
#private;
|
|
12
13
|
/** @browser */
|
|
13
14
|
type: 'template' | 'magic-word';
|
|
@@ -27,13 +28,13 @@ export declare abstract class TranscludeToken extends Token {
|
|
|
27
28
|
* @param parts 参数各部分
|
|
28
29
|
* @throws `SyntaxError` 非法的模板名称
|
|
29
30
|
*/
|
|
30
|
-
constructor(title: string, parts: ([string] | [string | number, string])[], config?:
|
|
31
|
+
constructor(title: string, parts: ([string] | [string | number, string])[], config?: Parser.Config, accum?: Token[]);
|
|
31
32
|
/**
|
|
32
33
|
* 设置引用修饰符
|
|
33
34
|
* @browser
|
|
34
35
|
* @param modifier 引用修饰符
|
|
35
36
|
*/
|
|
36
|
-
setModifier(modifier
|
|
37
|
+
setModifier(modifier: string): boolean;
|
|
37
38
|
/**
|
|
38
39
|
* 是否是模板
|
|
39
40
|
* @browser
|
|
@@ -43,17 +44,12 @@ export declare abstract class TranscludeToken extends Token {
|
|
|
43
44
|
* @override
|
|
44
45
|
* @browser
|
|
45
46
|
*/
|
|
46
|
-
toString(
|
|
47
|
+
toString(omit?: Set<string>): string;
|
|
47
48
|
/**
|
|
48
49
|
* @override
|
|
49
50
|
* @browser
|
|
50
51
|
*/
|
|
51
52
|
text(): string;
|
|
52
|
-
/**
|
|
53
|
-
* @override
|
|
54
|
-
* @browser
|
|
55
|
-
*/
|
|
56
|
-
print(): string;
|
|
57
53
|
/**
|
|
58
54
|
* @override
|
|
59
55
|
* @browser
|
|
@@ -96,6 +92,11 @@ export declare abstract class TranscludeToken extends Token {
|
|
|
96
92
|
* @throws `Error` 不是可接受的魔术字
|
|
97
93
|
*/
|
|
98
94
|
getPossibleValues(): Token[];
|
|
95
|
+
/**
|
|
96
|
+
* @override
|
|
97
|
+
* @browser
|
|
98
|
+
*/
|
|
99
|
+
print(): string;
|
|
99
100
|
/** @override */
|
|
100
101
|
cloneNode(): this;
|
|
101
102
|
/** 替换引用 */
|
package/dist/src/transclude.js
CHANGED
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.TranscludeToken = void 0;
|
|
4
4
|
const string_1 = require("../util/string");
|
|
5
5
|
const lint_1 = require("../util/lint");
|
|
6
|
-
const
|
|
6
|
+
const Parser = require("../index");
|
|
7
7
|
const _1 = require(".");
|
|
8
8
|
const parameter_1 = require("./parameter");
|
|
9
9
|
const atom_1 = require("./atom");
|
|
@@ -35,7 +35,7 @@ class TranscludeToken extends _1.Token {
|
|
|
35
35
|
* @param parts 参数各部分
|
|
36
36
|
* @throws `SyntaxError` 非法的模板名称
|
|
37
37
|
*/
|
|
38
|
-
constructor(title, parts, config =
|
|
38
|
+
constructor(title, parts, config = Parser.getConfig(), accum = []) {
|
|
39
39
|
super(undefined, config, true, accum, {
|
|
40
40
|
AtomToken: 0, SyntaxToken: 0, ParameterToken: '1:',
|
|
41
41
|
});
|
|
@@ -69,9 +69,7 @@ class TranscludeToken extends _1.Token {
|
|
|
69
69
|
if (!part) {
|
|
70
70
|
break;
|
|
71
71
|
}
|
|
72
|
-
const invoke = new atom_1.AtomToken(part.join('='), `invoke-${i ? 'function' : 'module'}`, config, accum, {
|
|
73
|
-
'Stage-1': ':', '!ExtToken': '',
|
|
74
|
-
});
|
|
72
|
+
const invoke = new atom_1.AtomToken(part.join('='), `invoke-${i ? 'function' : 'module'}`, config, accum, { 'Stage-1': ':', '!ExtToken': '' });
|
|
75
73
|
super.insertAt(invoke);
|
|
76
74
|
}
|
|
77
75
|
this.protectChildren('1:3');
|
|
@@ -101,7 +99,6 @@ class TranscludeToken extends _1.Token {
|
|
|
101
99
|
part.unshift(i);
|
|
102
100
|
i++;
|
|
103
101
|
}
|
|
104
|
-
// @ts-expect-error abstract class
|
|
105
102
|
this.insertAt(new parameter_1.ParameterToken(...part, config, accum));
|
|
106
103
|
}
|
|
107
104
|
this.protectChildren(0);
|
|
@@ -111,14 +108,14 @@ class TranscludeToken extends _1.Token {
|
|
|
111
108
|
* @browser
|
|
112
109
|
* @param modifier 引用修饰符
|
|
113
110
|
*/
|
|
114
|
-
setModifier(modifier
|
|
111
|
+
setModifier(modifier) {
|
|
115
112
|
const { parserFunction: [, , raw, subst] } = this.getAttribute('config'), lcModifier = (0, string_1.removeComment)(modifier).trim();
|
|
116
113
|
if (modifier && !lcModifier.endsWith(':')) {
|
|
117
114
|
return false;
|
|
118
115
|
}
|
|
119
116
|
const magicWord = lcModifier.slice(0, -1).toLowerCase(), isRaw = raw.includes(magicWord), isSubst = subst.includes(magicWord);
|
|
120
117
|
if (this.#raw && isRaw || !this.#raw && (isSubst || modifier === '')
|
|
121
|
-
|| (
|
|
118
|
+
|| (Parser.running || this.length > 1) && (isRaw || isSubst || modifier === '')) {
|
|
122
119
|
this.setAttribute('modifier', modifier);
|
|
123
120
|
this.#raw = isRaw;
|
|
124
121
|
return Boolean(modifier);
|
|
@@ -177,14 +174,13 @@ class TranscludeToken extends _1.Token {
|
|
|
177
174
|
* @override
|
|
178
175
|
* @browser
|
|
179
176
|
*/
|
|
180
|
-
toString(
|
|
181
|
-
if (
|
|
177
|
+
toString(omit) {
|
|
178
|
+
if (omit && this.matchesTypes(omit)) {
|
|
182
179
|
return '';
|
|
183
180
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
: super.toString(selector, '|')}}}`;
|
|
181
|
+
return `{{${this.modifier}${this.type === 'magic-word'
|
|
182
|
+
? `${this.firstChild.toString(omit)}${this.length === 1 ? '' : ':'}${this.childNodes.slice(1).map(child => child.toString(omit)).join('|')}`
|
|
183
|
+
: super.toString(omit, '|')}}}`;
|
|
188
184
|
}
|
|
189
185
|
/**
|
|
190
186
|
* @override
|
|
@@ -194,7 +190,7 @@ class TranscludeToken extends _1.Token {
|
|
|
194
190
|
const { childNodes, length, firstChild, modifier, type, name } = this;
|
|
195
191
|
return type === 'magic-word' && name === 'vardefine'
|
|
196
192
|
? ''
|
|
197
|
-
: `{{${modifier}${
|
|
193
|
+
: `{{${modifier}${type === 'magic-word'
|
|
198
194
|
? `${firstChild.text()}${length === 1 ? '' : ':'}${(0, string_1.text)(childNodes.slice(1), '|')}`
|
|
199
195
|
: super.text('|')}}}`;
|
|
200
196
|
}
|
|
@@ -206,16 +202,6 @@ class TranscludeToken extends _1.Token {
|
|
|
206
202
|
getGaps(i) {
|
|
207
203
|
return i < this.length - 1 ? 1 : 0;
|
|
208
204
|
}
|
|
209
|
-
/**
|
|
210
|
-
* @override
|
|
211
|
-
* @browser
|
|
212
|
-
*/
|
|
213
|
-
print() {
|
|
214
|
-
const { childNodes, length, firstChild, modifier } = this;
|
|
215
|
-
return `<span class="wpb-${this.type}">{{${modifier}${this.type === 'magic-word'
|
|
216
|
-
? `${firstChild.print()}${length === 1 ? '' : ':'}${(0, string_1.print)(childNodes.slice(1), { sep: '|' })}`
|
|
217
|
-
: (0, string_1.print)(childNodes, { sep: '|' })}}}</span>`;
|
|
218
|
-
}
|
|
219
205
|
/**
|
|
220
206
|
* @override
|
|
221
207
|
* @browser
|
|
@@ -378,11 +364,20 @@ class TranscludeToken extends _1.Token {
|
|
|
378
364
|
}
|
|
379
365
|
return queue;
|
|
380
366
|
}
|
|
367
|
+
/**
|
|
368
|
+
* @override
|
|
369
|
+
* @browser
|
|
370
|
+
*/
|
|
371
|
+
print() {
|
|
372
|
+
const { childNodes, length, firstChild, modifier, type } = this;
|
|
373
|
+
return `<span class="wpb-${type}">{{${modifier}${type === 'magic-word'
|
|
374
|
+
? `${firstChild.print()}${length === 1 ? '' : ':'}${(0, string_1.print)(childNodes.slice(1), { sep: '|' })}`
|
|
375
|
+
: (0, string_1.print)(childNodes, { sep: '|' })}}}</span>`;
|
|
376
|
+
}
|
|
381
377
|
/** @override */
|
|
382
378
|
cloneNode() {
|
|
383
379
|
const [first, ...cloned] = this.cloneChildNodes(), config = this.getAttribute('config');
|
|
384
|
-
return
|
|
385
|
-
// @ts-expect-error abstract class
|
|
380
|
+
return Parser.run(() => {
|
|
386
381
|
const token = new TranscludeToken(this.type === 'template' ? '' : first.text(), [], config);
|
|
387
382
|
if (this.#raw) {
|
|
388
383
|
token.setModifier(this.modifier);
|
|
@@ -458,7 +453,7 @@ class TranscludeToken extends _1.Token {
|
|
|
458
453
|
* @param exact 是否匹配匿名性
|
|
459
454
|
*/
|
|
460
455
|
removeArg(key, exact = false) {
|
|
461
|
-
|
|
456
|
+
Parser.run(() => {
|
|
462
457
|
for (const token of this.getArgs(key, exact, false)) {
|
|
463
458
|
this.removeChild(token);
|
|
464
459
|
}
|
|
@@ -496,7 +491,7 @@ class TranscludeToken extends _1.Token {
|
|
|
496
491
|
* @throws `SyntaxError` 非法的匿名参数
|
|
497
492
|
*/
|
|
498
493
|
newAnonArg(val) {
|
|
499
|
-
const templateLike = this.isTemplate(), wikitext = `{{${templateLike ? ':T|' : 'lc:'}${val}}}`, root =
|
|
494
|
+
const templateLike = this.isTemplate(), wikitext = `{{${templateLike ? ':T|' : 'lc:'}${val}}}`, root = Parser.parse(wikitext, this.getAttribute('include'), 2, this.getAttribute('config')), { length, firstChild: transclude } = root, targetType = templateLike ? 'template' : 'magic-word';
|
|
500
495
|
if (length !== 1 || transclude.type !== targetType || transclude.length !== 2) {
|
|
501
496
|
throw new SyntaxError(`非法的匿名参数:${(0, string_1.noWrap)(val)}`);
|
|
502
497
|
}
|
|
@@ -522,15 +517,15 @@ class TranscludeToken extends _1.Token {
|
|
|
522
517
|
token.setValue(value);
|
|
523
518
|
return;
|
|
524
519
|
}
|
|
525
|
-
const wikitext = `{{:T|${key}=${value}}}`, root =
|
|
520
|
+
const wikitext = `{{:T|${key}=${value}}}`, root = Parser.parse(wikitext, this.getAttribute('include'), 2, this.getAttribute('config')), { length, firstChild: template } = root;
|
|
526
521
|
if (length !== 1 || template.type !== 'template' || template.length !== 2) {
|
|
527
522
|
throw new SyntaxError(`非法的命名参数:${key}=${(0, string_1.noWrap)(value)}`);
|
|
528
523
|
}
|
|
529
524
|
const { name, lastChild: parameter } = template;
|
|
530
|
-
if (name
|
|
531
|
-
|
|
525
|
+
if (name !== 'T' || parameter.name !== key) {
|
|
526
|
+
throw new SyntaxError(`非法的命名参数:${key}=${(0, string_1.noWrap)(value)}`);
|
|
532
527
|
}
|
|
533
|
-
|
|
528
|
+
this.insertAt(parameter);
|
|
534
529
|
}
|
|
535
530
|
/**
|
|
536
531
|
* 将匿名参数改写为命名参数
|
|
@@ -554,11 +549,11 @@ class TranscludeToken extends _1.Token {
|
|
|
554
549
|
if (this.type === 'magic-word') {
|
|
555
550
|
throw new Error(`${this.constructor.name}.replaceTemplate 方法仅用于更换模板!`);
|
|
556
551
|
}
|
|
557
|
-
const root =
|
|
558
|
-
if (length
|
|
559
|
-
|
|
552
|
+
const root = Parser.parse(`{{${title}}}`, this.getAttribute('include'), 2, this.getAttribute('config')), { length, firstChild: template } = root;
|
|
553
|
+
if (length !== 1 || template.type !== 'template' || template.length !== 1) {
|
|
554
|
+
throw new SyntaxError(`非法的模板名称:${title}`);
|
|
560
555
|
}
|
|
561
|
-
|
|
556
|
+
this.firstChild.replaceChildren(...template.firstChild.childNodes);
|
|
562
557
|
}
|
|
563
558
|
/**
|
|
564
559
|
* 替换模块名
|
|
@@ -570,7 +565,7 @@ class TranscludeToken extends _1.Token {
|
|
|
570
565
|
if (this.type !== 'magic-word' || this.name !== 'invoke') {
|
|
571
566
|
throw new Error(`${this.constructor.name}.replaceModule 方法仅用于更换模块!`);
|
|
572
567
|
}
|
|
573
|
-
const root =
|
|
568
|
+
const root = Parser.parse(`{{#invoke:${title}}}`, this.getAttribute('include'), 2, this.getAttribute('config')), { length, firstChild: invoke } = root, { type, name, lastChild } = invoke;
|
|
574
569
|
if (length !== 1 || type !== 'magic-word' || name !== 'invoke' || invoke.length !== 2) {
|
|
575
570
|
throw new SyntaxError(`非法的模块名称:${title}`);
|
|
576
571
|
}
|
|
@@ -596,7 +591,7 @@ class TranscludeToken extends _1.Token {
|
|
|
596
591
|
else if (this.length < 2) {
|
|
597
592
|
throw new Error('尚未指定模块名称!');
|
|
598
593
|
}
|
|
599
|
-
const root =
|
|
594
|
+
const root = Parser.parse(`{{#invoke:M|${func}}}`, this.getAttribute('include'), 2, this.getAttribute('config')), { length, firstChild: invoke } = root, { type, name, lastChild } = invoke;
|
|
600
595
|
if (length !== 1 || type !== 'magic-word' || name !== 'invoke' || invoke.length !== 3) {
|
|
601
596
|
throw new SyntaxError(`非法的模块函数名:${func}`);
|
|
602
597
|
}
|
|
@@ -688,7 +683,7 @@ class TranscludeToken extends _1.Token {
|
|
|
688
683
|
}
|
|
689
684
|
}
|
|
690
685
|
if (remaining > 1) {
|
|
691
|
-
|
|
686
|
+
Parser.error(`${this.type === 'template'
|
|
692
687
|
? this.name
|
|
693
688
|
: this.normalizeTitle(this.childNodes[1]?.text() ?? '', 828).title} 还留有 ${remaining} 个重复的 ${key} 参数:${[...this.getArgs(key)].map(arg => {
|
|
694
689
|
const { top, left } = arg.getBoundingClientRect();
|
|
@@ -705,17 +700,17 @@ class TranscludeToken extends _1.Token {
|
|
|
705
700
|
* @throws `Error` 转义失败
|
|
706
701
|
*/
|
|
707
702
|
escapeTables() {
|
|
708
|
-
const count = this.hasDuplicatedArgs();
|
|
709
|
-
if (
|
|
703
|
+
const count = this.hasDuplicatedArgs(), str = this.text(), i = str.search(/\n[^\S\n]*(?::+[^\S\n]*)?\{\|/u), j = str.slice(i).search(/\n[^\S\n]*\|\}/u);
|
|
704
|
+
if (i === -1 || j === -1 || !count) {
|
|
710
705
|
return this;
|
|
711
706
|
}
|
|
712
|
-
const stripped = String(this).slice(2, -2), include = this.getAttribute('include'), config = this.getAttribute('config'), parsed =
|
|
707
|
+
const stripped = String(this).slice(2, -2), include = this.getAttribute('include'), config = this.getAttribute('config'), parsed = Parser.parse(stripped, include, 4, config);
|
|
713
708
|
for (const table of parsed.childNodes) {
|
|
714
709
|
if (table.type === 'table') {
|
|
715
710
|
table.escape();
|
|
716
711
|
}
|
|
717
712
|
}
|
|
718
|
-
const { firstChild, length } =
|
|
713
|
+
const { firstChild, length } = Parser.parse(`{{${String(parsed)}}}`, include, 2, config);
|
|
719
714
|
if (length !== 1 || !(firstChild instanceof TranscludeToken)) {
|
|
720
715
|
throw new Error('转义表格失败!');
|
|
721
716
|
}
|
|
@@ -723,10 +718,10 @@ class TranscludeToken extends _1.Token {
|
|
|
723
718
|
if (newCount === count) {
|
|
724
719
|
return this;
|
|
725
720
|
}
|
|
726
|
-
|
|
721
|
+
Parser.info(`共修复了 ${count - newCount} 个重复参数。`);
|
|
727
722
|
this.safeReplaceWith(firstChild);
|
|
728
723
|
return firstChild;
|
|
729
724
|
}
|
|
730
725
|
}
|
|
731
726
|
exports.TranscludeToken = TranscludeToken;
|
|
732
|
-
|
|
727
|
+
Parser.classes['TranscludeToken'] = __filename;
|
package/dist/util/lint.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateForSelf = exports.generateForChild = void 0;
|
|
4
|
-
const
|
|
4
|
+
const Parser = require("../index");
|
|
5
5
|
/**
|
|
6
6
|
* 生成对于子节点的LintError对象
|
|
7
7
|
* @param child 子节点
|
|
@@ -10,8 +10,18 @@ const index_1 = require("../index");
|
|
|
10
10
|
* @param severity 严重程度
|
|
11
11
|
*/
|
|
12
12
|
const generateForChild = (child, boundingRect, msg, severity = 'error') => {
|
|
13
|
-
const index = child.getRelativeIndex(), { offsetHeight, offsetWidth, parentNode } = child, { top: offsetTop, left: offsetLeft } = parentNode.posFromIndex(index), { start } = boundingRect, { top, left } = 'top' in boundingRect ? boundingRect : child.getRootNode().posFromIndex(start), str = String(child),
|
|
14
|
-
return {
|
|
13
|
+
const index = child.getRelativeIndex(), { offsetHeight, offsetWidth, parentNode } = child, { top: offsetTop, left: offsetLeft } = parentNode.posFromIndex(index), { start } = boundingRect, { top, left } = 'top' in boundingRect ? boundingRect : child.getRootNode().posFromIndex(start), str = String(child), startIndex = start + index, startLine = top + offsetTop, startCol = offsetTop ? offsetLeft : left + offsetLeft;
|
|
14
|
+
return {
|
|
15
|
+
message: Parser.msg(msg),
|
|
16
|
+
severity,
|
|
17
|
+
startIndex,
|
|
18
|
+
endIndex: startIndex + str.length,
|
|
19
|
+
startLine,
|
|
20
|
+
endLine: startLine + offsetHeight - 1,
|
|
21
|
+
startCol,
|
|
22
|
+
endCol: offsetHeight === 1 ? startCol + offsetWidth : offsetWidth,
|
|
23
|
+
excerpt: str.slice(0, 50),
|
|
24
|
+
};
|
|
15
25
|
};
|
|
16
26
|
exports.generateForChild = generateForChild;
|
|
17
27
|
/**
|
|
@@ -24,7 +34,7 @@ exports.generateForChild = generateForChild;
|
|
|
24
34
|
const generateForSelf = (token, boundingRect, msg, severity = 'error') => {
|
|
25
35
|
const { start } = boundingRect, { offsetHeight, offsetWidth } = token, str = String(token), { top, left } = 'top' in boundingRect ? boundingRect : token.getRootNode().posFromIndex(start);
|
|
26
36
|
return {
|
|
27
|
-
message:
|
|
37
|
+
message: Parser.msg(msg),
|
|
28
38
|
severity,
|
|
29
39
|
startIndex: start,
|
|
30
40
|
endIndex: start + str.length,
|
package/dist/util/string.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.normalizeSpace = exports.
|
|
3
|
+
exports.normalizeSpace = exports.toCase = exports.print = exports.noWrap = exports.decodeHtml = exports.text = exports.escapeRegExp = exports.removeComment = exports.extUrlChar = exports.extUrlCharFirst = void 0;
|
|
4
4
|
exports.extUrlCharFirst = '(?:\\[[\\da-f:.]+\\]|[^[\\]<>"\\0-\\x1F\\x7F\\p{Zs}\\uFFFD])';
|
|
5
5
|
exports.extUrlChar = '(?:[^[\\]<>"\\0-\\x1F\\x7F\\p{Zs}\\uFFFD]|\\0\\d+c\\x7F)*';
|
|
6
6
|
/**
|
|
@@ -10,19 +10,6 @@ exports.extUrlChar = '(?:[^[\\]<>"\\0-\\x1F\\x7F\\p{Zs}\\uFFFD]|\\0\\d+c\\x7F)*'
|
|
|
10
10
|
*/
|
|
11
11
|
const removeComment = (str) => str.replace(/\0\d+c\x7F/gu, '');
|
|
12
12
|
exports.removeComment = removeComment;
|
|
13
|
-
/**
|
|
14
|
-
* 以HTML格式打印
|
|
15
|
-
* @browser
|
|
16
|
-
* @param childNodes 子节点
|
|
17
|
-
* @param opt 选项
|
|
18
|
-
*/
|
|
19
|
-
const print = (childNodes, opt = {}) => {
|
|
20
|
-
const { pre = '', post = '', sep = '' } = opt, entities = { '&': 'amp', '<': 'lt', '>': 'gt' };
|
|
21
|
-
return `${pre}${childNodes.map(child => child.type === 'text'
|
|
22
|
-
? child.data.replace(/[&<>]/gu, p => `&${entities[p]};`)
|
|
23
|
-
: child.print()).join(sep)}${post}`;
|
|
24
|
-
};
|
|
25
|
-
exports.print = print;
|
|
26
13
|
/**
|
|
27
14
|
* escape special chars for RegExp constructor
|
|
28
15
|
* @browser
|
|
@@ -45,6 +32,26 @@ exports.text = text;
|
|
|
45
32
|
*/
|
|
46
33
|
const decodeHtml = (str) => str.replace(/&#(\d+|x[\da-f]+);/giu, (_, code) => String.fromCodePoint(Number(`${code[0].toLowerCase() === 'x' ? '0' : ''}${code}`)));
|
|
47
34
|
exports.decodeHtml = decodeHtml;
|
|
35
|
+
/**
|
|
36
|
+
* escape newlines
|
|
37
|
+
* @browser
|
|
38
|
+
* @param str 原字符串
|
|
39
|
+
*/
|
|
40
|
+
const noWrap = (str) => str.replaceAll('\n', '\\n');
|
|
41
|
+
exports.noWrap = noWrap;
|
|
42
|
+
/**
|
|
43
|
+
* 以HTML格式打印
|
|
44
|
+
* @browser
|
|
45
|
+
* @param childNodes 子节点
|
|
46
|
+
* @param opt 选项
|
|
47
|
+
*/
|
|
48
|
+
const print = (childNodes, opt = {}) => {
|
|
49
|
+
const { pre = '', post = '', sep = '' } = opt, entities = { '&': 'amp', '<': 'lt', '>': 'gt' };
|
|
50
|
+
return `${pre}${childNodes.map(child => child.type === 'text'
|
|
51
|
+
? child.data.replace(/[&<>]/gu, p => `&${entities[p]};`)
|
|
52
|
+
: child.print()).join(sep)}${post}`;
|
|
53
|
+
};
|
|
54
|
+
exports.print = print;
|
|
48
55
|
/**
|
|
49
56
|
* optionally convert to lower cases
|
|
50
57
|
* @param val 属性值
|
|
@@ -52,12 +59,6 @@ exports.decodeHtml = decodeHtml;
|
|
|
52
59
|
*/
|
|
53
60
|
const toCase = (val, i) => i ? val.toLowerCase() : val;
|
|
54
61
|
exports.toCase = toCase;
|
|
55
|
-
/**
|
|
56
|
-
* escape newlines
|
|
57
|
-
* @param str 原字符串
|
|
58
|
-
*/
|
|
59
|
-
const noWrap = (str) => str.replaceAll('\n', '\\n');
|
|
60
|
-
exports.noWrap = noWrap;
|
|
61
62
|
/**
|
|
62
63
|
* convert newline in text nodes to single whitespace
|
|
63
64
|
* @param token 父节点
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wikiparser-node",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.4",
|
|
4
4
|
"description": "A Node.js parser for MediaWiki markup with AST",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mediawiki",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"scripts": {
|
|
29
29
|
"prepublishOnly": "rm -rf dist/; tsc; rm dist/internal.js; rm dist/[mpu]*/*.d.ts; grep -rl --include='*.d.ts' '@private' dist/ | xargs gsed -i '/@private/,+1d'",
|
|
30
30
|
"build": "rm -rf dist/; tsc; grep -rl --include='*.js' '@ts' dist/ | xargs gsed -i '/@ts/d'; eslint --fix dist/",
|
|
31
|
+
"diff": "git diff --ignore-all-space --color-moved",
|
|
31
32
|
"doc": "node ./bin/doc.js",
|
|
32
33
|
"toc": "node ./bin/toc.js",
|
|
33
34
|
"lint:ts": "eslint --cache --ignore-pattern '/dist/' .",
|
|
@@ -37,19 +38,20 @@
|
|
|
37
38
|
"test:single": "node --prof test/single.js && node --prof-process isolate-0x*-v8.log > test/processed.txt && rm isolate-0x*-v8.log"
|
|
38
39
|
},
|
|
39
40
|
"devDependencies": {
|
|
41
|
+
"@cypress/request": "^3.0.1",
|
|
40
42
|
"@types/node": "^20.9.0",
|
|
43
|
+
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
|
44
|
+
"@typescript-eslint/parser": "^5.62.0",
|
|
45
|
+
"ajv-cli": "^5.0.0",
|
|
41
46
|
"eslint": "^8.53.0",
|
|
47
|
+
"eslint-plugin-eslint-comments": "^3.2.0",
|
|
48
|
+
"eslint-plugin-jsdoc": "^46.8.2",
|
|
49
|
+
"eslint-plugin-json-es": "^1.5.7",
|
|
42
50
|
"eslint-plugin-n": "^16.3.1",
|
|
51
|
+
"eslint-plugin-promise": "^6.1.1",
|
|
43
52
|
"eslint-plugin-regexp": "^2.1.1",
|
|
44
53
|
"eslint-plugin-unicorn": "^49.0.0",
|
|
45
|
-
"
|
|
46
|
-
"eslint-plugin-json-es": "^1.5.7",
|
|
47
|
-
"eslint-plugin-eslint-comments": "^3.2.0",
|
|
48
|
-
"typescript": "^5.0.3",
|
|
49
|
-
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
|
50
|
-
"@typescript-eslint/parser": "^5.62.0",
|
|
51
|
-
"ajv-cli": "^5.0.0",
|
|
52
|
-
"request": "^2.88.2"
|
|
54
|
+
"typescript": "^5.0.3"
|
|
53
55
|
},
|
|
54
56
|
"engines": {
|
|
55
57
|
"node": "^20.9.0"
|