wikiparser-node 1.3.7 → 1.3.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/lib/element.d.ts +1 -1
- package/dist/lib/element.js +1 -1
- package/dist/lib/node.js +5 -3
- package/dist/lib/text.js +1 -1
- package/dist/lib/title.js +6 -5
- package/dist/mixin/hidden.js +0 -1
- package/dist/parser/commentAndExt.js +6 -1
- package/dist/parser/converter.js +4 -4
- package/dist/parser/externalLinks.js +4 -1
- package/dist/parser/magicLinks.js +2 -0
- package/dist/src/arg.d.ts +2 -0
- package/dist/src/arg.js +7 -0
- package/dist/src/attribute.js +2 -1
- package/dist/src/attributes.js +3 -3
- package/dist/src/heading.d.ts +2 -0
- package/dist/src/heading.js +7 -0
- package/dist/src/html.d.ts +3 -1
- package/dist/src/html.js +9 -1
- package/dist/src/imageParameter.js +2 -0
- package/dist/src/imagemap.js +1 -1
- package/dist/src/link/file.js +0 -1
- package/dist/src/nowiki/comment.d.ts +2 -0
- package/dist/src/nowiki/comment.js +7 -0
- package/dist/src/parameter.d.ts +2 -0
- package/dist/src/parameter.js +9 -0
- package/dist/src/table/index.d.ts +2 -0
- package/dist/src/table/index.js +7 -0
- package/dist/src/table/td.d.ts +2 -0
- package/dist/src/table/td.js +7 -0
- package/dist/src/tagPair/ext.d.ts +2 -3
- package/dist/src/tagPair/ext.js +1 -7
- package/dist/src/tagPair/include.d.ts +2 -0
- package/dist/src/tagPair/include.js +7 -0
- package/dist/src/tagPair/index.d.ts +2 -6
- package/dist/src/tagPair/index.js +10 -27
- package/dist/src/transclude.d.ts +1 -1
- package/dist/src/transclude.js +2 -7
- package/package.json +1 -1
package/dist/lib/element.d.ts
CHANGED
package/dist/lib/element.js
CHANGED
|
@@ -246,7 +246,7 @@ class AstElement extends node_1.AstNode {
|
|
|
246
246
|
json(file) {
|
|
247
247
|
const json = {
|
|
248
248
|
...this,
|
|
249
|
-
childNodes: this.childNodes.map(child => child.type === 'text' ? child.data : child.json()),
|
|
249
|
+
childNodes: this.childNodes.map(child => child.type === 'text' ? { data: child.data } : child.json()),
|
|
250
250
|
};
|
|
251
251
|
if (typeof file === 'string') {
|
|
252
252
|
fs.writeFileSync(path.join(__dirname.slice(0, -4), '..', 'printed', `${file}${file.endsWith('.json') ? '' : '.json'}`), JSON.stringify(json, null, 2));
|
package/dist/lib/node.js
CHANGED
|
@@ -203,11 +203,13 @@ class AstNode {
|
|
|
203
203
|
throw new Error(`${this.constructor.name} ${msg}!`);
|
|
204
204
|
}
|
|
205
205
|
/** @private */
|
|
206
|
-
seal(key) {
|
|
207
|
-
|
|
206
|
+
seal(key, hidden) {
|
|
207
|
+
if (!hidden) {
|
|
208
|
+
this.#optional.add(key);
|
|
209
|
+
}
|
|
208
210
|
Object.defineProperty(this, key, {
|
|
209
211
|
writable: false,
|
|
210
|
-
enumerable: Boolean(this[key]),
|
|
212
|
+
enumerable: !hidden && Boolean(this[key]),
|
|
211
213
|
configurable: true,
|
|
212
214
|
});
|
|
213
215
|
}
|
package/dist/lib/text.js
CHANGED
|
@@ -76,7 +76,7 @@ class AstText extends node_1.AstNode {
|
|
|
76
76
|
writable: false,
|
|
77
77
|
},
|
|
78
78
|
childNodes: { enumerable: false, configurable: false },
|
|
79
|
-
type: { enumerable: false, writable: false
|
|
79
|
+
type: { enumerable: false, writable: false },
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
/** @private */
|
package/dist/lib/title.js
CHANGED
|
@@ -61,11 +61,6 @@ class Title {
|
|
|
61
61
|
* @param selfLink 是否允许selfLink
|
|
62
62
|
*/
|
|
63
63
|
constructor(title, defaultNs = 0, config = Parser.getConfig(), decode = false, selfLink = false) {
|
|
64
|
-
Object.defineProperties(this, {
|
|
65
|
-
encoded: { enumerable: false },
|
|
66
|
-
conversionTable: { enumerable: false },
|
|
67
|
-
redirects: { enumerable: false },
|
|
68
|
-
});
|
|
69
64
|
const { namespaces, nsid, } = config;
|
|
70
65
|
this.#namespaces = namespaces;
|
|
71
66
|
title = (0, string_1.decodeHtml)(title);
|
|
@@ -119,6 +114,12 @@ class Title {
|
|
|
119
114
|
|| this.interwiki
|
|
120
115
|
|| selfLink && this.fragment !== undefined) && !/\0\d+[eh!+-]\x7F|[<>[\]{}|]|%[\da-f]{2}/iu.test(title);
|
|
121
116
|
this.main = title;
|
|
117
|
+
Object.defineProperties(this, {
|
|
118
|
+
valid: { writable: false },
|
|
119
|
+
encoded: { enumerable: false, writable: false },
|
|
120
|
+
conversionTable: { enumerable: false },
|
|
121
|
+
redirects: { enumerable: false },
|
|
122
|
+
});
|
|
122
123
|
}
|
|
123
124
|
/* NOT FOR BROWSER */
|
|
124
125
|
/** @private */
|
package/dist/mixin/hidden.js
CHANGED
|
@@ -50,9 +50,14 @@ const parseCommentAndExt = (wikitext, config = Parser.getConfig(), accum = [], i
|
|
|
50
50
|
return str;
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
|
54
|
+
/<foo(?:\s[^>]*)?>|<\/foo\s*>/giu;
|
|
55
|
+
/<(bar)(\s[^>]*?)?(?:\/>|>(.*?)<\/(\1\s*)>)/gisu;
|
|
56
|
+
/<(baz)(\s[^>]*?)?(?:\/>|>(.*?)(?:<\/(baz\s*)>|$))/gisu;
|
|
57
|
+
/* eslint-enable @typescript-eslint/no-unused-expressions */
|
|
53
58
|
const ext = config.ext.join('|'), noincludeRegex = includeOnly ? 'includeonly' : '(?:no|only)include', includeRegex = includeOnly ? 'noinclude' : 'includeonly', regex = new RegExp('<!--.*?(?:-->|$)' // comment
|
|
54
59
|
+ '|'
|
|
55
|
-
+ `<${noincludeRegex}(?:\\s[^>]
|
|
60
|
+
+ `<${noincludeRegex}(?:\\s[^>]*)?>|</${noincludeRegex}\\s*>` // <noinclude>
|
|
56
61
|
+ '|'
|
|
57
62
|
+ `<(${ext})(\\s[^>]*?)?(?:/>|>(.*?)</(\\1\\s*)>)` // 扩展标签
|
|
58
63
|
+ '|'
|
package/dist/parser/converter.js
CHANGED
|
@@ -16,10 +16,10 @@ const parseConverter = (text, config = Parser.getConfig(), accum = []) => {
|
|
|
16
16
|
while (mt) {
|
|
17
17
|
const { 0: syntax, index } = mt;
|
|
18
18
|
if (syntax === '}-') {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
20
|
+
/;(?=(?:[^;]*?=>)?\s*foo\s*:|(?:\s|\0\d+c\x7F)*$)/u;
|
|
21
|
+
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*:|(?:\\s|\0\\d+c\x7F)*$)`, 'u'))
|
|
22
|
+
.map(rule => rule.replace(/\x01/gu, ';'));
|
|
23
23
|
new converter_1.ConverterToken(flags, rules, config, accum);
|
|
24
24
|
text = `${text.slice(0, top.index)}\0${length}v\x7F${text.slice(index + 2)}`;
|
|
25
25
|
if (stack.length === 0) {
|
|
@@ -12,7 +12,10 @@ const extLink_1 = require("../src/extLink");
|
|
|
12
12
|
* @param accum
|
|
13
13
|
*/
|
|
14
14
|
const parseExternalLinks = (wikitext, config = Parser.getConfig(), accum = []) => {
|
|
15
|
-
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
16
|
+
/\[((?:\[[\da-f:.]+\]|[^[\]\t\n\p{Zs}])[^[\]\t\n\p{Zs}]*(?=[[\]\t\p{Zs}]|\0\d))(\p{Zs}*(?=\P{Zs}))([^\]\n]*)\]/giu;
|
|
17
|
+
const regex = new RegExp(`\\[((?:(?:${config.protocol}|//)${string_1.extUrlCharFirst}|\0\\d+m\x7F)${string_1.extUrlChar}(?=[[\\]<>"\\t\\p{Zs}]|\0\\d))`
|
|
18
|
+
+ '(\\p{Zs}*(?=\\P{Zs}))([^\\]\x01-\x08\x0A-\x1F\uFFFD]*)\\]', 'giu');
|
|
16
19
|
return wikitext.replace(regex, (_, url, space, text) => {
|
|
17
20
|
const { length } = accum, mt = /&[lg]t;/u.exec(url);
|
|
18
21
|
if (mt) {
|
|
@@ -12,6 +12,8 @@ const magicLink_1 = require("../src/magicLink");
|
|
|
12
12
|
* @param accum
|
|
13
13
|
*/
|
|
14
14
|
const parseMagicLinks = (wikitext, config = Parser.getConfig(), accum = []) => {
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
16
|
+
/(^|[^\p{L}\d_])((?:\[[\da-f:.]+\]|[^[\]<>"\t\n\p{Zs}])(?:[^[\]<>"\0\t\n\p{Zs}]|\0\d+c\x7F)*)/giu;
|
|
15
17
|
const regex = new RegExp(`(^|[^\\p{L}\\d_])(?:${config.protocol})(${string_1.extUrlCharFirst}${string_1.extUrlChar})`, 'giu');
|
|
16
18
|
return wikitext.replace(regex, (m, lead, p1) => {
|
|
17
19
|
let trail = '', url = lead ? m.slice(1) : m;
|
package/dist/src/arg.d.ts
CHANGED
package/dist/src/arg.js
CHANGED
|
@@ -93,6 +93,13 @@ class ArgToken extends index_1.Token {
|
|
|
93
93
|
print() {
|
|
94
94
|
return super.print({ pre: '{{{', post: '}}}', sep: '|' });
|
|
95
95
|
}
|
|
96
|
+
/** @override */
|
|
97
|
+
json() {
|
|
98
|
+
return {
|
|
99
|
+
...super.json(),
|
|
100
|
+
default: this.default,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
96
103
|
/* NOT FOR BROWSER */
|
|
97
104
|
/** @override */
|
|
98
105
|
cloneNode() {
|
package/dist/src/attribute.js
CHANGED
|
@@ -158,6 +158,7 @@ const commonHtmlAttrs = new Set([
|
|
|
158
158
|
* @classdesc `{childNodes: [AtomToken, Token|AtomToken]}`
|
|
159
159
|
*/
|
|
160
160
|
class AttributeToken extends (0, fixed_1.fixed)(index_1.Token) {
|
|
161
|
+
tag;
|
|
161
162
|
#equal;
|
|
162
163
|
#quotes;
|
|
163
164
|
/** 引号是否匹配 */
|
|
@@ -239,7 +240,7 @@ class AttributeToken extends (0, fixed_1.fixed)(index_1.Token) {
|
|
|
239
240
|
this.#equal = equal;
|
|
240
241
|
this.#quotes = [...quotes];
|
|
241
242
|
this.tag = tag;
|
|
242
|
-
this.seal('tag');
|
|
243
|
+
this.seal('tag', true);
|
|
243
244
|
this.setAttribute('name', (0, string_1.removeComment)(key).trim().toLowerCase());
|
|
244
245
|
}
|
|
245
246
|
/** @private */
|
package/dist/src/attributes.js
CHANGED
|
@@ -80,10 +80,10 @@ class AttributesToken extends index_1.Token {
|
|
|
80
80
|
this.type = type;
|
|
81
81
|
this.setAttribute('name', name);
|
|
82
82
|
if (attr) {
|
|
83
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
84
|
+
/([^\s/](?:(?!\0\d+~\x7F)[^\s/=])*)(?:(\s*(?:=|\0\d+~\x7F)\s*)(?:(["'])(.*?)(\3|$)|(\S*)))?/gsu;
|
|
83
85
|
const regex = new RegExp('([^\\s/](?:(?!\0\\d+~\x7F)[^\\s/=])*)' // 属性名
|
|
84
|
-
+ `(?:${'((?:\\s|\0\\d+c\x7F)*' //
|
|
85
|
-
+ '(?:=|\0\\d+~\x7F)' // `=`
|
|
86
|
-
+ '(?:\\s|\0\\d+c\x7F)*)' // `=`后的空白字符
|
|
86
|
+
+ `(?:${'((?:\\s|\0\\d+c\x7F)*(?:=|\0\\d+~\x7F)(?:\\s|\0\\d+c\x7F)*)' // `=`和前后的空白字符
|
|
87
87
|
+ `(?:(["'])(.*?)(\\3|$)|(\\S*))` // 属性值
|
|
88
88
|
})?`, 'gsu');
|
|
89
89
|
let out = '', mt = regex.exec(attr), lastIndex = 0;
|
package/dist/src/heading.d.ts
CHANGED
package/dist/src/heading.js
CHANGED
|
@@ -100,6 +100,13 @@ class HeadingToken extends (0, sol_1.sol)((0, fixed_1.fixed)(index_1.Token)) {
|
|
|
100
100
|
const equals = this.#equals;
|
|
101
101
|
return super.print({ pre: equals, sep: equals });
|
|
102
102
|
}
|
|
103
|
+
/** @override */
|
|
104
|
+
json() {
|
|
105
|
+
return {
|
|
106
|
+
...super.json(),
|
|
107
|
+
level: this.level,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
103
110
|
/* NOT FOR BROWSER */
|
|
104
111
|
/** @override */
|
|
105
112
|
cloneNode() {
|
package/dist/src/html.d.ts
CHANGED
|
@@ -82,12 +82,14 @@ export declare class HtmlToken extends HtmlToken_base {
|
|
|
82
82
|
* 搜索匹配的标签
|
|
83
83
|
* @throws `SyntaxError` 同时闭合和自封闭的标签
|
|
84
84
|
* @throws `SyntaxError` 无效自封闭标签
|
|
85
|
-
* @throws `SyntaxError`
|
|
85
|
+
* @throws `SyntaxError` 未匹配的标签
|
|
86
86
|
*/
|
|
87
87
|
findMatchingTag(): this | undefined;
|
|
88
88
|
/** @override */
|
|
89
89
|
print(): string;
|
|
90
90
|
/** @override */
|
|
91
|
+
json(): object;
|
|
92
|
+
/** @override */
|
|
91
93
|
cloneNode(): this;
|
|
92
94
|
/**
|
|
93
95
|
* 更换标签名
|
package/dist/src/html.js
CHANGED
|
@@ -137,7 +137,7 @@ class HtmlToken extends (0, attributesParent_1.attributesParent)((0, fixed_1.fix
|
|
|
137
137
|
* 搜索匹配的标签
|
|
138
138
|
* @throws `SyntaxError` 同时闭合和自封闭的标签
|
|
139
139
|
* @throws `SyntaxError` 无效自封闭标签
|
|
140
|
-
* @throws `SyntaxError`
|
|
140
|
+
* @throws `SyntaxError` 未匹配的标签
|
|
141
141
|
*/
|
|
142
142
|
findMatchingTag() {
|
|
143
143
|
const { html } = this.getAttribute('config'), { name: tagName, parentNode, closing } = this, string = (0, string_1.noWrap)(String(this));
|
|
@@ -178,6 +178,14 @@ class HtmlToken extends (0, attributesParent_1.attributesParent)((0, fixed_1.fix
|
|
|
178
178
|
class: closing && html[2].includes(name) && name !== 'br' ? 'html-invalid' : 'html',
|
|
179
179
|
});
|
|
180
180
|
}
|
|
181
|
+
/** @override */
|
|
182
|
+
json() {
|
|
183
|
+
return {
|
|
184
|
+
...super.json(),
|
|
185
|
+
closing: this.closing,
|
|
186
|
+
selfClosing: this.#selfClosing,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
181
189
|
/* NOT FOR BROWSER */
|
|
182
190
|
/** @override */
|
|
183
191
|
cloneNode() {
|
|
@@ -18,6 +18,8 @@ function validate(key, val, config = Parser.getConfig(), halfParsed = false) {
|
|
|
18
18
|
if (!value) {
|
|
19
19
|
return val;
|
|
20
20
|
}
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
22
|
+
/^(?:\/\/(?:\[[\da-f:.]+\]|[^[\]<>"\t\n\p{Zs}])|\0\d+m\x7F)(?:[^[\]<>"\0\t\n\p{Zs}]|\0\d+c\x7F)*$/iu;
|
|
21
23
|
const regex = new RegExp(`^(?:(?:${config.protocol}|//)${string_1.extUrlCharFirst}|\0\\d+m\x7F)${string_1.extUrlChar}$`, 'iu');
|
|
22
24
|
if (regex.test(value)) {
|
|
23
25
|
return val;
|
package/dist/src/imagemap.js
CHANGED
|
@@ -71,7 +71,7 @@ class ImagemapToken extends index_1.Token {
|
|
|
71
71
|
}
|
|
72
72
|
else if (protocols.has(substr.slice(1, substr.indexOf(':') + 1))
|
|
73
73
|
|| protocols.has(substr.slice(1, substr.indexOf('//') + 2))) {
|
|
74
|
-
const mtEx = /^\[([^\]\s]+)(?:(\s+)(
|
|
74
|
+
const mtEx = /^\[([^\]\s]+)(?:(\s+(?=\S))([^\]]*))?\][\w\s]*$/u
|
|
75
75
|
.exec(substr);
|
|
76
76
|
if (mtEx) {
|
|
77
77
|
super.insertAt(new imagemapLink_1.ImagemapLinkToken(line.slice(0, i), mtEx.slice(1), substr.slice(substr.indexOf(']') + 1), config, accum));
|
package/dist/src/link/file.js
CHANGED
|
@@ -49,6 +49,13 @@ class CommentToken extends (0, hidden_1.hidden)(base_1.NowikiBaseToken) {
|
|
|
49
49
|
}
|
|
50
50
|
/* NOT FOR BROWSER */
|
|
51
51
|
/** @override */
|
|
52
|
+
json() {
|
|
53
|
+
return {
|
|
54
|
+
...super.json(),
|
|
55
|
+
closed: this.closed,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** @override */
|
|
52
59
|
cloneNode() {
|
|
53
60
|
return debug_1.Shadow.run(() => new CommentToken(this.innerText, this.closed, this.getAttribute('config')));
|
|
54
61
|
}
|
package/dist/src/parameter.d.ts
CHANGED
package/dist/src/parameter.js
CHANGED
|
@@ -107,6 +107,8 @@ class ParameterToken extends (0, fixed_1.fixed)(index_1.Token) {
|
|
|
107
107
|
}
|
|
108
108
|
/** @override */
|
|
109
109
|
lint(start = this.getAbsoluteIndex()) {
|
|
110
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
111
|
+
/https?:\/\/(?:\[[\da-f:.]+\]|[^[\]<>"\t\n\p{Zs}])(?:[^[\]<>"\0\t\n\p{Zs}]|\0\d+c\x7F)*$/iu;
|
|
110
112
|
const errors = super.lint(start), { firstChild } = this, link = new RegExp(`https?://${string_1.extUrlCharFirst}${string_1.extUrlChar}$`, 'iu')
|
|
111
113
|
.exec(firstChild.toString(new Set(['comment', 'noinclude', 'include'])))?.[0];
|
|
112
114
|
if (link && new URL(link).search) {
|
|
@@ -126,6 +128,13 @@ class ParameterToken extends (0, fixed_1.fixed)(index_1.Token) {
|
|
|
126
128
|
print() {
|
|
127
129
|
return super.print({ sep: this.anon ? '' : '=' });
|
|
128
130
|
}
|
|
131
|
+
/** @override */
|
|
132
|
+
json() {
|
|
133
|
+
return {
|
|
134
|
+
...super.json(),
|
|
135
|
+
anon: this.anon,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
129
138
|
/* NOT FOR BROWSER */
|
|
130
139
|
/** @override */
|
|
131
140
|
cloneNode() {
|
package/dist/src/table/index.js
CHANGED
package/dist/src/table/td.d.ts
CHANGED
package/dist/src/table/td.js
CHANGED
|
@@ -140,6 +140,13 @@ class TdToken extends (0, fixed_1.fixed)(base_1.TableBaseToken) {
|
|
|
140
140
|
const { childNodes: [syntax, attr, inner] } = this;
|
|
141
141
|
return `<span class="wpb-td">${syntax.print()}${attr.print()}${this.#innerSyntax}${inner.print()}</span>`;
|
|
142
142
|
}
|
|
143
|
+
/** @override */
|
|
144
|
+
json() {
|
|
145
|
+
return {
|
|
146
|
+
...super.json(),
|
|
147
|
+
subtype: this.subtype,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
143
150
|
/* NOT FOR BROWSER */
|
|
144
151
|
/** 是否位于行首 */
|
|
145
152
|
isIndependent() {
|
|
@@ -9,7 +9,7 @@ declare const ExtToken_base: (abstract new (...args: any[]) => {
|
|
|
9
9
|
attributes: Record<string, string | true>;
|
|
10
10
|
className: string;
|
|
11
11
|
classList: Set<string>;
|
|
12
|
-
id: string;
|
|
12
|
+
id: string;
|
|
13
13
|
hasAttr(key: string): boolean;
|
|
14
14
|
getAttr(key: string): string | true | undefined;
|
|
15
15
|
getAttrNames(): Set<string>;
|
|
@@ -36,13 +36,12 @@ declare const ExtToken_base: (abstract new (...args: any[]) => {
|
|
|
36
36
|
*/
|
|
37
37
|
export declare class ExtToken extends ExtToken_base {
|
|
38
38
|
readonly type = "ext";
|
|
39
|
+
closed: true;
|
|
39
40
|
readonly childNodes: [AttributesToken, Token];
|
|
40
41
|
abstract get children(): [AttributesToken, Token];
|
|
41
42
|
abstract get firstChild(): AttributesToken;
|
|
42
43
|
abstract get firstElementChild(): AttributesToken;
|
|
43
44
|
abstract get lastChild(): Token;
|
|
44
|
-
/** @override */
|
|
45
|
-
get closed(): boolean;
|
|
46
45
|
/**
|
|
47
46
|
* @param name 标签名
|
|
48
47
|
* @param attr 标签属性
|
package/dist/src/tagPair/ext.js
CHANGED
|
@@ -25,13 +25,6 @@ const del = (arr, ele) => {
|
|
|
25
25
|
*/
|
|
26
26
|
class ExtToken extends (0, attributesParent_1.attributesParent)(index_2.TagPairToken) {
|
|
27
27
|
type = 'ext';
|
|
28
|
-
/* NOT FOR BROWSER */
|
|
29
|
-
/** @override */
|
|
30
|
-
// eslint-disable-next-line class-methods-use-this
|
|
31
|
-
get closed() {
|
|
32
|
-
return true;
|
|
33
|
-
}
|
|
34
|
-
/* NOT FOR BROWSER END */
|
|
35
28
|
/**
|
|
36
29
|
* @param name 标签名
|
|
37
30
|
* @param attr 标签属性
|
|
@@ -115,6 +108,7 @@ class ExtToken extends (0, attributesParent_1.attributesParent)(index_2.TagPairT
|
|
|
115
108
|
innerToken.setAttribute('name', lcName);
|
|
116
109
|
innerToken.type = 'ext-inner';
|
|
117
110
|
super(name, attrToken, innerToken, closed, config, accum);
|
|
111
|
+
this.seal('closed', true);
|
|
118
112
|
}
|
|
119
113
|
/** @override */
|
|
120
114
|
lint(start = this.getAbsoluteIndex()) {
|
|
@@ -41,6 +41,13 @@ class IncludeToken extends (0, hidden_1.hidden)(index_1.TagPairToken) {
|
|
|
41
41
|
lint(start = this.getAbsoluteIndex()) {
|
|
42
42
|
return this.closed ? [] : [(0, lint_1.generateForSelf)(this, { start }, Parser.msg('unclosed $1', `<${this.name}>`))];
|
|
43
43
|
}
|
|
44
|
+
/** @override */
|
|
45
|
+
json() {
|
|
46
|
+
return {
|
|
47
|
+
...super.json(),
|
|
48
|
+
closed: this.closed,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
44
51
|
/* NOT FOR BROWSER */
|
|
45
52
|
/** @override */
|
|
46
53
|
cloneNode() {
|
|
@@ -23,15 +23,11 @@ export declare abstract class TagPairToken extends TagPairToken_base {
|
|
|
23
23
|
#private;
|
|
24
24
|
type: 'ext' | 'include';
|
|
25
25
|
readonly name: string;
|
|
26
|
+
closed: boolean;
|
|
27
|
+
selfClosing: boolean;
|
|
26
28
|
readonly childNodes: [AstNodes, AstNodes];
|
|
27
29
|
abstract get firstChild(): AstNodes;
|
|
28
30
|
abstract get lastChild(): AstNodes;
|
|
29
|
-
/** 是否闭合 */
|
|
30
|
-
get closed(): boolean;
|
|
31
|
-
set closed(value: boolean);
|
|
32
|
-
/** 是否自封闭 */
|
|
33
|
-
get selfClosing(): boolean;
|
|
34
|
-
set selfClosing(value: boolean);
|
|
35
31
|
/** 内部wikitext */
|
|
36
32
|
get innerText(): string | undefined;
|
|
37
33
|
/**
|
|
@@ -7,27 +7,9 @@ const Parser = require("../../index");
|
|
|
7
7
|
const index_1 = require("../index");
|
|
8
8
|
/** 成对标签 */
|
|
9
9
|
class TagPairToken extends (0, fixed_1.fixed)(index_1.Token) {
|
|
10
|
-
#selfClosing;
|
|
11
|
-
#closed;
|
|
12
10
|
#tags;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
return this.#closed;
|
|
16
|
-
}
|
|
17
|
-
/* NOT FOR BROWSER */
|
|
18
|
-
set closed(value) {
|
|
19
|
-
this.#closed ||= value;
|
|
20
|
-
}
|
|
21
|
-
/** 是否自封闭 */
|
|
22
|
-
get selfClosing() {
|
|
23
|
-
return this.#selfClosing;
|
|
24
|
-
}
|
|
25
|
-
set selfClosing(value) {
|
|
26
|
-
if (value !== this.selfClosing && this.lastChild.text()) {
|
|
27
|
-
Parser.warn(`<${this.name}>标签内部的${value ? '文本将被隐藏' : '原有文本将再次可见'}!`);
|
|
28
|
-
}
|
|
29
|
-
this.#selfClosing = value;
|
|
30
|
-
}
|
|
11
|
+
closed;
|
|
12
|
+
selfClosing;
|
|
31
13
|
/** 内部wikitext */
|
|
32
14
|
get innerText() {
|
|
33
15
|
return this.selfClosing ? undefined : this.lastChild.text();
|
|
@@ -43,30 +25,31 @@ class TagPairToken extends (0, fixed_1.fixed)(index_1.Token) {
|
|
|
43
25
|
super(undefined, config);
|
|
44
26
|
this.setAttribute('name', name.toLowerCase());
|
|
45
27
|
this.#tags = [name, closed || name];
|
|
46
|
-
this
|
|
47
|
-
this
|
|
28
|
+
this.closed = closed !== '';
|
|
29
|
+
this.selfClosing = closed === undefined;
|
|
48
30
|
this.append(attr, inner);
|
|
49
31
|
const index = typeof attr === 'string' ? -1 : accum.indexOf(attr);
|
|
50
32
|
accum.splice(index === -1 ? Infinity : index, 0, this);
|
|
33
|
+
Object.defineProperty(this, 'closed', { enumerable: false });
|
|
51
34
|
}
|
|
52
35
|
/** @private */
|
|
53
36
|
toString(omit) {
|
|
54
|
-
const { firstChild, lastChild, nextSibling, name, closed, } = this, [opening, closing] = this.#tags;
|
|
37
|
+
const { selfClosing, firstChild, lastChild, nextSibling, name, closed, } = this, [opening, closing] = this.#tags;
|
|
55
38
|
if (omit && this.matchesTypes(omit)) {
|
|
56
39
|
return '';
|
|
57
40
|
}
|
|
58
41
|
else if (!closed && nextSibling) {
|
|
59
42
|
Parser.error(`自动闭合 <${name}>`, lastChild);
|
|
60
|
-
this
|
|
43
|
+
this.closed = true;
|
|
61
44
|
}
|
|
62
|
-
return
|
|
45
|
+
return selfClosing
|
|
63
46
|
? `<${opening}${firstChild.toString(omit)}/>`
|
|
64
47
|
: `<${opening}${firstChild.toString(omit)}>${lastChild.toString(omit)}${this.closed ? `</${closing}>` : ''}`;
|
|
65
48
|
}
|
|
66
49
|
/** @override */
|
|
67
50
|
text() {
|
|
68
51
|
const [opening, closing] = this.#tags;
|
|
69
|
-
return this
|
|
52
|
+
return this.selfClosing
|
|
70
53
|
? `<${opening}${this.firstChild.text()}/>`
|
|
71
54
|
: `<${opening}${super.text('>')}${this.closed ? `</${closing}>` : ''}`;
|
|
72
55
|
}
|
|
@@ -84,7 +67,7 @@ class TagPairToken extends (0, fixed_1.fixed)(index_1.Token) {
|
|
|
84
67
|
/** @override */
|
|
85
68
|
print() {
|
|
86
69
|
const [opening, closing] = this.#tags;
|
|
87
|
-
return super.print(this
|
|
70
|
+
return super.print(this.selfClosing
|
|
88
71
|
? { pre: `<${opening}`, post: '/>' }
|
|
89
72
|
: { pre: `<${opening}`, sep: '>', post: this.closed ? `</${closing}>` : '' });
|
|
90
73
|
}
|
package/dist/src/transclude.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export declare class TranscludeToken extends Token {
|
|
|
12
12
|
#private;
|
|
13
13
|
type: 'template' | 'magic-word';
|
|
14
14
|
readonly name: string;
|
|
15
|
-
readonly modifier
|
|
15
|
+
readonly modifier: string;
|
|
16
16
|
readonly childNodes: [AtomToken | SyntaxToken, ...ParameterToken[]] | [SyntaxToken, AtomToken, AtomToken, ...ParameterToken[]];
|
|
17
17
|
abstract get children(): [AtomToken | SyntaxToken, ...ParameterToken[]] | [SyntaxToken, AtomToken, AtomToken, ...ParameterToken[]];
|
|
18
18
|
abstract get firstChild(): AtomToken | SyntaxToken;
|
package/dist/src/transclude.js
CHANGED
|
@@ -141,7 +141,7 @@ class TranscludeToken extends index_1.Token {
|
|
|
141
141
|
/** 获取模板或模块名 */
|
|
142
142
|
#getTitle() {
|
|
143
143
|
const isTemplate = this.type === 'template', child = this.childNodes[isTemplate ? 0 : 1];
|
|
144
|
-
return
|
|
144
|
+
return this.normalizeTitle(child.text(), isTemplate ? 10 : 828);
|
|
145
145
|
}
|
|
146
146
|
/** @private */
|
|
147
147
|
afterBuild() {
|
|
@@ -224,12 +224,7 @@ class TranscludeToken extends index_1.Token {
|
|
|
224
224
|
return errors;
|
|
225
225
|
}
|
|
226
226
|
const title = this.#getTitle();
|
|
227
|
-
if (
|
|
228
|
-
rect = { start, ...this.getRootNode().posFromIndex(start) };
|
|
229
|
-
errors.push((0, lint_1.generateForSelf)(this, rect, 'missing module name'));
|
|
230
|
-
return errors;
|
|
231
|
-
}
|
|
232
|
-
else if (title.fragment !== undefined) {
|
|
227
|
+
if (title.fragment !== undefined) {
|
|
233
228
|
rect = { start, ...this.getRootNode().posFromIndex(start) };
|
|
234
229
|
errors.push((0, lint_1.generateForChild)(childNodes[type === 'template' ? 0 : 1], rect, 'useless fragment'));
|
|
235
230
|
}
|