wikiparser-node 1.29.1 → 1.30.0

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 (93) hide show
  1. package/bundle/bundle-es8.min.js +29 -26
  2. package/bundle/bundle-lsp.min.js +31 -28
  3. package/bundle/bundle.min.js +23 -23
  4. package/dist/addon/token.js +3 -2
  5. package/dist/addon/transclude.js +19 -2
  6. package/dist/base.d.mts +1 -1
  7. package/dist/base.d.ts +1 -1
  8. package/dist/base.js +1 -0
  9. package/dist/base.mjs +1 -0
  10. package/dist/bin/config.js +1 -1
  11. package/dist/index.js +13 -13
  12. package/dist/lib/attributes.js +0 -1
  13. package/dist/lib/document.js +2 -2
  14. package/dist/lib/element.js +5 -7
  15. package/dist/lib/lintConfig.js +7 -0
  16. package/dist/lib/lsp.d.ts +0 -1
  17. package/dist/lib/lsp.js +2 -5
  18. package/dist/lib/node.js +6 -8
  19. package/dist/lib/text.js +53 -10
  20. package/dist/lib/title.js +1 -1
  21. package/dist/mixin/attributesParent.d.ts +0 -1
  22. package/dist/mixin/attributesParent.js +2 -4
  23. package/dist/mixin/elementLike.js +2 -4
  24. package/dist/mixin/fixed.js +0 -2
  25. package/dist/mixin/gapped.js +0 -2
  26. package/dist/mixin/hidden.js +1 -3
  27. package/dist/mixin/noEscape.js +1 -3
  28. package/dist/mixin/nodeLike.js +2 -4
  29. package/dist/mixin/padded.js +5 -9
  30. package/dist/mixin/singleLine.js +0 -2
  31. package/dist/mixin/sol.js +0 -2
  32. package/dist/mixin/syntax.js +0 -2
  33. package/dist/parser/commentAndExt.js +1 -1
  34. package/dist/parser/quotes.js +20 -8
  35. package/dist/parser/table.js +1 -2
  36. package/dist/src/arg.js +3 -5
  37. package/dist/src/attribute.js +10 -10
  38. package/dist/src/attributes.js +4 -4
  39. package/dist/src/commented.js +0 -1
  40. package/dist/src/converter.js +1 -2
  41. package/dist/src/converterFlags.js +1 -1
  42. package/dist/src/converterRule.js +1 -2
  43. package/dist/src/extLink.js +1 -1
  44. package/dist/src/heading.d.ts +8 -0
  45. package/dist/src/heading.js +25 -2
  46. package/dist/src/imageParameter.js +4 -6
  47. package/dist/src/index.d.ts +0 -2
  48. package/dist/src/index.js +1 -3
  49. package/dist/src/link/base.js +4 -5
  50. package/dist/src/link/category.js +2 -2
  51. package/dist/src/link/file.js +7 -7
  52. package/dist/src/link/galleryImage.d.ts +0 -2
  53. package/dist/src/link/galleryImage.js +1 -3
  54. package/dist/src/link/index.js +2 -2
  55. package/dist/src/link/redirectTarget.js +1 -1
  56. package/dist/src/magicLink.js +3 -3
  57. package/dist/src/multiLine/gallery.js +5 -5
  58. package/dist/src/multiLine/imagemap.js +1 -1
  59. package/dist/src/multiLine/paramTag.js +1 -1
  60. package/dist/src/nested.js +1 -1
  61. package/dist/src/nowiki/comment.js +1 -1
  62. package/dist/src/nowiki/dd.d.ts +3 -0
  63. package/dist/src/nowiki/doubleUnderscore.d.ts +3 -0
  64. package/dist/src/nowiki/hr.d.ts +3 -0
  65. package/dist/src/nowiki/index.js +2 -2
  66. package/dist/src/nowiki/list.d.ts +5 -0
  67. package/dist/src/nowiki/list.js +30 -0
  68. package/dist/src/nowiki/listBase.js +2 -2
  69. package/dist/src/nowiki/noinclude.d.ts +2 -1
  70. package/dist/src/nowiki/noinclude.js +26 -1
  71. package/dist/src/nowiki/quote.d.ts +21 -0
  72. package/dist/src/nowiki/quote.js +59 -2
  73. package/dist/src/parameter.js +3 -3
  74. package/dist/src/pre.js +1 -1
  75. package/dist/src/redirect.js +1 -1
  76. package/dist/src/syntax.js +1 -1
  77. package/dist/src/table/base.js +1 -1
  78. package/dist/src/table/index.d.ts +0 -4
  79. package/dist/src/table/index.js +9 -10
  80. package/dist/src/table/td.js +6 -6
  81. package/dist/src/table/trBase.js +2 -4
  82. package/dist/src/tag/html.js +2 -2
  83. package/dist/src/tag/index.js +2 -3
  84. package/dist/src/tagPair/ext.js +1 -1
  85. package/dist/src/tagPair/include.js +1 -1
  86. package/dist/src/transclude.d.ts +4 -8
  87. package/dist/src/transclude.js +11 -17
  88. package/dist/util/html.js +1 -3
  89. package/extensions/dist/base.js +2 -2
  90. package/i18n/en.json +2 -0
  91. package/i18n/zh-hans.json +2 -0
  92. package/i18n/zh-hant.json +2 -0
  93. package/package.json +26 -25
@@ -46,7 +46,6 @@ const cached_1 = require("./cached");
46
46
  * @param html 是否覆写 toHtml 方法
47
47
  */
48
48
  const hiddenToken = (linter = true, html = true) => (constructor) => {
49
- /* eslint-disable jsdoc/require-jsdoc */
50
49
  let AnyHiddenToken = (() => {
51
50
  let _classSuper = constructor;
52
51
  let _instanceExtraInitializers = [];
@@ -63,7 +62,7 @@ const hiddenToken = (linter = true, html = true) => (constructor) => {
63
62
  }
64
63
  lint(start) {
65
64
  // @ts-expect-error private argument
66
- LINT: return linter ? [] : super.lint(start); // eslint-disable-line no-unused-labels
65
+ LINT: return linter ? [] : super.lint(start);
67
66
  }
68
67
  /* NOT FOR BROWSER */
69
68
  dispatchEvent(e, data) {
@@ -79,7 +78,6 @@ const hiddenToken = (linter = true, html = true) => (constructor) => {
79
78
  }
80
79
  };
81
80
  })();
82
- /* eslint-enable jsdoc/require-jsdoc */
83
81
  (0, debug_1.mixin)(AnyHiddenToken, constructor);
84
82
  return AnyHiddenToken;
85
83
  };
@@ -10,14 +10,12 @@ const constants_1 = require("../util/constants");
10
10
  * @ignore
11
11
  */
12
12
  const noEscape = (constructor) => {
13
- LSP: { // eslint-disable-line no-unused-labels
14
- /* eslint-disable jsdoc/require-jsdoc */
13
+ LSP: {
15
14
  class NoEscapeToken extends constructor {
16
15
  escape() {
17
16
  //
18
17
  }
19
18
  }
20
- /* eslint-enable jsdoc/require-jsdoc */
21
19
  (0, debug_1.mixin)(NoEscapeToken, constructor);
22
20
  return NoEscapeToken;
23
21
  }
@@ -6,7 +6,6 @@ const debug_1 = require("../util/debug");
6
6
  const constants_1 = require("../util/constants");
7
7
  /** @ignore */
8
8
  const nodeLike = (constructor) => {
9
- /* eslint-disable jsdoc/require-jsdoc */
10
9
  class NodeLike extends constructor {
11
10
  get firstChild() {
12
11
  return this.childNodes[0];
@@ -15,13 +14,12 @@ const nodeLike = (constructor) => {
15
14
  return this.childNodes[this.childNodes.length - 1];
16
15
  }
17
16
  get offsetHeight() {
18
- LINT: return this.getDimension().height; // eslint-disable-line no-unused-labels
17
+ LINT: return this.getDimension().height;
19
18
  }
20
19
  get offsetWidth() {
21
- LINT: return this.getDimension().width; // eslint-disable-line no-unused-labels
20
+ LINT: return this.getDimension().width;
22
21
  }
23
22
  }
24
- /* eslint-enable jsdoc/require-jsdoc */
25
23
  (0, debug_1.mixin)(NodeLike, constructor);
26
24
  return NodeLike;
27
25
  };
@@ -11,17 +11,13 @@ const constants_1 = require("../util/constants");
11
11
  * @param padding.length
12
12
  */
13
13
  const padded = ({ length }) => (constructor) => {
14
- LINT: { // eslint-disable-line no-unused-labels
15
- /* eslint-disable jsdoc/require-jsdoc */
16
- class PaddedToken extends constructor {
17
- getAttribute(key) {
18
- return key === 'padding' ? length : super.getAttribute(key);
19
- }
14
+ class PaddedToken extends constructor {
15
+ getAttribute(key) {
16
+ return key === 'padding' ? length : super.getAttribute(key);
20
17
  }
21
- /* eslint-enable jsdoc/require-jsdoc */
22
- (0, debug_1.mixin)(PaddedToken, constructor);
23
- return PaddedToken;
24
18
  }
19
+ (0, debug_1.mixin)(PaddedToken, constructor);
20
+ return PaddedToken;
25
21
  };
26
22
  exports.padded = padded;
27
23
  constants_1.mixins['padded'] = __filename;
@@ -8,7 +8,6 @@ const constants_1 = require("../util/constants");
8
8
  * @ignore
9
9
  */
10
10
  const singleLine = (constructor) => {
11
- /* eslint-disable jsdoc/require-jsdoc */
12
11
  class SingleLineToken extends constructor {
13
12
  toString(skip) {
14
13
  if (this.parentNode?.name === 'inputbox') {
@@ -25,7 +24,6 @@ const singleLine = (constructor) => {
25
24
  return super.text().replaceAll('\n', ' ');
26
25
  }
27
26
  }
28
- /* eslint-enable jsdoc/require-jsdoc */
29
27
  (0, debug_1.mixin)(SingleLineToken, constructor);
30
28
  return SingleLineToken;
31
29
  };
package/dist/mixin/sol.js CHANGED
@@ -8,7 +8,6 @@ const constants_1 = require("../util/constants");
8
8
  * @param self 是否允许同类节点相邻
9
9
  */
10
10
  const sol = (self) => (constructor) => {
11
- /* eslint-disable jsdoc/require-jsdoc */
12
11
  class SolToken extends constructor {
13
12
  #prependNewLine() {
14
13
  const { previousVisibleSibling, parentNode, type } = this;
@@ -36,7 +35,6 @@ const sol = (self) => (constructor) => {
36
35
  return this.#prependNewLine() + super.text();
37
36
  }
38
37
  }
39
- /* eslint-enable jsdoc/require-jsdoc */
40
38
  (0, debug_1.mixin)(SolToken, constructor);
41
39
  return SolToken;
42
40
  };
@@ -9,7 +9,6 @@ const string_1 = require("../util/string");
9
9
  * @param pattern 语法正则
10
10
  */
11
11
  const syntax = (pattern) => (constructor) => {
12
- /* eslint-disable jsdoc/require-jsdoc */
13
12
  class SyntaxToken extends constructor {
14
13
  constructor(...args) {
15
14
  super(...args); // eslint-disable-line @typescript-eslint/no-unsafe-argument
@@ -36,7 +35,6 @@ const syntax = (pattern) => (constructor) => {
36
35
  }
37
36
  }
38
37
  }
39
- /* eslint-enable jsdoc/require-jsdoc */
40
38
  (0, debug_1.mixin)(SyntaxToken, constructor);
41
39
  return SyntaxToken;
42
40
  };
@@ -73,7 +73,7 @@ const parseCommentAndExt = (wikitext, config, accum, includeOnly) => {
73
73
  wikitext = wikitext.replace(/<nowiki>[\s\S]*?<\/nowiki>/giu, m => {
74
74
  stack.push(m);
75
75
  return `\0${stack.length - 1}\x7F`;
76
- }).replace(/<translate( nowrap)?>([\s\S]+?)?<\/translate>/gu, (_, p1, p2) => {
76
+ }).replace(/<translate( nowrap)?>([\s\S]*?)<\/translate>/gu, (_, p1, p2) => {
77
77
  const l = accum.length;
78
78
  // @ts-expect-error abstract class
79
79
  new translate_1.TranslateToken(p1, p2 && (0, string_1.restore)(p2, stack), newConfig, accum);
@@ -59,23 +59,35 @@ const parseQuotes = (wikitext, config, accum, tidy) => {
59
59
  arr[i - 1] += `'`;
60
60
  }
61
61
  }
62
- let bold = true, italic = true;
62
+ let bold = false, italic = false;
63
63
  for (let i = 1; i < length; i += 2) {
64
- const n = arr[i].length, isBold = n !== 2, isItalic = n !== 3;
64
+ const n = arr[i].length, isBold = n !== 2, isItalic = n !== 3,
65
+ // @ts-expect-error abstract class
66
+ token = new quote_1.QuoteToken(arr[i], { bold: isBold && Boolean(bold), italic: isItalic && Boolean(italic) }, config, accum);
65
67
  if (isBold) {
66
- bold = !bold;
68
+ /* NOT FOR BROWSER */
69
+ if (!tidy && bold) {
70
+ bold.setAttribute('bold', token);
71
+ token.setAttribute('bold', bold);
72
+ }
73
+ /* NOT FOR BROWSER END */
74
+ bold = !bold && token;
67
75
  }
68
76
  if (isItalic) {
69
- italic = !italic;
77
+ /* NOT FOR BROWSER */
78
+ if (!tidy && italic) {
79
+ italic.setAttribute('italic', token);
80
+ token.setAttribute('italic', italic);
81
+ }
82
+ /* NOT FOR BROWSER END */
83
+ italic = !italic && token;
70
84
  }
71
- // @ts-expect-error abstract class
72
- new quote_1.QuoteToken(arr[i], { bold: isBold && bold, italic: isItalic && italic }, config, accum);
73
85
  arr[i] = `\0${accum.length - 1}q\x7F`;
74
86
  }
75
87
  /* NOT FOR BROWSER */
76
- if (tidy && (!bold || !italic)) {
88
+ if (tidy && (bold || italic)) {
77
89
  // @ts-expect-error abstract class
78
- new quote_1.QuoteToken((bold ? '' : `'''`) + (italic ? '' : `''`), { bold: !bold, italic: !italic }, config, accum);
90
+ new quote_1.QuoteToken((bold ? `'''` : '') + (italic ? `''` : ''), { bold, italic }, config, accum);
79
91
  arr.push(`\0${accum.length - 1}q\x7F`);
80
92
  }
81
93
  /* NOT FOR BROWSER END */
@@ -74,8 +74,7 @@ const parseTable = ({ firstChild: { data }, type, name }, config, accum) => {
74
74
  out += `\n${outLine}`;
75
75
  continue;
76
76
  }
77
- const matches = // eslint-disable-line @stylistic/operator-linebreak
78
- /^(?:(\|\}|\0\d+!\x7F\}|\0\d+\}\x7F)|(\|-+|\0\d+!\x7F-+|\0\d+-\x7F-*)(?!-)|(!|(?:\||\0\d+!\x7F)\+?))(.*)$/u
77
+ const matches = /^(?:(\|\}|\0\d+!\x7F\}|\0\d+\}\x7F)|(\|-+|\0\d+!\x7F-+|\0\d+-\x7F-*)(?!-)|(!|(?:\||\0\d+!\x7F)\+?))(.*)$/u
79
78
  .exec(line);
80
79
  if (!matches) {
81
80
  push(`\n${outLine}`, top);
package/dist/src/arg.js CHANGED
@@ -85,7 +85,7 @@ let ArgToken = (() => {
85
85
  /* PRINT ONLY */
86
86
  /** default value / 预设值 */
87
87
  get default() {
88
- LSP: return this.childNodes[1]?.text() ?? false; // eslint-disable-line no-unused-labels
88
+ LSP: return this.childNodes[1]?.text() ?? false;
89
89
  }
90
90
  /* PRINT ONLY END */
91
91
  /* NOT FOR BROWSER */
@@ -131,12 +131,10 @@ let ArgToken = (() => {
131
131
  }
132
132
  /** 更新name */
133
133
  #setName() {
134
- // eslint-disable-next-line no-unused-labels
135
134
  LSP: this.setAttribute('name', this.firstChild.text().trim());
136
135
  }
137
136
  /** @private */
138
137
  afterBuild() {
139
- // eslint-disable-next-line no-unused-labels
140
138
  LSP: this.#setName();
141
139
  super.afterBuild();
142
140
  /* NOT FOR BROWSER */
@@ -149,7 +147,7 @@ let ArgToken = (() => {
149
147
  }
150
148
  /** @private */
151
149
  lint(start = this.getAbsoluteIndex(), re) {
152
- LINT: { // eslint-disable-line no-unused-labels
150
+ LINT: {
153
151
  const { childNodes: [argName, argDefault, ...rest] } = this;
154
152
  argName.setAttribute('aIndex', start + 3);
155
153
  const errors = argName.lint(start + 3, re);
@@ -192,7 +190,7 @@ let ArgToken = (() => {
192
190
  }
193
191
  /** @private */
194
192
  json(_, start = this.getAbsoluteIndex()) {
195
- LSP: { // eslint-disable-line no-unused-labels
193
+ LSP: {
196
194
  const json = super.json(undefined, start);
197
195
  json['default'] = this.default;
198
196
  return json;
@@ -105,7 +105,7 @@ let AttributeToken = (() => {
105
105
  }
106
106
  /** whether the quotes are balanced / 引号是否匹配 */
107
107
  get balanced() {
108
- LINT: return !this.#equal || this.#quotes[0] === this.#quotes[1]; // eslint-disable-line no-unused-labels
108
+ LINT: return !this.#equal || this.#quotes[0] === this.#quotes[1];
109
109
  }
110
110
  /* NOT FOR BROWSER */
111
111
  set balanced(value) {
@@ -211,7 +211,7 @@ let AttributeToken = (() => {
211
211
  #lint(start, rect) {
212
212
  const { firstChild, lastChild, type, name, tag, parentNode } = this, simple = !lastChild.childNodes.some(({ type: t }) => complexTypes.has(t)), value = this.getValue(), attrs = sharable_1.extAttrs[tag], attrs2 = sharable_1.htmlAttrs[tag], { length } = this.toString();
213
213
  let rule = 'illegal-attr', lintConfig, computeEditInfo;
214
- LINT: { // eslint-disable-line no-unused-labels
214
+ LINT: {
215
215
  ({ lintConfig } = index_1.default);
216
216
  ({ computeEditInfo } = lintConfig);
217
217
  }
@@ -229,7 +229,7 @@ let AttributeToken = (() => {
229
229
  return true;
230
230
  }
231
231
  /* PRINT ONLY END */
232
- LINT: { // eslint-disable-line no-unused-labels
232
+ LINT: {
233
233
  const s = lintConfig.getSeverity(rule, 'unknown');
234
234
  if (s) {
235
235
  const e = (0, lint_1.generateForChild)(firstChild, rect, rule, 'illegal-attribute-name', s);
@@ -246,7 +246,7 @@ let AttributeToken = (() => {
246
246
  return true;
247
247
  }
248
248
  /* PRINT ONLY END */
249
- LINT: { // eslint-disable-line no-unused-labels
249
+ LINT: {
250
250
  rule = 'insecure-style';
251
251
  const s = lintConfig.getSeverity(rule);
252
252
  return s && (0, lint_1.generateForChild)(lastChild, rect, rule, 'insecure-style', s);
@@ -258,7 +258,7 @@ let AttributeToken = (() => {
258
258
  return true;
259
259
  }
260
260
  /* PRINT ONLY END */
261
- LINT: { // eslint-disable-line no-unused-labels
261
+ LINT: {
262
262
  const s = lintConfig.getSeverity(rule, 'tabindex');
263
263
  if (s) {
264
264
  const e = (0, lint_1.generateForChild)(lastChild, rect, rule, 'nonzero-tabindex', s);
@@ -282,7 +282,7 @@ let AttributeToken = (() => {
282
282
  return true;
283
283
  }
284
284
  /* PRINT ONLY END */
285
- LINT: { // eslint-disable-line no-unused-labels
285
+ LINT: {
286
286
  const s = lintConfig.getSeverity(rule, 'value');
287
287
  return s && (0, lint_1.generateForChild)(lastChild, rect, rule, 'illegal-attribute-value', s);
288
288
  }
@@ -295,7 +295,7 @@ let AttributeToken = (() => {
295
295
  return true;
296
296
  }
297
297
  /* PRINT ONLY END */
298
- LINT: { // eslint-disable-line no-unused-labels
298
+ LINT: {
299
299
  const s = lintConfig.getSeverity(rule, 'value');
300
300
  return s && (0, lint_1.generateForChild)(lastChild, rect, rule, 'illegal-attribute-value', s);
301
301
  }
@@ -305,7 +305,7 @@ let AttributeToken = (() => {
305
305
  }
306
306
  /** @private */
307
307
  lint(start = this.getAbsoluteIndex(), re) {
308
- LINT: { // eslint-disable-line no-unused-labels
308
+ LINT: {
309
309
  const errors = super.lint(start, re), { balanced, firstChild, lastChild, name, tag } = this, rect = new rect_1.BoundingRect(this, start), rules = ['unclosed-quote', 'obsolete-attr'], { lintConfig } = index_1.default, s = rules.map(rule => lintConfig.getSeverity(rule, name));
310
310
  if (s[0] && !balanced) {
311
311
  const e = (0, lint_1.generateForChild)(lastChild, rect, rules[0], 'unclosed-quotes', s[0]);
@@ -359,7 +359,7 @@ let AttributeToken = (() => {
359
359
  return this.#equal ? this.lastChild.text().trim() : this.type === 'ext-attr' || '';
360
360
  }
361
361
  escape() {
362
- LSP: { // eslint-disable-line no-unused-labels
362
+ LSP: {
363
363
  if (this.type !== 'ext-attr') {
364
364
  this.#equal = '{{=}}';
365
365
  this.lastChild.escape();
@@ -378,7 +378,7 @@ let AttributeToken = (() => {
378
378
  }
379
379
  /** @private */
380
380
  json(_, start = this.getAbsoluteIndex()) {
381
- LSP: { // eslint-disable-line no-unused-labels
381
+ LSP: {
382
382
  const json = super.json(undefined, start);
383
383
  json['tag'] = this.tag;
384
384
  return json;
@@ -230,7 +230,7 @@ let AttributesToken = (() => {
230
230
  * @param key attribute name / 属性名
231
231
  */
232
232
  getAttrToken(key) {
233
- LINT: { // eslint-disable-line no-unused-labels
233
+ LINT: {
234
234
  const tokens = this.getAttrTokens(key);
235
235
  return tokens[tokens.length - 1];
236
236
  }
@@ -242,7 +242,7 @@ let AttributesToken = (() => {
242
242
  * @param key attribute name / 属性键
243
243
  */
244
244
  getAttr(key) {
245
- LINT: return this.getAttrToken(key)?.getValue(); // eslint-disable-line no-unused-labels
245
+ LINT: return this.getAttrToken(key)?.getValue();
246
246
  }
247
247
  /** 是否位于闭合标签内 */
248
248
  #lint() {
@@ -251,7 +251,7 @@ let AttributesToken = (() => {
251
251
  }
252
252
  /** @private */
253
253
  lint(start = this.getAbsoluteIndex(), re) {
254
- LINT: { // eslint-disable-line no-unused-labels
254
+ LINT: {
255
255
  const errors = super.lint(start, re), { parentNode, childNodes } = this, attrs = new Map(), duplicated = new Set(), rect = new rect_1.BoundingRect(this, start), rules = ['no-ignored', 'no-duplicate'], { lintConfig } = index_1.default, { computeEditInfo, fix } = lintConfig, s = ['closingTag', 'invalidAttributes', 'nonWordAttributes']
256
256
  .map(k => lintConfig.getSeverity(rules[0], k));
257
257
  if (s[0] && this.#lint()) {
@@ -313,7 +313,7 @@ let AttributesToken = (() => {
313
313
  }
314
314
  }
315
315
  escape() {
316
- LSP: { // eslint-disable-line no-unused-labels
316
+ LSP: {
317
317
  if (this.type !== 'ext-attrs') {
318
318
  super.escape();
319
319
  }
@@ -85,7 +85,6 @@ let CommentedToken = (() => {
85
85
  }
86
86
  /** @private */
87
87
  lint(start = this.getAbsoluteIndex()) {
88
- // eslint-disable-next-line no-unused-labels
89
88
  LINT: return super.lint(start, new RegExp(String.raw `<\s*(?:\/\s*)?(${this.name})\b`, 'giu'));
90
89
  }
91
90
  /* NOT FOR BROWSER */
@@ -101,8 +101,7 @@ let ConverterToken = (() => {
101
101
  const [firstRule] = rules, hasColon = firstRule.includes(':'),
102
102
  // @ts-expect-error abstract class
103
103
  firstRuleToken = new converterRule_1.ConverterRuleToken(firstRule, hasColon, config, accum);
104
- if (hasColon && firstRuleToken.length === 1
105
- || !hasColon && rules.length === 2 && !(0, string_1.removeComment)(rules[1]).trim()) {
104
+ if (hasColon ? firstRuleToken.length === 1 : rules.length === 2 && !(0, string_1.removeComment)(rules[1]).trim()) {
106
105
  this.insertAt(
107
106
  // @ts-expect-error abstract class
108
107
  new converterRule_1.ConverterRuleToken(rules.join(';'), false, config, accum));
@@ -151,7 +151,7 @@ let ConverterFlagsToken = (() => {
151
151
  }
152
152
  /** @private */
153
153
  lint(start = this.getAbsoluteIndex(), re) {
154
- LINT: { // eslint-disable-line no-unused-labels
154
+ LINT: {
155
155
  const variantFlags = this.getVariantFlags(), unknownFlags = this.getUnknownFlags(), validFlags = new Set(this.#flags.filter(flag => definedFlags.has(flag))), emptyFlagCount = this.#flags.filter(flag => !flag).length, knownFlagCount = this.#flags.length - unknownFlags.size - emptyFlagCount, { lintConfig } = index_1.default, { computeEditInfo, fix } = lintConfig, errors = super.lint(start, re);
156
156
  if (variantFlags.size === knownFlagCount || validFlags.size === knownFlagCount) {
157
157
  return errors;
@@ -93,7 +93,6 @@ let ConverterRuleToken = (() => {
93
93
  /* PRINT ONLY */
94
94
  /** language variant / 语言变体 */
95
95
  get variant() {
96
- // eslint-disable-next-line no-unused-labels
97
96
  LSP: return this.childNodes[this.length - 2]?.text().trim().toLowerCase() ?? '';
98
97
  }
99
98
  /* PRINT ONLY END */
@@ -192,7 +191,7 @@ let ConverterRuleToken = (() => {
192
191
  }
193
192
  /** @private */
194
193
  json(_, start = this.getAbsoluteIndex()) {
195
- LSP: { // eslint-disable-line no-unused-labels
194
+ LSP: {
196
195
  const json = super.json(undefined, start);
197
196
  json['variant'] = this.variant;
198
197
  return json;
@@ -157,7 +157,7 @@ let ExtLinkToken = (() => {
157
157
  }
158
158
  /** @private */
159
159
  lint(start = this.getAbsoluteIndex(), re) {
160
- LINT: { // eslint-disable-line no-unused-labels
160
+ LINT: {
161
161
  const errors = super.lint(start, re), rule = 'var-anchor', s = index_1.default.lintConfig.getSeverity(rule, 'extLink');
162
162
  if (s && this.length === 1 && this.closest('heading-title')) {
163
163
  errors.push((0, lint_1.generateForSelf)(this, { start }, rule, 'variable-anchor', s));
@@ -2,6 +2,7 @@ import { Token } from './index';
2
2
  import { SyntaxToken } from './syntax';
3
3
  import type { Config, LintError, AST } from '../base';
4
4
  import type { AstText } from '../internal';
5
+ import type { AstRange } from '../lib/range';
5
6
  /**
6
7
  * section heading
7
8
  *
@@ -51,4 +52,11 @@ export declare abstract class HeadingToken extends Token {
51
52
  * 移除标题后的不可见内容
52
53
  */
53
54
  removeTrail(): void;
55
+ /**
56
+ * Get the section led by this heading
57
+ *
58
+ * 获取由此标题引导的章节
59
+ * @since v1.29.3
60
+ */
61
+ section(): AstRange | undefined;
54
62
  }
@@ -155,7 +155,7 @@ let HeadingToken = (() => {
155
155
  }
156
156
  /** @private */
157
157
  lint(start = this.getAbsoluteIndex(), re) {
158
- LINT: { // eslint-disable-line no-unused-labels
158
+ LINT: {
159
159
  const errors = super.lint(start, re), { firstChild, level } = this, innerStr = firstChild.toString(), unbalancedStart = innerStr.startsWith('='), unbalanced = unbalancedStart || innerStr.endsWith('='), rect = new rect_1.BoundingRect(this, start), s = this.inHtmlAttrs(), rules = ['h1', 'unbalanced-header', 'format-leakage'], { lintConfig } = index_1.default, { computeEditInfo, fix } = lintConfig, severities = rules.map(rule => lintConfig.getSeverity(rule, 'apostrophe'));
160
160
  if (severities[0] && this.level === 1) {
161
161
  const e = (0, lint_1.generateForChild)(firstChild, rect, rules[0], '<h1>', severities[0]);
@@ -247,7 +247,7 @@ let HeadingToken = (() => {
247
247
  }
248
248
  /** @private */
249
249
  json(_, start = this.getAbsoluteIndex()) {
250
- LSP: { // eslint-disable-line no-unused-labels
250
+ LSP: {
251
251
  const json = super.json(undefined, start);
252
252
  json['level'] = this.level;
253
253
  return json;
@@ -305,6 +305,29 @@ let HeadingToken = (() => {
305
305
  }
306
306
  return `<div class="mw-heading mw-heading${level}"><h${level} id="${(0, string_1.sanitizeId)(id)}">${firstChild.toHtmlInternal().trim()}</h${level}></div>`;
307
307
  }
308
+ /**
309
+ * Get the section led by this heading
310
+ *
311
+ * 获取由此标题引导的章节
312
+ * @since v1.29.3
313
+ */
314
+ section() {
315
+ const { parentNode, level } = this;
316
+ if (!parentNode) {
317
+ return undefined;
318
+ }
319
+ const range = this.createRange(), { childNodes, length } = parentNode;
320
+ let i = childNodes.indexOf(this);
321
+ range.setStart(parentNode, i);
322
+ for (i++; i < length; i++) {
323
+ const sibling = childNodes[i];
324
+ if (sibling.is('heading') && sibling.level <= level) {
325
+ break;
326
+ }
327
+ }
328
+ range.setEnd(parentNode, i);
329
+ return range;
330
+ }
308
331
  };
309
332
  return HeadingToken = _classThis;
310
333
  })();
@@ -101,7 +101,6 @@ function validate(key, val, config, halfParsed, ext) {
101
101
  return Boolean(value) && !isNaN(value);
102
102
  }
103
103
  }
104
- /* eslint-enable jsdoc/check-param-names */
105
104
  /**
106
105
  * image parameter
107
106
  *
@@ -135,13 +134,13 @@ let ImageParameterToken = (() => {
135
134
  * @since v1.29.0
136
135
  */
137
136
  get thumb() {
138
- LINT: return this.name === 'manualthumb' // eslint-disable-line no-unused-labels
137
+ LINT: return this.name === 'manualthumb'
139
138
  ? this.normalizeTitle(`File:${super.text().trim()}`, 6, { page: '' })
140
139
  : undefined;
141
140
  }
142
141
  /** image link / 图片链接 */
143
142
  get link() {
144
- LINT: { // eslint-disable-line no-unused-labels
143
+ LINT: {
145
144
  if (this.name !== 'link') {
146
145
  return undefined;
147
146
  }
@@ -287,7 +286,7 @@ let ImageParameterToken = (() => {
287
286
  }
288
287
  /** @private */
289
288
  lint(start = this.getAbsoluteIndex(), re) {
290
- LINT: { // eslint-disable-line no-unused-labels
289
+ LINT: {
291
290
  const errors = super.lint(start, re), { lintConfig } = index_1.default, { computeEditInfo, fix } = lintConfig, { link, name } = this, value = name === 'width' && this.getValue();
292
291
  if (name === 'invalid' || value && value.endsWith('px')) {
293
292
  const rule = 'invalid-gallery', s = lintConfig.getSeverity(rule, 'parameter');
@@ -339,7 +338,7 @@ let ImageParameterToken = (() => {
339
338
  }
340
339
  /** 是否是不可变参数 */
341
340
  #isVoid() {
342
- LINT: return this.#syntax && !this.#syntax.includes('$1'); // eslint-disable-line no-unused-labels
341
+ LINT: return this.#syntax && !this.#syntax.includes('$1');
343
342
  }
344
343
  /**
345
344
  * Get the parameter value
@@ -347,7 +346,6 @@ let ImageParameterToken = (() => {
347
346
  * 获取参数值
348
347
  */
349
348
  getValue() {
350
- // eslint-disable-next-line no-unused-labels
351
349
  LINT: return this.name === 'invalid' ? this.text() : this.#isVoid() || super.text();
352
350
  }
353
351
  /** @private */
@@ -60,7 +60,6 @@ export declare class Token extends AstElement {
60
60
  * @param options options / 选项
61
61
  * @param options.selfClosing whether to be a self-closing tag / 是否自封闭
62
62
  * @param options.closing whether to be a closing tag / 是否是闭合标签
63
- * @throws `RangeError` 非法的标签名
64
63
  */
65
64
  createElement(tagName: string, options?: {
66
65
  selfClosing?: boolean;
@@ -110,7 +109,6 @@ export declare class Token extends AstElement {
110
109
  *
111
110
  * 获取指定的外层HTML标签
112
111
  * @param tag HTML tag name / HTML标签名
113
- * @throws `RangeError` 非法的标签或空标签
114
112
  */
115
113
  findEnclosingHtml(tag?: string): AstRange | undefined;
116
114
  /**
package/dist/src/index.js CHANGED
@@ -541,7 +541,7 @@ let Token = (() => {
541
541
  }
542
542
  /** @private */
543
543
  lint(start = this.getAbsoluteIndex(), re) {
544
- LINT: { // eslint-disable-line no-unused-labels
544
+ LINT: {
545
545
  const { lintConfig } = index_1.default, { computeEditInfo, fix: needFix, ignoreDisables, configurationComment } = lintConfig;
546
546
  let errors = super.lint(start, re);
547
547
  if (this.type === 'root') {
@@ -763,7 +763,6 @@ let Token = (() => {
763
763
  * @param options options / 选项
764
764
  * @param options.selfClosing whether to be a self-closing tag / 是否自封闭
765
765
  * @param options.closing whether to be a closing tag / 是否是闭合标签
766
- * @throws `RangeError` 非法的标签名
767
766
  */
768
767
  createElement(tagName, options) {
769
768
  require('../addon/token');
@@ -843,7 +842,6 @@ let Token = (() => {
843
842
  *
844
843
  * 获取指定的外层HTML标签
845
844
  * @param tag HTML tag name / HTML标签名
846
- * @throws `RangeError` 非法的标签或空标签
847
845
  */
848
846
  findEnclosingHtml(tag) {
849
847
  require('../addon/token');
@@ -87,13 +87,12 @@ let LinkBaseToken = (() => {
87
87
  /* NOT FOR BROWSER END */
88
88
  /** full link / 完整链接 */
89
89
  get link() {
90
- // eslint-disable-next-line no-unused-labels
91
90
  LSP: return this.#title;
92
91
  }
93
92
  /* PRINT ONLY */
94
93
  /** 片段标识符 */
95
94
  get fragment() {
96
- LSP: return this.#title.fragment; // eslint-disable-line no-unused-labels
95
+ LSP: return this.#title.fragment;
97
96
  }
98
97
  /* PRINT ONLY END */
99
98
  /* NOT FOR BROWSER */
@@ -214,7 +213,7 @@ let LinkBaseToken = (() => {
214
213
  }
215
214
  /** @private */
216
215
  lint(start = this.getAbsoluteIndex(), re) {
217
- LINT: { // eslint-disable-line no-unused-labels
216
+ LINT: {
218
217
  const errors = super.lint(start, re), { childNodes: [target, linkText], type } = this, { encoded, fragment } = this.#title, { lintConfig } = index_1.default, { computeEditInfo, fix } = lintConfig, rect = new rect_1.BoundingRect(this, start);
219
218
  let rule = 'unknown-page', s = lintConfig.getSeverity(rule);
220
219
  if (s && target.childNodes.some(({ type: t }) => t === 'template')) {
@@ -267,7 +266,7 @@ let LinkBaseToken = (() => {
267
266
  }
268
267
  /** @private */
269
268
  json(_, start = this.getAbsoluteIndex()) {
270
- LSP: { // eslint-disable-line no-unused-labels
269
+ LSP: {
271
270
  const json = super.json(undefined, start), { type, fragment } = this;
272
271
  if (fragment !== undefined && (type === 'link' || type === 'redirect-target')) {
273
272
  json['fragment'] = fragment;
@@ -293,7 +292,7 @@ let LinkBaseToken = (() => {
293
292
  */
294
293
  setTarget(link) {
295
294
  const { childNodes } = index_1.default.parseWithRef(link, this, 2), token = debug_1.Shadow.run(() => new atom_1.AtomToken(undefined, 'link-target', this.getAttribute('config'), [], { 'Stage-2': ':', '!ExtToken': '', '!HeadingToken': '' }));
296
- token.safeAppend(childNodes);
295
+ token.concat(childNodes); // eslint-disable-line unicorn/prefer-spread
297
296
  this.firstChild.safeReplaceWith(token);
298
297
  }
299
298
  /**
@@ -20,7 +20,7 @@ class CategoryToken extends base_1.LinkBaseToken {
20
20
  /* PRINT ONLY */
21
21
  /** sort key / 分类排序关键字 */
22
22
  get sortkey() {
23
- LSP: { // eslint-disable-line no-unused-labels
23
+ LSP: {
24
24
  const { childNodes: [, child] } = this;
25
25
  return child && (0, string_1.decodeHtml)(child.text());
26
26
  }
@@ -33,7 +33,7 @@ class CategoryToken extends base_1.LinkBaseToken {
33
33
  /* NOT FOR BROWSER END */
34
34
  /** @private */
35
35
  json(_, start = this.getAbsoluteIndex()) {
36
- LSP: { // eslint-disable-line no-unused-labels
36
+ LSP: {
37
37
  const json = super.json(undefined, start), { sortkey } = this;
38
38
  if (sortkey) {
39
39
  json['sortkey'] = sortkey;