wikiparser-node 1.17.0 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +20 -0
  2. package/bin/config.js +3 -0
  3. package/bundle/{bundle.es7.js → bundle-es7.min.js} +19 -19
  4. package/bundle/bundle-lsp.min.js +38 -0
  5. package/bundle/bundle.min.js +19 -19
  6. package/config/.schema.json +7 -3
  7. package/config/default.json +86 -23
  8. package/config/enwiki.json +20 -13
  9. package/config/llwiki.json +99 -7
  10. package/config/minimum.json +6 -3
  11. package/config/moegirl.json +12 -12
  12. package/config/zhwiki.json +52 -21
  13. package/data/.schema.json +7 -0
  14. package/data/ext/mapframe.json +4 -0
  15. package/data/ext/maplink.json +4 -0
  16. package/data/ext/score.json +1033 -0
  17. package/data/ext/templatedata.json +184 -0
  18. package/dist/addon/table.js +16 -10
  19. package/dist/addon/token.js +13 -9
  20. package/dist/addon/transclude.js +6 -3
  21. package/dist/base.d.mts +4 -2
  22. package/dist/base.d.ts +4 -2
  23. package/dist/base.js +2 -0
  24. package/dist/base.mjs +3 -1
  25. package/dist/bin/config.js +112 -0
  26. package/dist/index.d.ts +2 -2
  27. package/dist/index.js +33 -21
  28. package/dist/lib/document.d.ts +54 -0
  29. package/dist/lib/document.js +126 -0
  30. package/dist/lib/element.js +6 -3
  31. package/dist/lib/lsp.d.ts +7 -7
  32. package/dist/lib/lsp.js +314 -47
  33. package/dist/lib/node.js +19 -9
  34. package/dist/lib/text.js +4 -1
  35. package/dist/lib/title.js +9 -6
  36. package/dist/mixin/attributesParent.d.ts +8 -0
  37. package/dist/mixin/attributesParent.js +4 -0
  38. package/dist/parser/links.js +4 -1
  39. package/dist/parser/redirect.js +4 -1
  40. package/dist/src/arg.js +10 -3
  41. package/dist/src/attribute.d.ts +12 -1
  42. package/dist/src/attribute.js +69 -1
  43. package/dist/src/attributes.d.ts +8 -0
  44. package/dist/src/attributes.js +14 -1
  45. package/dist/src/converter.d.ts +62 -3
  46. package/dist/src/converter.js +162 -129
  47. package/dist/src/converterFlags.js +2 -2
  48. package/dist/src/converterRule.js +4 -1
  49. package/dist/src/extLink.d.ts +19 -3
  50. package/dist/src/extLink.js +177 -194
  51. package/dist/src/gallery.js +7 -3
  52. package/dist/src/heading.js +9 -4
  53. package/dist/src/html.js +4 -1
  54. package/dist/src/imageParameter.js +9 -3
  55. package/dist/src/imagemap.js +4 -1
  56. package/dist/src/index.js +34 -4
  57. package/dist/src/link/base.js +8 -2
  58. package/dist/src/link/file.js +11 -2
  59. package/dist/src/link/galleryImage.d.ts +1 -0
  60. package/dist/src/link/galleryImage.js +15 -1
  61. package/dist/src/magicLink.js +4 -1
  62. package/dist/src/nested.js +4 -1
  63. package/dist/src/nowiki/comment.js +4 -1
  64. package/dist/src/nowiki/index.js +4 -1
  65. package/dist/src/nowiki/quote.js +4 -1
  66. package/dist/src/onlyinclude.js +4 -1
  67. package/dist/src/paramTag/index.js +5 -1
  68. package/dist/src/paramTag/inputbox.js +4 -1
  69. package/dist/src/parameter.js +4 -1
  70. package/dist/src/pre.js +4 -1
  71. package/dist/src/redirect.js +3 -1
  72. package/dist/src/table/base.js +4 -1
  73. package/dist/src/table/index.js +10 -3
  74. package/dist/src/table/td.js +4 -1
  75. package/dist/src/tagPair/ext.js +17 -5
  76. package/dist/src/tagPair/include.js +4 -1
  77. package/dist/src/tagPair/index.js +4 -1
  78. package/dist/src/transclude.js +16 -7
  79. package/dist/util/debug.js +1 -13
  80. package/dist/util/diff.js +20 -6
  81. package/dist/util/lint.js +4 -1
  82. package/dist/util/string.js +5 -2
  83. package/extensions/dist/base.js +30 -18
  84. package/extensions/dist/lsp.js +30 -22
  85. package/extensions/es7/base.js +30 -18
  86. package/extensions/typings.d.ts +6 -2
  87. package/package.json +27 -16
  88. package/bundle/bundle.lsp.js +0 -38
  89. package/dist/mixin/flagsParent.d.ts +0 -69
  90. package/dist/mixin/flagsParent.js +0 -64
  91. package/dist/mixin/magicLinkParent.d.ts +0 -25
  92. package/dist/mixin/magicLinkParent.js +0 -43
  93. package/dist/util/sharable.d.ts +0 -1
package/dist/index.js CHANGED
@@ -1,15 +1,16 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  /* eslint n/exports-style: 0 */
3
6
  const base_1 = require("./base");
4
7
  const debug_1 = require("./util/debug");
5
8
  const constants_1 = require("./util/constants");
6
9
  const string_1 = require("./util/string");
7
- /* NOT FOR BROWSER */
8
- const chalk = require("chalk");
9
10
  /* NOT FOR BROWSER END */
10
11
  /* NOT FOR BROWSER ONLY */
11
- const fs = require("fs");
12
- const path = require("path");
12
+ const fs_1 = __importDefault(require("fs"));
13
+ const path_1 = __importDefault(require("path"));
13
14
  const diff_1 = require("./util/diff");
14
15
  /* NOT FOR BROWSER ONLY */
15
16
  /**
@@ -17,9 +18,9 @@ const diff_1 = require("./util/diff");
17
18
  * @param file 文件名
18
19
  * @param dir 子路径
19
20
  */
20
- const rootRequire = (file, dir) => require(path.isAbsolute(file)
21
+ const rootRequire = (file, dir) => require(path_1.default.isAbsolute(file)
21
22
  ? /* istanbul ignore next */ file
22
- : path.join('..', file.includes('/') ? '' : dir, file));
23
+ : path_1.default.join('..', file.includes('/') ? '' : dir, file));
23
24
  /* NOT FOR BROWSER ONLY END */
24
25
  /* NOT FOR BROWSER */
25
26
  /**
@@ -79,7 +80,7 @@ const Parser = {
79
80
  this.config = rootRequire(this.config, 'config');
80
81
  /* istanbul ignore if */
81
82
  if (this.config.doubleUnderscore.length < 3 || Array.isArray(this.config.parserFunction[1])) {
82
- (0, diff_1.error)(`The schema (${path.resolve(__dirname, '..', 'config', '.schema.json')}) of parser configuration is updated.`);
83
+ (0, diff_1.error)(`The schema (${path_1.default.resolve(__dirname, '..', 'config', '.schema.json')}) of parser configuration is updated.`);
83
84
  }
84
85
  /* NOT FOR BROWSER */
85
86
  const { config: { conversionTable, redirects } } = this;
@@ -168,15 +169,15 @@ const Parser = {
168
169
  }
169
170
  catch (e) /* istanbul ignore next */ {
170
171
  if (e instanceof Error) {
171
- const file = path.join(__dirname, '..', 'errors', new Date().toISOString()), stage = token.getAttribute('stage');
172
+ const file = path_1.default.join(__dirname, '..', 'errors', new Date().toISOString()), stage = token.getAttribute('stage');
172
173
  for (const k in config) {
173
174
  if (k.startsWith('regex') || config[k] instanceof Set) {
174
175
  delete config[k];
175
176
  }
176
177
  }
177
- fs.writeFileSync(file, stage === constants_1.MAX_STAGE ? wikitext : token.toString());
178
- fs.writeFileSync(`${file}.err`, e.stack);
179
- fs.writeFileSync(`${file}.json`, JSON.stringify({ stage, include, config }, null, '\t'));
178
+ fs_1.default.writeFileSync(file, stage === constants_1.MAX_STAGE ? wikitext : token.toString());
179
+ fs_1.default.writeFileSync(`${file}.err`, e.stack);
180
+ fs_1.default.writeFileSync(`${file}.json`, JSON.stringify({ stage, include, config }, null, '\t'));
180
181
  }
181
182
  throw e;
182
183
  }
@@ -250,14 +251,26 @@ const Parser = {
250
251
  warn(msg, ...args) {
251
252
  /* istanbul ignore if */
252
253
  if (this.warning) {
253
- console.warn(chalk.yellow(msg), ...args);
254
+ try {
255
+ const chalk = require('chalk');
256
+ console.warn(chalk.yellow(msg), ...args);
257
+ }
258
+ catch {
259
+ console.warn(msg, ...args);
260
+ }
254
261
  }
255
262
  },
256
263
  /** @implements */
257
264
  debug(msg, ...args) {
258
265
  /* istanbul ignore if */
259
266
  if (this.debugging) {
260
- console.debug(chalk.blue(msg), ...args);
267
+ try {
268
+ const chalk = require('chalk');
269
+ console.debug(chalk.blue(msg), ...args);
270
+ }
271
+ catch {
272
+ console.debug(msg, ...args);
273
+ }
261
274
  }
262
275
  },
263
276
  error: diff_1.error,
@@ -273,12 +286,12 @@ const Parser = {
273
286
  /** @implements */
274
287
  require(name) {
275
288
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
276
- return Object.hasOwn(constants_1.classes, name) ? require(constants_1.classes[name])[name] : require(path.join(__dirname, name));
289
+ return Object.hasOwn(constants_1.classes, name) ? require(constants_1.classes[name])[name] : require(path_1.default.join(__dirname, name));
277
290
  },
278
291
  /* istanbul ignore next */
279
292
  /** @implements */
280
293
  async clearCache() {
281
- await (0, diff_1.cmd)('npm', ['--prefix', path.join(__dirname, '..'), 'run', 'build:core']);
294
+ await (0, diff_1.cmd)('npm', ['--prefix', path_1.default.join(__dirname, '..'), 'run', 'build:core']);
282
295
  const entries = Object.entries(constants_1.classes);
283
296
  for (const [, filePath] of entries) {
284
297
  try {
@@ -306,12 +319,12 @@ const Parser = {
306
319
  /* istanbul ignore next */
307
320
  /** @implements */
308
321
  reparse(date = '') {
309
- const main = fs.readdirSync(path.join(__dirname, '..', 'errors'))
322
+ const main = fs_1.default.readdirSync(path_1.default.join(__dirname, '..', 'errors'))
310
323
  .find(name => name.startsWith(date) && name.endsWith('Z'));
311
324
  if (!main) {
312
325
  throw new RangeError(`找不到对应时间戳的错误记录:${date}`);
313
326
  }
314
- const file = path.join(__dirname, '..', 'errors', main), wikitext = fs.readFileSync(file, 'utf8');
327
+ const file = path_1.default.join(__dirname, '..', 'errors', main), wikitext = fs_1.default.readFileSync(file, 'utf8');
315
328
  const { stage, include, config } = require(`${file}.json`), { Token } = require('./src/index');
316
329
  debug_1.Shadow.run(() => {
317
330
  const halfParsed = stage < constants_1.MAX_STAGE, token = new Token(halfParsed ? wikitext : (0, string_1.tidy)(wikitext), config);
@@ -323,9 +336,9 @@ const Parser = {
323
336
  else {
324
337
  token.parse(undefined, include);
325
338
  }
326
- fs.unlinkSync(file);
327
- fs.unlinkSync(`${file}.err`);
328
- fs.unlinkSync(`${file}.json`);
339
+ fs_1.default.unlinkSync(file);
340
+ fs_1.default.unlinkSync(`${file}.err`);
341
+ fs_1.default.unlinkSync(`${file}.json`);
329
342
  });
330
343
  },
331
344
  };
@@ -336,7 +349,6 @@ const def = {
336
349
  'parse',
337
350
  'createLanguageService',
338
351
  /* NOT FOR BROWSER */
339
- 'conversionTable',
340
352
  'warning',
341
353
  'debugging',
342
354
  'isInterwiki',
@@ -0,0 +1,54 @@
1
+ import type { Position } from 'vscode-languageserver-types';
2
+ import type { TextDocument } from 'vscode-languageserver-textdocument';
3
+ import type { LanguageService as JSONLanguageService, JSONDocument } from 'vscode-json-languageservice';
4
+ import type { LanguageService as CSSLanguageService, Stylesheet } from 'vscode-css-languageservice';
5
+ import type { PublicApi } from 'stylelint';
6
+ import type { Token } from '../internal';
7
+ export declare const jsonTags: string[];
8
+ declare let jsonLSP: JSONLanguageService | undefined, cssLSP: CSSLanguageService | undefined;
9
+ declare const stylelint: Promise<PublicApi | undefined>;
10
+ export { jsonLSP, cssLSP, stylelint };
11
+ /** embedded document */
12
+ declare class EmbeddedDocument implements TextDocument {
13
+ #private;
14
+ languageId: string;
15
+ lineCount: number;
16
+ pre: string;
17
+ uri: string;
18
+ version: number;
19
+ /**
20
+ * @param id language ID
21
+ * @param root root token
22
+ * @param token current token
23
+ * @param pre padding before the content
24
+ * @param post padding after the content
25
+ */
26
+ constructor(id: string, root: Token, token: Token, pre?: string, post?: string);
27
+ /** 原始文本 */
28
+ getContent(): string;
29
+ /** @implements */
30
+ getText(): string;
31
+ /** @implements */
32
+ positionAt(offset: number): Position;
33
+ /** @implements */
34
+ offsetAt({ line, character }: Position): number;
35
+ }
36
+ /** embedded JSON document */
37
+ export declare class EmbeddedJSONDocument extends EmbeddedDocument {
38
+ jsonDoc: JSONDocument;
39
+ /**
40
+ * @param root root token
41
+ * @param token current token
42
+ */
43
+ constructor(root: Token, token: Token);
44
+ }
45
+ /** embedded CSS document */
46
+ export declare class EmbeddedCSSDocument extends EmbeddedDocument {
47
+ styleSheet: Stylesheet;
48
+ /**
49
+ * @param root root token
50
+ * @param token current token
51
+ */
52
+ constructor(root: Token, token: Token);
53
+ getContent(): string;
54
+ }
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.EmbeddedCSSDocument = exports.EmbeddedJSONDocument = exports.stylelint = exports.cssLSP = exports.jsonLSP = exports.jsonTags = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const common_1 = require("@bhsd/common");
9
+ /* NOT FOR BROWSER */
10
+ const constants_1 = require("../util/constants");
11
+ /* NOT FOR BROWSER END */
12
+ exports.jsonTags = ['templatedata', 'mapframe', 'maplink'];
13
+ let jsonLSP, cssLSP;
14
+ try {
15
+ exports.jsonLSP = jsonLSP = require('vscode-json-languageservice')
16
+ .getLanguageService({
17
+ /** @implements */
18
+ async schemaRequestService(uri) {
19
+ return (await fetch(uri)).text();
20
+ },
21
+ });
22
+ jsonLSP.configure({
23
+ schemas: exports.jsonTags.map((tag) => {
24
+ const uri = path_1.default.join('..', '..', 'data', 'ext', tag);
25
+ try {
26
+ const schema = require(uri);
27
+ return {
28
+ uri,
29
+ fileMatch: [tag],
30
+ schema,
31
+ };
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }).filter(Boolean),
37
+ });
38
+ }
39
+ catch { }
40
+ try {
41
+ exports.cssLSP = cssLSP = require('vscode-css-languageservice')
42
+ .getCSSLanguageService();
43
+ }
44
+ catch { }
45
+ const stylelint = (async () => {
46
+ try {
47
+ return (await import('stylelint')).default;
48
+ }
49
+ catch {
50
+ return undefined;
51
+ }
52
+ })();
53
+ exports.stylelint = stylelint;
54
+ /** embedded document */
55
+ class EmbeddedDocument {
56
+ uri = '';
57
+ version = 0;
58
+ #root;
59
+ #content;
60
+ #offset;
61
+ #post;
62
+ /**
63
+ * @param id language ID
64
+ * @param root root token
65
+ * @param token current token
66
+ * @param pre padding before the content
67
+ * @param post padding after the content
68
+ */
69
+ constructor(id, root, token, pre = '', post = '') {
70
+ this.languageId = id;
71
+ this.lineCount = root.getLines().length;
72
+ this.#root = root;
73
+ this.#content = String(token);
74
+ this.#offset = token.getAbsoluteIndex();
75
+ this.pre = pre;
76
+ this.#post = post;
77
+ }
78
+ /** 原始文本 */
79
+ getContent() {
80
+ return this.#content;
81
+ }
82
+ /** @implements */
83
+ getText() {
84
+ return this.pre + this.getContent() + this.#post;
85
+ }
86
+ /** @implements */
87
+ positionAt(offset) {
88
+ const { top, left } = this.#root.posFromIndex(this.#offset + Math.max(Math.min(offset - this.pre.length, this.#content.length), 0));
89
+ return { line: top, character: left };
90
+ }
91
+ /** @implements */
92
+ offsetAt({ line, character }) {
93
+ return Math.min(Math.max(this.#root.indexFromPos(line, character) - this.#offset, 0), this.#content.length)
94
+ + this.pre.length;
95
+ }
96
+ }
97
+ /** embedded JSON document */
98
+ class EmbeddedJSONDocument extends EmbeddedDocument {
99
+ /**
100
+ * @param root root token
101
+ * @param token current token
102
+ */
103
+ constructor(root, token) {
104
+ super('json', root, token);
105
+ this.uri = token.name;
106
+ this.jsonDoc = jsonLSP.parseJSONDocument(this);
107
+ }
108
+ }
109
+ exports.EmbeddedJSONDocument = EmbeddedJSONDocument;
110
+ /** embedded CSS document */
111
+ class EmbeddedCSSDocument extends EmbeddedDocument {
112
+ /**
113
+ * @param root root token
114
+ * @param token current token
115
+ */
116
+ constructor(root, token) {
117
+ const { type, tag } = token.parentNode;
118
+ super('css', root, token, `${type === 'ext-attr' ? 'div' : tag}{`, '}');
119
+ this.styleSheet = cssLSP.parseStylesheet(this);
120
+ }
121
+ getContent() {
122
+ return (0, common_1.sanitizeInlineStyle)(super.getContent());
123
+ }
124
+ }
125
+ exports.EmbeddedCSSDocument = EmbeddedCSSDocument;
126
+ constants_1.classes['EmbeddedCSSDocument'] = __filename;
@@ -1,4 +1,7 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.AstElement = void 0;
4
7
  const string_1 = require("../util/string");
@@ -6,8 +9,8 @@ const debug_1 = require("../util/debug");
6
9
  const selector_1 = require("../parser/selector");
7
10
  const node_1 = require("./node");
8
11
  /* NOT FOR BROWSER */
9
- const fs = require("fs");
10
- const path = require("path");
12
+ const fs_1 = __importDefault(require("fs"));
13
+ const path_1 = __importDefault(require("path"));
11
14
  const constants_1 = require("../util/constants");
12
15
  /**
13
16
  * HTMLElement-like
@@ -392,7 +395,7 @@ class AstElement extends node_1.AstNode {
392
395
  /* NOT FOR BROWSER */
393
396
  /* istanbul ignore if */
394
397
  if (typeof file === 'string') {
395
- fs.writeFileSync(path.join(__dirname, '..', '..', 'printed', file + (file.endsWith('.json') ? '' : '.json')), JSON.stringify(json, null, 2));
398
+ fs_1.default.writeFileSync(path_1.default.join(__dirname, '..', '..', 'printed', file + (file.endsWith('.json') ? '' : '.json')), JSON.stringify(json, null, 2));
396
399
  }
397
400
  /* NOT FOR BROWSER END */
398
401
  return json;
package/dist/lib/lsp.d.ts CHANGED
@@ -1,10 +1,8 @@
1
1
  import Parser from '../index';
2
2
  import type { Range, Position, ColorInformation, ColorPresentation, FoldingRange, DocumentLink, Location, WorkspaceEdit, Diagnostic as DiagnosticBase, TextEdit, Hover, SignatureHelp, InlayHint, CodeAction, DocumentSymbol } from 'vscode-languageserver-types';
3
3
  import type { LanguageService as LanguageServiceBase, CompletionItem, SignatureData } from '../base';
4
- declare interface Diagnostic extends DiagnosticBase {
5
- data: QuickFixData[];
6
- }
7
- declare interface QuickFixData extends TextEdit {
4
+ import type { AttributeToken } from '../internal';
5
+ export interface QuickFixData extends TextEdit {
8
6
  title: string;
9
7
  fix: boolean;
10
8
  }
@@ -12,6 +10,9 @@ export declare const tasks: WeakMap<object, Parser.LanguageService>;
12
10
  /** VSCode-style language service */
13
11
  export declare class LanguageService implements LanguageServiceBase {
14
12
  #private;
13
+ include: boolean;
14
+ lilypond: string;
15
+ lilypondData: string[];
15
16
  /** @param uri 任务标识 */
16
17
  constructor(uri: object);
17
18
  /** @implements */
@@ -47,7 +48,7 @@ export declare class LanguageService implements LanguageServiceBase {
47
48
  * @param text source Wikitext / 源代码
48
49
  * @param warning whether to include warnings / 是否包含警告
49
50
  */
50
- provideDiagnostics(text: string, warning?: boolean): Promise<Diagnostic[]>;
51
+ provideDiagnostics(text: string, warning?: boolean): Promise<DiagnosticBase[]>;
51
52
  /**
52
53
  * Provide folding ranges
53
54
  *
@@ -124,7 +125,7 @@ export declare class LanguageService implements LanguageServiceBase {
124
125
  * 提供快速修复建议
125
126
  * @param diagnostics grammar diagnostics / 语法诊断信息
126
127
  */
127
- provideCodeAction(diagnostics: Diagnostic[]): CodeAction[];
128
+ provideCodeAction(diagnostics: DiagnosticBase[]): CodeAction[];
128
129
  /**
129
130
  * Provide document sections
130
131
  *
@@ -133,4 +134,3 @@ export declare class LanguageService implements LanguageServiceBase {
133
134
  */
134
135
  provideDocumentSymbols(text: string): Promise<DocumentSymbol[]>;
135
136
  }
136
- export {};