wikiparser-node 0.8.0 → 0.8.1-m
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 +142 -0
- package/index.js +11 -253
- package/lib/element.js +7 -481
- package/lib/node.js +6 -552
- package/lib/text.js +70 -110
- package/lib/title.js +0 -21
- package/mixin/hidden.js +0 -3
- package/package.json +5 -5
- package/parser/brackets.js +0 -1
- package/parser/commentAndExt.js +3 -4
- package/parser/converter.js +0 -1
- package/parser/externalLinks.js +0 -1
- package/parser/hrAndDoubleUnderscore.js +0 -1
- package/parser/html.js +0 -1
- package/parser/links.js +4 -5
- package/parser/list.js +0 -1
- package/parser/magicLinks.js +4 -5
- package/parser/quotes.js +1 -2
- package/parser/table.js +0 -1
- package/src/arg.js +2 -116
- package/src/atom/hidden.js +0 -2
- package/src/atom/index.js +0 -17
- package/src/attribute.js +15 -182
- package/src/attributes.js +4 -308
- package/src/converter.js +2 -108
- package/src/converterFlags.js +0 -187
- package/src/converterRule.js +1 -184
- package/src/extLink.js +1 -120
- package/src/gallery.js +6 -57
- package/src/hasNowiki/index.js +0 -12
- package/src/hasNowiki/pre.js +0 -12
- package/src/heading.js +4 -55
- package/src/html.js +3 -118
- package/src/imageParameter.js +19 -189
- package/src/imagemap.js +1 -60
- package/src/imagemapLink.js +1 -13
- package/src/index.js +3 -529
- package/src/link/category.js +1 -37
- package/src/link/file.js +2 -159
- package/src/link/galleryImage.js +1 -59
- package/src/link/index.js +1 -259
- package/src/magicLink.js +9 -90
- package/src/nested/choose.js +0 -1
- package/src/nested/combobox.js +0 -1
- package/src/nested/index.js +3 -30
- package/src/nested/references.js +0 -1
- package/src/nowiki/comment.js +1 -25
- package/src/nowiki/dd.js +1 -47
- package/src/nowiki/doubleUnderscore.js +1 -31
- package/src/nowiki/hr.js +1 -20
- package/src/nowiki/index.js +1 -23
- package/src/nowiki/list.js +2 -5
- package/src/nowiki/noinclude.js +0 -14
- package/src/nowiki/quote.js +2 -16
- package/src/onlyinclude.js +1 -26
- package/src/paramTag/index.js +1 -24
- package/src/paramTag/inputbox.js +1 -4
- package/src/parameter.js +6 -148
- package/src/syntax.js +0 -68
- package/src/table/index.js +2 -940
- package/src/table/td.js +5 -225
- package/src/table/tr.js +2 -247
- package/src/tagPair/ext.js +3 -24
- package/src/tagPair/include.js +0 -24
- package/src/tagPair/index.js +2 -51
- package/src/transclude.js +20 -519
- package/util/string.js +1 -48
- package/README.md +0 -39
- package/lib/ranges.js +0 -130
- package/mixin/attributeParent.js +0 -117
- package/mixin/fixedToken.js +0 -40
- package/mixin/singleLine.js +0 -31
- package/mixin/sol.js +0 -65
- package/parser/selector.js +0 -177
- package/src/charinsert.js +0 -97
- package/tool/index.js +0 -1202
- package/util/debug.js +0 -73
package/src/converter.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const {text
|
|
3
|
+
const {text} = require('../util/string'),
|
|
4
4
|
Parser = require('..'),
|
|
5
5
|
Token = require('.'),
|
|
6
6
|
ConverterFlagsToken = require('./converterFlags'),
|
|
@@ -13,19 +13,6 @@ const {text, print} = require('../util/string'),
|
|
|
13
13
|
class ConverterToken extends Token {
|
|
14
14
|
type = 'converter';
|
|
15
15
|
|
|
16
|
-
/**
|
|
17
|
-
* 是否无转换
|
|
18
|
-
* @this {ConverterToken & {lastChild: ConverterRuleToken}}
|
|
19
|
-
*/
|
|
20
|
-
get noConvert() {
|
|
21
|
-
return this.hasFlag('R') || this.length === 2 && !this.lastChild.variant;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/** flags */
|
|
25
|
-
get flags() {
|
|
26
|
-
return this.getAllFlags();
|
|
27
|
-
}
|
|
28
|
-
|
|
29
16
|
/**
|
|
30
17
|
* @param {string[]} flags 转换类型标记
|
|
31
18
|
* @param {string[]} rules 转换规则
|
|
@@ -45,19 +32,15 @@ class ConverterToken extends Token {
|
|
|
45
32
|
...rules.slice(1).map(rule => new ConverterRuleToken(rule, true, config, accum)),
|
|
46
33
|
);
|
|
47
34
|
}
|
|
48
|
-
this.getAttribute('protectChildren')(0);
|
|
49
35
|
}
|
|
50
36
|
|
|
51
37
|
/**
|
|
52
38
|
* @override
|
|
53
|
-
* @param {string} selector
|
|
54
39
|
* @returns {string}
|
|
55
40
|
*/
|
|
56
41
|
toString(selector) {
|
|
57
42
|
const {childNodes: [flags, ...rules]} = this;
|
|
58
|
-
return
|
|
59
|
-
? ''
|
|
60
|
-
: `-{${flags.toString(selector)}${flags.length > 0 ? '|' : ''}${rules.map(String).join(';')}}-`;
|
|
43
|
+
return `-{${flags.toString()}${flags.length > 0 ? '|' : ''}${rules.map(String).join(';')}}-`;
|
|
61
44
|
}
|
|
62
45
|
|
|
63
46
|
/**
|
|
@@ -82,95 +65,6 @@ class ConverterToken extends Token {
|
|
|
82
65
|
i = i < 0 ? i + this.length : i;
|
|
83
66
|
return i || this.firstChild.length > 0 ? 1 : 0;
|
|
84
67
|
}
|
|
85
|
-
|
|
86
|
-
/** @override */
|
|
87
|
-
print() {
|
|
88
|
-
const {childNodes: [flags, ...rules]} = this;
|
|
89
|
-
return `<span class="wpb-converter">-{${flags.print()}${
|
|
90
|
-
flags.length > 0 ? '|' : ''
|
|
91
|
-
}${print(rules, {sep: ';'})}}-</span>`;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/** @override */
|
|
95
|
-
cloneNode() {
|
|
96
|
-
const [flags, ...rules] = this.cloneChildNodes();
|
|
97
|
-
return Parser.run(() => {
|
|
98
|
-
const token = new ConverterToken([], [], this.getAttribute('config'));
|
|
99
|
-
token.firstChild.safeReplaceWith(flags);
|
|
100
|
-
token.append(...rules);
|
|
101
|
-
return token;
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* 获取所有转换类型标记
|
|
107
|
-
* @this {{firstChild: ConverterFlagsToken}}
|
|
108
|
-
*/
|
|
109
|
-
getAllFlags() {
|
|
110
|
-
return this.firstChild.getAllFlags();
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* 获取有效的转换类型标记
|
|
115
|
-
* @this {{firstChild: ConverterFlagsToken}}
|
|
116
|
-
*/
|
|
117
|
-
getEffectiveFlags() {
|
|
118
|
-
return this.firstChild.getEffectiveFlags();
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* 获取未知的转换类型标记
|
|
123
|
-
* @this {{firstChild: ConverterFlagsToken}}
|
|
124
|
-
*/
|
|
125
|
-
getUnknownFlags() {
|
|
126
|
-
return this.firstChild.getUnknownFlags();
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* 是否具有某转换类型标记
|
|
131
|
-
* @this {{firstChild: ConverterFlagsToken}}
|
|
132
|
-
* @param {string} flag 转换类型标记
|
|
133
|
-
*/
|
|
134
|
-
hasFlag(flag) {
|
|
135
|
-
return this.firstChild.hasFlag(flag);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* 是否具有某有效的转换类型标记
|
|
140
|
-
* @this {{firstChild: ConverterFlagsToken}}
|
|
141
|
-
* @param {string} flag 转换类型标记
|
|
142
|
-
*/
|
|
143
|
-
hasEffectiveFlag(flag) {
|
|
144
|
-
return this.firstChild.hasEffectiveFlag(flag);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* 移除转换类型标记
|
|
149
|
-
* @this {{firstChild: ConverterFlagsToken}}
|
|
150
|
-
* @param {string} flag 转换类型标记
|
|
151
|
-
*/
|
|
152
|
-
removeFlag(flag) {
|
|
153
|
-
this.firstChild.removeFlag(flag);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* 设置转换类型标记
|
|
158
|
-
* @this {{firstChild: ConverterFlagsToken}}
|
|
159
|
-
* @param {string} flag 转换类型标记
|
|
160
|
-
*/
|
|
161
|
-
setFlag(flag) {
|
|
162
|
-
this.firstChild.setFlag(flag);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* 开关某转换类型标记
|
|
167
|
-
* @this {{firstChild: ConverterFlagsToken}}
|
|
168
|
-
* @param {string} flag 转换类型标记
|
|
169
|
-
*/
|
|
170
|
-
toggleFlag(flag) {
|
|
171
|
-
this.firstChild.toggleFlag(flag);
|
|
172
|
-
}
|
|
173
68
|
}
|
|
174
69
|
|
|
175
|
-
Parser.classes.ConverterToken = __filename;
|
|
176
70
|
module.exports = ConverterToken;
|
package/src/converterFlags.js
CHANGED
|
@@ -21,7 +21,6 @@ class ConverterFlagsToken extends Token {
|
|
|
21
21
|
*/
|
|
22
22
|
constructor(flags, config = Parser.getConfig(), accum = []) {
|
|
23
23
|
super(undefined, config, true, accum, {
|
|
24
|
-
AtomToken: ':',
|
|
25
24
|
});
|
|
26
25
|
this.append(...flags.map(flag => new AtomToken(flag, 'converter-flag', config, accum)));
|
|
27
26
|
}
|
|
@@ -32,17 +31,10 @@ class ConverterFlagsToken extends Token {
|
|
|
32
31
|
*/
|
|
33
32
|
afterBuild() {
|
|
34
33
|
this.#flags = this.childNodes.map(child => child.text().trim());
|
|
35
|
-
const /** @type {AstListener} */ converterFlagsListener = ({prevTarget}) => {
|
|
36
|
-
if (prevTarget) {
|
|
37
|
-
this.#flags[this.childNodes.indexOf(prevTarget)] = prevTarget.text().trim();
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
this.addEventListener(['remove', 'insert', 'text', 'replace'], converterFlagsListener);
|
|
41
34
|
}
|
|
42
35
|
|
|
43
36
|
/**
|
|
44
37
|
* @override
|
|
45
|
-
* @param {string} selector
|
|
46
38
|
*/
|
|
47
39
|
toString(selector) {
|
|
48
40
|
return super.toString(selector, ';');
|
|
@@ -58,11 +50,6 @@ class ConverterFlagsToken extends Token {
|
|
|
58
50
|
return 1;
|
|
59
51
|
}
|
|
60
52
|
|
|
61
|
-
/** @override */
|
|
62
|
-
print() {
|
|
63
|
-
return super.print({sep: ';'});
|
|
64
|
-
}
|
|
65
|
-
|
|
66
53
|
/**
|
|
67
54
|
* @override
|
|
68
55
|
* @param {number} start 起始位置
|
|
@@ -105,180 +92,6 @@ class ConverterFlagsToken extends Token {
|
|
|
105
92
|
const variants = new Set(this.getAttribute('config').variants);
|
|
106
93
|
return new Set(this.#flags.filter(flag => variants.has(flag)));
|
|
107
94
|
}
|
|
108
|
-
|
|
109
|
-
/** @override */
|
|
110
|
-
cloneNode() {
|
|
111
|
-
const cloned = this.cloneChildNodes();
|
|
112
|
-
return Parser.run(() => {
|
|
113
|
-
const token = new ConverterFlagsToken([], this.getAttribute('config'));
|
|
114
|
-
token.append(...cloned);
|
|
115
|
-
token.afterBuild();
|
|
116
|
-
return token;
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* @override
|
|
122
|
-
* @template {string} T
|
|
123
|
-
* @param {T} key 属性键
|
|
124
|
-
* @returns {TokenAttribute<T>}
|
|
125
|
-
*/
|
|
126
|
-
getAttribute(key) {
|
|
127
|
-
if (key === 'flags') {
|
|
128
|
-
return Parser.debugging ? this.#flags : [...this.#flags];
|
|
129
|
-
}
|
|
130
|
-
return super.getAttribute(key);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* @override
|
|
135
|
-
* @param {PropertyKey} key 属性键
|
|
136
|
-
*/
|
|
137
|
-
hasAttribute(key) {
|
|
138
|
-
return key === 'flags' || super.hasAttribute(key);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* @override
|
|
143
|
-
* @param {number} i 移除位置
|
|
144
|
-
* @complexity `n`
|
|
145
|
-
*/
|
|
146
|
-
removeAt(i) {
|
|
147
|
-
const /** @type {AtomToken} */ token = super.removeAt(i);
|
|
148
|
-
this.#flags?.splice(i, 1);
|
|
149
|
-
return token;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* @override
|
|
154
|
-
* @param {AtomToken} token 待插入的子节点
|
|
155
|
-
* @param {number} i 插入位置
|
|
156
|
-
* @complexity `n`
|
|
157
|
-
*/
|
|
158
|
-
insertAt(token, i = this.length) {
|
|
159
|
-
super.insertAt(token, i);
|
|
160
|
-
this.#flags?.splice(i, 0, token.text());
|
|
161
|
-
return token;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/** 获取所有转换类型标记 */
|
|
165
|
-
getAllFlags() {
|
|
166
|
-
return new Set(this.#flags);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* 获取转换类型标记节点
|
|
171
|
-
* @param {string} flag 转换类型标记
|
|
172
|
-
* @returns {AtomToken[]}
|
|
173
|
-
* @complexity `n`
|
|
174
|
-
*/
|
|
175
|
-
getFlagToken(flag) {
|
|
176
|
-
return this.#flags.includes(flag) ? this.childNodes.filter(child => child.text().trim() === flag) : [];
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* 获取有效转换类型标记
|
|
181
|
-
* @complexity `n`
|
|
182
|
-
*/
|
|
183
|
-
getEffectiveFlags() {
|
|
184
|
-
const variantFlags = this.getVariantFlags(),
|
|
185
|
-
unknownFlags = this.getUnknownFlags();
|
|
186
|
-
if (variantFlags.size > 0) {
|
|
187
|
-
return new Set([...variantFlags, ...unknownFlags]);
|
|
188
|
-
}
|
|
189
|
-
const flags = new Set([...this.#flags.filter(flag => definedFlags.has(flag)), ...unknownFlags]);
|
|
190
|
-
if (flags.size === 0) {
|
|
191
|
-
return new Set('S');
|
|
192
|
-
} else if (flags.has('R')) {
|
|
193
|
-
return new Set('R');
|
|
194
|
-
} else if (flags.has('N')) {
|
|
195
|
-
return new Set('N');
|
|
196
|
-
} else if (flags.has('-')) {
|
|
197
|
-
return new Set('-');
|
|
198
|
-
} else if (flags.has('H')) {
|
|
199
|
-
const hasT = flags.has('T'),
|
|
200
|
-
hasD = flags.has('D');
|
|
201
|
-
return hasT && hasD
|
|
202
|
-
? new Set(['+', 'H', 'T', 'D'])
|
|
203
|
-
: new Set(['+', 'H', ...hasT ? ['T'] : [], ...hasD ? ['D'] : [], ...unknownFlags]);
|
|
204
|
-
}
|
|
205
|
-
if (flags.size === 1 && flags.has('T')) {
|
|
206
|
-
flags.add('H');
|
|
207
|
-
}
|
|
208
|
-
if (flags.has('A')) {
|
|
209
|
-
flags.add('+');
|
|
210
|
-
flags.add('S');
|
|
211
|
-
}
|
|
212
|
-
if (flags.has('D')) {
|
|
213
|
-
flags.delete('S');
|
|
214
|
-
}
|
|
215
|
-
return flags;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* 是否具有某转换类型标记
|
|
220
|
-
* @param {string} flag 转换类型标记
|
|
221
|
-
*/
|
|
222
|
-
hasFlag(flag) {
|
|
223
|
-
return typeof flag === 'string' ? this.#flags.includes(flag) : this.typeError('hasFlag', 'String');
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
/**
|
|
227
|
-
* 是否具有某有效转换类型标记
|
|
228
|
-
* @param {string} flag 转换类型标记
|
|
229
|
-
* @complexity `n`
|
|
230
|
-
*/
|
|
231
|
-
hasEffectiveFlag(flag) {
|
|
232
|
-
return typeof flag === 'string' ? this.getEffectiveFlags().has(flag) : this.typeError('hasFlag', 'String');
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* 移除某转换类型标记
|
|
237
|
-
* @param {string} flag 转换类型标记
|
|
238
|
-
* @complexity `n²`
|
|
239
|
-
*/
|
|
240
|
-
removeFlag(flag) {
|
|
241
|
-
for (const token of this.getFlagToken(flag)) {
|
|
242
|
-
token.remove();
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
/**
|
|
247
|
-
* 添加转换类型标记
|
|
248
|
-
* @param {string} flag 转换类型标记
|
|
249
|
-
* @complexity `n`
|
|
250
|
-
*/
|
|
251
|
-
#newFlag(flag) {
|
|
252
|
-
const token = Parser.run(() => new AtomToken(flag, 'converter-flag', this.getAttribute('config')));
|
|
253
|
-
this.insertAt(token);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* 设置转换类型标记
|
|
258
|
-
* @param {string} flag 转换类型标记
|
|
259
|
-
* @complexity `n`
|
|
260
|
-
*/
|
|
261
|
-
setFlag(flag) {
|
|
262
|
-
if (!this.#flags.includes(flag)) {
|
|
263
|
-
this.#newFlag(flag);
|
|
264
|
-
} else if (!this.getEffectiveFlags().has(flag)) {
|
|
265
|
-
Parser.error('此 flag 不会生效', flag);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* 开关转换类型标记
|
|
271
|
-
* @param {string} flag 转换类型标记
|
|
272
|
-
* @complexity `n²`
|
|
273
|
-
*/
|
|
274
|
-
toggleFlag(flag) {
|
|
275
|
-
if (this.#flags.includes(flag)) {
|
|
276
|
-
this.removeFlag(flag);
|
|
277
|
-
} else {
|
|
278
|
-
this.#newFlag(flag);
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
95
|
}
|
|
282
96
|
|
|
283
|
-
Parser.classes.ConverterFlagsToken = __filename;
|
|
284
97
|
module.exports = ConverterFlagsToken;
|
package/src/converterRule.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const Parser = require('..'),
|
|
4
|
-
{undo} = require('../util/debug'),
|
|
5
|
-
{noWrap} = require('../util/string'),
|
|
6
4
|
Token = require('.'),
|
|
7
5
|
AtomToken = require('./atom');
|
|
8
6
|
|
|
@@ -13,31 +11,6 @@ const Parser = require('..'),
|
|
|
13
11
|
class ConverterRuleToken extends Token {
|
|
14
12
|
type = 'converter-rule';
|
|
15
13
|
|
|
16
|
-
/** 语言变体 */
|
|
17
|
-
get variant() {
|
|
18
|
-
return this.childNodes.at(-2)?.text()?.trim() ?? '';
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
set variant(variant) {
|
|
22
|
-
this.setVariant(variant);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/** 是否是单向转换 */
|
|
26
|
-
get unidirectional() {
|
|
27
|
-
return this.length === 3;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
set unidirectional(unidirectional) {
|
|
31
|
-
if (unidirectional === false) {
|
|
32
|
-
this.makeBidirectional();
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/** 是否是双向转换 */
|
|
37
|
-
get bidirectional() {
|
|
38
|
-
return this.length === 2;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
14
|
/**
|
|
42
15
|
* @param {string} rule 转换规则
|
|
43
16
|
* @param {boolean} hasColon 是否带有":"
|
|
@@ -62,16 +35,14 @@ class ConverterRuleToken extends Token {
|
|
|
62
35
|
} else {
|
|
63
36
|
super.insertAt(new AtomToken(rule, 'converter-rule-noconvert', config, accum));
|
|
64
37
|
}
|
|
65
|
-
this.getAttribute('protectChildren')('1:');
|
|
66
38
|
}
|
|
67
39
|
|
|
68
40
|
/**
|
|
69
41
|
* @override
|
|
70
|
-
* @param {string} selector
|
|
71
42
|
* @returns {string}
|
|
72
43
|
*/
|
|
73
44
|
toString(selector) {
|
|
74
|
-
if (this.length === 3
|
|
45
|
+
if (this.length === 3) {
|
|
75
46
|
const {childNodes: [from, variant, to]} = this;
|
|
76
47
|
return `${from.toString(selector)}=>${variant.toString(selector)}:${to.toString(selector)}`;
|
|
77
48
|
}
|
|
@@ -99,160 +70,6 @@ class ConverterRuleToken extends Token {
|
|
|
99
70
|
i = i < 0 ? i + length : i;
|
|
100
71
|
return i === 0 && length === 3 ? 2 : 1;
|
|
101
72
|
}
|
|
102
|
-
|
|
103
|
-
/** @override */
|
|
104
|
-
print() {
|
|
105
|
-
if (this.length === 3) {
|
|
106
|
-
const {childNodes: [from, variant, to]} = this;
|
|
107
|
-
return `<span class="wpb-converter-rule">${from.print()}=>${variant.print()}:${to.print()}</span>`;
|
|
108
|
-
}
|
|
109
|
-
return super.print({sep: ':'});
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/** @override */
|
|
113
|
-
cloneNode() {
|
|
114
|
-
const cloned = this.cloneChildNodes(),
|
|
115
|
-
placeholders = ['', 'zh:', '=>zh:'],
|
|
116
|
-
placeholder = placeholders[cloned.length - 1];
|
|
117
|
-
return Parser.run(() => {
|
|
118
|
-
const token = new ConverterRuleToken(placeholder, placeholder, this.getAttribute('config'));
|
|
119
|
-
for (let i = 0; i < cloned.length; i++) {
|
|
120
|
-
token.childNodes[i].safeReplaceWith(cloned[i]);
|
|
121
|
-
}
|
|
122
|
-
token.afterBuild();
|
|
123
|
-
return token;
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/** @override */
|
|
128
|
-
afterBuild() {
|
|
129
|
-
const /** @type {AstListener} */ converterRuleListener = (e, data) => {
|
|
130
|
-
const {childNodes, length} = this,
|
|
131
|
-
{prevTarget} = e;
|
|
132
|
-
if (length > 1 && childNodes.at(-2) === prevTarget) {
|
|
133
|
-
const v = prevTarget.text().trim(),
|
|
134
|
-
{variants} = this.getAttribute('config');
|
|
135
|
-
if (!variants.includes(v)) {
|
|
136
|
-
undo(e, data);
|
|
137
|
-
throw new Error(`无效的语言变体:${v}`);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
this.addEventListener(['remove', 'insert', 'text', 'replace'], converterRuleListener);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* @override
|
|
146
|
-
* @param {number} i 移除位置
|
|
147
|
-
* @returns {AtomToken}
|
|
148
|
-
* @throws `Error` 至少保留1个子节点
|
|
149
|
-
*/
|
|
150
|
-
removeAt(i) {
|
|
151
|
-
if (this.length === 1) {
|
|
152
|
-
throw new Error(`${this.constructor.name} 需至少保留 1 个子节点!`);
|
|
153
|
-
}
|
|
154
|
-
const removed = super.removeAt(i);
|
|
155
|
-
if (this.length === 1) {
|
|
156
|
-
this.firstChild.type = 'converter-rule-noconvert';
|
|
157
|
-
}
|
|
158
|
-
return removed;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* @override
|
|
163
|
-
* @throws `Error` 请勿手动插入子节点
|
|
164
|
-
*/
|
|
165
|
-
insertAt() {
|
|
166
|
-
throw new Error(`转换规则语法复杂,请勿尝试对 ${this.constructor.name} 手动插入子节点!`);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/** 修改为不转换 */
|
|
170
|
-
noConvert() {
|
|
171
|
-
const {length} = this;
|
|
172
|
-
for (let i = 0; i < length - 1; i++) { // ConverterRuleToken只能从前往后删除子节点
|
|
173
|
-
this.removeAt(0);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* 设置转换目标
|
|
179
|
-
* @param {string} to 转换目标
|
|
180
|
-
* @throws `SyntaxError` 非法的转换目标
|
|
181
|
-
*/
|
|
182
|
-
setTo(to) {
|
|
183
|
-
to = String(to);
|
|
184
|
-
const config = this.getAttribute('config'),
|
|
185
|
-
root = Parser.parse(`-{|${config.variants[0]}:${to}}-`, this.getAttribute('include'), undefined, config),
|
|
186
|
-
{length, firstChild: converter} = root,
|
|
187
|
-
{lastChild: converterRule, type, length: converterLength} = converter;
|
|
188
|
-
if (length !== 1 || type !== 'converter' || converterLength !== 2 || converterRule.length !== 2) {
|
|
189
|
-
throw new SyntaxError(`非法的转换目标:${noWrap(to)}`);
|
|
190
|
-
}
|
|
191
|
-
const {lastChild} = converterRule;
|
|
192
|
-
converterRule.destroy(true);
|
|
193
|
-
this.lastChild.safeReplaceWith(lastChild);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* 设置语言变体
|
|
198
|
-
* @param {string} variant 语言变体
|
|
199
|
-
* @throws `RangeError` 无效的语言变体
|
|
200
|
-
*/
|
|
201
|
-
setVariant(variant) {
|
|
202
|
-
if (typeof variant !== 'string') {
|
|
203
|
-
this.typeError('setVariant', 'String');
|
|
204
|
-
}
|
|
205
|
-
const config = this.getAttribute('config'),
|
|
206
|
-
v = variant.trim();
|
|
207
|
-
if (!config.variants.includes(v)) {
|
|
208
|
-
throw new RangeError(`无效的语言变体:${v}`);
|
|
209
|
-
} else if (this.length === 1) {
|
|
210
|
-
super.insertAt(Parser.run(() => new AtomToken(variant, 'converter-rule-variant', config)), 0);
|
|
211
|
-
} else {
|
|
212
|
-
this.childNodes.at(-2).setText(variant);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* 设置转换原文
|
|
218
|
-
* @param {string} from 转换原文
|
|
219
|
-
* @throws `Error` 尚未指定语言变体
|
|
220
|
-
* @throws `SyntaxError` 非法的转换原文
|
|
221
|
-
*/
|
|
222
|
-
setFrom(from) {
|
|
223
|
-
const {variant, unidirectional} = this;
|
|
224
|
-
if (!variant) {
|
|
225
|
-
throw new Error('请先指定语言变体!');
|
|
226
|
-
}
|
|
227
|
-
from = String(from);
|
|
228
|
-
const config = this.getAttribute('config'),
|
|
229
|
-
root = Parser.parse(`-{|${from}=>${variant}:}-`, this.getAttribute('include'), undefined, config),
|
|
230
|
-
{length, firstChild: converter} = root,
|
|
231
|
-
{type, length: converterLength, lastChild: converterRule} = converter;
|
|
232
|
-
if (length !== 1 || type !== 'converter' || converterLength !== 2 || converterRule.length !== 3) {
|
|
233
|
-
throw new SyntaxError(`非法的转换原文:${noWrap(from)}`);
|
|
234
|
-
} else if (unidirectional) {
|
|
235
|
-
this.firstChild.safeReplaceWith(converterRule.firstChild);
|
|
236
|
-
} else {
|
|
237
|
-
super.insertAt(converterRule.firstChild, 0);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
/**
|
|
242
|
-
* 修改为单向转换
|
|
243
|
-
* @param {string} from 转换来源
|
|
244
|
-
*/
|
|
245
|
-
makeUnidirectional(from) {
|
|
246
|
-
this.setFrom(from);
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/** 修改为双向转换 */
|
|
250
|
-
makeBidirectional() {
|
|
251
|
-
if (this.unidirectional) {
|
|
252
|
-
this.removeAt(0);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
73
|
}
|
|
256
74
|
|
|
257
|
-
Parser.classes.ConverterRuleToken = __filename;
|
|
258
75
|
module.exports = ConverterRuleToken;
|