wikiparser-node 1.0.0-beta.2 → 1.0.0-beta.4

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 (127) hide show
  1. package/config/minimum.json +136 -0
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.js +4 -4
  4. package/dist/internal.d.ts +1 -1
  5. package/dist/lib/element.d.ts +12 -8
  6. package/dist/lib/element.js +72 -57
  7. package/dist/lib/node.js +4 -5
  8. package/dist/lib/range.js +5 -8
  9. package/dist/lib/ranges.js +2 -2
  10. package/dist/lib/text.d.ts +2 -2
  11. package/dist/lib/text.js +5 -5
  12. package/dist/lib/title.d.ts +3 -2
  13. package/dist/lib/title.js +11 -10
  14. package/dist/mixin/attributesParent.js +2 -2
  15. package/dist/mixin/fixed.js +3 -3
  16. package/dist/mixin/hidden.js +2 -2
  17. package/dist/mixin/singleLine.js +4 -4
  18. package/dist/mixin/sol.js +6 -6
  19. package/dist/parser/braces.js +4 -9
  20. package/dist/parser/commentAndExt.js +24 -18
  21. package/dist/parser/converter.js +8 -7
  22. package/dist/parser/externalLinks.js +3 -4
  23. package/dist/parser/hrAndDoubleUnderscore.js +4 -7
  24. package/dist/parser/html.js +4 -7
  25. package/dist/parser/links.js +4 -5
  26. package/dist/parser/list.js +3 -6
  27. package/dist/parser/magicLinks.js +3 -3
  28. package/dist/parser/quotes.js +4 -5
  29. package/dist/parser/selector.js +4 -7
  30. package/dist/parser/table.js +6 -15
  31. package/dist/src/arg.d.ts +6 -5
  32. package/dist/src/arg.js +31 -27
  33. package/dist/src/atom.d.ts +2 -1
  34. package/dist/src/atom.js +4 -4
  35. package/dist/src/attribute.d.ts +14 -13
  36. package/dist/src/attribute.js +41 -31
  37. package/dist/src/attributes.d.ts +4 -3
  38. package/dist/src/attributes.js +15 -21
  39. package/dist/src/converter.d.ts +4 -3
  40. package/dist/src/converter.js +10 -17
  41. package/dist/src/converterFlags.d.ts +9 -8
  42. package/dist/src/converterFlags.js +14 -15
  43. package/dist/src/converterRule.d.ts +4 -3
  44. package/dist/src/converterRule.js +20 -22
  45. package/dist/src/extLink.d.ts +5 -4
  46. package/dist/src/extLink.js +16 -17
  47. package/dist/src/gallery.d.ts +7 -5
  48. package/dist/src/gallery.js +15 -19
  49. package/dist/src/heading.d.ts +12 -10
  50. package/dist/src/heading.js +17 -18
  51. package/dist/src/hidden.d.ts +4 -3
  52. package/dist/src/hidden.js +4 -4
  53. package/dist/src/html.d.ts +17 -15
  54. package/dist/src/html.js +25 -23
  55. package/dist/src/imageParameter.d.ts +5 -4
  56. package/dist/src/imageParameter.js +22 -23
  57. package/dist/src/imagemap.d.ts +7 -5
  58. package/dist/src/imagemap.js +14 -19
  59. package/dist/src/imagemapLink.d.ts +8 -7
  60. package/dist/src/imagemapLink.js +4 -8
  61. package/dist/src/index.d.ts +2 -1
  62. package/dist/src/index.js +48 -46
  63. package/dist/src/link/base.d.ts +5 -4
  64. package/dist/src/link/base.js +26 -28
  65. package/dist/src/link/category.d.ts +1 -1
  66. package/dist/src/link/category.js +3 -2
  67. package/dist/src/link/file.d.ts +5 -4
  68. package/dist/src/link/file.js +22 -20
  69. package/dist/src/link/galleryImage.d.ts +5 -5
  70. package/dist/src/link/galleryImage.js +11 -10
  71. package/dist/src/link/index.d.ts +1 -1
  72. package/dist/src/link/index.js +8 -6
  73. package/dist/src/magicLink.d.ts +3 -2
  74. package/dist/src/magicLink.js +10 -11
  75. package/dist/src/nested.d.ts +4 -2
  76. package/dist/src/nested.js +5 -9
  77. package/dist/src/nowiki/base.d.ts +6 -5
  78. package/dist/src/nowiki/base.js +4 -4
  79. package/dist/src/nowiki/comment.d.ts +6 -5
  80. package/dist/src/nowiki/comment.js +8 -10
  81. package/dist/src/nowiki/dd.d.ts +1 -1
  82. package/dist/src/nowiki/dd.js +3 -2
  83. package/dist/src/nowiki/doubleUnderscore.d.ts +8 -6
  84. package/dist/src/nowiki/doubleUnderscore.js +13 -13
  85. package/dist/src/nowiki/hr.d.ts +2 -8
  86. package/dist/src/nowiki/hr.js +4 -11
  87. package/dist/src/nowiki/index.d.ts +2 -1
  88. package/dist/src/nowiki/index.js +6 -5
  89. package/dist/src/nowiki/list.d.ts +4 -4
  90. package/dist/src/nowiki/list.js +3 -2
  91. package/dist/src/nowiki/noinclude.d.ts +2 -2
  92. package/dist/src/nowiki/noinclude.js +3 -2
  93. package/dist/src/nowiki/quote.d.ts +1 -8
  94. package/dist/src/nowiki/quote.js +25 -17
  95. package/dist/src/onlyinclude.d.ts +5 -4
  96. package/dist/src/onlyinclude.js +13 -13
  97. package/dist/src/paramTag/index.d.ts +5 -3
  98. package/dist/src/paramTag/index.js +7 -7
  99. package/dist/src/paramTag/inputbox.d.ts +3 -2
  100. package/dist/src/paramTag/inputbox.js +6 -5
  101. package/dist/src/parameter.d.ts +11 -10
  102. package/dist/src/parameter.js +29 -30
  103. package/dist/src/pre.d.ts +4 -2
  104. package/dist/src/pre.js +19 -14
  105. package/dist/src/syntax.d.ts +2 -1
  106. package/dist/src/syntax.js +7 -7
  107. package/dist/src/table/base.d.ts +6 -5
  108. package/dist/src/table/base.js +6 -8
  109. package/dist/src/table/index.d.ts +9 -8
  110. package/dist/src/table/index.js +23 -24
  111. package/dist/src/table/td.d.ts +12 -10
  112. package/dist/src/table/td.js +19 -20
  113. package/dist/src/table/tr.d.ts +3 -2
  114. package/dist/src/table/tr.js +4 -3
  115. package/dist/src/table/trBase.d.ts +3 -3
  116. package/dist/src/table/trBase.js +10 -10
  117. package/dist/src/tagPair/ext.d.ts +7 -6
  118. package/dist/src/tagPair/ext.js +5 -17
  119. package/dist/src/tagPair/include.d.ts +5 -5
  120. package/dist/src/tagPair/include.js +4 -5
  121. package/dist/src/tagPair/index.d.ts +7 -7
  122. package/dist/src/tagPair/index.js +13 -19
  123. package/dist/src/transclude.d.ts +10 -9
  124. package/dist/src/transclude.js +41 -46
  125. package/dist/util/lint.js +14 -4
  126. package/dist/util/string.js +21 -20
  127. package/package.json +11 -9
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.IncludeToken = void 0;
4
4
  const hidden_1 = require("../../mixin/hidden");
5
- const index_1 = require("../../index");
5
+ const Parser = require("../../index");
6
6
  const _1 = require(".");
7
7
  /**
8
8
  * `<includeonly>`或`<noinclude>`或`<onlyinclude>`
@@ -18,14 +18,13 @@ class IncludeToken extends (0, hidden_1.hidden)(_1.TagPairToken) {
18
18
  * @param inner 内部wikitext
19
19
  * @param closed 是否封闭
20
20
  */
21
- constructor(name, attr = '', inner, closed, config = index_1.default.getConfig(), accum = []) {
21
+ constructor(name, attr = '', inner, closed, config = Parser.getConfig(), accum = []) {
22
22
  super(name, attr, inner ?? '', inner === undefined ? closed : closed ?? '', config, accum);
23
23
  }
24
24
  /** @override */
25
25
  cloneNode() {
26
26
  const tags = this.getAttribute('tags'), config = this.getAttribute('config'), inner = this.selfClosing ? undefined : this.lastChild.data, closing = this.selfClosing || !this.closed ? undefined : tags[1];
27
- // @ts-expect-error abstract class
28
- return index_1.default.run(() => new IncludeToken(tags[0], this.firstChild.data, inner, closing, config));
27
+ return Parser.run(() => new IncludeToken(tags[0], this.firstChild.data, inner, closing, config));
29
28
  }
30
29
  /**
31
30
  * @override
@@ -40,4 +39,4 @@ class IncludeToken extends (0, hidden_1.hidden)(_1.TagPairToken) {
40
39
  }
41
40
  }
42
41
  exports.IncludeToken = IncludeToken;
43
- index_1.default.classes['IncludeToken'] = __filename;
42
+ Parser.classes['IncludeToken'] = __filename;
@@ -1,16 +1,16 @@
1
+ import * as Parser from '../../index';
1
2
  import { Token } from '..';
2
3
  import type { AstNodes } from '../../lib/node';
3
4
  declare const TagPairToken_base: ((abstract new (...args: any[]) => {
4
5
  removeAt(): never;
5
- insertAt(token: string, i?: number | undefined): import("../../index").AstText;
6
- insertAt<T extends AstNodes>(token: T, i?: number | undefined): T;
6
+ insertAt(token: string, i?: number | undefined): Parser.AstText;
7
+ insertAt<T extends Parser.AstNodes>(token: T, i?: number | undefined): T;
7
8
  length: number;
8
- toString(selector?: string | undefined, separator?: string | undefined): string;
9
- /** @browser */
9
+ toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
10
10
  text(separator?: string | undefined): string;
11
11
  }) & {
12
12
  readonly fixed: true;
13
- }) & typeof Token;
13
+ }) & typeof Parser.Token;
14
14
  /** 成对标签 */
15
15
  export declare abstract class TagPairToken extends TagPairToken_base {
16
16
  #private;
@@ -37,12 +37,12 @@ export declare abstract class TagPairToken extends TagPairToken_base {
37
37
  * @param inner 内部wikitext
38
38
  * @param closed 是否封闭;约定`undefined`表示自封闭,`''`表示未闭合
39
39
  */
40
- constructor(name: string, attr: string | Token, inner: string | Token, closed?: string, config?: import("../../index").Config, accum?: Token[]);
40
+ constructor(name: string, attr: string | Token, inner: string | Token, closed?: string, config?: Parser.Config, accum?: Token[]);
41
41
  /**
42
42
  * @override
43
43
  * @browser
44
44
  */
45
- toString(selector?: string): string;
45
+ toString(omit?: Set<string>): string;
46
46
  /**
47
47
  * @override
48
48
  * @browser
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TagPairToken = void 0;
4
4
  const fixed_1 = require("../../mixin/fixed");
5
- const index_1 = require("../../index");
5
+ const Parser = require("../../index");
6
6
  const __1 = require("..");
7
7
  /** 成对标签 */
8
8
  class TagPairToken extends (0, fixed_1.fixed)(__1.Token) {
@@ -28,7 +28,7 @@ class TagPairToken extends (0, fixed_1.fixed)(__1.Token) {
28
28
  }
29
29
  set selfClosing(value) {
30
30
  if (value !== this.#selfClosing && this.lastChild.text()) {
31
- index_1.default.warn(`<${this.name}>标签内部的${value ? '文本将被隐藏' : '原有文本将再次可见'}!`);
31
+ Parser.warn(`<${this.name}>标签内部的${value ? '文本将被隐藏' : '原有文本将再次可见'}!`);
32
32
  }
33
33
  this.#selfClosing = value;
34
34
  }
@@ -43,38 +43,32 @@ class TagPairToken extends (0, fixed_1.fixed)(__1.Token) {
43
43
  * @param inner 内部wikitext
44
44
  * @param closed 是否封闭;约定`undefined`表示自封闭,`''`表示未闭合
45
45
  */
46
- constructor(name, attr, inner, closed, config = index_1.default.getConfig(), accum = []) {
46
+ constructor(name, attr, inner, closed, config = Parser.getConfig(), accum = []) {
47
47
  super(undefined, config, true);
48
48
  this.setAttribute('name', name.toLowerCase());
49
49
  this.#tags = [name, closed || name];
50
50
  this.#selfClosing = closed === undefined;
51
51
  this.#closed = closed !== '';
52
52
  this.append(attr, inner);
53
- let index = typeof attr === 'string' ? -1 : accum.indexOf(attr);
54
- if (index === -1 && typeof inner !== 'string') {
55
- index = accum.indexOf(inner);
56
- }
57
- if (index === -1) {
58
- index = Infinity;
59
- }
60
- accum.splice(index, 0, this);
53
+ const index = typeof attr === 'string' ? -1 : accum.indexOf(attr);
54
+ accum.splice(index === -1 ? Infinity : index, 0, this);
61
55
  }
62
56
  /**
63
57
  * @override
64
58
  * @browser
65
59
  */
66
- toString(selector) {
67
- const { firstChild, lastChild, nextSibling, name } = this, [opening, closing] = this.#tags;
68
- if (selector && this.matches(selector)) {
60
+ toString(omit) {
61
+ const { firstChild, lastChild, nextSibling, name, closed } = this, [opening, closing] = this.#tags;
62
+ if (omit && this.matchesTypes(omit)) {
69
63
  return '';
70
64
  }
71
- else if (!this.closed && nextSibling) {
72
- index_1.default.error(`自动闭合 <${name}>`, lastChild);
65
+ else if (!closed && nextSibling) {
66
+ Parser.error(`自动闭合 <${name}>`, lastChild);
73
67
  this.#closed = true;
74
68
  }
75
69
  return this.#selfClosing
76
- ? `<${opening}${firstChild.toString(selector)}/>`
77
- : `<${opening}${firstChild.toString(selector)}>${lastChild.toString(selector)}${this.closed ? `</${closing}>` : ''}`;
70
+ ? `<${opening}${firstChild.toString(omit)}/>`
71
+ : `<${opening}${firstChild.toString(omit)}>${lastChild.toString(omit)}${this.closed ? `</${closing}>` : ''}`;
78
72
  }
79
73
  /**
80
74
  * @override
@@ -110,4 +104,4 @@ class TagPairToken extends (0, fixed_1.fixed)(__1.Token) {
110
104
  }
111
105
  }
112
106
  exports.TagPairToken = TagPairToken;
113
- index_1.default.classes['TagPairToken'] = __filename;
107
+ Parser.classes['TagPairToken'] = __filename;
@@ -1,3 +1,4 @@
1
+ import * as Parser from '../index';
1
2
  import { Token } from '.';
2
3
  import { ParameterToken } from './parameter';
3
4
  import { AtomToken } from './atom';
@@ -7,7 +8,7 @@ import type { LintError } from '../index';
7
8
  * 模板或魔术字
8
9
  * @classdesc `{childNodes: [AtomToken|SyntaxToken, ...AtomToken, ...ParameterToken]}`
9
10
  */
10
- export declare abstract class TranscludeToken extends Token {
11
+ export declare class TranscludeToken extends Token {
11
12
  #private;
12
13
  /** @browser */
13
14
  type: 'template' | 'magic-word';
@@ -27,13 +28,13 @@ export declare abstract class TranscludeToken extends Token {
27
28
  * @param parts 参数各部分
28
29
  * @throws `SyntaxError` 非法的模板名称
29
30
  */
30
- constructor(title: string, parts: ([string] | [string | number, string])[], config?: import("../index").Config, accum?: Token[]);
31
+ constructor(title: string, parts: ([string] | [string | number, string])[], config?: Parser.Config, accum?: Token[]);
31
32
  /**
32
33
  * 设置引用修饰符
33
34
  * @browser
34
35
  * @param modifier 引用修饰符
35
36
  */
36
- setModifier(modifier?: string): boolean;
37
+ setModifier(modifier: string): boolean;
37
38
  /**
38
39
  * 是否是模板
39
40
  * @browser
@@ -43,17 +44,12 @@ export declare abstract class TranscludeToken extends Token {
43
44
  * @override
44
45
  * @browser
45
46
  */
46
- toString(selector?: string): string;
47
+ toString(omit?: Set<string>): string;
47
48
  /**
48
49
  * @override
49
50
  * @browser
50
51
  */
51
52
  text(): string;
52
- /**
53
- * @override
54
- * @browser
55
- */
56
- print(): string;
57
53
  /**
58
54
  * @override
59
55
  * @browser
@@ -96,6 +92,11 @@ export declare abstract class TranscludeToken extends Token {
96
92
  * @throws `Error` 不是可接受的魔术字
97
93
  */
98
94
  getPossibleValues(): Token[];
95
+ /**
96
+ * @override
97
+ * @browser
98
+ */
99
+ print(): string;
99
100
  /** @override */
100
101
  cloneNode(): this;
101
102
  /** 替换引用 */
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TranscludeToken = void 0;
4
4
  const string_1 = require("../util/string");
5
5
  const lint_1 = require("../util/lint");
6
- const index_1 = require("../index");
6
+ const Parser = require("../index");
7
7
  const _1 = require(".");
8
8
  const parameter_1 = require("./parameter");
9
9
  const atom_1 = require("./atom");
@@ -35,7 +35,7 @@ class TranscludeToken extends _1.Token {
35
35
  * @param parts 参数各部分
36
36
  * @throws `SyntaxError` 非法的模板名称
37
37
  */
38
- constructor(title, parts, config = index_1.default.getConfig(), accum = []) {
38
+ constructor(title, parts, config = Parser.getConfig(), accum = []) {
39
39
  super(undefined, config, true, accum, {
40
40
  AtomToken: 0, SyntaxToken: 0, ParameterToken: '1:',
41
41
  });
@@ -69,9 +69,7 @@ class TranscludeToken extends _1.Token {
69
69
  if (!part) {
70
70
  break;
71
71
  }
72
- const invoke = new atom_1.AtomToken(part.join('='), `invoke-${i ? 'function' : 'module'}`, config, accum, {
73
- 'Stage-1': ':', '!ExtToken': '',
74
- });
72
+ const invoke = new atom_1.AtomToken(part.join('='), `invoke-${i ? 'function' : 'module'}`, config, accum, { 'Stage-1': ':', '!ExtToken': '' });
75
73
  super.insertAt(invoke);
76
74
  }
77
75
  this.protectChildren('1:3');
@@ -101,7 +99,6 @@ class TranscludeToken extends _1.Token {
101
99
  part.unshift(i);
102
100
  i++;
103
101
  }
104
- // @ts-expect-error abstract class
105
102
  this.insertAt(new parameter_1.ParameterToken(...part, config, accum));
106
103
  }
107
104
  this.protectChildren(0);
@@ -111,14 +108,14 @@ class TranscludeToken extends _1.Token {
111
108
  * @browser
112
109
  * @param modifier 引用修饰符
113
110
  */
114
- setModifier(modifier = '') {
111
+ setModifier(modifier) {
115
112
  const { parserFunction: [, , raw, subst] } = this.getAttribute('config'), lcModifier = (0, string_1.removeComment)(modifier).trim();
116
113
  if (modifier && !lcModifier.endsWith(':')) {
117
114
  return false;
118
115
  }
119
116
  const magicWord = lcModifier.slice(0, -1).toLowerCase(), isRaw = raw.includes(magicWord), isSubst = subst.includes(magicWord);
120
117
  if (this.#raw && isRaw || !this.#raw && (isSubst || modifier === '')
121
- || (index_1.default.running || this.length > 1) && (isRaw || isSubst || modifier === '')) {
118
+ || (Parser.running || this.length > 1) && (isRaw || isSubst || modifier === '')) {
122
119
  this.setAttribute('modifier', modifier);
123
120
  this.#raw = isRaw;
124
121
  return Boolean(modifier);
@@ -177,14 +174,13 @@ class TranscludeToken extends _1.Token {
177
174
  * @override
178
175
  * @browser
179
176
  */
180
- toString(selector) {
181
- if (selector && this.matches(selector)) {
177
+ toString(omit) {
178
+ if (omit && this.matchesTypes(omit)) {
182
179
  return '';
183
180
  }
184
- const { childNodes, length, firstChild, modifier } = this;
185
- return `{{${modifier}${this.type === 'magic-word'
186
- ? `${firstChild.toString(selector)}${length === 1 ? '' : ':'}${childNodes.slice(1).map(child => child.toString(selector)).join('|')}`
187
- : super.toString(selector, '|')}}}`;
181
+ return `{{${this.modifier}${this.type === 'magic-word'
182
+ ? `${this.firstChild.toString(omit)}${this.length === 1 ? '' : ':'}${this.childNodes.slice(1).map(child => child.toString(omit)).join('|')}`
183
+ : super.toString(omit, '|')}}}`;
188
184
  }
189
185
  /**
190
186
  * @override
@@ -194,7 +190,7 @@ class TranscludeToken extends _1.Token {
194
190
  const { childNodes, length, firstChild, modifier, type, name } = this;
195
191
  return type === 'magic-word' && name === 'vardefine'
196
192
  ? ''
197
- : `{{${modifier}${this.type === 'magic-word'
193
+ : `{{${modifier}${type === 'magic-word'
198
194
  ? `${firstChild.text()}${length === 1 ? '' : ':'}${(0, string_1.text)(childNodes.slice(1), '|')}`
199
195
  : super.text('|')}}}`;
200
196
  }
@@ -206,16 +202,6 @@ class TranscludeToken extends _1.Token {
206
202
  getGaps(i) {
207
203
  return i < this.length - 1 ? 1 : 0;
208
204
  }
209
- /**
210
- * @override
211
- * @browser
212
- */
213
- print() {
214
- const { childNodes, length, firstChild, modifier } = this;
215
- return `<span class="wpb-${this.type}">{{${modifier}${this.type === 'magic-word'
216
- ? `${firstChild.print()}${length === 1 ? '' : ':'}${(0, string_1.print)(childNodes.slice(1), { sep: '|' })}`
217
- : (0, string_1.print)(childNodes, { sep: '|' })}}}</span>`;
218
- }
219
205
  /**
220
206
  * @override
221
207
  * @browser
@@ -378,11 +364,20 @@ class TranscludeToken extends _1.Token {
378
364
  }
379
365
  return queue;
380
366
  }
367
+ /**
368
+ * @override
369
+ * @browser
370
+ */
371
+ print() {
372
+ const { childNodes, length, firstChild, modifier, type } = this;
373
+ return `<span class="wpb-${type}">{{${modifier}${type === 'magic-word'
374
+ ? `${firstChild.print()}${length === 1 ? '' : ':'}${(0, string_1.print)(childNodes.slice(1), { sep: '|' })}`
375
+ : (0, string_1.print)(childNodes, { sep: '|' })}}}</span>`;
376
+ }
381
377
  /** @override */
382
378
  cloneNode() {
383
379
  const [first, ...cloned] = this.cloneChildNodes(), config = this.getAttribute('config');
384
- return index_1.default.run(() => {
385
- // @ts-expect-error abstract class
380
+ return Parser.run(() => {
386
381
  const token = new TranscludeToken(this.type === 'template' ? '' : first.text(), [], config);
387
382
  if (this.#raw) {
388
383
  token.setModifier(this.modifier);
@@ -458,7 +453,7 @@ class TranscludeToken extends _1.Token {
458
453
  * @param exact 是否匹配匿名性
459
454
  */
460
455
  removeArg(key, exact = false) {
461
- index_1.default.run(() => {
456
+ Parser.run(() => {
462
457
  for (const token of this.getArgs(key, exact, false)) {
463
458
  this.removeChild(token);
464
459
  }
@@ -496,7 +491,7 @@ class TranscludeToken extends _1.Token {
496
491
  * @throws `SyntaxError` 非法的匿名参数
497
492
  */
498
493
  newAnonArg(val) {
499
- const templateLike = this.isTemplate(), wikitext = `{{${templateLike ? ':T|' : 'lc:'}${val}}}`, root = index_1.default.parse(wikitext, this.getAttribute('include'), 2, this.getAttribute('config')), { length, firstChild: transclude } = root, targetType = templateLike ? 'template' : 'magic-word';
494
+ const templateLike = this.isTemplate(), wikitext = `{{${templateLike ? ':T|' : 'lc:'}${val}}}`, root = Parser.parse(wikitext, this.getAttribute('include'), 2, this.getAttribute('config')), { length, firstChild: transclude } = root, targetType = templateLike ? 'template' : 'magic-word';
500
495
  if (length !== 1 || transclude.type !== targetType || transclude.length !== 2) {
501
496
  throw new SyntaxError(`非法的匿名参数:${(0, string_1.noWrap)(val)}`);
502
497
  }
@@ -522,15 +517,15 @@ class TranscludeToken extends _1.Token {
522
517
  token.setValue(value);
523
518
  return;
524
519
  }
525
- const wikitext = `{{:T|${key}=${value}}}`, root = index_1.default.parse(wikitext, this.getAttribute('include'), 2, this.getAttribute('config')), { length, firstChild: template } = root;
520
+ const wikitext = `{{:T|${key}=${value}}}`, root = Parser.parse(wikitext, this.getAttribute('include'), 2, this.getAttribute('config')), { length, firstChild: template } = root;
526
521
  if (length !== 1 || template.type !== 'template' || template.length !== 2) {
527
522
  throw new SyntaxError(`非法的命名参数:${key}=${(0, string_1.noWrap)(value)}`);
528
523
  }
529
524
  const { name, lastChild: parameter } = template;
530
- if (name === 'T' && parameter.name === key) {
531
- this.insertAt(parameter);
525
+ if (name !== 'T' || parameter.name !== key) {
526
+ throw new SyntaxError(`非法的命名参数:${key}=${(0, string_1.noWrap)(value)}`);
532
527
  }
533
- throw new SyntaxError(`非法的命名参数:${key}=${(0, string_1.noWrap)(value)}`);
528
+ this.insertAt(parameter);
534
529
  }
535
530
  /**
536
531
  * 将匿名参数改写为命名参数
@@ -554,11 +549,11 @@ class TranscludeToken extends _1.Token {
554
549
  if (this.type === 'magic-word') {
555
550
  throw new Error(`${this.constructor.name}.replaceTemplate 方法仅用于更换模板!`);
556
551
  }
557
- const root = index_1.default.parse(`{{${title}}}`, this.getAttribute('include'), 2, this.getAttribute('config')), { length, firstChild: template } = root;
558
- if (length === 1 && template.type === 'template' && template.length === 1) {
559
- this.firstChild.replaceChildren(...template.firstChild.childNodes);
552
+ const root = Parser.parse(`{{${title}}}`, this.getAttribute('include'), 2, this.getAttribute('config')), { length, firstChild: template } = root;
553
+ if (length !== 1 || template.type !== 'template' || template.length !== 1) {
554
+ throw new SyntaxError(`非法的模板名称:${title}`);
560
555
  }
561
- throw new SyntaxError(`非法的模板名称:${title}`);
556
+ this.firstChild.replaceChildren(...template.firstChild.childNodes);
562
557
  }
563
558
  /**
564
559
  * 替换模块名
@@ -570,7 +565,7 @@ class TranscludeToken extends _1.Token {
570
565
  if (this.type !== 'magic-word' || this.name !== 'invoke') {
571
566
  throw new Error(`${this.constructor.name}.replaceModule 方法仅用于更换模块!`);
572
567
  }
573
- const root = index_1.default.parse(`{{#invoke:${title}}}`, this.getAttribute('include'), 2, this.getAttribute('config')), { length, firstChild: invoke } = root, { type, name, lastChild } = invoke;
568
+ const root = Parser.parse(`{{#invoke:${title}}}`, this.getAttribute('include'), 2, this.getAttribute('config')), { length, firstChild: invoke } = root, { type, name, lastChild } = invoke;
574
569
  if (length !== 1 || type !== 'magic-word' || name !== 'invoke' || invoke.length !== 2) {
575
570
  throw new SyntaxError(`非法的模块名称:${title}`);
576
571
  }
@@ -596,7 +591,7 @@ class TranscludeToken extends _1.Token {
596
591
  else if (this.length < 2) {
597
592
  throw new Error('尚未指定模块名称!');
598
593
  }
599
- const root = index_1.default.parse(`{{#invoke:M|${func}}}`, this.getAttribute('include'), 2, this.getAttribute('config')), { length, firstChild: invoke } = root, { type, name, lastChild } = invoke;
594
+ const root = Parser.parse(`{{#invoke:M|${func}}}`, this.getAttribute('include'), 2, this.getAttribute('config')), { length, firstChild: invoke } = root, { type, name, lastChild } = invoke;
600
595
  if (length !== 1 || type !== 'magic-word' || name !== 'invoke' || invoke.length !== 3) {
601
596
  throw new SyntaxError(`非法的模块函数名:${func}`);
602
597
  }
@@ -688,7 +683,7 @@ class TranscludeToken extends _1.Token {
688
683
  }
689
684
  }
690
685
  if (remaining > 1) {
691
- index_1.default.error(`${this.type === 'template'
686
+ Parser.error(`${this.type === 'template'
692
687
  ? this.name
693
688
  : this.normalizeTitle(this.childNodes[1]?.text() ?? '', 828).title} 还留有 ${remaining} 个重复的 ${key} 参数:${[...this.getArgs(key)].map(arg => {
694
689
  const { top, left } = arg.getBoundingClientRect();
@@ -705,17 +700,17 @@ class TranscludeToken extends _1.Token {
705
700
  * @throws `Error` 转义失败
706
701
  */
707
702
  escapeTables() {
708
- const count = this.hasDuplicatedArgs();
709
- if (!/\n[^\S\n]*(?::+\s*)?\{\|[^\n]*\n\s*(?:\S[^\n]*\n\s*)*\|\}/u.test(this.text()) || !count) {
703
+ const count = this.hasDuplicatedArgs(), str = this.text(), i = str.search(/\n[^\S\n]*(?::+[^\S\n]*)?\{\|/u), j = str.slice(i).search(/\n[^\S\n]*\|\}/u);
704
+ if (i === -1 || j === -1 || !count) {
710
705
  return this;
711
706
  }
712
- const stripped = String(this).slice(2, -2), include = this.getAttribute('include'), config = this.getAttribute('config'), parsed = index_1.default.parse(stripped, include, 4, config);
707
+ const stripped = String(this).slice(2, -2), include = this.getAttribute('include'), config = this.getAttribute('config'), parsed = Parser.parse(stripped, include, 4, config);
713
708
  for (const table of parsed.childNodes) {
714
709
  if (table.type === 'table') {
715
710
  table.escape();
716
711
  }
717
712
  }
718
- const { firstChild, length } = index_1.default.parse(`{{${String(parsed)}}}`, include, 2, config);
713
+ const { firstChild, length } = Parser.parse(`{{${String(parsed)}}}`, include, 2, config);
719
714
  if (length !== 1 || !(firstChild instanceof TranscludeToken)) {
720
715
  throw new Error('转义表格失败!');
721
716
  }
@@ -723,10 +718,10 @@ class TranscludeToken extends _1.Token {
723
718
  if (newCount === count) {
724
719
  return this;
725
720
  }
726
- index_1.default.info(`共修复了 ${count - newCount} 个重复参数。`);
721
+ Parser.info(`共修复了 ${count - newCount} 个重复参数。`);
727
722
  this.safeReplaceWith(firstChild);
728
723
  return firstChild;
729
724
  }
730
725
  }
731
726
  exports.TranscludeToken = TranscludeToken;
732
- index_1.default.classes['TranscludeToken'] = __filename;
727
+ Parser.classes['TranscludeToken'] = __filename;
package/dist/util/lint.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateForSelf = exports.generateForChild = void 0;
4
- const index_1 = require("../index");
4
+ const Parser = require("../index");
5
5
  /**
6
6
  * 生成对于子节点的LintError对象
7
7
  * @param child 子节点
@@ -10,8 +10,18 @@ const index_1 = require("../index");
10
10
  * @param severity 严重程度
11
11
  */
12
12
  const generateForChild = (child, boundingRect, msg, severity = 'error') => {
13
- const index = child.getRelativeIndex(), { offsetHeight, offsetWidth, parentNode } = child, { top: offsetTop, left: offsetLeft } = parentNode.posFromIndex(index), { start } = boundingRect, { top, left } = 'top' in boundingRect ? boundingRect : child.getRootNode().posFromIndex(start), str = String(child), excerpt = str.slice(0, 50), startIndex = start + index, endIndex = startIndex + str.length, startLine = top + offsetTop, endLine = startLine + offsetHeight - 1, startCol = offsetTop ? offsetLeft : left + offsetLeft, endCol = offsetHeight === 1 ? startCol + offsetWidth : offsetWidth;
14
- return { message: index_1.default.msg(msg), severity, startIndex, endIndex, startLine, endLine, startCol, endCol, excerpt };
13
+ const index = child.getRelativeIndex(), { offsetHeight, offsetWidth, parentNode } = child, { top: offsetTop, left: offsetLeft } = parentNode.posFromIndex(index), { start } = boundingRect, { top, left } = 'top' in boundingRect ? boundingRect : child.getRootNode().posFromIndex(start), str = String(child), startIndex = start + index, startLine = top + offsetTop, startCol = offsetTop ? offsetLeft : left + offsetLeft;
14
+ return {
15
+ message: Parser.msg(msg),
16
+ severity,
17
+ startIndex,
18
+ endIndex: startIndex + str.length,
19
+ startLine,
20
+ endLine: startLine + offsetHeight - 1,
21
+ startCol,
22
+ endCol: offsetHeight === 1 ? startCol + offsetWidth : offsetWidth,
23
+ excerpt: str.slice(0, 50),
24
+ };
15
25
  };
16
26
  exports.generateForChild = generateForChild;
17
27
  /**
@@ -24,7 +34,7 @@ exports.generateForChild = generateForChild;
24
34
  const generateForSelf = (token, boundingRect, msg, severity = 'error') => {
25
35
  const { start } = boundingRect, { offsetHeight, offsetWidth } = token, str = String(token), { top, left } = 'top' in boundingRect ? boundingRect : token.getRootNode().posFromIndex(start);
26
36
  return {
27
- message: index_1.default.msg(msg),
37
+ message: Parser.msg(msg),
28
38
  severity,
29
39
  startIndex: start,
30
40
  endIndex: start + str.length,
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.normalizeSpace = exports.noWrap = exports.toCase = exports.decodeHtml = exports.text = exports.escapeRegExp = exports.print = exports.removeComment = exports.extUrlChar = exports.extUrlCharFirst = void 0;
3
+ exports.normalizeSpace = exports.toCase = exports.print = exports.noWrap = exports.decodeHtml = exports.text = exports.escapeRegExp = exports.removeComment = exports.extUrlChar = exports.extUrlCharFirst = void 0;
4
4
  exports.extUrlCharFirst = '(?:\\[[\\da-f:.]+\\]|[^[\\]<>"\\0-\\x1F\\x7F\\p{Zs}\\uFFFD])';
5
5
  exports.extUrlChar = '(?:[^[\\]<>"\\0-\\x1F\\x7F\\p{Zs}\\uFFFD]|\\0\\d+c\\x7F)*';
6
6
  /**
@@ -10,19 +10,6 @@ exports.extUrlChar = '(?:[^[\\]<>"\\0-\\x1F\\x7F\\p{Zs}\\uFFFD]|\\0\\d+c\\x7F)*'
10
10
  */
11
11
  const removeComment = (str) => str.replace(/\0\d+c\x7F/gu, '');
12
12
  exports.removeComment = removeComment;
13
- /**
14
- * 以HTML格式打印
15
- * @browser
16
- * @param childNodes 子节点
17
- * @param opt 选项
18
- */
19
- const print = (childNodes, opt = {}) => {
20
- const { pre = '', post = '', sep = '' } = opt, entities = { '&': 'amp', '<': 'lt', '>': 'gt' };
21
- return `${pre}${childNodes.map(child => child.type === 'text'
22
- ? child.data.replace(/[&<>]/gu, p => `&${entities[p]};`)
23
- : child.print()).join(sep)}${post}`;
24
- };
25
- exports.print = print;
26
13
  /**
27
14
  * escape special chars for RegExp constructor
28
15
  * @browser
@@ -45,6 +32,26 @@ exports.text = text;
45
32
  */
46
33
  const decodeHtml = (str) => str.replace(/&#(\d+|x[\da-f]+);/giu, (_, code) => String.fromCodePoint(Number(`${code[0].toLowerCase() === 'x' ? '0' : ''}${code}`)));
47
34
  exports.decodeHtml = decodeHtml;
35
+ /**
36
+ * escape newlines
37
+ * @browser
38
+ * @param str 原字符串
39
+ */
40
+ const noWrap = (str) => str.replaceAll('\n', '\\n');
41
+ exports.noWrap = noWrap;
42
+ /**
43
+ * 以HTML格式打印
44
+ * @browser
45
+ * @param childNodes 子节点
46
+ * @param opt 选项
47
+ */
48
+ const print = (childNodes, opt = {}) => {
49
+ const { pre = '', post = '', sep = '' } = opt, entities = { '&': 'amp', '<': 'lt', '>': 'gt' };
50
+ return `${pre}${childNodes.map(child => child.type === 'text'
51
+ ? child.data.replace(/[&<>]/gu, p => `&${entities[p]};`)
52
+ : child.print()).join(sep)}${post}`;
53
+ };
54
+ exports.print = print;
48
55
  /**
49
56
  * optionally convert to lower cases
50
57
  * @param val 属性值
@@ -52,12 +59,6 @@ exports.decodeHtml = decodeHtml;
52
59
  */
53
60
  const toCase = (val, i) => i ? val.toLowerCase() : val;
54
61
  exports.toCase = toCase;
55
- /**
56
- * escape newlines
57
- * @param str 原字符串
58
- */
59
- const noWrap = (str) => str.replaceAll('\n', '\\n');
60
- exports.noWrap = noWrap;
61
62
  /**
62
63
  * convert newline in text nodes to single whitespace
63
64
  * @param token 父节点
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wikiparser-node",
3
- "version": "1.0.0-beta.2",
3
+ "version": "1.0.0-beta.4",
4
4
  "description": "A Node.js parser for MediaWiki markup with AST",
5
5
  "keywords": [
6
6
  "mediawiki",
@@ -28,6 +28,7 @@
28
28
  "scripts": {
29
29
  "prepublishOnly": "rm -rf dist/; tsc; rm dist/internal.js; rm dist/[mpu]*/*.d.ts; grep -rl --include='*.d.ts' '@private' dist/ | xargs gsed -i '/@private/,+1d'",
30
30
  "build": "rm -rf dist/; tsc; grep -rl --include='*.js' '@ts' dist/ | xargs gsed -i '/@ts/d'; eslint --fix dist/",
31
+ "diff": "git diff --ignore-all-space --color-moved",
31
32
  "doc": "node ./bin/doc.js",
32
33
  "toc": "node ./bin/toc.js",
33
34
  "lint:ts": "eslint --cache --ignore-pattern '/dist/' .",
@@ -37,19 +38,20 @@
37
38
  "test:single": "node --prof test/single.js && node --prof-process isolate-0x*-v8.log > test/processed.txt && rm isolate-0x*-v8.log"
38
39
  },
39
40
  "devDependencies": {
41
+ "@cypress/request": "^3.0.1",
40
42
  "@types/node": "^20.9.0",
43
+ "@typescript-eslint/eslint-plugin": "^5.62.0",
44
+ "@typescript-eslint/parser": "^5.62.0",
45
+ "ajv-cli": "^5.0.0",
41
46
  "eslint": "^8.53.0",
47
+ "eslint-plugin-eslint-comments": "^3.2.0",
48
+ "eslint-plugin-jsdoc": "^46.8.2",
49
+ "eslint-plugin-json-es": "^1.5.7",
42
50
  "eslint-plugin-n": "^16.3.1",
51
+ "eslint-plugin-promise": "^6.1.1",
43
52
  "eslint-plugin-regexp": "^2.1.1",
44
53
  "eslint-plugin-unicorn": "^49.0.0",
45
- "eslint-plugin-jsdoc": "^46.8.2",
46
- "eslint-plugin-json-es": "^1.5.7",
47
- "eslint-plugin-eslint-comments": "^3.2.0",
48
- "typescript": "^5.0.3",
49
- "@typescript-eslint/eslint-plugin": "^5.62.0",
50
- "@typescript-eslint/parser": "^5.62.0",
51
- "ajv-cli": "^5.0.0",
52
- "request": "^2.88.2"
54
+ "typescript": "^5.0.3"
53
55
  },
54
56
  "engines": {
55
57
  "node": "^20.9.0"