wikiparser-node 1.8.0 → 1.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 (97) hide show
  1. package/dist/addon/token.js +4 -5
  2. package/dist/addon/transclude.js +2 -2
  3. package/dist/base.d.ts +2 -2
  4. package/dist/base.js +1 -0
  5. package/dist/index.d.ts +2 -4
  6. package/dist/index.js +10 -3
  7. package/dist/lib/element.d.ts +0 -11
  8. package/dist/lib/element.js +9 -13
  9. package/dist/lib/node.d.ts +2 -2
  10. package/dist/lib/node.js +3 -3
  11. package/dist/lib/range.js +1 -1
  12. package/dist/lib/text.d.ts +0 -9
  13. package/dist/lib/text.js +5 -10
  14. package/dist/mixin/sol.js +1 -1
  15. package/dist/parser/braces.js +10 -1
  16. package/dist/parser/externalLinks.js +1 -1
  17. package/dist/parser/magicLinks.js +34 -17
  18. package/dist/parser/table.js +1 -1
  19. package/dist/src/arg.d.ts +0 -4
  20. package/dist/src/arg.js +3 -3
  21. package/dist/src/attribute.d.ts +0 -4
  22. package/dist/src/attribute.js +3 -3
  23. package/dist/src/attributes.d.ts +0 -4
  24. package/dist/src/attributes.js +6 -6
  25. package/dist/src/converter.d.ts +0 -2
  26. package/dist/src/converter.js +2 -2
  27. package/dist/src/converterFlags.d.ts +0 -4
  28. package/dist/src/converterFlags.js +2 -2
  29. package/dist/src/converterRule.d.ts +0 -2
  30. package/dist/src/converterRule.js +2 -2
  31. package/dist/src/extLink.d.ts +0 -4
  32. package/dist/src/extLink.js +3 -3
  33. package/dist/src/gallery.d.ts +0 -4
  34. package/dist/src/gallery.js +3 -3
  35. package/dist/src/heading.d.ts +0 -4
  36. package/dist/src/heading.js +4 -4
  37. package/dist/src/html.d.ts +0 -4
  38. package/dist/src/html.js +3 -3
  39. package/dist/src/imageParameter.d.ts +0 -4
  40. package/dist/src/imageParameter.js +2 -2
  41. package/dist/src/imagemap.d.ts +0 -4
  42. package/dist/src/imagemap.js +3 -3
  43. package/dist/src/index.d.ts +1 -1
  44. package/dist/src/index.js +35 -19
  45. package/dist/src/link/base.d.ts +0 -4
  46. package/dist/src/link/base.js +2 -2
  47. package/dist/src/link/file.d.ts +0 -2
  48. package/dist/src/link/file.js +1 -1
  49. package/dist/src/link/galleryImage.d.ts +0 -2
  50. package/dist/src/link/galleryImage.js +3 -4
  51. package/dist/src/link/index.d.ts +0 -2
  52. package/dist/src/link/index.js +1 -1
  53. package/dist/src/link/redirectTarget.d.ts +0 -2
  54. package/dist/src/link/redirectTarget.js +3 -3
  55. package/dist/src/magicLink.d.ts +9 -9
  56. package/dist/src/magicLink.js +63 -22
  57. package/dist/src/nested.d.ts +0 -2
  58. package/dist/src/nested.js +3 -3
  59. package/dist/src/nowiki/comment.d.ts +0 -4
  60. package/dist/src/nowiki/comment.js +2 -2
  61. package/dist/src/nowiki/doubleUnderscore.d.ts +0 -2
  62. package/dist/src/nowiki/doubleUnderscore.js +1 -1
  63. package/dist/src/nowiki/index.d.ts +0 -2
  64. package/dist/src/nowiki/index.js +1 -1
  65. package/dist/src/nowiki/quote.d.ts +0 -2
  66. package/dist/src/nowiki/quote.js +1 -1
  67. package/dist/src/onlyinclude.d.ts +0 -2
  68. package/dist/src/onlyinclude.js +1 -1
  69. package/dist/src/paramTag/index.d.ts +0 -4
  70. package/dist/src/paramTag/index.js +3 -3
  71. package/dist/src/parameter.d.ts +0 -4
  72. package/dist/src/parameter.js +3 -3
  73. package/dist/src/pre.d.ts +0 -2
  74. package/dist/src/pre.js +1 -1
  75. package/dist/src/redirect.d.ts +0 -6
  76. package/dist/src/redirect.js +4 -4
  77. package/dist/src/syntax.d.ts +0 -2
  78. package/dist/src/syntax.js +1 -1
  79. package/dist/src/table/base.js +1 -1
  80. package/dist/src/table/index.d.ts +0 -2
  81. package/dist/src/table/index.js +2 -2
  82. package/dist/src/table/td.d.ts +0 -4
  83. package/dist/src/table/td.js +11 -8
  84. package/dist/src/table/trBase.d.ts +0 -2
  85. package/dist/src/table/trBase.js +2 -2
  86. package/dist/src/tagPair/ext.d.ts +0 -2
  87. package/dist/src/tagPair/ext.js +2 -2
  88. package/dist/src/tagPair/include.d.ts +0 -2
  89. package/dist/src/tagPair/include.js +1 -1
  90. package/dist/src/tagPair/index.d.ts +0 -2
  91. package/dist/src/tagPair/index.js +3 -3
  92. package/dist/src/transclude.d.ts +0 -4
  93. package/dist/src/transclude.js +3 -3
  94. package/dist/util/lint.js +1 -1
  95. package/i18n/zh-hans.json +1 -0
  96. package/i18n/zh-hant.json +1 -0
  97. package/package.json +4 -4
@@ -45,7 +45,7 @@ index_1.Token.prototype.caretPositionFromIndex =
45
45
  if (index === undefined) {
46
46
  return undefined;
47
47
  }
48
- const { length } = String(this);
48
+ const { length } = this.toString();
49
49
  if (index >= length || index < -length) {
50
50
  return undefined;
51
51
  }
@@ -55,7 +55,7 @@ index_1.Token.prototype.caretPositionFromIndex =
55
55
  const { childNodes } = self;
56
56
  acc += self.getAttribute('padding');
57
57
  for (let i = 0; acc <= index && i < childNodes.length; i++) {
58
- const cur = childNodes[i], l = String(cur).length;
58
+ const cur = childNodes[i], l = cur.toString().length;
59
59
  acc += l;
60
60
  if (acc > index) {
61
61
  self = cur;
@@ -167,8 +167,7 @@ index_1.Token.prototype.redoQuotes =
167
167
  }
168
168
  }
169
169
  const token = debug_1.Shadow.run(() => {
170
- const node = new index_1.Token(String(this), this.getAttribute('config'), accum);
171
- node.type = 'plain';
170
+ const node = new index_1.Token(this.toString(), this.getAttribute('config'), accum);
172
171
  node.setAttribute('stage', 6);
173
172
  return node.parse(7);
174
173
  });
@@ -183,7 +182,7 @@ index_1.Token.prototype.solveConst =
183
182
  if (type === 'arg' || type === 'magic-word' && magicWords.has(name)) {
184
183
  let replace = '';
185
184
  if (type === 'arg') {
186
- replace = target.default === false ? String(target) : target.default;
185
+ replace = target.default === false ? target.toString() : target.default;
187
186
  }
188
187
  else if (name === 'if' && !var1?.getElementByTypes('magic-word, template')) {
189
188
  replace = String(childNodes[String(var1 ?? '').trim() ? 2 : 3] ?? '').trim();
@@ -167,13 +167,13 @@ transclude_1.TranscludeToken.prototype.escapeTables =
167
167
  if (!/\n[^\S\n]*(?::+[^\S\n]*)?\{\|/u.test(this.text())) {
168
168
  return this;
169
169
  }
170
- const stripped = String(this).slice(2, -2), include = this.getAttribute('include'), config = this.getAttribute('config'), parsed = index_1.default.parse(stripped, include, 4, config), isTable = (0, debug_1.isToken)('table');
170
+ const stripped = this.toString().slice(2, -2), include = this.getAttribute('include'), config = this.getAttribute('config'), parsed = index_1.default.parse(stripped, include, 4, config), isTable = (0, debug_1.isToken)('table');
171
171
  for (const table of parsed.childNodes) {
172
172
  if (isTable(table)) {
173
173
  table.escape();
174
174
  }
175
175
  }
176
- const { firstChild, length } = index_1.default.parse(`{{${String(parsed)}}}`, include, undefined, config);
176
+ const { firstChild, length } = index_1.default.parse(`{{${parsed.toString()}}}`, include, undefined, config);
177
177
  if (length !== 1 || !(firstChild instanceof transclude_1.TranscludeToken)) {
178
178
  throw new Error('转义表格失败!');
179
179
  }
package/dist/base.d.ts CHANGED
@@ -14,8 +14,8 @@ export interface Config {
14
14
  readonly conversionTable?: [string, string][];
15
15
  readonly redirects?: [string, string][];
16
16
  }
17
- 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';
18
- 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"];
17
+ 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';
18
+ 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"];
19
19
  export declare namespace LintError {
20
20
  type Severity = 'error' | 'warning';
21
21
  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
@@ -3,6 +3,7 @@ import type { Title } from './lib/title';
3
3
  import type { Token } from './internal';
4
4
  declare interface Parser extends ParserBase {
5
5
  rules: readonly LintError.Rule[];
6
+ viewOnly: boolean;
6
7
  conversionTable: Map<string, string>;
7
8
  redirects: Map<string, string>;
8
9
  warning: boolean;
@@ -29,7 +30,4 @@ declare const Parser: Parser;
29
30
  export = Parser;
30
31
  export type { Config, LintError };
31
32
  export type * from './internal';
32
- declare global {
33
- type Acceptable = unknown;
34
- type PrintOpt = unknown;
35
- }
33
+ declare global { type Acceptable = unknown; }
package/dist/index.js CHANGED
@@ -21,6 +21,7 @@ const Parser = {
21
21
  i18n: undefined,
22
22
  rules: base_1.rules,
23
23
  /* NOT FOR BROWSER */
24
+ viewOnly: false,
24
25
  conversionTable: new Map(),
25
26
  redirects: new Map(),
26
27
  warning: true,
@@ -61,7 +62,11 @@ const Parser = {
61
62
  return new Title(title, defaultNs, config, decode, selfLink);
62
63
  }
63
64
  const { Token } = require('./src/index');
64
- const token = debug_1.Shadow.run(() => new Token(title, config).parseOnce(0, include).parseOnce()), titleObj = new Title(String(token), defaultNs, config, decode, selfLink);
65
+ const token = debug_1.Shadow.run(() => {
66
+ const root = new Token(title, config);
67
+ root.type = 'root';
68
+ return root.parseOnce(0, include).parseOnce();
69
+ }), titleObj = new Title(token.toString(), defaultNs, config, decode, selfLink);
65
70
  debug_1.Shadow.run(() => {
66
71
  for (const key of ['main', 'fragment']) {
67
72
  const str = titleObj[key];
@@ -82,13 +87,14 @@ const Parser = {
82
87
  const { Token } = require('./src/index');
83
88
  const root = debug_1.Shadow.run(() => {
84
89
  const token = new Token(wikitext, config);
90
+ token.type = 'root';
85
91
  try {
86
92
  return token.parse(maxStage, include);
87
93
  }
88
94
  catch (e) {
89
95
  if (e instanceof Error) {
90
96
  const file = path.join(__dirname, '..', 'errors', new Date().toISOString()), stage = token.getAttribute('stage');
91
- fs.writeFileSync(file, stage === constants_1.MAX_STAGE ? wikitext : String(token));
97
+ fs.writeFileSync(file, stage === constants_1.MAX_STAGE ? wikitext : token.toString());
92
98
  fs.writeFileSync(`${file}.err`, e.stack);
93
99
  fs.writeFileSync(`${file}.json`, JSON.stringify({ stage, include, config }, null, '\t'));
94
100
  }
@@ -97,7 +103,7 @@ const Parser = {
97
103
  });
98
104
  /* NOT FOR BROWSER */
99
105
  if (this.debugging) {
100
- let restored = String(root), process = 'parsing';
106
+ let restored = root.toString(), process = 'parsing';
101
107
  if (restored === wikitext) {
102
108
  const entities = { lt: '<', gt: '>', amp: '&' };
103
109
  restored = root.print().replace(/<[^<]+?>|&([lg]t|amp);/gu, (_, s) => s ? entities[s] : '');
@@ -176,6 +182,7 @@ const Parser = {
176
182
  const { stage, include, config } = require(`${file}.json`), { Token } = require('./src/index');
177
183
  return debug_1.Shadow.run(() => {
178
184
  const halfParsed = stage < constants_1.MAX_STAGE, token = new Token(halfParsed ? wikitext : (0, string_1.tidy)(wikitext), config);
185
+ token.type = 'root';
179
186
  if (halfParsed) {
180
187
  token.setAttribute('stage', stage);
181
188
  token.parseOnce(stage, include);
@@ -78,17 +78,6 @@ export declare abstract class AstElement extends AstNode {
78
78
  * @throws `RangeError` 对应位置的子节点不是文本节点
79
79
  */
80
80
  setText(str: string, i?: number): string;
81
- /**
82
- * @override
83
- * @param start
84
- * @param re 用于`AstText`后代节点的正则表达式
85
- */
86
- lint(start?: number, re?: RegExp): LintError[];
87
- /**
88
- * @override
89
- * @param opt 选项
90
- */
91
- print(opt?: PrintOpt): string;
92
81
  /**
93
82
  * 保存为JSON
94
83
  * @param file 文件名
@@ -281,26 +281,21 @@ class AstElement extends node_1.AstNode {
281
281
  toString(separator = '') {
282
282
  return this.childNodes.map(String).join(separator);
283
283
  }
284
- /**
285
- * @override
286
- * @param start
287
- * @param re 用于`AstText`后代节点的正则表达式
288
- */
284
+ /** @private */
289
285
  lint(start = this.getAbsoluteIndex(), re) {
290
286
  const errors = [];
291
287
  for (let i = 0, cur = start + this.getAttribute('padding'); i < this.length; i++) {
292
288
  const child = this.childNodes[i];
293
289
  errors.push(...child.lint(cur, re));
294
- cur += String(child).length + this.getGaps(i);
290
+ cur += child.toString().length + this.getGaps(i);
295
291
  }
296
292
  return errors;
297
293
  }
298
- /**
299
- * @override
300
- * @param opt 选项
301
- */
294
+ /** @private */
302
295
  print(opt = {}) {
303
- return String(this) ? `<span class="wpb-${opt.class ?? this.type}">${(0, string_1.print)(this.childNodes, opt)}</span>` : '';
296
+ return this.toString()
297
+ ? `<span class="wpb-${opt.class ?? this.type}">${(0, string_1.print)(this.childNodes, opt)}</span>`
298
+ : '';
304
299
  }
305
300
  /**
306
301
  * 保存为JSON
@@ -310,11 +305,11 @@ class AstElement extends node_1.AstNode {
310
305
  json(file, start = this.getAbsoluteIndex()) {
311
306
  const json = {
312
307
  ...this,
313
- range: [start, start + String(this).length],
308
+ range: [start, start + this.toString().length],
314
309
  childNodes: [],
315
310
  };
316
311
  for (let i = 0, cur = start + this.getAttribute('padding'); i < this.length; i++) {
317
- const child = this.childNodes[i], { length } = String(child);
312
+ const child = this.childNodes[i], { length } = child.toString();
318
313
  if (child.type === 'text') {
319
314
  json.childNodes.push({ data: child.data, range: [cur, cur + length] });
320
315
  }
@@ -433,6 +428,7 @@ class AstElement extends node_1.AstNode {
433
428
  case ':any-link':
434
429
  return type === 'link'
435
430
  || type === 'free-ext-link'
431
+ || type === 'magic-link'
436
432
  || type === 'ext-link'
437
433
  || (type === 'file' || type === 'gallery-image' && link);
438
434
  case ':local-link':
@@ -20,8 +20,8 @@ export declare abstract class AstNode implements AstNodeBase {
20
20
  data?: string | undefined;
21
21
  readonly childNodes: readonly AstNodes[];
22
22
  abstract text(): string;
23
- abstract lint(): LintError[];
24
- abstract print(): string;
23
+ lint(): LintError[];
24
+ print(): string;
25
25
  /** 首位子节点 */
26
26
  get firstChild(): AstNodes | undefined;
27
27
  /** 末位子节点 */
package/dist/lib/node.js CHANGED
@@ -18,7 +18,7 @@ const getDimension = (str) => {
18
18
  * @param j 子节点序号
19
19
  * @param parent 父节点
20
20
  */
21
- const getIndex = (j, parent) => parent.childNodes.slice(0, j).reduce((acc, cur, i) => acc + String(cur).length + parent.getGaps(i), 0)
21
+ const getIndex = (j, parent) => parent.childNodes.slice(0, j).reduce((acc, cur, i) => acc + cur.toString().length + parent.getGaps(i), 0)
22
22
  + parent.getAttribute('padding');
23
23
  /* NOT FOR BROWSER */
24
24
  /**
@@ -139,8 +139,8 @@ class AstNode {
139
139
  for (let i = index - 1; i >= 0; i--) {
140
140
  const child = childNodes[i];
141
141
  if (isQuote(child)) {
142
- bold = child.bold ? !bold : bold;
143
- italic = child.italic ? !italic : italic;
142
+ bold = child.bold !== bold;
143
+ italic = child.italic !== italic;
144
144
  }
145
145
  else if (child.type === 'text' && child.data.includes('\n')) {
146
146
  break;
package/dist/lib/range.js CHANGED
@@ -351,7 +351,7 @@ class AstRange {
351
351
  /** @private */
352
352
  toString() {
353
353
  const { startContainer, startIndex, endIndex } = this;
354
- return String(startContainer.getRootNode()).slice(startIndex, endIndex);
354
+ return startContainer.getRootNode().toString().slice(startIndex, endIndex);
355
355
  }
356
356
  /** 获取范围内的全部节点 */
357
357
  extractContents() {
@@ -12,20 +12,11 @@ export declare class AstText extends AstNode {
12
12
  constructor(text: string);
13
13
  /** 可见部分 */
14
14
  text(): string;
15
- /**
16
- * @override
17
- * @param start
18
- * @param errorRegex 正则表达式
19
- * @throws `Error` 孤立文本节点
20
- */
21
- lint(start?: number, errorRegex?: RegExp): LintError[];
22
15
  /**
23
16
  * 替换字符串
24
17
  * @param text 替换的字符串
25
18
  */
26
19
  replaceData(text: string): void;
27
- /** @override */
28
- print(): string;
29
20
  /** 复制 */
30
21
  cloneNode(): AstText;
31
22
  /**
package/dist/lib/text.js CHANGED
@@ -110,12 +110,7 @@ class AstText extends node_1.AstNode {
110
110
  text() {
111
111
  return this.data;
112
112
  }
113
- /**
114
- * @override
115
- * @param start
116
- * @param errorRegex 正则表达式
117
- * @throws `Error` 孤立文本节点
118
- */
113
+ /** @private */
119
114
  lint(start = this.getAbsoluteIndex(), errorRegex) {
120
115
  const { data, parentNode, nextSibling, previousSibling } = this;
121
116
  if (!parentNode) {
@@ -167,7 +162,7 @@ class AstText extends node_1.AstNode {
167
162
  else if (char === 'h' && index === 0 && type === 'ext-link-text' && extImage.test(data)) {
168
163
  continue;
169
164
  }
170
- 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 ?? '')
165
+ 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 ?? '')
171
166
  || isHtmlAttrVal && (char === '[' || char === ']'))
172
167
  || char === '{' && (nextChar === char || previousChar === '-')
173
168
  || char === '}' && (previousChar === char || nextChar === '-')
@@ -228,7 +223,7 @@ class AstText extends node_1.AstNode {
228
223
  ];
229
224
  }
230
225
  else if (char === '[' && type === 'ext-link-text') {
231
- const i = parentNode.getAbsoluteIndex() + String(parentNode).length;
226
+ const i = parentNode.getAbsoluteIndex() + parentNode.toString().length;
232
227
  e.suggestions = [
233
228
  {
234
229
  desc: 'escape',
@@ -238,7 +233,7 @@ class AstText extends node_1.AstNode {
238
233
  ];
239
234
  }
240
235
  else if (char === ']' && previousType === 'free-ext-link' && severity === 'error') {
241
- const i = start - String(previousSibling).length;
236
+ const i = start - previousSibling.toString().length;
242
237
  e.fix = {
243
238
  range: [i, i],
244
239
  text: '[',
@@ -269,7 +264,7 @@ class AstText extends node_1.AstNode {
269
264
  replaceData(text) {
270
265
  this.#setData(text);
271
266
  }
272
- /** @override */
267
+ /** @private */
273
268
  print() {
274
269
  return (0, string_1.escape)(this.data);
275
270
  }
package/dist/mixin/sol.js CHANGED
@@ -14,7 +14,7 @@ const sol = (constructor, _) => {
14
14
  #prependNewLine() {
15
15
  const { previousVisibleSibling, parentNode, type } = this;
16
16
  if (previousVisibleSibling) {
17
- return String(previousVisibleSibling).endsWith('\n') ? '' : '\n';
17
+ return previousVisibleSibling.toString().endsWith('\n') ? '' : '\n';
18
18
  }
19
19
  return parentNode?.type === 'root'
20
20
  || type !== 'heading' && parentNode?.type === 'ext-inner' && parentNode.name === 'poem'
@@ -14,7 +14,16 @@ const arg_1 = require("../src/arg");
14
14
  * @throws TranscludeToken.constructor()
15
15
  */
16
16
  const parseBraces = (wikitext, config, accum) => {
17
- const source = `${config.excludes?.includes('heading') ? '' : '^(\0\\d+c\x7F)*={1,6}|'}\\[\\[|\\{{2,}|-\\{(?!\\{)`, { parserFunction: [, , , subst] } = config, stack = [], closes = { '=': '\n', '{': '\\}{2,}|\\|', '-': '\\}-', '[': '\\]\\]' }, marks = new Map([['!', '!'], ['!!', '+'], ['(!', '{'], ['!)', '}'], ['!-', '-'], ['=', '~']]);
17
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
18
+ /\{\{\s*([!=]|!!|\(!|!\)|!-)\s*\}\}(?!\})/gu;
19
+ 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');
20
+ wikitext = wikitext.replace(re, (m, p1) => {
21
+ // @ts-expect-error abstract class
22
+ new transclude_1.TranscludeToken(m.slice(2, -2), [], config, accum);
23
+ return `\0${accum.length - 2}${marks.get(p1)}\x7F`;
24
+ });
25
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
26
+ /^(\0\d+c\x7F)*={1,6}|\[\[|\{{2,}|-\{(?!\{)|[\n|=]|\}{2,}|\}-|\]\]/gmu;
18
27
  let regex = new RegExp(source, 'gmu'), mt = regex.exec(wikitext), moreBraces = wikitext.includes('}}'), lastIndex;
19
28
  while (mt
20
29
  || lastIndex !== undefined && lastIndex <= wikitext.length && stack[stack.length - 1]?.[0]?.startsWith('=')) {
@@ -32,7 +32,7 @@ const parseExternalLinks = (wikitext, config, accum, inFile) => {
32
32
  }
33
33
  if (inFile) {
34
34
  // @ts-expect-error abstract class
35
- new magicLink_1.MagicLinkToken(url, true, config, accum);
35
+ new magicLink_1.MagicLinkToken(url, 'ext-link-url', config, accum);
36
36
  return `[\0${length}f\x7F${space}${text}]`;
37
37
  }
38
38
  // @ts-expect-error abstract class
@@ -13,29 +13,46 @@ const magicLink_1 = require("../src/magicLink");
13
13
  const parseMagicLinks = (wikitext, config, accum) => {
14
14
  // eslint-disable-next-line @typescript-eslint/no-unused-expressions
15
15
  /(^|[^\p{L}\d_])((?:\[[\da-f:.]+\]|[^[\]<>"\t\n\p{Zs}])(?:[^[\]<>"\0\t\n\p{Zs}]|\0\d+c\x7F)*)/giu;
16
- const regex = new RegExp(`(^|[^\\p{L}\\d_])(?:${config.protocol})(${string_1.extUrlCharFirst}${string_1.extUrlChar})`, 'giu');
16
+ const space = '[\\p{Zs}\\t]|&nbsp;|&#0*160;|&#x0*a0;', spdash = `(?:${space}|-)`, regex = new RegExp('(^|[^\\p{L}\\d_])' // lead
17
+ + '(?:'
18
+ + `(?:${config.protocol})(${string_1.extUrlCharFirst}${string_1.extUrlChar})` // free external link
19
+ + '|'
20
+ + `(?:RFC|PMID)(?:${space})+\\d+\\b` // RFC or PMID
21
+ + '|'
22
+ + `ISBN(?:${space})+(?:97[89]${spdash}?)?(?:\\d${spdash}?){9}[\\dx]\\b` // ISBN
23
+ + ')', 'giu');
17
24
  return wikitext.replace(regex, (m, lead, p1) => {
18
- let trail = '', url = lead ? m.slice(lead.length) : m;
19
- const m2 = /&(?:lt|gt|nbsp|#x0*(?:3[ce]|a0)|#0*(?:6[02]|160));/iu.exec(url);
20
- if (m2) {
21
- trail = url.slice(m2.index);
22
- url = url.slice(0, m2.index);
23
- }
24
- const sep = new RegExp(`[,;\\\\.:!?${url.includes('(') ? '' : ')'}]+$`, 'u'), sepChars = sep.exec(url);
25
- if (sepChars) {
26
- let correction = 0;
27
- if (sepChars[0].startsWith(';') && /&(?:[a-z]+|#x[\da-f]+|#\d+)$/iu.test(url.slice(0, sepChars.index))) {
28
- correction = 1;
25
+ let url = lead ? m.slice(lead.length) : m;
26
+ if (p1) {
27
+ let trail = '';
28
+ const m2 = /&(?:lt|gt|nbsp|#x0*(?:3[ce]|a0)|#0*(?:6[02]|160));/iu.exec(url);
29
+ if (m2) {
30
+ trail = url.slice(m2.index);
31
+ url = url.slice(0, m2.index);
32
+ }
33
+ const sep = new RegExp(`[,;\\\\.:!?${url.includes('(') ? '' : ')'}]+$`, 'u'), sepChars = sep.exec(url);
34
+ if (sepChars) {
35
+ let correction = 0;
36
+ if (sepChars[0].startsWith(';')
37
+ && /&(?:[a-z]+|#x[\da-f]+|#\d+)$/iu.test(url.slice(0, sepChars.index))) {
38
+ correction = 1;
39
+ }
40
+ trail = url.slice(sepChars.index + correction) + trail;
41
+ url = url.slice(0, sepChars.index + correction);
42
+ }
43
+ if (trail.length >= p1.length) {
44
+ return m;
29
45
  }
30
- trail = url.slice(sepChars.index + correction) + trail;
31
- url = url.slice(0, sepChars.index + correction);
46
+ // @ts-expect-error abstract class
47
+ new magicLink_1.MagicLinkToken(url, undefined, config, accum);
48
+ return `${lead}\0${accum.length - 1}w\x7F${trail}`;
32
49
  }
33
- if (trail.length >= p1.length) {
50
+ else if (!/^(?:RFC|PMID|ISBN)/u.test(url)) {
34
51
  return m;
35
52
  }
36
53
  // @ts-expect-error abstract class
37
- new magicLink_1.MagicLinkToken(url, false, config, accum);
38
- return `${lead}\0${accum.length - 1}w\x7F${trail}`;
54
+ new magicLink_1.MagicLinkToken(url, 'magic-link', config, accum);
55
+ return `${lead}\0${accum.length - 1}i\x7F`;
39
56
  });
40
57
  };
41
58
  exports.parseMagicLinks = parseMagicLinks;
@@ -41,7 +41,7 @@ const parseTable = ({ firstChild: { data }, type, name }, config, accum) => {
41
41
  topToken.insertAt(token);
42
42
  }
43
43
  else {
44
- lastChild.setText(String(lastChild) + str);
44
+ lastChild.setText(lastChild.toString() + str);
45
45
  }
46
46
  },
47
47
  /** 取出最近的表格行 */
package/dist/src/arg.d.ts CHANGED
@@ -25,10 +25,6 @@ export declare abstract class ArgToken extends Token {
25
25
  /** @override */
26
26
  text(): string;
27
27
  /** @override */
28
- lint(start?: number, re?: RegExp): LintError[];
29
- /** @override */
30
- print(): string;
31
- /** @override */
32
28
  json(): AST;
33
29
  /** @override */
34
30
  cloneNode(): this;
package/dist/src/arg.js CHANGED
@@ -69,7 +69,7 @@ class ArgToken extends index_2.Token {
69
69
  getGaps() {
70
70
  return 1;
71
71
  }
72
- /** @override */
72
+ /** @private */
73
73
  lint(start = this.getAbsoluteIndex(), re) {
74
74
  const { childNodes: [argName, argDefault, ...rest] } = this;
75
75
  if (!this.getAttribute('include')) {
@@ -84,7 +84,7 @@ class ArgToken extends index_2.Token {
84
84
  }
85
85
  const errors = argName.lint(start + 3, re);
86
86
  if (argDefault) {
87
- errors.push(...argDefault.lint(start + 4 + String(argName).length, re));
87
+ errors.push(...argDefault.lint(start + 4 + argName.toString().length, re));
88
88
  }
89
89
  if (rest.length > 0) {
90
90
  const rect = { start, ...this.getRootNode().posFromIndex(start) };
@@ -109,7 +109,7 @@ class ArgToken extends index_2.Token {
109
109
  }
110
110
  return errors;
111
111
  }
112
- /** @override */
112
+ /** @private */
113
113
  print() {
114
114
  return super.print({ pre: '{{{', post: '}}}', sep: '|' });
115
115
  }
@@ -43,13 +43,9 @@ export declare abstract class AttributeToken extends Token {
43
43
  constructor(type: AttributeTypes, tag: string, key: string, equal?: string, value?: string, quotes?: readonly [string?, string?], config?: Parser.Config, accum?: Token[]);
44
44
  /** @override */
45
45
  text(): string;
46
- /** @override */
47
- lint(start?: number, re?: RegExp): LintError[];
48
46
  /** 获取属性值 */
49
47
  getValue(): string | true;
50
48
  /** @override */
51
- print(): string;
52
- /** @override */
53
49
  cloneNode(): this;
54
50
  /** 转义等号 */
55
51
  escape(): void;
@@ -330,7 +330,7 @@ let AttributeToken = (() => {
330
330
  /** @private */
331
331
  toString() {
332
332
  const [quoteStart = '', quoteEnd = ''] = this.#quotes;
333
- return this.#equal ? super.toString(this.#equal + quoteStart) + quoteEnd : String(this.firstChild);
333
+ return this.#equal ? super.toString(this.#equal + quoteStart) + quoteEnd : this.firstChild.toString();
334
334
  }
335
335
  /** @override */
336
336
  text() {
@@ -340,7 +340,7 @@ let AttributeToken = (() => {
340
340
  getGaps() {
341
341
  return this.#equal ? this.#equal.length + (this.#quotes[0]?.length ?? 0) : 0;
342
342
  }
343
- /** @override */
343
+ /** @private */
344
344
  lint(start = this.getAbsoluteIndex(), re) {
345
345
  const errors = super.lint(start, re), { balanced, firstChild, lastChild, type, name, tag } = this, value = this.getValue();
346
346
  let rect;
@@ -414,7 +414,7 @@ let AttributeToken = (() => {
414
414
  }
415
415
  return this.type === 'ext-attr' || '';
416
416
  }
417
- /** @override */
417
+ /** @private */
418
418
  print() {
419
419
  const [quoteStart = '', quoteEnd = ''] = this.#quotes;
420
420
  return this.#equal ? super.print({ sep: (0, string_1.escape)(this.#equal) + quoteStart, post: quoteEnd }) : super.print();
@@ -58,10 +58,6 @@ export declare abstract class AttributesToken extends Token {
58
58
  * @param key 属性键
59
59
  */
60
60
  getAttr(key: string): string | true | undefined;
61
- /** @override */
62
- lint(start?: number, re?: RegExp): LintError[];
63
- /** @override */
64
- print(): string;
65
61
  /** 清理无效属性 */
66
62
  sanitize(): void;
67
63
  /** @override */
@@ -143,7 +143,7 @@ class AttributesToken extends index_2.Token {
143
143
  getAttr(key) {
144
144
  return this.getAttrToken(key)?.getValue();
145
145
  }
146
- /** @override */
146
+ /** @private */
147
147
  lint(start = this.getAbsoluteIndex(), re) {
148
148
  const errors = super.lint(start, re), { parentNode, length, childNodes } = this, attrs = new Map(), duplicated = new Set();
149
149
  let rect;
@@ -186,9 +186,9 @@ class AttributesToken extends index_2.Token {
186
186
  }
187
187
  return errors;
188
188
  }
189
- /** @override */
189
+ /** @private */
190
190
  print() {
191
- return String(this)
191
+ return this.toString()
192
192
  ? `<span class="wpb-${this.type}">${this.childNodes.map(child => child.print(child instanceof atom_1.AtomToken ? { class: 'attr-dirty' } : undefined)).join('')}</span>`
193
193
  : '';
194
194
  }
@@ -226,7 +226,7 @@ class AttributesToken extends index_2.Token {
226
226
  */
227
227
  insertAt(token, i = this.length) {
228
228
  if (!(token instanceof attribute_1.AttributeToken)) {
229
- if (String(token).trim()) {
229
+ if (token.toString().trim()) {
230
230
  this.constructorError('只能插入 AttributeToken');
231
231
  }
232
232
  return super.insertAt(token, i);
@@ -248,10 +248,10 @@ class AttributesToken extends index_2.Token {
248
248
  }
249
249
  super.insertAt(token, i);
250
250
  const { previousVisibleSibling, nextVisibleSibling } = token, type = toDirty(this.type), config = this.getAttribute('config'), acceptable = { [`Stage-${stages[this.type]}`]: ':' };
251
- if (nextVisibleSibling && !/^\s/u.test(String(nextVisibleSibling))) {
251
+ if (nextVisibleSibling && !/^\s/u.test(nextVisibleSibling.toString())) {
252
252
  super.insertAt(debug_1.Shadow.run(() => new atom_1.AtomToken(' ', type, config, [], acceptable)), i + 1);
253
253
  }
254
- if (previousVisibleSibling && !/\s$/u.test(String(previousVisibleSibling))) {
254
+ if (previousVisibleSibling && !/\s$/u.test(previousVisibleSibling.toString())) {
255
255
  super.insertAt(debug_1.Shadow.run(() => new atom_1.AtomToken(' ', type, config, [], acceptable)), i);
256
256
  }
257
257
  return token;
@@ -27,7 +27,5 @@ export declare abstract class ConverterToken extends Token {
27
27
  /** @override */
28
28
  text(): string;
29
29
  /** @override */
30
- print(): string;
31
- /** @override */
32
30
  cloneNode(): this;
33
31
  }
@@ -94,7 +94,7 @@ let ConverterToken = (() => {
94
94
  /** @private */
95
95
  toString() {
96
96
  const { childNodes: [flags, ...rules] } = this;
97
- return `-{${String(flags)}${flags.length > 0 ? '|' : ''}${rules.map(String).join(';')}}-`;
97
+ return `-{${flags.toString()}${flags.length > 0 ? '|' : ''}${rules.map(String).join(';')}}-`;
98
98
  }
99
99
  /** @override */
100
100
  text() {
@@ -109,7 +109,7 @@ let ConverterToken = (() => {
109
109
  getGaps(i) {
110
110
  return i || this.firstChild.length > 0 ? 1 : 0;
111
111
  }
112
- /** @override */
112
+ /** @private */
113
113
  print() {
114
114
  const { childNodes: [flags, ...rules] } = this;
115
115
  return `<span class="wpb-converter">-{${flags.print()}${flags.length > 0 ? '|' : ''}${(0, string_1.print)(rules, { sep: ';' })}}-</span>`;
@@ -34,10 +34,6 @@ export declare abstract class ConverterFlagsToken extends Token {
34
34
  /** 获取指定语言变体的转换标记 */
35
35
  getVariantFlags(): Set<string>;
36
36
  /** @override */
37
- lint(start?: number, re?: RegExp): LintError[];
38
- /** @override */
39
- print(): string;
40
- /** @override */
41
37
  cloneNode(): this;
42
38
  /**
43
39
  * @override