wikiparser-node 1.3.7 → 1.3.8

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.
@@ -86,7 +86,7 @@ export declare abstract class AstElement extends AstNode {
86
86
  * 保存为JSON
87
87
  * @param file 文件名
88
88
  */
89
- json(file?: string): unknown;
89
+ json(file?: string): object;
90
90
  /** 销毁 */
91
91
  destroy(): void;
92
92
  /**
@@ -246,7 +246,7 @@ class AstElement extends node_1.AstNode {
246
246
  json(file) {
247
247
  const json = {
248
248
  ...this,
249
- childNodes: this.childNodes.map(child => child.type === 'text' ? child.data : child.json()),
249
+ childNodes: this.childNodes.map(child => child.type === 'text' ? { data: child.data } : child.json()),
250
250
  };
251
251
  if (typeof file === 'string') {
252
252
  fs.writeFileSync(path.join(__dirname.slice(0, -4), '..', 'printed', `${file}${file.endsWith('.json') ? '' : '.json'}`), JSON.stringify(json, null, 2));
package/dist/lib/node.js CHANGED
@@ -203,11 +203,13 @@ class AstNode {
203
203
  throw new Error(`${this.constructor.name} ${msg}!`);
204
204
  }
205
205
  /** @private */
206
- seal(key) {
207
- this.#optional.add(key);
206
+ seal(key, hidden) {
207
+ if (!hidden) {
208
+ this.#optional.add(key);
209
+ }
208
210
  Object.defineProperty(this, key, {
209
211
  writable: false,
210
- enumerable: Boolean(this[key]),
212
+ enumerable: !hidden && Boolean(this[key]),
211
213
  configurable: true,
212
214
  });
213
215
  }
package/dist/lib/text.js CHANGED
@@ -76,7 +76,7 @@ class AstText extends node_1.AstNode {
76
76
  writable: false,
77
77
  },
78
78
  childNodes: { enumerable: false, configurable: false },
79
- type: { enumerable: false, writable: false, configurable: false },
79
+ type: { enumerable: false, writable: false },
80
80
  });
81
81
  }
82
82
  /** @private */
package/dist/lib/title.js CHANGED
@@ -61,11 +61,6 @@ class Title {
61
61
  * @param selfLink 是否允许selfLink
62
62
  */
63
63
  constructor(title, defaultNs = 0, config = Parser.getConfig(), decode = false, selfLink = false) {
64
- Object.defineProperties(this, {
65
- encoded: { enumerable: false },
66
- conversionTable: { enumerable: false },
67
- redirects: { enumerable: false },
68
- });
69
64
  const { namespaces, nsid, } = config;
70
65
  this.#namespaces = namespaces;
71
66
  title = (0, string_1.decodeHtml)(title);
@@ -119,6 +114,12 @@ class Title {
119
114
  || this.interwiki
120
115
  || selfLink && this.fragment !== undefined) && !/\0\d+[eh!+-]\x7F|[<>[\]{}|]|%[\da-f]{2}/iu.test(title);
121
116
  this.main = title;
117
+ Object.defineProperties(this, {
118
+ valid: { writable: false },
119
+ encoded: { enumerable: false, writable: false },
120
+ conversionTable: { enumerable: false },
121
+ redirects: { enumerable: false },
122
+ });
122
123
  }
123
124
  /* NOT FOR BROWSER */
124
125
  /** @private */
@@ -11,7 +11,6 @@ const hidden = (constructor) => {
11
11
  class AnyHiddenToken extends constructor {
12
12
  static hidden = true;
13
13
  /** 没有可见部分 */
14
- // eslint-disable-next-line class-methods-use-this
15
14
  text() {
16
15
  return '';
17
16
  }
@@ -50,9 +50,14 @@ const parseCommentAndExt = (wikitext, config = Parser.getConfig(), accum = [], i
50
50
  return str;
51
51
  }
52
52
  }
53
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
54
+ /<foo(?:\s[^>]*)?>|<\/foo\s*>/giu;
55
+ /<(bar)(\s[^>]*?)?(?:\/>|>(.*?)<\/(\1\s*)>)/gisu;
56
+ /<(baz)(\s[^>]*?)?(?:\/>|>(.*?)(?:<\/(baz\s*)>|$))/gisu;
57
+ /* eslint-enable @typescript-eslint/no-unused-expressions */
53
58
  const ext = config.ext.join('|'), noincludeRegex = includeOnly ? 'includeonly' : '(?:no|only)include', includeRegex = includeOnly ? 'noinclude' : 'includeonly', regex = new RegExp('<!--.*?(?:-->|$)' // comment
54
59
  + '|'
55
- + `<${noincludeRegex}(?:\\s[^>]*?)?>|</${noincludeRegex}\\s*>` // <noinclude>
60
+ + `<${noincludeRegex}(?:\\s[^>]*)?>|</${noincludeRegex}\\s*>` // <noinclude>
56
61
  + '|'
57
62
  + `<(${ext})(\\s[^>]*?)?(?:/>|>(.*?)</(\\1\\s*)>)` // 扩展标签
58
63
  + '|'
@@ -16,10 +16,10 @@ const parseConverter = (text, config = Parser.getConfig(), accum = []) => {
16
16
  while (mt) {
17
17
  const { 0: syntax, index } = mt;
18
18
  if (syntax === '}-') {
19
- const top = stack.pop(), { length } = accum, str = text.slice(top.index + 2, index), i = str.indexOf('|'), [flags, raw] = i === -1 ? [[], str] : [str.slice(0, i).split(';'), str.slice(i + 1)], temp = raw.replace(/(&[#a-z\d]+);/giu, '$1\x01'), variants = `(?:${config.variants.join('|')})`, rules = temp.split(new RegExp(`;(?=\\s*(?:${`(?:${variants}|[^;]*?=>\\s*${variants})\\s*:`
20
- + '|'
21
- + '(?:\0\\d+c\x7f(?:\\s|\0\\d+c\x7f)*)?$' // 末尾的空白
22
- }))`, 'u')).map(rule => rule.replace(/\x01/gu, ';'));
19
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
20
+ /;(?=(?:[^;]*?=>)?\s*foo\s*:|(?:\s|\0\d+c\x7F)*$)/u;
21
+ const top = stack.pop(), { length } = accum, str = text.slice(top.index + 2, index), i = str.indexOf('|'), [flags, raw] = i === -1 ? [[], str] : [str.slice(0, i).split(';'), str.slice(i + 1)], temp = raw.replace(/(&[#a-z\d]+);/giu, '$1\x01'), variants = `(?:${config.variants.join('|')})`, rules = temp.split(new RegExp(`;(?=(?:[^;]*?=>)?\\s*${variants}\\s*:|(?:\\s|\0\\d+c\x7F)*$)`, 'u'))
22
+ .map(rule => rule.replace(/\x01/gu, ';'));
23
23
  new converter_1.ConverterToken(flags, rules, config, accum);
24
24
  text = `${text.slice(0, top.index)}\0${length}v\x7F${text.slice(index + 2)}`;
25
25
  if (stack.length === 0) {
@@ -12,7 +12,10 @@ const extLink_1 = require("../src/extLink");
12
12
  * @param accum
13
13
  */
14
14
  const parseExternalLinks = (wikitext, config = Parser.getConfig(), accum = []) => {
15
- const regex = new RegExp(`\\[((?:(?:${config.protocol}|//)${string_1.extUrlCharFirst}|\0\\d+m\x7F)${string_1.extUrlChar})(\\p{Zs}*)([^\\]\x01-\x08\x0A-\x1F\uFFFD]*)\\]`, 'giu');
15
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
16
+ /\[((?:\[[\da-f:.]+\]|[^[\]\t\n\p{Zs}])[^[\]\t\n\p{Zs}]*(?=[[\]\t\p{Zs}]|\0\d))(\p{Zs}*(?=\P{Zs}))([^\]\n]*)\]/giu;
17
+ const regex = new RegExp(`\\[((?:(?:${config.protocol}|//)${string_1.extUrlCharFirst}|\0\\d+m\x7F)${string_1.extUrlChar}(?=[[\\]<>"\\t\\p{Zs}]|\0\\d))`
18
+ + '(\\p{Zs}*(?=\\P{Zs}))([^\\]\x01-\x08\x0A-\x1F\uFFFD]*)\\]', 'giu');
16
19
  return wikitext.replace(regex, (_, url, space, text) => {
17
20
  const { length } = accum, mt = /&[lg]t;/u.exec(url);
18
21
  if (mt) {
@@ -12,6 +12,8 @@ const magicLink_1 = require("../src/magicLink");
12
12
  * @param accum
13
13
  */
14
14
  const parseMagicLinks = (wikitext, config = Parser.getConfig(), accum = []) => {
15
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
16
+ /(^|[^\p{L}\d_])((?:\[[\da-f:.]+\]|[^[\]<>"\t\n\p{Zs}])(?:[^[\]<>"\0\t\n\p{Zs}]|\0\d+c\x7F)*)/giu;
15
17
  const regex = new RegExp(`(^|[^\\p{L}\\d_])(?:${config.protocol})(${string_1.extUrlCharFirst}${string_1.extUrlChar})`, 'giu');
16
18
  return wikitext.replace(regex, (m, lead, p1) => {
17
19
  let trail = '', url = lead ? m.slice(1) : m;
package/dist/src/arg.d.ts CHANGED
@@ -29,6 +29,8 @@ export declare class ArgToken extends Token {
29
29
  /** @override */
30
30
  print(): string;
31
31
  /** @override */
32
+ json(): object;
33
+ /** @override */
32
34
  cloneNode(): this;
33
35
  /** 移除无效部分 */
34
36
  removeRedundant(): void;
package/dist/src/arg.js CHANGED
@@ -93,6 +93,13 @@ class ArgToken extends index_1.Token {
93
93
  print() {
94
94
  return super.print({ pre: '{{{', post: '}}}', sep: '|' });
95
95
  }
96
+ /** @override */
97
+ json() {
98
+ return {
99
+ ...super.json(),
100
+ default: this.default,
101
+ };
102
+ }
96
103
  /* NOT FOR BROWSER */
97
104
  /** @override */
98
105
  cloneNode() {
@@ -158,6 +158,7 @@ const commonHtmlAttrs = new Set([
158
158
  * @classdesc `{childNodes: [AtomToken, Token|AtomToken]}`
159
159
  */
160
160
  class AttributeToken extends (0, fixed_1.fixed)(index_1.Token) {
161
+ tag;
161
162
  #equal;
162
163
  #quotes;
163
164
  /** 引号是否匹配 */
@@ -239,7 +240,7 @@ class AttributeToken extends (0, fixed_1.fixed)(index_1.Token) {
239
240
  this.#equal = equal;
240
241
  this.#quotes = [...quotes];
241
242
  this.tag = tag;
242
- this.seal('tag');
243
+ this.seal('tag', true);
243
244
  this.setAttribute('name', (0, string_1.removeComment)(key).trim().toLowerCase());
244
245
  }
245
246
  /** @private */
@@ -80,10 +80,10 @@ class AttributesToken extends index_1.Token {
80
80
  this.type = type;
81
81
  this.setAttribute('name', name);
82
82
  if (attr) {
83
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
84
+ /([^\s/](?:(?!\0\d+~\x7F)[^\s/=])*)(?:(\s*(?:=|\0\d+~\x7F)\s*)(?:(["'])(.*?)(\3|$)|(\S*)))?/gsu;
83
85
  const regex = new RegExp('([^\\s/](?:(?!\0\\d+~\x7F)[^\\s/=])*)' // 属性名
84
- + `(?:${'((?:\\s|\0\\d+c\x7F)*' // `=`前的空白字符
85
- + '(?:=|\0\\d+~\x7F)' // `=`
86
- + '(?:\\s|\0\\d+c\x7F)*)' // `=`后的空白字符
86
+ + `(?:${'((?:\\s|\0\\d+c\x7F)*(?:=|\0\\d+~\x7F)(?:\\s|\0\\d+c\x7F)*)' // `=`和前后的空白字符
87
87
  + `(?:(["'])(.*?)(\\3|$)|(\\S*))` // 属性值
88
88
  })?`, 'gsu');
89
89
  let out = '', mt = regex.exec(attr), lastIndex = 0;
@@ -64,6 +64,8 @@ export declare class HeadingToken extends HeadingToken_base {
64
64
  /** @override */
65
65
  print(): string;
66
66
  /** @override */
67
+ json(): object;
68
+ /** @override */
67
69
  cloneNode(): this;
68
70
  /**
69
71
  * 设置标题层级
@@ -100,6 +100,13 @@ class HeadingToken extends (0, sol_1.sol)((0, fixed_1.fixed)(index_1.Token)) {
100
100
  const equals = this.#equals;
101
101
  return super.print({ pre: equals, sep: equals });
102
102
  }
103
+ /** @override */
104
+ json() {
105
+ return {
106
+ ...super.json(),
107
+ level: this.level,
108
+ };
109
+ }
103
110
  /* NOT FOR BROWSER */
104
111
  /** @override */
105
112
  cloneNode() {
@@ -82,12 +82,14 @@ export declare class HtmlToken extends HtmlToken_base {
82
82
  * 搜索匹配的标签
83
83
  * @throws `SyntaxError` 同时闭合和自封闭的标签
84
84
  * @throws `SyntaxError` 无效自封闭标签
85
- * @throws `SyntaxError` 未闭合的标签
85
+ * @throws `SyntaxError` 未匹配的标签
86
86
  */
87
87
  findMatchingTag(): this | undefined;
88
88
  /** @override */
89
89
  print(): string;
90
90
  /** @override */
91
+ json(): object;
92
+ /** @override */
91
93
  cloneNode(): this;
92
94
  /**
93
95
  * 更换标签名
package/dist/src/html.js CHANGED
@@ -137,7 +137,7 @@ class HtmlToken extends (0, attributesParent_1.attributesParent)((0, fixed_1.fix
137
137
  * 搜索匹配的标签
138
138
  * @throws `SyntaxError` 同时闭合和自封闭的标签
139
139
  * @throws `SyntaxError` 无效自封闭标签
140
- * @throws `SyntaxError` 未闭合的标签
140
+ * @throws `SyntaxError` 未匹配的标签
141
141
  */
142
142
  findMatchingTag() {
143
143
  const { html } = this.getAttribute('config'), { name: tagName, parentNode, closing } = this, string = (0, string_1.noWrap)(String(this));
@@ -178,6 +178,14 @@ class HtmlToken extends (0, attributesParent_1.attributesParent)((0, fixed_1.fix
178
178
  class: closing && html[2].includes(name) && name !== 'br' ? 'html-invalid' : 'html',
179
179
  });
180
180
  }
181
+ /** @override */
182
+ json() {
183
+ return {
184
+ ...super.json(),
185
+ closing: this.closing,
186
+ selfClosing: this.#selfClosing,
187
+ };
188
+ }
181
189
  /* NOT FOR BROWSER */
182
190
  /** @override */
183
191
  cloneNode() {
@@ -18,6 +18,8 @@ function validate(key, val, config = Parser.getConfig(), halfParsed = false) {
18
18
  if (!value) {
19
19
  return val;
20
20
  }
21
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
22
+ /^(?:\/\/(?:\[[\da-f:.]+\]|[^[\]<>"\t\n\p{Zs}])|\0\d+m\x7F)(?:[^[\]<>"\0\t\n\p{Zs}]|\0\d+c\x7F)*$/iu;
21
23
  const regex = new RegExp(`^(?:(?:${config.protocol}|//)${string_1.extUrlCharFirst}|\0\\d+m\x7F)${string_1.extUrlChar}$`, 'iu');
22
24
  if (regex.test(value)) {
23
25
  return val;
@@ -71,7 +71,7 @@ class ImagemapToken extends index_1.Token {
71
71
  }
72
72
  else if (protocols.has(substr.slice(1, substr.indexOf(':') + 1))
73
73
  || protocols.has(substr.slice(1, substr.indexOf('//') + 2))) {
74
- const mtEx = /^\[([^\]\s]+)(?:(\s+)(\S[^\]]*)?)?\][\w\s]*$/u
74
+ const mtEx = /^\[([^\]\s]+)(?:(\s+(?=\S))([^\]]*))?\][\w\s]*$/u
75
75
  .exec(substr);
76
76
  if (mtEx) {
77
77
  super.insertAt(new imagemapLink_1.ImagemapLinkToken(line.slice(0, i), mtEx.slice(1), substr.slice(substr.indexOf(']') + 1), config, accum));
@@ -248,7 +248,6 @@ class FileToken extends base_1.LinkBaseToken {
248
248
  * @override
249
249
  * @throws `Error` 不适用于图片
250
250
  */
251
- // eslint-disable-next-line class-methods-use-this
252
251
  setLinkText() {
253
252
  throw new Error('setLinkText 方法不适用于图片!');
254
253
  }
@@ -31,6 +31,8 @@ export declare class CommentToken extends CommentToken_base {
31
31
  /** @override */
32
32
  print(): string;
33
33
  /** @override */
34
+ json(): object;
35
+ /** @override */
34
36
  cloneNode(): this;
35
37
  /**
36
38
  * @override
@@ -49,6 +49,13 @@ class CommentToken extends (0, hidden_1.hidden)(base_1.NowikiBaseToken) {
49
49
  }
50
50
  /* NOT FOR BROWSER */
51
51
  /** @override */
52
+ json() {
53
+ return {
54
+ ...super.json(),
55
+ closed: this.closed,
56
+ };
57
+ }
58
+ /** @override */
52
59
  cloneNode() {
53
60
  return debug_1.Shadow.run(() => new CommentToken(this.innerText, this.closed, this.getAttribute('config')));
54
61
  }
@@ -59,6 +59,8 @@ export declare class ParameterToken extends ParameterToken_base {
59
59
  /** @override */
60
60
  print(): string;
61
61
  /** @override */
62
+ json(): object;
63
+ /** @override */
62
64
  cloneNode(): this;
63
65
  /**
64
66
  * @override
@@ -107,6 +107,8 @@ class ParameterToken extends (0, fixed_1.fixed)(index_1.Token) {
107
107
  }
108
108
  /** @override */
109
109
  lint(start = this.getAbsoluteIndex()) {
110
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
111
+ /https?:\/\/(?:\[[\da-f:.]+\]|[^[\]<>"\t\n\p{Zs}])(?:[^[\]<>"\0\t\n\p{Zs}]|\0\d+c\x7F)*$/iu;
110
112
  const errors = super.lint(start), { firstChild } = this, link = new RegExp(`https?://${string_1.extUrlCharFirst}${string_1.extUrlChar}$`, 'iu')
111
113
  .exec(firstChild.toString(new Set(['comment', 'noinclude', 'include'])))?.[0];
112
114
  if (link && new URL(link).search) {
@@ -126,6 +128,13 @@ class ParameterToken extends (0, fixed_1.fixed)(index_1.Token) {
126
128
  print() {
127
129
  return super.print({ sep: this.anon ? '' : '=' });
128
130
  }
131
+ /** @override */
132
+ json() {
133
+ return {
134
+ ...super.json(),
135
+ anon: this.anon,
136
+ };
137
+ }
129
138
  /* NOT FOR BROWSER */
130
139
  /** @override */
131
140
  cloneNode() {
@@ -38,6 +38,8 @@ export declare class TableToken extends TrBaseToken {
38
38
  * @param halfParsed
39
39
  */
40
40
  close(syntax?: string, halfParsed?: boolean): void;
41
+ /** @override */
42
+ json(): object;
41
43
  /**
42
44
  * @override
43
45
  * @param token 待插入的子节点
@@ -61,6 +61,13 @@ class TableToken extends trBase_1.TrBaseToken {
61
61
  }
62
62
  this.lastChild.replaceChildren(...inner);
63
63
  }
64
+ /** @override */
65
+ json() {
66
+ return {
67
+ ...super.json(),
68
+ closed: this.closed,
69
+ };
70
+ }
64
71
  /* NOT FOR BROWSER */
65
72
  /**
66
73
  * @override
@@ -65,6 +65,8 @@ export declare class TdToken extends TdToken_base {
65
65
  lint(start?: number): LintError[];
66
66
  /** @override */
67
67
  print(): string;
68
+ /** @override */
69
+ json(): object;
68
70
  /** 是否位于行首 */
69
71
  isIndependent(): boolean;
70
72
  /** @override */
@@ -140,6 +140,13 @@ class TdToken extends (0, fixed_1.fixed)(base_1.TableBaseToken) {
140
140
  const { childNodes: [syntax, attr, inner] } = this;
141
141
  return `<span class="wpb-td">${syntax.print()}${attr.print()}${this.#innerSyntax}${inner.print()}</span>`;
142
142
  }
143
+ /** @override */
144
+ json() {
145
+ return {
146
+ ...super.json(),
147
+ subtype: this.subtype,
148
+ };
149
+ }
143
150
  /* NOT FOR BROWSER */
144
151
  /** 是否位于行首 */
145
152
  isIndependent() {
@@ -9,7 +9,7 @@ declare const ExtToken_base: (abstract new (...args: any[]) => {
9
9
  attributes: Record<string, string | true>;
10
10
  className: string;
11
11
  classList: Set<string>;
12
- id: string; /** @override */
12
+ id: string;
13
13
  hasAttr(key: string): boolean;
14
14
  getAttr(key: string): string | true | undefined;
15
15
  getAttrNames(): Set<string>;
@@ -36,13 +36,12 @@ declare const ExtToken_base: (abstract new (...args: any[]) => {
36
36
  */
37
37
  export declare class ExtToken extends ExtToken_base {
38
38
  readonly type = "ext";
39
+ closed: true;
39
40
  readonly childNodes: [AttributesToken, Token];
40
41
  abstract get children(): [AttributesToken, Token];
41
42
  abstract get firstChild(): AttributesToken;
42
43
  abstract get firstElementChild(): AttributesToken;
43
44
  abstract get lastChild(): Token;
44
- /** @override */
45
- get closed(): boolean;
46
45
  /**
47
46
  * @param name 标签名
48
47
  * @param attr 标签属性
@@ -25,13 +25,6 @@ const del = (arr, ele) => {
25
25
  */
26
26
  class ExtToken extends (0, attributesParent_1.attributesParent)(index_2.TagPairToken) {
27
27
  type = 'ext';
28
- /* NOT FOR BROWSER */
29
- /** @override */
30
- // eslint-disable-next-line class-methods-use-this
31
- get closed() {
32
- return true;
33
- }
34
- /* NOT FOR BROWSER END */
35
28
  /**
36
29
  * @param name 标签名
37
30
  * @param attr 标签属性
@@ -115,6 +108,7 @@ class ExtToken extends (0, attributesParent_1.attributesParent)(index_2.TagPairT
115
108
  innerToken.setAttribute('name', lcName);
116
109
  innerToken.type = 'ext-inner';
117
110
  super(name, attrToken, innerToken, closed, config, accum);
111
+ this.seal('closed', true);
118
112
  }
119
113
  /** @override */
120
114
  lint(start = this.getAbsoluteIndex()) {
@@ -42,6 +42,8 @@ export declare class IncludeToken extends IncludeToken_base {
42
42
  /** @override */
43
43
  lint(start?: number): LintError[];
44
44
  /** @override */
45
+ json(): object;
46
+ /** @override */
45
47
  cloneNode(): this;
46
48
  /**
47
49
  * @override
@@ -41,6 +41,13 @@ class IncludeToken extends (0, hidden_1.hidden)(index_1.TagPairToken) {
41
41
  lint(start = this.getAbsoluteIndex()) {
42
42
  return this.closed ? [] : [(0, lint_1.generateForSelf)(this, { start }, Parser.msg('unclosed $1', `<${this.name}>`))];
43
43
  }
44
+ /** @override */
45
+ json() {
46
+ return {
47
+ ...super.json(),
48
+ closed: this.closed,
49
+ };
50
+ }
44
51
  /* NOT FOR BROWSER */
45
52
  /** @override */
46
53
  cloneNode() {
@@ -23,15 +23,11 @@ export declare abstract class TagPairToken extends TagPairToken_base {
23
23
  #private;
24
24
  type: 'ext' | 'include';
25
25
  readonly name: string;
26
+ closed: boolean;
27
+ selfClosing: boolean;
26
28
  readonly childNodes: [AstNodes, AstNodes];
27
29
  abstract get firstChild(): AstNodes;
28
30
  abstract get lastChild(): AstNodes;
29
- /** 是否闭合 */
30
- get closed(): boolean;
31
- set closed(value: boolean);
32
- /** 是否自封闭 */
33
- get selfClosing(): boolean;
34
- set selfClosing(value: boolean);
35
31
  /** 内部wikitext */
36
32
  get innerText(): string | undefined;
37
33
  /**
@@ -7,27 +7,9 @@ const Parser = require("../../index");
7
7
  const index_1 = require("../index");
8
8
  /** 成对标签 */
9
9
  class TagPairToken extends (0, fixed_1.fixed)(index_1.Token) {
10
- #selfClosing;
11
- #closed;
12
10
  #tags;
13
- /** 是否闭合 */
14
- get closed() {
15
- return this.#closed;
16
- }
17
- /* NOT FOR BROWSER */
18
- set closed(value) {
19
- this.#closed ||= value;
20
- }
21
- /** 是否自封闭 */
22
- get selfClosing() {
23
- return this.#selfClosing;
24
- }
25
- set selfClosing(value) {
26
- if (value !== this.selfClosing && this.lastChild.text()) {
27
- Parser.warn(`<${this.name}>标签内部的${value ? '文本将被隐藏' : '原有文本将再次可见'}!`);
28
- }
29
- this.#selfClosing = value;
30
- }
11
+ closed;
12
+ selfClosing;
31
13
  /** 内部wikitext */
32
14
  get innerText() {
33
15
  return this.selfClosing ? undefined : this.lastChild.text();
@@ -43,30 +25,31 @@ class TagPairToken extends (0, fixed_1.fixed)(index_1.Token) {
43
25
  super(undefined, config);
44
26
  this.setAttribute('name', name.toLowerCase());
45
27
  this.#tags = [name, closed || name];
46
- this.#selfClosing = closed === undefined;
47
- this.#closed = closed !== '';
28
+ this.closed = closed !== '';
29
+ this.selfClosing = closed === undefined;
48
30
  this.append(attr, inner);
49
31
  const index = typeof attr === 'string' ? -1 : accum.indexOf(attr);
50
32
  accum.splice(index === -1 ? Infinity : index, 0, this);
33
+ Object.defineProperty(this, 'closed', { enumerable: false });
51
34
  }
52
35
  /** @private */
53
36
  toString(omit) {
54
- const { firstChild, lastChild, nextSibling, name, closed, } = this, [opening, closing] = this.#tags;
37
+ const { selfClosing, firstChild, lastChild, nextSibling, name, closed, } = this, [opening, closing] = this.#tags;
55
38
  if (omit && this.matchesTypes(omit)) {
56
39
  return '';
57
40
  }
58
41
  else if (!closed && nextSibling) {
59
42
  Parser.error(`自动闭合 <${name}>`, lastChild);
60
- this.#closed = true;
43
+ this.closed = true;
61
44
  }
62
- return this.#selfClosing
45
+ return selfClosing
63
46
  ? `<${opening}${firstChild.toString(omit)}/>`
64
47
  : `<${opening}${firstChild.toString(omit)}>${lastChild.toString(omit)}${this.closed ? `</${closing}>` : ''}`;
65
48
  }
66
49
  /** @override */
67
50
  text() {
68
51
  const [opening, closing] = this.#tags;
69
- return this.#selfClosing
52
+ return this.selfClosing
70
53
  ? `<${opening}${this.firstChild.text()}/>`
71
54
  : `<${opening}${super.text('>')}${this.closed ? `</${closing}>` : ''}`;
72
55
  }
@@ -84,7 +67,7 @@ class TagPairToken extends (0, fixed_1.fixed)(index_1.Token) {
84
67
  /** @override */
85
68
  print() {
86
69
  const [opening, closing] = this.#tags;
87
- return super.print(this.#selfClosing
70
+ return super.print(this.selfClosing
88
71
  ? { pre: `&lt;${opening}`, post: '/&gt;' }
89
72
  : { pre: `&lt;${opening}`, sep: '&gt;', post: this.closed ? `&lt;/${closing}&gt;` : '' });
90
73
  }
@@ -12,7 +12,7 @@ export declare class TranscludeToken extends Token {
12
12
  #private;
13
13
  type: 'template' | 'magic-word';
14
14
  readonly name: string;
15
- readonly modifier = "";
15
+ readonly modifier: string;
16
16
  readonly childNodes: [AtomToken | SyntaxToken, ...ParameterToken[]] | [SyntaxToken, AtomToken, AtomToken, ...ParameterToken[]];
17
17
  abstract get children(): [AtomToken | SyntaxToken, ...ParameterToken[]] | [SyntaxToken, AtomToken, AtomToken, ...ParameterToken[]];
18
18
  abstract get firstChild(): AtomToken | SyntaxToken;
@@ -141,7 +141,7 @@ class TranscludeToken extends index_1.Token {
141
141
  /** 获取模板或模块名 */
142
142
  #getTitle() {
143
143
  const isTemplate = this.type === 'template', child = this.childNodes[isTemplate ? 0 : 1];
144
- return child && this.normalizeTitle(child.text(), isTemplate ? 10 : 828);
144
+ return this.normalizeTitle(child.text(), isTemplate ? 10 : 828);
145
145
  }
146
146
  /** @private */
147
147
  afterBuild() {
@@ -224,12 +224,7 @@ class TranscludeToken extends index_1.Token {
224
224
  return errors;
225
225
  }
226
226
  const title = this.#getTitle();
227
- if (!title) {
228
- rect = { start, ...this.getRootNode().posFromIndex(start) };
229
- errors.push((0, lint_1.generateForSelf)(this, rect, 'missing module name'));
230
- return errors;
231
- }
232
- else if (title.fragment !== undefined) {
227
+ if (title.fragment !== undefined) {
233
228
  rect = { start, ...this.getRootNode().posFromIndex(start) };
234
229
  errors.push((0, lint_1.generateForChild)(childNodes[type === 'template' ? 0 : 1], rect, 'useless fragment'));
235
230
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wikiparser-node",
3
- "version": "1.3.7",
3
+ "version": "1.3.8",
4
4
  "description": "A Node.js parser for MediaWiki markup with AST",
5
5
  "keywords": [
6
6
  "mediawiki",