wikilint 2.7.1 → 2.9.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 (86) hide show
  1. package/dist/base.d.ts +2 -2
  2. package/dist/base.js +1 -0
  3. package/dist/index.d.ts +1 -3
  4. package/dist/index.js +7 -2
  5. package/dist/lib/element.d.ts +0 -6
  6. package/dist/lib/element.js +2 -6
  7. package/dist/lib/node.d.ts +1 -1
  8. package/dist/lib/node.js +1 -1
  9. package/dist/lib/text.d.ts +0 -6
  10. package/dist/lib/text.js +4 -8
  11. package/dist/parser/braces.js +10 -1
  12. package/dist/parser/externalLinks.js +1 -1
  13. package/dist/parser/magicLinks.js +34 -17
  14. package/dist/parser/table.js +1 -1
  15. package/dist/src/arg.d.ts +0 -2
  16. package/dist/src/arg.js +2 -2
  17. package/dist/src/attribute.d.ts +0 -2
  18. package/dist/src/attribute.js +2 -2
  19. package/dist/src/attributes.d.ts +0 -2
  20. package/dist/src/attributes.js +1 -1
  21. package/dist/src/converter.js +1 -1
  22. package/dist/src/converterFlags.d.ts +0 -2
  23. package/dist/src/converterFlags.js +1 -1
  24. package/dist/src/converterRule.js +1 -1
  25. package/dist/src/extLink.d.ts +0 -2
  26. package/dist/src/extLink.js +2 -2
  27. package/dist/src/gallery.d.ts +0 -2
  28. package/dist/src/gallery.js +2 -2
  29. package/dist/src/heading.d.ts +0 -2
  30. package/dist/src/heading.js +3 -3
  31. package/dist/src/html.d.ts +0 -2
  32. package/dist/src/html.js +2 -2
  33. package/dist/src/imageParameter.d.ts +0 -2
  34. package/dist/src/imageParameter.js +1 -1
  35. package/dist/src/imagemap.d.ts +0 -2
  36. package/dist/src/imagemap.js +2 -2
  37. package/dist/src/index.d.ts +1 -1
  38. package/dist/src/index.js +29 -15
  39. package/dist/src/link/base.d.ts +0 -2
  40. package/dist/src/link/base.js +1 -1
  41. package/dist/src/link/file.d.ts +0 -2
  42. package/dist/src/link/file.js +1 -1
  43. package/dist/src/link/galleryImage.d.ts +0 -2
  44. package/dist/src/link/galleryImage.js +2 -3
  45. package/dist/src/link/index.d.ts +0 -2
  46. package/dist/src/link/index.js +1 -1
  47. package/dist/src/link/redirectTarget.d.ts +0 -2
  48. package/dist/src/link/redirectTarget.js +3 -3
  49. package/dist/src/magicLink.d.ts +7 -5
  50. package/dist/src/magicLink.js +37 -5
  51. package/dist/src/nested.d.ts +0 -2
  52. package/dist/src/nested.js +3 -3
  53. package/dist/src/nowiki/comment.d.ts +0 -2
  54. package/dist/src/nowiki/comment.js +1 -1
  55. package/dist/src/nowiki/index.d.ts +0 -2
  56. package/dist/src/nowiki/index.js +1 -1
  57. package/dist/src/nowiki/quote.d.ts +0 -2
  58. package/dist/src/nowiki/quote.js +1 -1
  59. package/dist/src/paramTag/index.d.ts +0 -2
  60. package/dist/src/paramTag/index.js +2 -2
  61. package/dist/src/parameter.d.ts +0 -2
  62. package/dist/src/parameter.js +2 -2
  63. package/dist/src/pre.d.ts +0 -2
  64. package/dist/src/pre.js +1 -1
  65. package/dist/src/redirect.d.ts +0 -4
  66. package/dist/src/redirect.js +3 -3
  67. package/dist/src/syntax.d.ts +0 -2
  68. package/dist/src/syntax.js +1 -1
  69. package/dist/src/table/index.d.ts +0 -2
  70. package/dist/src/table/index.js +1 -1
  71. package/dist/src/table/td.d.ts +0 -2
  72. package/dist/src/table/td.js +2 -2
  73. package/dist/src/table/trBase.d.ts +0 -2
  74. package/dist/src/table/trBase.js +2 -2
  75. package/dist/src/tagPair/ext.d.ts +0 -2
  76. package/dist/src/tagPair/ext.js +1 -1
  77. package/dist/src/tagPair/include.d.ts +0 -2
  78. package/dist/src/tagPair/include.js +1 -1
  79. package/dist/src/tagPair/index.js +2 -2
  80. package/dist/src/transclude.d.ts +0 -2
  81. package/dist/src/transclude.js +2 -2
  82. package/dist/util/lint.js +1 -1
  83. package/dist/util/string.js +1 -1
  84. package/i18n/zh-hans.json +1 -0
  85. package/i18n/zh-hant.json +1 -0
  86. package/package.json +4 -4
package/dist/base.d.ts CHANGED
@@ -11,8 +11,8 @@ export interface Config {
11
11
  readonly variants: string[];
12
12
  readonly excludes?: string[];
13
13
  }
14
- export type TokenTypes = 'root' | 'plain' | 'redirect' | 'redirect-syntax' | 'redirect-target' | 'onlyinclude' | 'noinclude' | 'include' | 'comment' | 'ext' | 'ext-attrs' | 'ext-attr-dirty' | 'ext-attr' | 'attr-key' | 'attr-value' | 'ext-inner' | 'arg' | 'arg-name' | 'arg-default' | 'hidden' | 'magic-word' | 'magic-word-name' | 'invoke-function' | 'invoke-module' | 'template' | 'template-name' | 'parameter' | 'parameter-key' | 'parameter-value' | 'heading' | 'heading-title' | 'heading-trail' | 'html' | 'html-attrs' | 'html-attr-dirty' | 'html-attr' | 'table' | 'tr' | 'td' | 'table-syntax' | 'table-attrs' | 'table-attr-dirty' | 'table-attr' | 'table-inter' | 'td-inner' | 'hr' | 'double-underscore' | 'link' | 'link-target' | 'link-text' | 'category' | 'file' | 'gallery-image' | 'imagemap-image' | 'image-parameter' | 'quote' | 'ext-link' | 'ext-link-text' | 'ext-link-url' | 'free-ext-link' | 'list' | 'dd' | 'converter' | 'converter-flags' | 'converter-flag' | 'converter-rule' | 'converter-rule-variant' | 'converter-rule-to' | 'converter-rule-from' | 'param-line' | 'imagemap-link';
15
- export declare const rules: readonly ["bold-header", "format-leakage", "fostered-content", "h1", "illegal-attr", "insecure-style", "invalid-gallery", "invalid-imagemap", "invalid-invoke", "lonely-apos", "lonely-bracket", "lonely-http", "nested-link", "no-arg", "no-duplicate", "no-ignored", "obsolete-attr", "obsolete-tag", "parsing-order", "pipe-like", "table-layout", "tag-like", "unbalanced-header", "unclosed-comment", "unclosed-quote", "unclosed-table", "unescaped", "unknown-page", "unmatched-tag", "unterminated-url", "url-encoding", "var-anchor", "void-ext"];
14
+ export type TokenTypes = 'root' | 'plain' | 'redirect' | 'redirect-syntax' | 'redirect-target' | 'onlyinclude' | 'noinclude' | 'include' | 'comment' | 'ext' | 'ext-attrs' | 'ext-attr-dirty' | 'ext-attr' | 'attr-key' | 'attr-value' | 'ext-inner' | 'arg' | 'arg-name' | 'arg-default' | 'hidden' | 'magic-word' | 'magic-word-name' | 'invoke-function' | 'invoke-module' | 'template' | 'template-name' | 'parameter' | 'parameter-key' | 'parameter-value' | 'heading' | 'heading-title' | 'heading-trail' | 'html' | 'html-attrs' | 'html-attr-dirty' | 'html-attr' | 'table' | 'tr' | 'td' | 'table-syntax' | 'table-attrs' | 'table-attr-dirty' | 'table-attr' | 'table-inter' | 'td-inner' | 'hr' | 'double-underscore' | 'link' | 'link-target' | 'link-text' | 'category' | 'file' | 'gallery-image' | 'imagemap-image' | 'image-parameter' | 'quote' | 'ext-link' | 'ext-link-text' | 'ext-link-url' | 'free-ext-link' | 'magic-link' | 'list' | 'dd' | 'converter' | 'converter-flags' | 'converter-flag' | 'converter-rule' | 'converter-rule-variant' | 'converter-rule-to' | 'converter-rule-from' | 'param-line' | 'imagemap-link';
15
+ export declare const rules: readonly ["bold-header", "format-leakage", "fostered-content", "h1", "illegal-attr", "insecure-style", "invalid-gallery", "invalid-imagemap", "invalid-invoke", "invalid-isbn", "lonely-apos", "lonely-bracket", "lonely-http", "nested-link", "no-arg", "no-duplicate", "no-ignored", "obsolete-attr", "obsolete-tag", "parsing-order", "pipe-like", "table-layout", "tag-like", "unbalanced-header", "unclosed-comment", "unclosed-quote", "unclosed-table", "unescaped", "unknown-page", "unmatched-tag", "unterminated-url", "url-encoding", "var-anchor", "void-ext"];
16
16
  export declare namespace LintError {
17
17
  type Severity = 'error' | 'warning';
18
18
  type Rule = typeof rules[number];
package/dist/base.js CHANGED
@@ -11,6 +11,7 @@ exports.rules = [
11
11
  'invalid-gallery',
12
12
  'invalid-imagemap',
13
13
  'invalid-invoke',
14
+ 'invalid-isbn',
14
15
  'lonely-apos',
15
16
  'lonely-bracket',
16
17
  'lonely-http',
package/dist/index.d.ts CHANGED
@@ -20,6 +20,4 @@ declare const Parser: Parser;
20
20
  export = Parser;
21
21
  export type { Config, LintError };
22
22
  export type * from './internal';
23
- declare global {
24
- type Acceptable = unknown;
25
- }
23
+ declare global { type Acceptable = unknown; }
package/dist/index.js CHANGED
@@ -43,7 +43,11 @@ const Parser = {
43
43
  return new Title(title, defaultNs, config, decode, selfLink);
44
44
  }
45
45
  const { Token } = require('./src/index');
46
- const token = debug_1.Shadow.run(() => new Token(title, config).parseOnce(0, include).parseOnce()), titleObj = new Title(String(token), defaultNs, config, decode, selfLink);
46
+ const token = debug_1.Shadow.run(() => {
47
+ const root = new Token(title, config);
48
+ root.type = 'root';
49
+ return root.parseOnce(0, include).parseOnce();
50
+ }), titleObj = new Title(token.toString(), defaultNs, config, decode, selfLink);
47
51
  debug_1.Shadow.run(() => {
48
52
  for (const key of ['main', 'fragment']) {
49
53
  const str = titleObj[key];
@@ -60,13 +64,14 @@ const Parser = {
60
64
  const { Token } = require('./src/index');
61
65
  const root = debug_1.Shadow.run(() => {
62
66
  const token = new Token(wikitext, config);
67
+ token.type = 'root';
63
68
  try {
64
69
  return token.parse(maxStage, include);
65
70
  }
66
71
  catch (e) {
67
72
  if (e instanceof Error) {
68
73
  const file = path.join(__dirname, '..', 'errors', new Date().toISOString()), stage = token.getAttribute('stage');
69
- fs.writeFileSync(file, stage === constants_1.MAX_STAGE ? wikitext : String(token));
74
+ fs.writeFileSync(file, stage === constants_1.MAX_STAGE ? wikitext : token.toString());
70
75
  fs.writeFileSync(`${file}.err`, e.stack);
71
76
  fs.writeFileSync(`${file}.json`, JSON.stringify({ stage, include, config }, null, '\t'));
72
77
  }
@@ -57,10 +57,4 @@ export declare abstract class AstElement extends AstNode {
57
57
  * @param i 子节点位置
58
58
  */
59
59
  setText(str: string, i?: number): string;
60
- /**
61
- * @override
62
- * @param start
63
- * @param re 用于`AstText`后代节点的正则表达式
64
- */
65
- lint(start?: number, re?: RegExp): LintError[];
66
60
  }
@@ -164,17 +164,13 @@ class AstElement extends node_1.AstNode {
164
164
  toString(separator = '') {
165
165
  return this.childNodes.map(String).join(separator);
166
166
  }
167
- /**
168
- * @override
169
- * @param start
170
- * @param re 用于`AstText`后代节点的正则表达式
171
- */
167
+ /** @private */
172
168
  lint(start = this.getAbsoluteIndex(), re) {
173
169
  const errors = [];
174
170
  for (let i = 0, cur = start + this.getAttribute('padding'); i < this.length; i++) {
175
171
  const child = this.childNodes[i];
176
172
  errors.push(...child.lint(cur, re));
177
- cur += String(child).length + this.getGaps(i);
173
+ cur += child.toString().length + this.getGaps(i);
178
174
  }
179
175
  return errors;
180
176
  }
@@ -19,7 +19,7 @@ export declare abstract class AstNode implements AstNodeBase {
19
19
  type: TokenTypes | 'text';
20
20
  data?: string | undefined;
21
21
  readonly childNodes: readonly AstNodes[];
22
- abstract lint(): LintError[];
22
+ lint(): LintError[];
23
23
  /** 首位子节点 */
24
24
  get firstChild(): AstNodes | undefined;
25
25
  /** 末位子节点 */
package/dist/lib/node.js CHANGED
@@ -14,7 +14,7 @@ const getDimension = (str) => {
14
14
  * @param j 子节点序号
15
15
  * @param parent 父节点
16
16
  */
17
- const getIndex = (j, parent) => parent.childNodes.slice(0, j).reduce((acc, cur, i) => acc + String(cur).length + parent.getGaps(i), 0)
17
+ const getIndex = (j, parent) => parent.childNodes.slice(0, j).reduce((acc, cur, i) => acc + cur.toString().length + parent.getGaps(i), 0)
18
18
  + parent.getAttribute('padding');
19
19
  /** 类似Node */
20
20
  class AstNode {
@@ -10,12 +10,6 @@ export declare class AstText extends AstNode {
10
10
  constructor(text: string);
11
11
  /** 可见部分 */
12
12
  text(): string;
13
- /**
14
- * @override
15
- * @param start
16
- * @throws `Error` 孤立文本节点
17
- */
18
- lint(start?: number, errorRegex?: RegExp): LintError[];
19
13
  /**
20
14
  * 替换字符串
21
15
  * @param text 替换的字符串
package/dist/lib/text.js CHANGED
@@ -73,11 +73,7 @@ class AstText extends node_1.AstNode {
73
73
  text() {
74
74
  return this.data;
75
75
  }
76
- /**
77
- * @override
78
- * @param start
79
- * @throws `Error` 孤立文本节点
80
- */
76
+ /** @private */
81
77
  lint(start = this.getAbsoluteIndex(), errorRegex) {
82
78
  const { data, parentNode, nextSibling, previousSibling } = this;
83
79
  if (!parentNode) {
@@ -129,7 +125,7 @@ class AstText extends node_1.AstNode {
129
125
  else if (char === 'h' && index === 0 && type === 'ext-link-text' && extImage.test(data)) {
130
126
  continue;
131
127
  }
132
- const startIndex = start + index, endIndex = startIndex + length, rootStr = String(root), nextChar = rootStr[endIndex], previousChar = rootStr[startIndex - 1], severity = length > 1 && !(char === '<' && !/[\s/>]/u.test(nextChar ?? '')
128
+ const startIndex = start + index, endIndex = startIndex + length, rootStr = root.toString(), nextChar = rootStr[endIndex], previousChar = rootStr[startIndex - 1], severity = length > 1 && !(char === '<' && !/[\s/>]/u.test(nextChar ?? '')
133
129
  || isHtmlAttrVal && (char === '[' || char === ']'))
134
130
  || char === '{' && (nextChar === char || previousChar === '-')
135
131
  || char === '}' && (previousChar === char || nextChar === '-')
@@ -190,7 +186,7 @@ class AstText extends node_1.AstNode {
190
186
  ];
191
187
  }
192
188
  else if (char === '[' && type === 'ext-link-text') {
193
- const i = parentNode.getAbsoluteIndex() + String(parentNode).length;
189
+ const i = parentNode.getAbsoluteIndex() + parentNode.toString().length;
194
190
  e.suggestions = [
195
191
  {
196
192
  desc: 'escape',
@@ -200,7 +196,7 @@ class AstText extends node_1.AstNode {
200
196
  ];
201
197
  }
202
198
  else if (char === ']' && previousType === 'free-ext-link' && severity === 'error') {
203
- const i = start - String(previousSibling).length;
199
+ const i = start - previousSibling.toString().length;
204
200
  e.fix = {
205
201
  range: [i, i],
206
202
  text: '[',
@@ -13,7 +13,16 @@ const arg_1 = require("../src/arg");
13
13
  * @throws TranscludeToken.constructor()
14
14
  */
15
15
  const parseBraces = (wikitext, config, accum) => {
16
- const source = `${config.excludes?.includes('heading') ? '' : '^(\0\\d+c\x7F)*={1,6}|'}\\[\\[|\\{{2,}|-\\{(?!\\{)`, { parserFunction: [, , , subst] } = config, stack = [], closes = { '=': '\n', '{': '\\}{2,}|\\|', '-': '\\}-', '[': '\\]\\]' }, marks = new Map([['!', '!'], ['!!', '+'], ['(!', '{'], ['!)', '}'], ['!-', '-'], ['=', '~']]);
16
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
17
+ /\{\{\s*([!=]|!!|\(!|!\)|!-)\s*\}\}(?!\})/gu;
18
+ const source = `${config.excludes?.includes('heading') ? '' : '^(\0\\d+c\x7F)*={1,6}|'}\\[\\[|\\{{2,}|-\\{(?!\\{)`, { parserFunction: [, , , subst] } = config, stack = [], closes = { '=': '\n', '{': '\\}{2,}|\\|', '-': '\\}-', '[': '\\]\\]' }, marks = new Map([['!', '!'], ['!!', '+'], ['(!', '{'], ['!)', '}'], ['!-', '-'], ['=', '~']]), re = new RegExp(`\\{\\{\\s*(${[...marks.keys()].map(string_1.escapeRegExp).join('|')})\\s*\\}\\}(?!\\})`, 'gu');
19
+ wikitext = wikitext.replace(re, (m, p1) => {
20
+ // @ts-expect-error abstract class
21
+ new transclude_1.TranscludeToken(m.slice(2, -2), [], config, accum);
22
+ return `\0${accum.length - 2}${marks.get(p1)}\x7F`;
23
+ });
24
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
25
+ /^(\0\d+c\x7F)*={1,6}|\[\[|\{{2,}|-\{(?!\{)|[\n|=]|\}{2,}|\}-|\]\]/gmu;
17
26
  let regex = new RegExp(source, 'gmu'), mt = regex.exec(wikitext), moreBraces = wikitext.includes('}}'), lastIndex;
18
27
  while (mt
19
28
  || lastIndex !== undefined && lastIndex <= wikitext.length && stack[stack.length - 1]?.[0]?.startsWith('=')) {
@@ -29,7 +29,7 @@ const parseExternalLinks = (wikitext, config, accum, inFile) => {
29
29
  }
30
30
  if (inFile) {
31
31
  // @ts-expect-error abstract class
32
- new magicLink_1.MagicLinkToken(url, true, config, accum);
32
+ new magicLink_1.MagicLinkToken(url, 'ext-link-url', config, accum);
33
33
  return `[\0${length}f\x7F${space}${text}]`;
34
34
  }
35
35
  // @ts-expect-error abstract class
@@ -10,29 +10,46 @@ const magicLink_1 = require("../src/magicLink");
10
10
  * @param accum
11
11
  */
12
12
  const parseMagicLinks = (wikitext, config, accum) => {
13
- const regex = new RegExp(`(^|[^\\p{L}\\d_])(?:${config.protocol})(${string_1.extUrlCharFirst}${string_1.extUrlChar})`, 'giu');
13
+ const space = '[\\p{Zs}\\t]|&nbsp;|&#0*160;|&#x0*a0;', spdash = `(?:${space}|-)`, regex = new RegExp('(^|[^\\p{L}\\d_])' // lead
14
+ + '(?:'
15
+ + `(?:${config.protocol})(${string_1.extUrlCharFirst}${string_1.extUrlChar})` // free external link
16
+ + '|'
17
+ + `(?:RFC|PMID)(?:${space})+\\d+\\b` // RFC or PMID
18
+ + '|'
19
+ + `ISBN(?:${space})+(?:97[89]${spdash}?)?(?:\\d${spdash}?){9}[\\dx]\\b` // ISBN
20
+ + ')', 'giu');
14
21
  return wikitext.replace(regex, (m, lead, p1) => {
15
- let trail = '', url = lead ? m.slice(lead.length) : m;
16
- const m2 = /&(?:lt|gt|nbsp|#x0*(?:3[ce]|a0)|#0*(?:6[02]|160));/iu.exec(url);
17
- if (m2) {
18
- trail = url.slice(m2.index);
19
- url = url.slice(0, m2.index);
20
- }
21
- const sep = new RegExp(`[,;\\\\.:!?${url.includes('(') ? '' : ')'}]+$`, 'u'), sepChars = sep.exec(url);
22
- if (sepChars) {
23
- let correction = 0;
24
- if (sepChars[0].startsWith(';') && /&(?:[a-z]+|#x[\da-f]+|#\d+)$/iu.test(url.slice(0, sepChars.index))) {
25
- correction = 1;
22
+ let url = lead ? m.slice(lead.length) : m;
23
+ if (p1) {
24
+ let trail = '';
25
+ const m2 = /&(?:lt|gt|nbsp|#x0*(?:3[ce]|a0)|#0*(?:6[02]|160));/iu.exec(url);
26
+ if (m2) {
27
+ trail = url.slice(m2.index);
28
+ url = url.slice(0, m2.index);
29
+ }
30
+ const sep = new RegExp(`[,;\\\\.:!?${url.includes('(') ? '' : ')'}]+$`, 'u'), sepChars = sep.exec(url);
31
+ if (sepChars) {
32
+ let correction = 0;
33
+ if (sepChars[0].startsWith(';')
34
+ && /&(?:[a-z]+|#x[\da-f]+|#\d+)$/iu.test(url.slice(0, sepChars.index))) {
35
+ correction = 1;
36
+ }
37
+ trail = url.slice(sepChars.index + correction) + trail;
38
+ url = url.slice(0, sepChars.index + correction);
39
+ }
40
+ if (trail.length >= p1.length) {
41
+ return m;
26
42
  }
27
- trail = url.slice(sepChars.index + correction) + trail;
28
- url = url.slice(0, sepChars.index + correction);
43
+ // @ts-expect-error abstract class
44
+ new magicLink_1.MagicLinkToken(url, undefined, config, accum);
45
+ return `${lead}\0${accum.length - 1}w\x7F${trail}`;
29
46
  }
30
- if (trail.length >= p1.length) {
47
+ else if (!/^(?:RFC|PMID|ISBN)/u.test(url)) {
31
48
  return m;
32
49
  }
33
50
  // @ts-expect-error abstract class
34
- new magicLink_1.MagicLinkToken(url, false, config, accum);
35
- return `${lead}\0${accum.length - 1}w\x7F${trail}`;
51
+ new magicLink_1.MagicLinkToken(url, 'magic-link', config, accum);
52
+ return `${lead}\0${accum.length - 1}i\x7F`;
36
53
  });
37
54
  };
38
55
  exports.parseMagicLinks = parseMagicLinks;
@@ -40,7 +40,7 @@ const parseTable = ({ firstChild: { data }, type, name }, config, accum) => {
40
40
  topToken.insertAt(token);
41
41
  }
42
42
  else {
43
- lastChild.setText(String(lastChild) + str);
43
+ lastChild.setText(lastChild.toString() + str);
44
44
  }
45
45
  },
46
46
  /** 取出最近的表格行 */
package/dist/src/arg.d.ts CHANGED
@@ -18,6 +18,4 @@ export declare abstract class ArgToken extends Token {
18
18
  constructor(parts: readonly string[], config?: Parser.Config, accum?: Token[]);
19
19
  /** @override */
20
20
  text(): string;
21
- /** @override */
22
- lint(start?: number, re?: RegExp): LintError[];
23
21
  }
package/dist/src/arg.js CHANGED
@@ -53,7 +53,7 @@ class ArgToken extends index_2.Token {
53
53
  getGaps() {
54
54
  return 1;
55
55
  }
56
- /** @override */
56
+ /** @private */
57
57
  lint(start = this.getAbsoluteIndex(), re) {
58
58
  const { childNodes: [argName, argDefault, ...rest] } = this;
59
59
  if (!this.getAttribute('include')) {
@@ -68,7 +68,7 @@ class ArgToken extends index_2.Token {
68
68
  }
69
69
  const errors = argName.lint(start + 3, re);
70
70
  if (argDefault) {
71
- errors.push(...argDefault.lint(start + 4 + String(argName).length, re));
71
+ errors.push(...argDefault.lint(start + 4 + argName.toString().length, re));
72
72
  }
73
73
  if (rest.length > 0) {
74
74
  const rect = { start, ...this.getRootNode().posFromIndex(start) };
@@ -33,8 +33,6 @@ export declare abstract class AttributeToken extends Token {
33
33
  constructor(type: AttributeTypes, tag: string, key: string, equal?: string, value?: string, quotes?: readonly [string?, string?], config?: Parser.Config, accum?: Token[]);
34
34
  /** @override */
35
35
  text(): string;
36
- /** @override */
37
- lint(start?: number, re?: RegExp): LintError[];
38
36
  /** 获取属性值 */
39
37
  getValue(): string | true;
40
38
  }
@@ -244,7 +244,7 @@ class AttributeToken extends index_2.Token {
244
244
  /** @private */
245
245
  toString() {
246
246
  const [quoteStart = '', quoteEnd = ''] = this.#quotes;
247
- return this.#equal ? super.toString(this.#equal + quoteStart) + quoteEnd : String(this.firstChild);
247
+ return this.#equal ? super.toString(this.#equal + quoteStart) + quoteEnd : this.firstChild.toString();
248
248
  }
249
249
  /** @override */
250
250
  text() {
@@ -254,7 +254,7 @@ class AttributeToken extends index_2.Token {
254
254
  getGaps() {
255
255
  return this.#equal ? this.#equal.length + (this.#quotes[0]?.length ?? 0) : 0;
256
256
  }
257
- /** @override */
257
+ /** @private */
258
258
  lint(start = this.getAbsoluteIndex(), re) {
259
259
  const errors = super.lint(start, re), { balanced, firstChild, lastChild, type, name, tag } = this, value = this.getValue();
260
260
  let rect;
@@ -38,7 +38,5 @@ export declare abstract class AttributesToken extends Token {
38
38
  * @param key 属性键
39
39
  */
40
40
  getAttr(key: string): string | true | undefined;
41
- /** @override */
42
- lint(start?: number, re?: RegExp): LintError[];
43
41
  }
44
42
  export {};
@@ -92,7 +92,7 @@ class AttributesToken extends index_2.Token {
92
92
  getAttr(key) {
93
93
  return this.getAttrToken(key)?.getValue();
94
94
  }
95
- /** @override */
95
+ /** @private */
96
96
  lint(start = this.getAbsoluteIndex(), re) {
97
97
  const errors = super.lint(start, re), { parentNode, length, childNodes } = this, attrs = new Map(), duplicated = new Set();
98
98
  let rect;
@@ -36,7 +36,7 @@ class ConverterToken extends index_2.Token {
36
36
  /** @private */
37
37
  toString() {
38
38
  const { childNodes: [flags, ...rules] } = this;
39
- return `-{${String(flags)}${flags.length > 0 ? '|' : ''}${rules.map(String).join(';')}}-`;
39
+ return `-{${flags.toString()}${flags.length > 0 ? '|' : ''}${rules.map(String).join(';')}}-`;
40
40
  }
41
41
  /** @override */
42
42
  text() {
@@ -24,6 +24,4 @@ export declare abstract class ConverterFlagsToken extends Token {
24
24
  getUnknownFlags(): Set<string>;
25
25
  /** 获取指定语言变体的转换标记 */
26
26
  getVariantFlags(): Set<string>;
27
- /** @override */
28
- lint(start?: number, re?: RegExp): LintError[];
29
27
  }
@@ -43,7 +43,7 @@ class ConverterFlagsToken extends index_2.Token {
43
43
  const variants = new Set(this.getAttribute('config').variants);
44
44
  return new Set(this.#flags.filter(flag => variants.has(flag)));
45
45
  }
46
- /** @override */
46
+ /** @private */
47
47
  lint(start = this.getAbsoluteIndex(), re) {
48
48
  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, errors = super.lint(start, re);
49
49
  if (variantFlags.size === knownFlagCount || validFlags.size === knownFlagCount) {
@@ -33,7 +33,7 @@ class ConverterRuleToken extends index_2.Token {
33
33
  const { childNodes } = this;
34
34
  if (childNodes.length === 3) {
35
35
  const [from, variant, to] = childNodes;
36
- return `${String(from)}=>${String(variant)}:${String(to)}`;
36
+ return `${from.toString()}=>${variant.toString()}:${to.toString()}`;
37
37
  }
38
38
  return super.toString(':');
39
39
  }
@@ -20,6 +20,4 @@ export declare abstract class ExtLinkToken extends Token {
20
20
  constructor(url?: string, space?: string, text?: string, config?: Parser.Config, accum?: Token[]);
21
21
  /** @override */
22
22
  text(): string;
23
- /** @override */
24
- lint(start?: number, re?: RegExp): LintError[];
25
23
  }
@@ -23,7 +23,7 @@ class ExtLinkToken extends index_2.Token {
23
23
  const link = url && /\0\d+f\x7F/u.test(url)
24
24
  ? accum[Number(url.slice(1, -2))]
25
25
  // @ts-expect-error abstract class
26
- : new magicLink_1.MagicLinkToken(url, true, config, accum);
26
+ : new magicLink_1.MagicLinkToken(url, 'ext-link-url', config, accum);
27
27
  this.insertAt(link);
28
28
  this.#space = space;
29
29
  if (text) {
@@ -52,7 +52,7 @@ class ExtLinkToken extends index_2.Token {
52
52
  getGaps() {
53
53
  return this.#space.length;
54
54
  }
55
- /** @override */
55
+ /** @private */
56
56
  lint(start = this.getAbsoluteIndex(), re) {
57
57
  const errors = super.lint(start, re);
58
58
  if (this.length === 1 && this.closest('heading-title')) {
@@ -22,6 +22,4 @@ export declare abstract class GalleryToken extends Token {
22
22
  constructor(inner?: string, config?: Parser.Config, accum?: Token[]);
23
23
  /** @override */
24
24
  text(): string;
25
- /** @override */
26
- lint(start?: number, re?: RegExp): LintError[];
27
25
  }
@@ -51,11 +51,11 @@ class GalleryToken extends index_2.Token {
51
51
  getGaps() {
52
52
  return 1;
53
53
  }
54
- /** @override */
54
+ /** @private */
55
55
  lint(start = this.getAbsoluteIndex(), re) {
56
56
  const { top, left } = this.getRootNode().posFromIndex(start), errors = [];
57
57
  for (let i = 0; i < this.length; i++) {
58
- const child = this.childNodes[i], str = String(child), { length } = str, trimmed = str.trim(), startLine = top + i, startCol = i ? 0 : left;
58
+ const child = this.childNodes[i], str = child.toString(), { length } = str, trimmed = str.trim(), startLine = top + i, startCol = i ? 0 : left;
59
59
  if (child.type === 'noinclude' && trimmed && !/^<!--.*-->$/u.test(trimmed)) {
60
60
  errors.push({
61
61
  rule: 'no-ignored',
@@ -21,6 +21,4 @@ export declare abstract class HeadingToken extends Token {
21
21
  constructor(level: number, input: readonly [string?, string?], config?: Parser.Config, accum?: Token[]);
22
22
  /** @override */
23
23
  text(): string;
24
- /** @override */
25
- lint(start?: number, re?: RegExp): LintError[];
26
24
  }
@@ -36,7 +36,7 @@ class HeadingToken extends index_2.Token {
36
36
  /** @private */
37
37
  toString() {
38
38
  const equals = this.#equals;
39
- return equals + String(this.firstChild) + equals + String(this.lastChild);
39
+ return equals + this.firstChild.toString() + equals + this.lastChild.toString();
40
40
  }
41
41
  /** @override */
42
42
  text() {
@@ -51,9 +51,9 @@ class HeadingToken extends index_2.Token {
51
51
  getGaps() {
52
52
  return this.level;
53
53
  }
54
- /** @override */
54
+ /** @private */
55
55
  lint(start = this.getAbsoluteIndex(), re) {
56
- const errors = super.lint(start, re), { firstChild, level } = this, innerStr = String(firstChild), quotes = firstChild.childNodes.filter((node) => node.type === 'quote'), boldQuotes = quotes.filter(({ bold }) => bold), italicQuotes = quotes.filter(({ italic }) => italic);
56
+ const errors = super.lint(start, re), { firstChild, level } = this, innerStr = firstChild.toString(), quotes = firstChild.childNodes.filter((node) => node.type === 'quote'), boldQuotes = quotes.filter(({ bold }) => bold), italicQuotes = quotes.filter(({ italic }) => italic);
57
57
  let rect;
58
58
  if (this.level === 1) {
59
59
  rect = { start, ...this.getRootNode().posFromIndex(start) };
@@ -26,8 +26,6 @@ export declare abstract class HtmlToken extends Token {
26
26
  constructor(name: string, attr: AttributesToken, closing: boolean, selfClosing: boolean, config?: Parser.Config, accum?: Token[]);
27
27
  /** @override */
28
28
  text(): string;
29
- /** @override */
30
- lint(start?: number, re?: RegExp): LintError[];
31
29
  /**
32
30
  * 搜索匹配的标签
33
31
  * @throws `SyntaxError` 同时闭合和自封闭的标签
package/dist/src/html.js CHANGED
@@ -78,7 +78,7 @@ class HtmlToken extends index_2.Token {
78
78
  ? this.#tag.length + (this.closing ? 2 : 1)
79
79
  : super.getAttribute(key);
80
80
  }
81
- /** @override */
81
+ /** @private */
82
82
  lint(start = this.getAbsoluteIndex(), re) {
83
83
  const errors = super.lint(start, re);
84
84
  let refError;
@@ -167,7 +167,7 @@ class HtmlToken extends index_2.Token {
167
167
  * @throws `SyntaxError` 未匹配的标签
168
168
  */
169
169
  findMatchingTag() {
170
- const { html: [normalTags, flexibleTags, voidTags] } = this.getAttribute('config'), { name: tagName, parentNode, closing } = this, string = (0, string_1.noWrap)(String(this));
170
+ const { html: [normalTags, flexibleTags, voidTags] } = this.getAttribute('config'), { name: tagName, parentNode, closing } = this, string = (0, string_1.noWrap)(this.toString());
171
171
  if (closing && (this.#selfClosing || voidTags.includes(tagName))) {
172
172
  throw new SyntaxError(`tag that is both closing and self-closing: ${string}`);
173
173
  }
@@ -18,8 +18,6 @@ export declare abstract class ImageParameterToken extends Token {
18
18
  constructor(str: string, extension: string | undefined, config?: Parser.Config, accum?: Token[]);
19
19
  /** @override */
20
20
  text(): string;
21
- /** @override */
22
- lint(start?: number, re?: RegExp): LintError[];
23
21
  /** 获取参数值 */
24
22
  getValue(): string | true;
25
23
  }
@@ -99,7 +99,7 @@ class ImageParameterToken extends index_2.Token {
99
99
  ? Math.max(0, this.#syntax.indexOf('$1'))
100
100
  : super.getAttribute(key);
101
101
  }
102
- /** @override */
102
+ /** @private */
103
103
  lint(start = this.getAbsoluteIndex(), re) {
104
104
  const errors = super.lint(start, re), { link, name } = this;
105
105
  if (name === 'invalid') {
@@ -24,6 +24,4 @@ export declare abstract class ImagemapToken extends Token {
24
24
  constructor(inner?: string, config?: Parser.Config, accum?: Token[]);
25
25
  /** @override */
26
26
  text(): string;
27
- /** @override */
28
- lint(start?: number, re?: RegExp): LintError[];
29
27
  }
@@ -85,12 +85,12 @@ class ImagemapToken extends index_2.Token {
85
85
  getGaps() {
86
86
  return 1;
87
87
  }
88
- /** @override */
88
+ /** @private */
89
89
  lint(start = this.getAbsoluteIndex(), re) {
90
90
  const errors = super.lint(start, re), rect = { start, ...this.getRootNode().posFromIndex(start) };
91
91
  if (this.image) {
92
92
  errors.push(...this.childNodes.filter(child => {
93
- const str = String(child).trim();
93
+ const str = child.toString().trim();
94
94
  return child.type === 'noinclude' && str && !str.startsWith('#');
95
95
  }).map(child => (0, lint_1.generateForChild)(child, rect, 'invalid-imagemap', 'invalid link in <imagemap>')));
96
96
  }
@@ -30,5 +30,5 @@ export declare class Token extends AstElement {
30
30
  */
31
31
  normalizeTitle(title: string, defaultNs?: number, halfParsed?: boolean, decode?: boolean, selfLink?: boolean): Title;
32
32
  /** @override */
33
- lint(start?: number, re?: RegExp): LintError[];
33
+ toString(separator?: string): string;
34
34
  }