wikiparser-node 0.10.0 → 0.11.0-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.
Files changed (155) hide show
  1. package/README.md +44 -32
  2. package/config/.schema.json +1 -8
  3. package/config/default.json +1 -2
  4. package/config/llwiki.json +1 -36
  5. package/config/moegirl.json +1 -45
  6. package/config/zhwiki.json +1 -467
  7. package/dist/index.d.ts +110 -0
  8. package/dist/lib/element.d.ts +48 -0
  9. package/dist/lib/node.d.ts +108 -0
  10. package/dist/lib/text.d.ts +30 -0
  11. package/dist/lib/title.d.ts +15 -0
  12. package/dist/mixin/hidden.d.ts +8 -0
  13. package/dist/parser/brackets.d.ts +12 -0
  14. package/dist/parser/commentAndExt.d.ts +8 -0
  15. package/dist/parser/converter.d.ts +7 -0
  16. package/dist/parser/externalLinks.d.ts +7 -0
  17. package/dist/parser/hrAndDoubleUnderscore.d.ts +11 -0
  18. package/dist/parser/html.d.ts +7 -0
  19. package/dist/parser/links.d.ts +7 -0
  20. package/dist/parser/list.d.ts +7 -0
  21. package/dist/parser/magicLinks.d.ts +7 -0
  22. package/dist/parser/quotes.d.ts +7 -0
  23. package/dist/parser/table.d.ts +11 -0
  24. package/dist/src/arg.d.ts +25 -0
  25. package/dist/src/atom/hidden.d.ts +5 -0
  26. package/dist/src/atom/index.d.ts +14 -0
  27. package/dist/src/attribute.d.ts +42 -0
  28. package/dist/src/attributes.d.ts +33 -0
  29. package/dist/src/converter.d.ts +29 -0
  30. package/dist/src/converterFlags.d.ts +27 -0
  31. package/dist/src/converterRule.d.ts +29 -0
  32. package/dist/src/extLink.d.ts +22 -0
  33. package/dist/src/gallery.d.ts +19 -0
  34. package/dist/src/hasNowiki/index.d.ts +14 -0
  35. package/dist/src/hasNowiki/pre.d.ts +13 -0
  36. package/dist/src/heading.d.ts +24 -0
  37. package/dist/src/html.d.ts +33 -0
  38. package/dist/src/imageParameter.d.ts +23 -0
  39. package/dist/src/imagemap.d.ts +26 -0
  40. package/dist/src/imagemapLink.d.ts +16 -0
  41. package/dist/src/index.d.ts +53 -0
  42. package/dist/src/link/category.d.ts +8 -0
  43. package/dist/src/link/file.d.ts +27 -0
  44. package/dist/src/link/galleryImage.d.ts +15 -0
  45. package/dist/src/link/index.d.ts +29 -0
  46. package/dist/src/magicLink.d.ts +14 -0
  47. package/dist/src/nested/choose.d.ts +13 -0
  48. package/dist/src/nested/combobox.d.ts +13 -0
  49. package/dist/src/nested/index.d.ts +20 -0
  50. package/dist/src/nested/references.d.ts +13 -0
  51. package/dist/src/nowiki/comment.d.ts +19 -0
  52. package/dist/src/nowiki/dd.d.ts +8 -0
  53. package/dist/src/nowiki/doubleUnderscore.d.ts +12 -0
  54. package/dist/src/nowiki/hr.d.ts +13 -0
  55. package/dist/src/nowiki/index.d.ts +18 -0
  56. package/dist/src/nowiki/list.d.ts +8 -0
  57. package/dist/src/nowiki/noinclude.d.ts +8 -0
  58. package/dist/src/nowiki/quote.d.ts +20 -0
  59. package/dist/src/onlyinclude.d.ts +17 -0
  60. package/dist/src/paramTag/index.d.ts +24 -0
  61. package/dist/src/paramTag/inputbox.d.ts +8 -0
  62. package/dist/src/parameter.d.ts +28 -0
  63. package/dist/src/syntax.d.ts +15 -0
  64. package/dist/src/table/index.d.ts +16 -0
  65. package/dist/src/table/td.d.ts +39 -0
  66. package/dist/src/table/tr.d.ts +17 -0
  67. package/dist/src/tagPair/ext.d.ts +17 -0
  68. package/dist/src/tagPair/include.d.ts +16 -0
  69. package/dist/src/tagPair/index.d.ts +28 -0
  70. package/dist/src/transclude.d.ts +75 -0
  71. package/dist/util/lint.d.ts +28 -0
  72. package/dist/util/string.d.ts +31 -0
  73. package/i18n/zh-hans.json +1 -1
  74. package/i18n/zh-hant.json +1 -1
  75. package/index.js +5 -257
  76. package/lib/element.js +7 -482
  77. package/lib/node.js +11 -540
  78. package/lib/text.js +3 -96
  79. package/lib/title.js +1 -28
  80. package/mixin/hidden.js +0 -3
  81. package/package.json +11 -5
  82. package/parser/brackets.js +3 -2
  83. package/parser/commentAndExt.js +8 -6
  84. package/parser/converter.js +1 -2
  85. package/parser/externalLinks.js +1 -2
  86. package/parser/hrAndDoubleUnderscore.js +1 -2
  87. package/parser/html.js +1 -2
  88. package/parser/links.js +5 -6
  89. package/parser/list.js +1 -2
  90. package/parser/magicLinks.js +1 -2
  91. package/parser/quotes.js +1 -2
  92. package/parser/table.js +1 -2
  93. package/src/arg.js +4 -118
  94. package/src/atom/hidden.js +0 -2
  95. package/src/atom/index.js +1 -18
  96. package/src/attribute.js +6 -190
  97. package/src/attributes.js +5 -308
  98. package/src/converter.js +3 -109
  99. package/src/converterFlags.js +1 -188
  100. package/src/converterRule.js +2 -184
  101. package/src/extLink.js +2 -122
  102. package/src/gallery.js +2 -56
  103. package/src/hasNowiki/index.js +1 -13
  104. package/src/hasNowiki/pre.js +1 -13
  105. package/src/heading.js +4 -55
  106. package/src/html.js +5 -120
  107. package/src/imageParameter.js +3 -165
  108. package/src/imagemap.js +3 -62
  109. package/src/imagemapLink.js +2 -14
  110. package/src/index.js +9 -530
  111. package/src/link/category.js +1 -32
  112. package/src/link/file.js +3 -158
  113. package/src/link/galleryImage.js +3 -61
  114. package/src/link/index.js +4 -273
  115. package/src/magicLink.js +6 -87
  116. package/src/nested/choose.js +1 -2
  117. package/src/nested/combobox.js +1 -2
  118. package/src/nested/index.js +8 -32
  119. package/src/nested/references.js +1 -2
  120. package/src/nowiki/comment.js +2 -26
  121. package/src/nowiki/dd.js +1 -47
  122. package/src/nowiki/doubleUnderscore.js +1 -31
  123. package/src/nowiki/hr.js +2 -21
  124. package/src/nowiki/index.js +2 -24
  125. package/src/nowiki/list.js +2 -5
  126. package/src/nowiki/noinclude.js +0 -14
  127. package/src/nowiki/quote.js +2 -16
  128. package/src/onlyinclude.js +2 -27
  129. package/src/paramTag/index.js +2 -25
  130. package/src/paramTag/inputbox.js +2 -5
  131. package/src/parameter.js +6 -148
  132. package/src/syntax.js +1 -69
  133. package/src/table/index.js +2 -939
  134. package/src/table/td.js +6 -226
  135. package/src/table/tr.js +3 -248
  136. package/src/tagPair/ext.js +4 -23
  137. package/src/tagPair/include.js +1 -25
  138. package/src/tagPair/index.js +3 -52
  139. package/src/transclude.js +6 -513
  140. package/typings/api.d.ts +9 -0
  141. package/typings/index.d.ts +51 -0
  142. package/typings/node.d.ts +16 -0
  143. package/typings/parser.d.ts +5 -0
  144. package/typings/token.d.ts +28 -0
  145. package/util/lint.js +2 -0
  146. package/util/string.js +0 -51
  147. package/lib/ranges.js +0 -130
  148. package/mixin/attributeParent.js +0 -117
  149. package/mixin/fixedToken.js +0 -40
  150. package/mixin/singleLine.js +0 -31
  151. package/mixin/sol.js +0 -54
  152. package/parser/selector.js +0 -177
  153. package/src/charinsert.js +0 -97
  154. package/tool/index.js +0 -1202
  155. package/util/debug.js +0 -73
package/src/table/td.js CHANGED
@@ -1,21 +1,15 @@
1
1
  'use strict';
2
2
 
3
3
  const {generateForChild} = require('../../util/lint'),
4
- fixedToken = require('../../mixin/fixedToken'),
5
- {typeError} = require('../../util/debug'),
6
- {isPlainObject} = require('../../util/base'),
7
4
  Parser = require('../..'),
8
5
  Token = require('..'),
9
6
  TrToken = require('./tr');
10
7
 
11
- const aliases = {td: '\n|', th: '\n!', caption: '\n|+'},
12
- openingPattern = /^(?:\n[^\S\n]*(?:[|!]|\|\+|\{\{\s*!\s*\}\}\+?)|(?:\||\{\{\s*!\s*\}\}){2}|!!|\{\{\s*!!\s*\}\})$/u;
13
-
14
8
  /**
15
9
  * `<td>`、`<th>`和`<caption>`
16
10
  * @classdesc `{childNodes: [SyntaxToken, AttributesToken, Token]}`
17
11
  */
18
- class TdToken extends fixedToken(TrToken) {
12
+ class TdToken extends TrToken {
19
13
  type = 'td';
20
14
  #innerSyntax = '';
21
15
 
@@ -27,46 +21,13 @@ class TdToken extends fixedToken(TrToken) {
27
21
  return this.getSyntax().subtype;
28
22
  }
29
23
 
30
- set subtype(subtype) {
31
- this.setSyntax(subtype);
32
- }
33
-
34
- /** rowspan */
35
- get rowspan() {
36
- return this.getAttr('rowspan');
37
- }
38
-
39
- set rowspan(rowspan) {
40
- this.setAttr('rowspan', rowspan);
41
- }
42
-
43
- /** colspan */
44
- get colspan() {
45
- return this.getAttr('colspan');
46
- }
47
-
48
- set colspan(colspan) {
49
- this.setAttr('colspan', colspan);
50
- }
51
-
52
- /** 内部wikitext */
53
- get innerText() {
54
- return this.lastChild.text();
55
- }
56
-
57
- /** 是否位于行首 */
58
- isIndependent() {
59
- return this.firstChild.text()[0] === '\n';
60
- }
61
-
62
24
  /**
63
25
  * 获取单元格语法信息
64
- * @returns {{subtype: 'td'|'th'|'caption', escape: boolean, correction: boolean}}
26
+ * @returns {{subtype: 'td'|'th'|'caption'}}
65
27
  * @complexity `n`
66
28
  */
67
29
  getSyntax() {
68
30
  const syntax = this.firstChild.text(),
69
- esc = syntax.includes('{{'),
70
31
  char = syntax.at(-1);
71
32
  let subtype = 'td';
72
33
  if (char === '!') {
@@ -74,29 +35,13 @@ class TdToken extends fixedToken(TrToken) {
74
35
  } else if (char === '+') {
75
36
  subtype = 'caption';
76
37
  }
77
- if (this.isIndependent()) {
78
- return {subtype, escape: esc, correction: false};
79
- }
80
- const {previousSibling} = this;
81
- if (previousSibling?.type !== 'td') {
82
- return {subtype, escape: esc, correction: true};
83
- }
84
- const result = previousSibling.getSyntax();
85
- result.escape ||= esc;
86
- result.correction = previousSibling.lastChild
87
- .toString('comment, ext, include, noinclude, arg, template, magic-word')
88
- .includes('\n');
89
- if (subtype === 'th' && result.subtype !== 'th') {
90
- result.subtype = 'th';
91
- result.correction = true;
92
- }
93
- return result;
38
+ return {subtype};
94
39
  }
95
40
 
96
41
  /**
97
42
  * @param {string} syntax 单元格语法
98
43
  * @param {string} inner 内部wikitext
99
- * @param {accum} accum
44
+ * @param {import('../../typings/token').accum} accum
100
45
  */
101
46
  constructor(syntax, inner, config = Parser.getConfig(), accum = []) {
102
47
  let innerSyntax = inner?.match(/\||\0\d+!\x7F/u),
@@ -105,7 +50,7 @@ class TdToken extends fixedToken(TrToken) {
105
50
  innerSyntax = undefined;
106
51
  attr = '';
107
52
  }
108
- super(syntax, attr, config, accum, openingPattern);
53
+ super(syntax, attr, config, accum);
109
54
  if (innerSyntax) {
110
55
  [this.#innerSyntax] = innerSyntax;
111
56
  }
@@ -113,8 +58,6 @@ class TdToken extends fixedToken(TrToken) {
113
58
  const innerToken = new Token(inner?.slice(innerSyntax?.index + this.#innerSyntax.length), config, true, accum);
114
59
  innerToken.type = 'td-inner';
115
60
  this.insertAt(innerToken.setAttribute('stage', 4));
116
- this.setAttribute('acceptable', {SyntaxToken: 0, AttributesToken: 1, Token: 2})
117
- .seal(['getRowCount', 'getNthCol', 'insertTableCell'], true);
118
61
  }
119
62
 
120
63
  /** @override */
@@ -126,16 +69,12 @@ class TdToken extends fixedToken(TrToken) {
126
69
 
127
70
  /**
128
71
  * @override
129
- * @param {string} selector
130
72
  * @returns {string}
131
73
  * @complexity `n`
132
74
  */
133
75
  toString(selector) {
134
- this.#correct();
135
76
  const {childNodes: [syntax, attr, inner]} = this;
136
- return selector && this.matches(selector)
137
- ? ''
138
- : `${syntax.toString(selector)}${attr.toString(selector)}${this.#innerSyntax}${inner.toString(selector)}`;
77
+ return `${syntax.toString()}${attr.toString()}${this.#innerSyntax}${inner.toString()}`;
139
78
  }
140
79
 
141
80
  /**
@@ -144,7 +83,6 @@ class TdToken extends fixedToken(TrToken) {
144
83
  * @complexity `n`
145
84
  */
146
85
  text() {
147
- this.#correct();
148
86
  const {childNodes: [syntax, attr, inner]} = this;
149
87
  return `${syntax.text()}${attr.text()}${this.#innerSyntax}${inner.text()}`;
150
88
  }
@@ -156,7 +94,6 @@ class TdToken extends fixedToken(TrToken) {
156
94
  getGaps(i = 0) {
157
95
  i = i < 0 ? i + this.length : i;
158
96
  if (i === 1) {
159
- this.#correct();
160
97
  return this.#innerSyntax.length;
161
98
  }
162
99
  return 0;
@@ -176,163 +113,6 @@ class TdToken extends fixedToken(TrToken) {
176
113
  }
177
114
  return errors;
178
115
  }
179
-
180
- /** @override */
181
- print() {
182
- const {childNodes: [syntax, attr, inner]} = this;
183
- return `<span class="wpb-td">${syntax.print()}${attr.print()}${this.#innerSyntax}${inner.print()}</span>`;
184
- }
185
-
186
- /** @override */
187
- cloneNode() {
188
- const /** @type {TdToken} */ token = super.cloneNode();
189
- token.setAttribute('innerSyntax', this.#innerSyntax);
190
- return token;
191
- }
192
-
193
- /**
194
- * 创建新的单元格
195
- * @param {string|Token} inner 内部wikitext
196
- * @param {'td'|'th'|'caption'} subtype 单元格类型
197
- * @param {Record<string, string>} attr 单元格属性
198
- * @param {boolean} include 是否嵌入
199
- * @throws `RangeError` 非法的单元格类型
200
- */
201
- static create(inner, subtype = 'td', attr = {}, include = false, config = Parser.getConfig()) {
202
- if (typeof inner !== 'string' && inner?.constructor !== Token || !isPlainObject(attr)) {
203
- typeError(this, 'create', 'String', 'Token', 'Object');
204
- } else if (subtype !== 'td' && subtype !== 'th' && subtype !== 'caption') {
205
- throw new RangeError('单元格的子类型只能为 "td"、"th" 或 "caption"!');
206
- } else if (typeof inner === 'string') {
207
- inner = Parser.parse(inner, include, undefined, config);
208
- }
209
- const token = Parser.run(() => new TdToken('\n|', undefined, config));
210
- token.setSyntax(subtype);
211
- token.lastChild.safeReplaceWith(inner);
212
- for (const [k, v] of Object.entries(attr)) {
213
- token.setAttr(k, v);
214
- }
215
- return token;
216
- }
217
-
218
- /**
219
- * @override
220
- * @template {string} T
221
- * @param {T} key 属性键
222
- * @returns {TokenAttribute<T>}
223
- */
224
- getAttribute(key) {
225
- return key === 'innerSyntax' ? this.#innerSyntax : super.getAttribute(key);
226
- }
227
-
228
- /**
229
- * @override
230
- * @template {string} T
231
- * @param {T} key 属性键
232
- * @param {TokenAttribute<T>} value 属性值
233
- * @returns {this}
234
- */
235
- setAttribute(key, value) {
236
- if (key === 'innerSyntax') {
237
- this.#innerSyntax = String(value);
238
- return this;
239
- }
240
- return super.setAttribute(key, value);
241
- }
242
-
243
- /**
244
- * @override
245
- * @param {string} syntax 表格语法
246
- * @param {boolean} esc 是否需要转义
247
- */
248
- setSyntax(syntax, esc) {
249
- super.setSyntax(aliases[syntax] ?? syntax, esc);
250
- }
251
-
252
- /**
253
- * 修复\<td\>语法
254
- * @complexity `n`
255
- */
256
- #correct() {
257
- if (String(this.childNodes[1])) {
258
- this.#innerSyntax ||= '|';
259
- }
260
- const {subtype, escape, correction} = this.getSyntax();
261
- if (correction) {
262
- this.setSyntax(subtype, escape);
263
- }
264
- }
265
-
266
- /**
267
- * 改为独占一行
268
- * @complexity `n`
269
- */
270
- independence() {
271
- if (!this.isIndependent()) {
272
- const {subtype, escape} = this.getSyntax();
273
- this.setSyntax(subtype, escape);
274
- }
275
- }
276
-
277
- /**
278
- * 获取单元格属性
279
- * @template {string} T
280
- * @param {T} key 属性键
281
- * @returns {T extends 'rowspan'|'colspan' ? number : string|true}
282
- */
283
- getAttr(key) {
284
- const /** @type {string|true} */ value = super.getAttr(key);
285
- key = key?.toLowerCase()?.trim();
286
- return key === 'rowspan' || key === 'colspan' ? Number(value) || 1 : value;
287
- }
288
-
289
- /**
290
- * 获取全部单元格属性
291
- * @returns {{rowspan: number, colspan: number, [key: string]: string|true}}
292
- */
293
- getAttrs() {
294
- const /** @type {record<string, string|true>} */ attr = super.getAttrs();
295
- if ('rowspan' in attr) {
296
- attr.rowspan = Number(attr.rowspan);
297
- }
298
- if ('colspan' in attr) {
299
- attr.colspan = Number(attr.colspan);
300
- }
301
- return attr;
302
- }
303
-
304
- /**
305
- * 设置单元格属性
306
- * @template {string} T
307
- * @param {T} key 属性键
308
- * @param {T extends 'rowspan'|'colspan' ? number : string|boolean} value 属性值
309
- */
310
- setAttr(key, value) {
311
- if (typeof key !== 'string') {
312
- this.typeError('setAttr', 'String');
313
- }
314
- key = key.toLowerCase().trim();
315
- if (typeof value === 'number' && (key === 'rowspan' || key === 'colspan')) {
316
- value = value === 1 ? false : String(value);
317
- }
318
- const /** @type {boolean} */ result = super.setAttr(key, value);
319
- if (!String(this.childNodes[1])) {
320
- this.#innerSyntax = '';
321
- }
322
- return result;
323
- }
324
-
325
- /** @override */
326
- escape() {
327
- super.escape();
328
- if (String(this.childNodes[1])) {
329
- this.#innerSyntax ||= '{{!}}';
330
- }
331
- if (this.#innerSyntax === '|') {
332
- this.#innerSyntax = '{{!}}';
333
- }
334
- }
335
116
  }
336
117
 
337
- Parser.classes.TdToken = __filename;
338
118
  module.exports = TdToken;
package/src/table/tr.js CHANGED
@@ -1,54 +1,32 @@
1
1
  'use strict';
2
2
 
3
3
  const {generateForChild} = require('../../util/lint'),
4
- attributeParent = require('../../mixin/attributeParent'),
5
4
  Parser = require('../..'),
6
- AstText = require('../../lib/text'),
7
5
  Token = require('..'),
8
6
  SyntaxToken = require('../syntax'),
9
7
  AttributesToken = require('../attributes');
10
8
 
11
- const openingPattern = /^\n[^\S\n]*(?:\|-+|\{\{\s*!\s*\}\}-+|\{\{\s*!-\s*\}\}-*)$/u;
12
-
13
- /**
14
- * 转义表格语法
15
- * @param {SyntaxToken} syntax 表格语法节点
16
- */
17
- const escapeTable = syntax => {
18
- const templates = {'{|': '(!', '|}': '!)', '||': '!!', '|': '!'},
19
- wikitext = syntax.childNodes.map(
20
- child => child.type === 'text'
21
- ? String(child).replace(/\{\||\|\}|\|{2}|\|/gu, p => `{{${templates[p]}}}`)
22
- : String(child),
23
- ).join(''),
24
- token = Parser.parse(wikitext, syntax.getAttribute('include'), 2, syntax.getAttribute('config'));
25
- syntax.replaceChildren(...token.childNodes);
26
- };
27
-
28
9
  /**
29
10
  * 表格行,含开头的换行,不含结尾的换行
30
11
  * @classdesc `{childNodes: [SyntaxToken, AttributesToken, ?Token, ...TdToken]}`
31
12
  */
32
- class TrToken extends attributeParent(Token, 1) {
13
+ class TrToken extends Token {
33
14
  type = 'tr';
34
15
 
35
16
  /**
36
17
  * @param {string} syntax 表格语法
37
18
  * @param {string} attr 表格属性
38
- * @param {accum} accum
19
+ * @param {import('../../typings/token').accum} accum
39
20
  * @param {RegExp} pattern 表格语法正则
40
21
  */
41
- constructor(syntax, attr = '', config = Parser.getConfig(), accum = [], pattern = openingPattern) {
22
+ constructor(syntax, attr = '', config = Parser.getConfig(), accum = [], pattern = undefined) {
42
23
  super(undefined, config, true, accum, {
43
- Token: 2, SyntaxToken: 0, AttributesToken: 1, TdToken: '2:',
44
24
  });
45
25
  this.append(
46
26
  new SyntaxToken(syntax, pattern, 'table-syntax', config, accum, {
47
- 'Stage-1': ':', '!ExtToken': '', TranscludeToken: ':',
48
27
  }),
49
28
  new AttributesToken(attr, 'table-attrs', this.type, config, accum),
50
29
  );
51
- this.getAttribute('protectChildren')(0, 1);
52
30
  }
53
31
 
54
32
  /**
@@ -88,232 +66,9 @@ class TrToken extends attributeParent(Token, 1) {
88
66
 
89
67
  /** @override */
90
68
  text() {
91
- this.#correct();
92
69
  const str = super.text();
93
70
  return this.type === 'tr' && !str.trim().includes('\n') ? '' : str;
94
71
  }
95
-
96
- /**
97
- * @override
98
- * @this {TrToken & {constructor: typeof TrToken}}
99
- */
100
- cloneNode() {
101
- const [syntax, attr, inner, ...cloned] = this.cloneChildNodes();
102
- return Parser.run(() => {
103
- const token = new this.constructor(undefined, undefined, this.getAttribute('config'));
104
- token.firstChild.safeReplaceWith(syntax);
105
- token.childNodes[1].safeReplaceWith(attr);
106
- if (token.type === 'td') { // TdToken
107
- token.childNodes[2].safeReplaceWith(inner);
108
- } else if (inner !== undefined) {
109
- token.insertAt(inner);
110
- }
111
- token.append(...cloned);
112
- return token;
113
- });
114
- }
115
-
116
- /** 修复简单的表格语法错误 */
117
- #correct() {
118
- const {childNodes: [,, child]} = this;
119
- if (child?.constructor === Token) {
120
- const /** @type {{firstChild: AstText}} */ {firstChild} = child;
121
- if (firstChild.type !== 'text') {
122
- child.prepend('\n');
123
- } else if (firstChild.data[0] !== '\n') {
124
- firstChild.insertData(0, '\n');
125
- }
126
- }
127
- }
128
-
129
- /**
130
- * @override
131
- * @param {string} selector
132
- */
133
- toString(selector) {
134
- this.#correct();
135
- return super.toString(selector);
136
- }
137
-
138
- /**
139
- * 转义表格语法
140
- * @complexity `n`
141
- */
142
- escape() {
143
- for (const child of this.childNodes) {
144
- if (child instanceof SyntaxToken) {
145
- escapeTable(child);
146
- } else if (child instanceof TrToken) {
147
- child.escape();
148
- }
149
- }
150
- }
151
-
152
- /**
153
- * 设置表格语法
154
- * @param {string} syntax 表格语法
155
- * @param {boolean} esc 是否需要转义
156
- */
157
- setSyntax(syntax, esc) {
158
- const {firstChild} = this;
159
- firstChild.replaceChildren(syntax);
160
- if (esc) {
161
- escapeTable(firstChild);
162
- }
163
- }
164
-
165
- /**
166
- * @override
167
- * @param {number} i 移除位置
168
- * @complexity `n`
169
- */
170
- removeAt(i) {
171
- const TdToken = require('./td');
172
- const child = this.childNodes.at(i);
173
- if (child instanceof TdToken && child.isIndependent()) {
174
- const {nextSibling} = child;
175
- if (nextSibling?.type === 'td') {
176
- nextSibling.independence();
177
- }
178
- }
179
- return super.removeAt(i);
180
- }
181
-
182
- /**
183
- * @override
184
- * @template {AstText|Token} T
185
- * @param {T} token 待插入的子节点
186
- * @param {number} i 插入位置
187
- * @returns {T}
188
- * @complexity `n`
189
- */
190
- insertAt(token, i = this.length) {
191
- if (!Parser.running && !(token instanceof TrToken)) {
192
- this.typeError('insertAt', 'TrToken');
193
- }
194
- const TdToken = require('./td');
195
- const child = this.childNodes.at(i);
196
- if (token instanceof TdToken && token.isIndependent() && child instanceof TdToken) {
197
- child.independence();
198
- }
199
- return super.insertAt(token, i);
200
- }
201
-
202
- /**
203
- * 获取行数
204
- * @returns {0|1}
205
- * @complexity `n`
206
- */
207
- getRowCount() {
208
- const TdToken = require('./td');
209
- return Number(this.childNodes.some(
210
- child => child instanceof TdToken && child.isIndependent() && !child.firstChild.text().endsWith('+'),
211
- ));
212
- }
213
-
214
- /**
215
- * 获取相邻行
216
- * @param {(childNodes: Token[], index: number) => Token[]} subset 筛选兄弟节点的方法
217
- * @complexity `n`
218
- */
219
- #getSiblingRow(subset) {
220
- const {parentNode} = this;
221
- if (!parentNode) {
222
- return undefined;
223
- }
224
- const {childNodes} = parentNode,
225
- index = childNodes.indexOf(this);
226
- for (const child of subset(childNodes, index)) {
227
- if (child instanceof TrToken && child.getRowCount()) {
228
- return child;
229
- }
230
- }
231
- return undefined;
232
- }
233
-
234
- /**
235
- * 获取下一行
236
- * @complexity `n`
237
- */
238
- getNextRow() {
239
- return this.#getSiblingRow((childNodes, index) => childNodes.slice(index + 1));
240
- }
241
-
242
- /**
243
- * 获取前一行
244
- * @complexity `n`
245
- */
246
- getPreviousRow() {
247
- return this.#getSiblingRow((childNodes, index) => childNodes.slice(0, index).reverse());
248
- }
249
-
250
- /**
251
- * 获取列数
252
- * @complexity `n`
253
- */
254
- getColCount() {
255
- const TdToken = require('./td');
256
- let count = 0,
257
- last = 0;
258
- for (const child of this.childNodes) {
259
- if (child instanceof TdToken) {
260
- last = child.isIndependent() ? Number(child.subtype !== 'caption') : last;
261
- count += last;
262
- }
263
- }
264
- return count;
265
- }
266
-
267
- /**
268
- * 获取第n列
269
- * @param {number} n 列号
270
- * @param {boolean} insert 是否用于判断插入新列的位置
271
- * @returns {TdToken}
272
- * @complexity `n`
273
- * @throws `RangeError` 不存在对应单元格
274
- */
275
- getNthCol(n, insert) {
276
- if (!Number.isInteger(n)) {
277
- this.typeError('getNthCol', 'Number');
278
- }
279
- const nCols = this.getColCount();
280
- n = n < 0 ? n + nCols : n;
281
- if (n < 0 || n > nCols || n === nCols && !insert) {
282
- throw new RangeError(`不存在第 ${n} 个单元格!`);
283
- }
284
- const TdToken = require('./td');
285
- let last = 0;
286
- for (const child of this.childNodes.slice(2)) {
287
- if (child instanceof TdToken) {
288
- if (child.isIndependent()) {
289
- last = Number(child.subtype !== 'caption');
290
- }
291
- n -= last;
292
- if (n < 0) {
293
- return child;
294
- }
295
- } else if (child.type === 'tr' || child.type === 'table-syntax') {
296
- return child;
297
- }
298
- }
299
- return undefined;
300
- }
301
-
302
- /**
303
- * 插入新的单元格
304
- * @param {string|Token} inner 单元格内部wikitext
305
- * @param {TableCoords} coord 单元格坐标
306
- * @param {'td'|'th'|'caption'} subtype 单元格类型
307
- * @param {Record<string, string|boolean>} attr 单元格属性
308
- * @returns {TdToken}
309
- * @complexity `n`
310
- */
311
- insertTableCell(inner, {column}, subtype = 'td', attr = {}) {
312
- const TdToken = require('./td');
313
- const token = TdToken.create(inner, subtype, attr, this.getAttribute('include'), this.getAttribute('config'));
314
- return this.insertBefore(token, this.getNthCol(column, true));
315
- }
316
72
  }
317
73
 
318
- Parser.classes.TrToken = __filename;
319
74
  module.exports = TrToken;
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  const {generateForSelf} = require('../../util/lint'),
4
- attributeParent = require('../../mixin/attributeParent'),
5
4
  Parser = require('../..'),
6
5
  Token = require('..'),
7
6
  TagPairToken = require('.'),
@@ -11,7 +10,7 @@ const {generateForSelf} = require('../../util/lint'),
11
10
  * 扩展标签
12
11
  * @classdesc `{childNodes: [AttributesToken, NowikiToken|Token]}`
13
12
  */
14
- class ExtToken extends attributeParent(TagPairToken) {
13
+ class ExtToken extends TagPairToken {
15
14
  type = 'ext';
16
15
  closed = true;
17
16
 
@@ -20,13 +19,14 @@ class ExtToken extends attributeParent(TagPairToken) {
20
19
  * @param {string} attr 标签属性
21
20
  * @param {string} inner 内部wikitext
22
21
  * @param {string|undefined} closed 是否封闭
23
- * @param {accum} accum
22
+ * @param {import('../../typings/token').accum} accum
24
23
  */
25
24
  constructor(name, attr = '', inner = '', closed = undefined, config = Parser.getConfig(), accum = []) {
26
25
  attr = !attr || attr.trimStart() !== attr ? attr : ` ${attr}`;
27
26
  const lcName = name.toLowerCase(),
28
27
  attrToken = new AttributesToken(attr, 'ext-attrs', lcName, config, accum),
29
- /** @type {ParserConfig} */ newConfig = {...config, excludes: [...config.excludes]},
28
+ /** @type {import('../../typings/token').ParserConfig} */
29
+ newConfig = {...config, excludes: [...config.excludes]},
30
30
  ext = new Set(newConfig.ext);
31
31
  let /** @type {Token} */ innerToken;
32
32
  ext.delete(lcName);
@@ -59,11 +59,6 @@ class ExtToken extends attributeParent(TagPairToken) {
59
59
  innerToken = new PreToken(inner, newConfig, accum);
60
60
  break;
61
61
  }
62
- case 'charinsert': {
63
- const CharinsertToken = require('../charinsert');
64
- innerToken = new CharinsertToken(inner, newConfig, accum);
65
- break;
66
- }
67
62
  case 'references': {
68
63
  const ReferencesToken = require('../nested/references');
69
64
  innerToken = new ReferencesToken(inner, newConfig, accum);
@@ -126,20 +121,6 @@ class ExtToken extends attributeParent(TagPairToken) {
126
121
  }
127
122
  return errors;
128
123
  }
129
-
130
- /** @override */
131
- cloneNode() {
132
- const inner = this.lastChild.cloneNode(),
133
- tags = this.getAttribute('tags'),
134
- config = this.getAttribute('config'),
135
- attr = String(this.firstChild);
136
- return Parser.run(() => {
137
- const token = new ExtToken(tags[0], attr, '', this.selfClosing ? undefined : tags[1], config);
138
- token.lastChild.safeReplaceWith(inner);
139
- return token;
140
- });
141
- }
142
124
  }
143
125
 
144
- Parser.classes.ExtToken = __filename;
145
126
  module.exports = ExtToken;
@@ -16,35 +16,11 @@ class IncludeToken extends hidden(TagPairToken) {
16
16
  * @param {string} attr 标签属性
17
17
  * @param {string|undefined} inner 内部wikitext
18
18
  * @param {string|undefined} closed 是否封闭
19
- * @param {accum} accum
19
+ * @param {import('../../typings/token').accum} accum
20
20
  */
21
21
  constructor(name, attr = '', inner = undefined, closed = undefined, config = Parser.getConfig(), accum = []) {
22
22
  super(name, attr, inner ?? '', inner === undefined ? closed : closed ?? '', config, accum);
23
23
  }
24
-
25
- /** @override */
26
- cloneNode() {
27
- const tags = this.getAttribute('tags'),
28
- config = this.getAttribute('config'),
29
- inner = this.selfClosing ? undefined : String(this.lastChild),
30
- closing = this.selfClosing || !this.closed ? undefined : tags[1],
31
- token = Parser.run(() => new IncludeToken(tags[0], String(this.firstChild), inner, closing, config));
32
- return token;
33
- }
34
-
35
- /**
36
- * @override
37
- * @param {string} str 新文本
38
- */
39
- setText(str) {
40
- return super.setText(str, 1);
41
- }
42
-
43
- /** 清除标签属性 */
44
- removeAttr() {
45
- super.setText('', 0);
46
- }
47
24
  }
48
25
 
49
- Parser.classes.IncludeToken = __filename;
50
26
  module.exports = IncludeToken;