wikiparser-node 1.3.1 → 1.3.2

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 (43) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/lib/element.js +5 -25
  3. package/dist/lib/text.js +21 -8
  4. package/dist/mixin/hidden.js +4 -0
  5. package/dist/parser/braces.js +1 -2
  6. package/dist/src/attribute.d.ts +1 -0
  7. package/dist/src/attribute.js +3 -2
  8. package/dist/src/converter.d.ts +1 -0
  9. package/dist/src/converterFlags.js +3 -1
  10. package/dist/src/extLink.d.ts +1 -0
  11. package/dist/src/extLink.js +2 -1
  12. package/dist/src/heading.d.ts +2 -0
  13. package/dist/src/hidden.d.ts +1 -0
  14. package/dist/src/html.d.ts +3 -5
  15. package/dist/src/imagemapLink.d.ts +2 -0
  16. package/dist/src/link/base.js +3 -1
  17. package/dist/src/link/file.js +3 -1
  18. package/dist/src/link/galleryImage.d.ts +1 -0
  19. package/dist/src/magicLink.d.ts +2 -1
  20. package/dist/src/nowiki/base.d.ts +1 -0
  21. package/dist/src/nowiki/comment.d.ts +1 -0
  22. package/dist/src/nowiki/comment.js +1 -1
  23. package/dist/src/nowiki/doubleUnderscore.d.ts +3 -1
  24. package/dist/src/nowiki/hr.d.ts +3 -1
  25. package/dist/src/nowiki/list.d.ts +1 -0
  26. package/dist/src/nowiki/listBase.d.ts +2 -1
  27. package/dist/src/nowiki/noinclude.d.ts +1 -0
  28. package/dist/src/nowiki/quote.d.ts +2 -1
  29. package/dist/src/parameter.d.ts +1 -0
  30. package/dist/src/syntax.d.ts +5 -1
  31. package/dist/src/syntax.js +4 -0
  32. package/dist/src/table/base.d.ts +2 -1
  33. package/dist/src/table/index.js +1 -1
  34. package/dist/src/table/td.d.ts +1 -0
  35. package/dist/src/table/trBase.js +2 -1
  36. package/dist/src/tagPair/ext.d.ts +3 -5
  37. package/dist/src/tagPair/include.d.ts +5 -4
  38. package/dist/src/tagPair/include.js +5 -0
  39. package/dist/src/tagPair/index.d.ts +1 -0
  40. package/dist/src/transclude.js +3 -3
  41. package/i18n/zh-hans.json +4 -3
  42. package/i18n/zh-hant.json +4 -3
  43. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { Shadow } from './util/debug';
2
+ import type { Config, LintError, Parser as ParserBase } from './base';
2
3
  import type { Title } from './lib/title';
3
4
  import type { Token } from './internal';
4
- import type { Config, LintError, Parser as ParserBase } from './base';
5
5
  declare interface Parser extends ParserBase {
6
6
  readonly Shadow: typeof Shadow;
7
7
  conversionTable: Map<string, string>;
@@ -10,24 +10,6 @@ const ranges_1 = require("./ranges");
10
10
  const title_1 = require("./title");
11
11
  const Parser = require("../index");
12
12
  const node_1 = require("./node");
13
- const lintIgnoredExt = new Set([
14
- 'nowiki',
15
- 'pre',
16
- 'charinsert',
17
- 'score',
18
- 'syntaxhighlight',
19
- 'source',
20
- 'math',
21
- 'chem',
22
- 'ce',
23
- 'graph',
24
- 'mapframe',
25
- 'maplink',
26
- 'quiz',
27
- 'templatedata',
28
- 'timeline',
29
- ]);
30
- /* NOT FOR BROWSER */
31
13
  /**
32
14
  * optionally convert to lower cases
33
15
  * @param val 属性值
@@ -244,11 +226,6 @@ class AstElement extends node_1.AstNode {
244
226
  * @param start
245
227
  */
246
228
  lint(start = this.getAbsoluteIndex()) {
247
- const { SyntaxToken } = require('../src/syntax');
248
- if (this instanceof SyntaxToken || this.constructor.hidden
249
- || this.type === 'ext-inner' && lintIgnoredExt.has(this.name)) {
250
- return [];
251
- }
252
229
  const errors = [];
253
230
  for (let i = 0, cur = start + this.getAttribute('padding'); i < this.length; i++) {
254
231
  const child = this.childNodes[i];
@@ -391,11 +368,14 @@ class AstElement extends node_1.AstNode {
391
368
  case ':only-whitespace':
392
369
  return this.text().trim() === '';
393
370
  case ':any-link':
394
- return type === 'link' || type === 'free-ext-link' || type === 'ext-link'
371
+ return type === 'link'
372
+ || type === 'free-ext-link'
373
+ || type === 'ext-link'
395
374
  || (type === 'file' || type === 'gallery-image' && link);
396
375
  case ':local-link':
397
376
  return (type === 'link' || type === 'file' || type === 'gallery-image')
398
- && link instanceof title_1.Title && link.title === '';
377
+ && link instanceof title_1.Title
378
+ && link.title === '';
399
379
  case ':invalid':
400
380
  return type === 'table-inter' || type === 'image-parameter' && name === 'invalid';
401
381
  case ':required':
package/dist/lib/text.js CHANGED
@@ -4,7 +4,7 @@ exports.AstText = void 0;
4
4
  const constants_1 = require("../util/constants");
5
5
  const Parser = require("../index");
6
6
  const node_1 = require("./node");
7
- const errorSyntax = /https?[:/]\/+|\{+|\}+|\[{2,}|\[(?![^[]*\])|(?<=^|\])([^[]*?)\]+|\]{2,}|<\s*\/?([a-z]\w*)/giu, errorSyntaxUrl = /\{+|\}+|\[{2,}|\[(?![^[]*\])|(?<=^|\])([^[]*?)\]+|\]{2,}|<\s*\/?([a-z]\w*)/giu, disallowedTags = [
7
+ const errorSyntax = /<\s*\/?([a-z]\w*)|\{+|\}+|\[{2,}|\[(?![^[]*\])|(?<=^|\])([^[]*?)\]+|\]{2,}|https?[:/]\/+/giu, errorSyntaxUrl = /<\s*\/?([a-z]\w*)|\{+|\}+|\[{2,}|\[(?![^[]*\])|(?<=^|\])([^[]*?)\]+|\]{2,}/giu, disallowedTags = [
8
8
  'html',
9
9
  'base',
10
10
  'head',
@@ -93,14 +93,26 @@ class AstText extends node_1.AstNode {
93
93
  if (!parentNode) {
94
94
  throw new Error('无法对孤立文本节点进行语法分析!');
95
95
  }
96
- const { type, name } = parentNode, nextType = nextSibling?.type, previousType = previousSibling?.type, errorRegex = type === 'free-ext-link' || type === 'ext-link-url' || type === 'image-parameter' && name === 'link'
97
- || type === 'attr-value'
98
- ? errorSyntaxUrl
99
- : errorSyntax, errors = [...data.matchAll(errorRegex)], { ext, html } = this.getRootNode().getAttribute('config');
96
+ const { NowikiToken } = require('../src/nowiki');
97
+ const { type, name } = parentNode, nextType = nextSibling?.type, previousType = previousSibling?.type;
98
+ let errorRegex;
99
+ if (type === 'ext-inner' && (name === 'pre' || parentNode instanceof NowikiToken)) {
100
+ errorRegex = new RegExp(`<\\s*\\/?(${name})\\b`, 'giu');
101
+ }
102
+ else if (type === 'free-ext-link'
103
+ || type === 'ext-link-url'
104
+ || type === 'image-parameter' && name === 'link'
105
+ || type === 'attr-value') {
106
+ errorRegex = errorSyntaxUrl;
107
+ }
108
+ else {
109
+ errorRegex = errorSyntax;
110
+ }
111
+ const errors = [...data.matchAll(errorRegex)], { ext, html } = this.getRootNode().getAttribute('config');
100
112
  if (errors.length > 0) {
101
- const root = this.getRootNode(), { top, left } = root.posFromIndex(start), tags = new Set([ext, html, disallowedTags].flat(2));
113
+ const root = this.getRootNode(), { top, left } = root.posFromIndex(start), tags = new Set(['onlyinclude', 'noinclude', 'includeonly', ext, html, disallowedTags].flat(2));
102
114
  return errors
103
- .map(({ 0: error, 1: prefix, 2: tag, index }) => {
115
+ .map(({ 0: error, 1: tag, 2: prefix, index }) => {
104
116
  if (prefix) {
105
117
  const { length } = prefix;
106
118
  index += length;
@@ -109,7 +121,8 @@ class AstText extends node_1.AstNode {
109
121
  const startIndex = start + index, lines = data.slice(0, index).split('\n'), startLine = lines.length + top - 1, line = lines.at(-1), startCol = lines.length === 1 ? left + line.length : line.length, { 0: char, length } = error, endIndex = startIndex + length, rootStr = String(root), nextChar = rootStr[endIndex], previousChar = rootStr[startIndex - 1], severity = length > 1 && (char !== '<' || /[\s/>]/u.test(nextChar ?? ''))
110
122
  || char === '{' && (nextChar === char || previousChar === '-')
111
123
  || char === '}' && (previousChar === char || nextChar === '-')
112
- || char === '[' && (nextChar === char || type === 'ext-link-text'
124
+ || char === '[' && (nextChar === char
125
+ || type === 'ext-link-text'
113
126
  || !data.slice(index + 1).trim() && nextType === 'free-ext-link')
114
127
  || char === ']' && (previousChar === char
115
128
  || !data.slice(0, index).trim() && previousType === 'free-ext-link')
@@ -15,6 +15,10 @@ const hidden = (constructor) => {
15
15
  text() {
16
16
  return '';
17
17
  }
18
+ /** @override */
19
+ lint() {
20
+ return [];
21
+ }
18
22
  }
19
23
  return AnyHiddenToken;
20
24
  };
@@ -18,8 +18,7 @@ const parseBraces = (wikitext, config = Parser.getConfig(), accum = []) => {
18
18
  const source = `${config.excludes?.includes('heading') ? '' : '^(\0\\d+c\x7F)*={1,6}|'}\\[\\[|\\{{2,}|-\\{(?!\\{)`, { parserFunction: [, , , subst] } = config, stack = [], closes = { '=': '\n', '{': '\\}{2,}|\\|', '-': '\\}-', '[': '\\]\\]' }, marks = new Map([['!', '!'], ['!!', '+'], ['(!', '{'], ['!)', '}'], ['!-', '-'], ['=', '~']]);
19
19
  let regex = new RegExp(source, 'gmu'), mt = regex.exec(wikitext), moreBraces = wikitext.includes('}}'), lastIndex;
20
20
  while (mt
21
- || lastIndex !== undefined && lastIndex <= wikitext.length
22
- && stack.at(-1)?.[0]?.startsWith('=')) {
21
+ || lastIndex !== undefined && lastIndex <= wikitext.length && stack.at(-1)?.[0]?.startsWith('=')) {
23
22
  if (mt?.[1]) {
24
23
  const [, { length }] = mt;
25
24
  mt[0] = mt[0].slice(length);
@@ -11,6 +11,7 @@ declare const AttributeToken_base: ((abstract new (...args: any[]) => {
11
11
  readonly length: number;
12
12
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
13
13
  text(separator?: string | undefined): string;
14
+ lint(start?: number | undefined): Parser.LintError[];
14
15
  afterBuild(): void;
15
16
  getAttribute<T_1 extends string>(key: T_1): TokenAttributeGetter<T_1>;
16
17
  setAttribute<T_2 extends string>(key: T_2, value: TokenAttributeSetter<T_2>): void;
@@ -271,7 +271,7 @@ class AttributeToken extends (0, fixed_1.fixed)(index_1.Token) {
271
271
  if (!balanced) {
272
272
  const root = this.getRootNode();
273
273
  rect = { start, ...root.posFromIndex(start) };
274
- const e = (0, lint_1.generateForChild)(lastChild, rect, 'unclosed quotes', 'warning');
274
+ const e = (0, lint_1.generateForChild)(lastChild, rect, Parser.msg('unclosed $1', 'quotes'), 'warning');
275
275
  errors.push({
276
276
  ...e,
277
277
  startIndex: e.startIndex - 1,
@@ -280,7 +280,8 @@ class AttributeToken extends (0, fixed_1.fixed)(index_1.Token) {
280
280
  }
281
281
  if (extAttrs[tag] && !extAttrs[tag].has(name)
282
282
  || (type === 'ext-attr' ? tag in htmlAttrs : !/\{\{[^{]+\}\}/u.test(name))
283
- && !htmlAttrs[tag]?.has(name) && !/^(?:xmlns:[\w:.-]+|data-[^:]*)$/u.test(name)
283
+ && !htmlAttrs[tag]?.has(name)
284
+ && !/^(?:xmlns:[\w:.-]+|data-[^:]*)$/u.test(name)
284
285
  && (tag === 'meta' || tag === 'link' || !commonHtmlAttrs.has(name))) {
285
286
  rect ??= { start, ...this.getRootNode().posFromIndex(start) };
286
287
  errors.push((0, lint_1.generateForChild)(firstChild, rect, 'illegal attribute name'));
@@ -17,6 +17,7 @@ declare const ConverterToken_base: (abstract new (...args: any[]) => {
17
17
  readonly length: number;
18
18
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
19
19
  text(separator?: string | undefined): string;
20
+ lint(start?: number | undefined): Parser.LintError[];
20
21
  insertAt(token: unknown, i?: number | undefined): unknown;
21
22
  afterBuild(): void;
22
23
  getAttribute<T extends string>(key: T): TokenAttributeGetter<T>;
@@ -73,7 +73,9 @@ class ConverterFlagsToken extends index_1.Token {
73
73
  const rect = { start, ...this.getRootNode().posFromIndex(start) }, { childNodes, length } = this;
74
74
  for (let i = 0; i < length; i++) {
75
75
  const child = childNodes[i], flag = child.text().trim();
76
- if (flag && !variantFlags.has(flag) && !unknownFlags.has(flag)
76
+ if (flag
77
+ && !variantFlags.has(flag)
78
+ && !unknownFlags.has(flag)
77
79
  && (variantFlags.size > 0 || !validFlags.has(flag))) {
78
80
  errors.push((0, lint_1.generateForChild)(child, rect, 'invalid conversion flag'));
79
81
  }
@@ -11,6 +11,7 @@ declare const ExtLinkToken_base: (abstract new (...args: any[]) => {
11
11
  readonly length: number;
12
12
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
13
13
  text(separator?: string | undefined): string;
14
+ lint(start?: number | undefined): Parser.LintError[];
14
15
  insertAt(token: unknown, i?: number | undefined): unknown;
15
16
  afterBuild(): void;
16
17
  getAttribute<T extends string>(key: T): TokenAttributeGetter<T>;
@@ -92,7 +92,8 @@ class ExtLinkToken extends (0, magicLinkParent_1.magicLinkParent)(index_1.Token)
92
92
  }
93
93
  /** 修正空白字符 */
94
94
  #correct() {
95
- if (!this.#space && this.length > 1
95
+ if (!this.#space
96
+ && this.length > 1
96
97
  // 都替换成`<`肯定不对,但无妨
97
98
  && /^[^[\]<>"{\0-\x1F\x7F\p{Zs}\uFFFD]/u.test(this.lastChild.text().replace(/&[lg]t;/u, '<'))) {
98
99
  this.#space = ' ';
@@ -8,6 +8,7 @@ declare const HeadingToken_base: (abstract new (...args: any[]) => {
8
8
  getAttribute<S extends string>(key: S): TokenAttributeGetter<S>;
9
9
  text(): string;
10
10
  readonly length: number;
11
+ lint(start?: number | undefined): Parser.LintError[];
11
12
  insertAt(token: unknown, i?: number | undefined): unknown;
12
13
  afterBuild(): void;
13
14
  setAttribute<T extends string>(key: T, value: TokenAttributeSetter<T>): void;
@@ -20,6 +21,7 @@ declare const HeadingToken_base: (abstract new (...args: any[]) => {
20
21
  readonly length: number;
21
22
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
22
23
  text(separator?: string | undefined): string;
24
+ lint(start?: number | undefined): Parser.LintError[];
23
25
  afterBuild(): void;
24
26
  getAttribute<T_2 extends string>(key: T_2): TokenAttributeGetter<T_2>;
25
27
  setAttribute<T extends string>(key: T, value: TokenAttributeSetter<T>): void;
@@ -1,6 +1,7 @@
1
1
  import { Token } from './index';
2
2
  declare const HiddenToken_base: ((abstract new (...args: any[]) => {
3
3
  text(): string;
4
+ lint(): import("..").LintError[];
4
5
  readonly length: number;
5
6
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
6
7
  insertAt(token: unknown, i?: number | undefined): unknown;
@@ -4,7 +4,7 @@ import type { LintError } from '../base';
4
4
  import type { AttributesToken } from '../internal';
5
5
  declare const HtmlToken_base: (abstract new (...args: any[]) => {
6
6
  readonly childNodes: Parser.AstNodes[];
7
- readonly "__#8@#attributesChild": Parser.AttributesToken;
7
+ readonly "__#7@#attributesChild": Parser.AttributesToken;
8
8
  attributes: Record<string, string | true>;
9
9
  className: string;
10
10
  classList: Set<string>;
@@ -19,10 +19,7 @@ declare const HtmlToken_base: (abstract new (...args: any[]) => {
19
19
  readonly length: number;
20
20
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
21
21
  text(separator?: string | undefined): string;
22
- /**
23
- * HTML标签
24
- * @classdesc `{childNodes: [AttributesToken]}`
25
- */
22
+ lint(start?: number | undefined): Parser.LintError[];
26
23
  insertAt(token: unknown, i?: number | undefined): unknown;
27
24
  afterBuild(): void;
28
25
  getAttribute<T extends string>(key: T): TokenAttributeGetter<T>;
@@ -36,6 +33,7 @@ declare const HtmlToken_base: (abstract new (...args: any[]) => {
36
33
  readonly length: number;
37
34
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
38
35
  text(separator?: string | undefined): string;
36
+ lint(start?: number | undefined): Parser.LintError[];
39
37
  afterBuild(): void;
40
38
  getAttribute<T extends string>(key: T): TokenAttributeGetter<T>;
41
39
  setAttribute<T_1 extends string>(key: T_1, value: TokenAttributeSetter<T_1>): void;
@@ -12,6 +12,7 @@ declare const ImagemapLinkToken_base: ((abstract new (...args: any[]) => {
12
12
  readonly length: number;
13
13
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
14
14
  text(separator?: string | undefined): string;
15
+ lint(start?: number | undefined): Parser.LintError[];
15
16
  afterBuild(): void;
16
17
  getAttribute<T_1 extends string>(key: T_1): TokenAttributeGetter<T_1>;
17
18
  setAttribute<T_2 extends string>(key: T_2, value: TokenAttributeSetter<T_2>): void;
@@ -23,6 +24,7 @@ declare const ImagemapLinkToken_base: ((abstract new (...args: any[]) => {
23
24
  toString(omit?: Set<string> | undefined): string;
24
25
  text(): string;
25
26
  readonly length: number;
27
+ lint(start?: number | undefined): Parser.LintError[];
26
28
  insertAt(token: unknown, i?: number | undefined): unknown;
27
29
  afterBuild(): void;
28
30
  getAttribute<T_1 extends string>(key: T_1): TokenAttributeGetter<T_1>;
@@ -76,7 +76,9 @@ class LinkBaseToken extends index_1.Token {
76
76
  (0, debug_1.undo)(e, data);
77
77
  throw new Error(`${this.type === 'file' ? '文件' : '分类'}链接不可更改命名空间:${name}`);
78
78
  }
79
- else if (this.type === 'link' && !interwiki && (ns === 6 || ns === 14)
79
+ else if (this.type === 'link'
80
+ && !interwiki
81
+ && (ns === 6 || ns === 14)
80
82
  && !name.trim().startsWith(':')) {
81
83
  const { firstChild } = prevTarget;
82
84
  if (firstChild?.type === 'text') {
@@ -102,7 +102,9 @@ class FileToken extends base_1.LinkBaseToken {
102
102
  return visibleNodes.length !== 1 || visibleNodes[0].type !== 'arg';
103
103
  }), keys = [...new Set(args.map(({ name }) => name))].filter(key => key !== 'invalid'), frameKeys = keys.filter(key => frame.has(key)), horizAlignKeys = keys.filter(key => horizAlign.has(key)), vertAlignKeys = keys.filter(key => vertAlign.has(key));
104
104
  if (args.length === keys.length
105
- && frameKeys.length < 2 && horizAlignKeys.length < 2 && vertAlignKeys.length < 2) {
105
+ && frameKeys.length < 2
106
+ && horizAlignKeys.length < 2
107
+ && vertAlignKeys.length < 2) {
106
108
  return errors;
107
109
  }
108
110
  const rect = { start, ...this.getRootNode().posFromIndex(start) };
@@ -7,6 +7,7 @@ declare const GalleryImageToken_base: (abstract new (...args: any[]) => {
7
7
  toString(omit?: Set<string> | undefined): string;
8
8
  text(): string;
9
9
  readonly length: number;
10
+ lint(start?: number | undefined): Parser.LintError[];
10
11
  insertAt(token: unknown, i?: number | undefined): unknown;
11
12
  afterBuild(): void;
12
13
  getAttribute<T extends string>(key: T): TokenAttributeGetter<T>;
@@ -3,7 +3,7 @@ import { Token } from './index';
3
3
  import type { LintError } from '../base';
4
4
  import type { AstNodes, AstText, CommentToken, IncludeToken, NoincludeToken, TranscludeToken } from '../internal';
5
5
  declare const MagicLinkToken_base: (abstract new (...args: any[]) => {
6
- "__#5@#pattern": RegExp;
6
+ "__#10@#pattern": RegExp;
7
7
  afterBuild(): void;
8
8
  getAttribute<T extends string>(key: T): TokenAttributeGetter<T>;
9
9
  setAttribute<T_1 extends string>(key: T_1, value: TokenAttributeSetter<T_1>): void;
@@ -11,6 +11,7 @@ declare const MagicLinkToken_base: (abstract new (...args: any[]) => {
11
11
  readonly length: number;
12
12
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
13
13
  text(separator?: string | undefined): string;
14
+ lint(start?: number | undefined): Parser.LintError[];
14
15
  insertAt(token: unknown, i?: number | undefined): unknown;
15
16
  addEventListener(events: string | string[], listener: AstListener): void;
16
17
  }) & typeof Parser.Token;
@@ -9,6 +9,7 @@ declare const NowikiBaseToken_base: ((abstract new (...args: any[]) => {
9
9
  readonly length: number;
10
10
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
11
11
  text(separator?: string | undefined): string;
12
+ lint(start?: number | undefined): Parser.LintError[];
12
13
  afterBuild(): void;
13
14
  getAttribute<T_1 extends string>(key: T_1): TokenAttributeGetter<T_1>;
14
15
  setAttribute<T_2 extends string>(key: T_2, value: TokenAttributeSetter<T_2>): void;
@@ -4,6 +4,7 @@ import type { LintError } from '../../base';
4
4
  import type { Token } from '../index';
5
5
  declare const CommentToken_base: ((abstract new (...args: any[]) => {
6
6
  text(): string;
7
+ lint(): Parser.LintError[];
7
8
  readonly length: number;
8
9
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
9
10
  insertAt(token: unknown, i?: number | undefined): unknown;
@@ -33,7 +33,7 @@ class CommentToken extends (0, hidden_1.hidden)(base_1.NowikiBaseToken) {
33
33
  }
34
34
  /** @override */
35
35
  lint(start = this.getAbsoluteIndex()) {
36
- return this.closed ? [] : [(0, lint_1.generateForSelf)(this, { start }, 'unclosed HTML comment')];
36
+ return this.closed ? [] : [(0, lint_1.generateForSelf)(this, { start }, Parser.msg('unclosed $1', 'HTML comment'))];
37
37
  }
38
38
  /** @private */
39
39
  toString(omit) {
@@ -2,7 +2,7 @@ import * as Parser from '../../index';
2
2
  import { NowikiBaseToken } from './base';
3
3
  import type { Token } from '../index';
4
4
  declare const DoubleUnderscoreToken_base: (abstract new (...args: any[]) => {
5
- "__#5@#pattern": RegExp;
5
+ "__#10@#pattern": RegExp;
6
6
  afterBuild(): void;
7
7
  getAttribute<T extends string>(key: T): TokenAttributeGetter<T>;
8
8
  setAttribute<T_1 extends string>(key: T_1, value: TokenAttributeSetter<T_1>): void;
@@ -10,10 +10,12 @@ declare const DoubleUnderscoreToken_base: (abstract new (...args: any[]) => {
10
10
  readonly length: number;
11
11
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
12
12
  text(separator?: string | undefined): string;
13
+ lint(start?: number | undefined): Parser.LintError[];
13
14
  insertAt(token: unknown, i?: number | undefined): unknown;
14
15
  addEventListener(events: string | string[], listener: AstListener): void;
15
16
  }) & ((abstract new (...args: any[]) => {
16
17
  text(): string;
18
+ lint(): Parser.LintError[];
17
19
  readonly length: number;
18
20
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
19
21
  insertAt(token: unknown, i?: number | undefined): unknown;
@@ -1,6 +1,6 @@
1
1
  import { NowikiBaseToken } from './base';
2
2
  declare const HrToken_base: (abstract new (...args: any[]) => {
3
- "__#5@#pattern": RegExp;
3
+ "__#10@#pattern": RegExp;
4
4
  afterBuild(): void;
5
5
  getAttribute<T extends string>(key: T): TokenAttributeGetter<T>;
6
6
  setAttribute<T_1 extends string>(key: T_1, value: TokenAttributeSetter<T_1>): void;
@@ -8,6 +8,7 @@ declare const HrToken_base: (abstract new (...args: any[]) => {
8
8
  readonly length: number;
9
9
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
10
10
  text(separator?: string | undefined): string;
11
+ lint(start?: number | undefined): import("../..").LintError[];
11
12
  insertAt(token: unknown, i?: number | undefined): unknown;
12
13
  addEventListener(events: string | string[], listener: AstListener): void;
13
14
  }) & (abstract new (...args: any[]) => {
@@ -16,6 +17,7 @@ declare const HrToken_base: (abstract new (...args: any[]) => {
16
17
  getAttribute<S extends string>(key: S): TokenAttributeGetter<S>;
17
18
  text(): string;
18
19
  readonly length: number;
20
+ lint(start?: number | undefined): import("../..").LintError[];
19
21
  insertAt(token: unknown, i?: number | undefined): unknown;
20
22
  afterBuild(): void;
21
23
  setAttribute<T_2 extends string>(key: T_2, value: TokenAttributeSetter<T_2>): void;
@@ -6,6 +6,7 @@ declare const ListToken_base: (abstract new (...args: any[]) => {
6
6
  getAttribute<S extends string>(key: S): TokenAttributeGetter<S>;
7
7
  text(): string;
8
8
  readonly length: number;
9
+ lint(start?: number | undefined): import("../..").LintError[];
9
10
  insertAt(token: unknown, i?: number | undefined): unknown;
10
11
  afterBuild(): void;
11
12
  setAttribute<T extends string>(key: T, value: TokenAttributeSetter<T>): void;
@@ -1,6 +1,6 @@
1
1
  import { NowikiBaseToken } from './base';
2
2
  declare const ListBaseToken_base: (abstract new (...args: any[]) => {
3
- "__#5@#pattern": RegExp;
3
+ "__#10@#pattern": RegExp;
4
4
  afterBuild(): void;
5
5
  getAttribute<T extends string>(key: T): TokenAttributeGetter<T>;
6
6
  setAttribute<T_1 extends string>(key: T_1, value: TokenAttributeSetter<T_1>): void;
@@ -8,6 +8,7 @@ declare const ListBaseToken_base: (abstract new (...args: any[]) => {
8
8
  readonly length: number;
9
9
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
10
10
  text(separator?: string | undefined): string;
11
+ lint(start?: number | undefined): import("../..").LintError[];
11
12
  insertAt(token: unknown, i?: number | undefined): unknown;
12
13
  addEventListener(events: string | string[], listener: AstListener): void;
13
14
  }) & typeof NowikiBaseToken;
@@ -1,6 +1,7 @@
1
1
  import { NowikiBaseToken } from './base';
2
2
  declare const NoincludeToken_base: ((abstract new (...args: any[]) => {
3
3
  text(): string;
4
+ lint(): import("../..").LintError[];
4
5
  readonly length: number;
5
6
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
6
7
  insertAt(token: unknown, i?: number | undefined): unknown;
@@ -2,7 +2,7 @@ import * as Parser from '../../index';
2
2
  import { NowikiBaseToken } from './base';
3
3
  import type { LintError } from '../../base';
4
4
  declare const QuoteToken_base: (abstract new (...args: any[]) => {
5
- "__#5@#pattern": RegExp;
5
+ "__#10@#pattern": RegExp;
6
6
  afterBuild(): void;
7
7
  getAttribute<T extends string>(key: T): TokenAttributeGetter<T>;
8
8
  setAttribute<T_1 extends string>(key: T_1, value: TokenAttributeSetter<T_1>): void;
@@ -10,6 +10,7 @@ declare const QuoteToken_base: (abstract new (...args: any[]) => {
10
10
  readonly length: number;
11
11
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
12
12
  text(separator?: string | undefined): string;
13
+ lint(start?: number | undefined): Parser.LintError[];
13
14
  insertAt(token: unknown, i?: number | undefined): unknown;
14
15
  addEventListener(events: string | string[], listener: AstListener): void;
15
16
  }) & typeof NowikiBaseToken;
@@ -9,6 +9,7 @@ declare const ParameterToken_base: ((abstract new (...args: any[]) => {
9
9
  readonly length: number;
10
10
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
11
11
  text(separator?: string | undefined): string;
12
+ lint(start?: number | undefined): Parser.LintError[];
12
13
  afterBuild(): void;
13
14
  getAttribute<T_1 extends string>(key: T_1): TokenAttributeGetter<T_1>;
14
15
  setAttribute<T_2 extends string>(key: T_2, value: TokenAttributeSetter<T_2>): void;
@@ -1,8 +1,9 @@
1
1
  import * as Parser from '../index';
2
2
  import { Token } from './index';
3
+ import type { LintError } from '../base';
3
4
  declare type SyntaxTypes = 'plain' | 'heading-trail' | 'magic-word-name' | 'table-syntax';
4
5
  declare const SyntaxToken_base: (abstract new (...args: any[]) => {
5
- "__#5@#pattern": RegExp;
6
+ "__#10@#pattern": RegExp;
6
7
  afterBuild(): void;
7
8
  getAttribute<T extends string>(key: T): TokenAttributeGetter<T>;
8
9
  setAttribute<T_1 extends string>(key: T_1, value: TokenAttributeSetter<T_1>): void;
@@ -10,6 +11,7 @@ declare const SyntaxToken_base: (abstract new (...args: any[]) => {
10
11
  readonly length: number;
11
12
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
12
13
  text(separator?: string | undefined): string;
14
+ lint(start?: number | undefined): Parser.LintError[];
13
15
  insertAt(token: unknown, i?: number | undefined): unknown;
14
16
  addEventListener(events: string | string[], listener: AstListener): void;
15
17
  }) & typeof Parser.Token;
@@ -19,6 +21,8 @@ export declare class SyntaxToken extends SyntaxToken_base {
19
21
  /** @param pattern 语法正则 */
20
22
  constructor(wikitext: string | undefined, pattern: RegExp, type?: SyntaxTypes, config?: Parser.Config, accum?: Token[], acceptable?: Acceptable);
21
23
  /** @override */
24
+ lint(): LintError[];
25
+ /** @override */
22
26
  cloneNode(): this;
23
27
  }
24
28
  export {};
@@ -14,6 +14,10 @@ class SyntaxToken extends (0, syntax_1.syntax)(index_1.Token) {
14
14
  this.type = type;
15
15
  this.setAttribute('pattern', pattern);
16
16
  }
17
+ /** @override */
18
+ lint() {
19
+ return [];
20
+ }
17
21
  /* NOT FOR BROWSER */
18
22
  /** @override */
19
23
  cloneNode() {
@@ -4,7 +4,7 @@ import { SyntaxToken } from '../syntax';
4
4
  import { AttributesToken } from '../attributes';
5
5
  declare const TableBaseToken_base: (abstract new (...args: any[]) => {
6
6
  readonly childNodes: Parser.AstNodes[];
7
- readonly "__#8@#attributesChild": Parser.AttributesToken;
7
+ readonly "__#7@#attributesChild": Parser.AttributesToken;
8
8
  attributes: Record<string, string | true>;
9
9
  className: string;
10
10
  classList: Set<string>;
@@ -19,6 +19,7 @@ declare const TableBaseToken_base: (abstract new (...args: any[]) => {
19
19
  readonly length: number;
20
20
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
21
21
  text(separator?: string | undefined): string;
22
+ lint(start?: number | undefined): Parser.LintError[];
22
23
  insertAt(token: unknown, i?: number | undefined): unknown;
23
24
  afterBuild(): void;
24
25
  getAttribute<T extends string>(key: T): TokenAttributeGetter<T>;
@@ -40,7 +40,7 @@ class TableToken extends trBase_1.TrBaseToken {
40
40
  lint(start = this.getAbsoluteIndex()) {
41
41
  const errors = super.lint(start);
42
42
  if (!this.closed) {
43
- errors.push((0, lint_1.generateForChild)(this.firstChild, { start }, 'unclosed table'));
43
+ errors.push((0, lint_1.generateForChild)(this.firstChild, { start }, Parser.msg('unclosed $1', 'table')));
44
44
  }
45
45
  return errors;
46
46
  }
@@ -18,6 +18,7 @@ declare const TdToken_base: ((abstract new (...args: any[]) => {
18
18
  readonly length: number;
19
19
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
20
20
  text(separator?: string | undefined): string;
21
+ lint(start?: number | undefined): Parser.LintError[];
21
22
  afterBuild(): void;
22
23
  getAttribute<T_1 extends string>(key: T_1): TokenAttributeGetter<T_1>;
23
24
  setAttribute<T_2 extends string>(key: T_2, value: TokenAttributeSetter<T_2>): void;
@@ -20,7 +20,8 @@ class TrBaseToken extends base_1.TableBaseToken {
20
20
  isArg = (token) => token.type === 'arg',
21
21
  /** @ignore */
22
22
  isTransclude = (token) => token.type === 'magic-word';
23
- if (!first || tdPattern.test(String(first))
23
+ if (!first
24
+ || tdPattern.test(String(first))
24
25
  || isArg(first) && tdPattern.test(first.default || '')) {
25
26
  return errors;
26
27
  }
@@ -5,7 +5,7 @@ import { AttributesToken } from '../attributes';
5
5
  import type { LintError } from '../../base';
6
6
  declare const ExtToken_base: (abstract new (...args: any[]) => {
7
7
  readonly childNodes: Parser.AstNodes[];
8
- readonly "__#8@#attributesChild": Parser.AttributesToken;
8
+ readonly "__#7@#attributesChild": Parser.AttributesToken;
9
9
  attributes: Record<string, string | true>;
10
10
  className: string;
11
11
  classList: Set<string>;
@@ -20,10 +20,8 @@ declare const ExtToken_base: (abstract new (...args: any[]) => {
20
20
  readonly length: number;
21
21
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
22
22
  text(separator?: string | undefined): string;
23
- insertAt(token: unknown, i?: number | undefined): unknown; /**
24
- * 扩展标签
25
- * @classdesc `{childNodes: [AttributesToken, Token]}`
26
- */
23
+ lint(start?: number | undefined): Parser.LintError[];
24
+ insertAt(token: unknown, i?: number | undefined): unknown;
27
25
  afterBuild(): void;
28
26
  getAttribute<T extends string>(key: T): TokenAttributeGetter<T>;
29
27
  setAttribute<T_1 extends string>(key: T_1, value: TokenAttributeSetter<T_1>): void;
@@ -1,8 +1,10 @@
1
1
  import * as Parser from '../../index';
2
2
  import { TagPairToken } from './index';
3
+ import type { LintError } from '../../base';
3
4
  import type { AstText, Token } from '../../internal';
4
5
  declare const IncludeToken_base: ((abstract new (...args: any[]) => {
5
6
  text(): string;
7
+ lint(): Parser.LintError[];
6
8
  readonly length: number;
7
9
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
8
10
  insertAt(token: unknown, i?: number | undefined): unknown;
@@ -12,10 +14,7 @@ declare const IncludeToken_base: ((abstract new (...args: any[]) => {
12
14
  addEventListener(events: string | string[], listener: AstListener): void;
13
15
  replaceChildren(...elements: (string | Parser.AstNodes)[]): void;
14
16
  }) & {
15
- readonly hidden: true; /**
16
- * `<includeonly>`或`<noinclude>`或`<onlyinclude>`
17
- * @classdesc `{childNodes: [AstText, AstText]}`
18
- */
17
+ readonly hidden: true;
19
18
  }) & typeof TagPairToken;
20
19
  /**
21
20
  * `<includeonly>`或`<noinclude>`或`<onlyinclude>`
@@ -40,6 +39,8 @@ export declare class IncludeToken extends IncludeToken_base {
40
39
  */
41
40
  constructor(name: string, attr?: string, inner?: string, closed?: string, config?: Parser.Config, accum?: Token[]);
42
41
  /** @override */
42
+ lint(start?: number): LintError[];
43
+ /** @override */
43
44
  cloneNode(): this;
44
45
  /**
45
46
  * @override
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.IncludeToken = void 0;
4
4
  const debug_1 = require("../../util/debug");
5
5
  const constants_1 = require("../../util/constants");
6
+ const lint_1 = require("../../util/lint");
6
7
  const hidden_1 = require("../../mixin/hidden");
7
8
  const Parser = require("../../index");
8
9
  const index_1 = require("./index");
@@ -36,6 +37,10 @@ class IncludeToken extends (0, hidden_1.hidden)(index_1.TagPairToken) {
36
37
  constructor(name, attr = '', inner, closed, config = Parser.getConfig(), accum = []) {
37
38
  super(name, attr, inner ?? '', inner === undefined ? closed : closed ?? '', config, accum);
38
39
  }
40
+ /** @override */
41
+ lint(start = this.getAbsoluteIndex()) {
42
+ return this.closed ? [] : [(0, lint_1.generateForSelf)(this, { start }, Parser.msg('unclosed $1', `<${this.name}>`))];
43
+ }
39
44
  /* NOT FOR BROWSER */
40
45
  /** @override */
41
46
  cloneNode() {
@@ -8,6 +8,7 @@ declare const TagPairToken_base: ((abstract new (...args: any[]) => {
8
8
  readonly length: number;
9
9
  toString(omit?: Set<string> | undefined, separator?: string | undefined): string;
10
10
  text(separator?: string | undefined): string;
11
+ lint(start?: number | undefined): Parser.LintError[];
11
12
  afterBuild(): void;
12
13
  getAttribute<T_1 extends string>(key: T_1): TokenAttributeGetter<T_1>;
13
14
  setAttribute<T_2 extends string>(key: T_2, value: TokenAttributeSetter<T_2>): void;
@@ -116,9 +116,9 @@ class TranscludeToken extends index_1.Token {
116
116
  return false;
117
117
  }
118
118
  const magicWord = lcModifier.slice(0, -1).toLowerCase(), isRaw = raw.includes(magicWord), isSubst = subst.includes(magicWord);
119
- if (this.#raw && isRaw || !this.#raw && (isSubst || modifier === '')
120
- || (debug_1.Shadow.running || this.length > 1)
121
- && (isRaw || isSubst || modifier === '')) {
119
+ if (this.#raw && isRaw
120
+ || !this.#raw && (isSubst || modifier === '')
121
+ || (debug_1.Shadow.running || this.length > 1) && (isRaw || isSubst || modifier === '')) {
122
122
  this.setAttribute('modifier', modifier);
123
123
  this.#raw = isRaw;
124
124
  return Boolean(modifier);
package/i18n/zh-hans.json CHANGED
@@ -14,6 +14,7 @@
14
14
  "frame": "框架",
15
15
  "full-width punctuation": "全角标点",
16
16
  "horizontal-alignment": "水平对齐",
17
+ "HTML comment": "HTML注释",
17
18
  "HTML tag in table attributes": "表格属性中的HTML标签",
18
19
  "illegal attribute name": "非法的属性名",
19
20
  "illegal module name": "非法的模块名称",
@@ -31,13 +32,13 @@
31
32
  "missing module name": "缺少模块名称",
32
33
  "nonzero tabindex": "不为0的tabindex",
33
34
  "nothing should be in <$1>": "<$1>标签内不应有任何内容",
35
+ "quotes": "引号",
34
36
  "section header in a HTML tag": "HTML标签属性中的段落标题",
37
+ "table": "表格",
35
38
  "tag that is both closing and self-closing": "同时闭合和自封闭的标签",
36
39
  "template in an internal link target": "内链目标包含模板",
37
40
  "unbalanced \"=\" in a section header": "段落标题中不平衡的\"=\"",
38
- "unclosed HTML comment": "未闭合的HTML注释",
39
- "unclosed quotes": "未闭合的引号",
40
- "unclosed table": "未闭合的表格",
41
+ "unclosed $1": "未闭合的$1",
41
42
  "unclosed tag": "未闭合的标签",
42
43
  "unescaped query string in an anonymous parameter": "匿名参数中未转义的查询参数",
43
44
  "unexpected template argument": "未预期的模板参数",
package/i18n/zh-hant.json CHANGED
@@ -14,6 +14,7 @@
14
14
  "frame": "框架",
15
15
  "full-width punctuation": "全形標點",
16
16
  "horizontal-alignment": "水瓶對齊",
17
+ "HTML comment": "HTML註釋",
17
18
  "HTML tag in table attributes": "表格屬性中的HTML標籤",
18
19
  "illegal attribute name": "非法的屬性名",
19
20
  "illegal module name": "非法的模組名稱",
@@ -31,13 +32,13 @@
31
32
  "missing module name": "缺少模組名稱",
32
33
  "nonzero tabindex": "不為0的tabindex",
33
34
  "nothing should be in <$1>": "<$1>標籤內不應有任何內容",
35
+ "quotes": "引號",
34
36
  "section header in a HTML tag": "HTML標籤屬性中的段落標題",
37
+ "table": "表格",
35
38
  "tag that is both closing and self-closing": "同時閉合和自封閉的標籤",
36
39
  "template in an internal link target": "內部連結目標包含模板",
37
40
  "unbalanced \"=\" in a section header": "段落標題中不平衡的\"=\"",
38
- "unclosed HTML comment": "未閉合的HTML註釋",
39
- "unclosed quotes": "未閉合的引號",
40
- "unclosed table": "未閉合的表格",
41
+ "unclosed $1": "未閉合的$1",
41
42
  "unclosed tag": "未閉合的標籤",
42
43
  "unescaped query string in an anonymous parameter": "匿名參數中未轉義的查詢參數",
43
44
  "unexpected template argument": "未預期的模板參數",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wikiparser-node",
3
- "version": "1.3.1",
3
+ "version": "1.3.2",
4
4
  "description": "A Node.js parser for MediaWiki markup with AST",
5
5
  "keywords": [
6
6
  "mediawiki",