wikiparser-node 1.18.4 → 1.20.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 (108) hide show
  1. package/README.md +3 -0
  2. package/bundle/bundle-es7.min.js +25 -32
  3. package/bundle/bundle-lsp.min.js +26 -99
  4. package/bundle/bundle.min.js +25 -32
  5. package/config/default.json +49 -3
  6. package/config/minimum.json +5 -1
  7. package/data/ext/math.json +660 -0
  8. package/dist/addon/table.js +24 -5
  9. package/dist/addon/transclude.js +5 -5
  10. package/dist/base.d.mts +4 -3
  11. package/dist/base.d.ts +4 -3
  12. package/dist/bin/config.js +26 -8
  13. package/dist/index.d.ts +2 -2
  14. package/dist/index.js +10 -1
  15. package/dist/internal.d.ts +2 -0
  16. package/dist/lib/document.d.ts +5 -0
  17. package/dist/lib/document.js +31 -2
  18. package/dist/lib/element.js +15 -21
  19. package/dist/lib/lsp.js +104 -42
  20. package/dist/lib/node.js +21 -24
  21. package/dist/lib/text.js +3 -4
  22. package/dist/lib/title.js +2 -1
  23. package/dist/mixin/attributesParent.js +1 -1
  24. package/dist/mixin/fixed.d.ts +1 -2
  25. package/dist/mixin/fixed.js +2 -3
  26. package/dist/mixin/gapped.d.ts +4 -0
  27. package/dist/mixin/gapped.js +24 -0
  28. package/dist/mixin/hidden.js +1 -1
  29. package/dist/mixin/multiLine.d.ts +4 -0
  30. package/dist/mixin/multiLine.js +33 -0
  31. package/dist/mixin/noEscape.js +1 -1
  32. package/dist/mixin/padded.d.ts +5 -0
  33. package/dist/mixin/padded.js +24 -0
  34. package/dist/mixin/singleLine.js +1 -1
  35. package/dist/mixin/sol.js +1 -1
  36. package/dist/mixin/syntax.js +3 -3
  37. package/dist/parser/braces.js +9 -13
  38. package/dist/parser/commentAndExt.js +18 -2
  39. package/dist/parser/magicLinks.js +2 -2
  40. package/dist/parser/selector.js +5 -2
  41. package/dist/src/arg.js +10 -13
  42. package/dist/src/atom.js +2 -7
  43. package/dist/src/attribute.js +6 -6
  44. package/dist/src/attributes.js +8 -12
  45. package/dist/src/commented.d.ts +26 -0
  46. package/dist/src/commented.js +52 -0
  47. package/dist/src/converter.js +3 -6
  48. package/dist/src/converterFlags.js +266 -223
  49. package/dist/src/converterRule.d.ts +2 -2
  50. package/dist/src/converterRule.js +2 -2
  51. package/dist/src/extLink.d.ts +2 -3
  52. package/dist/src/extLink.js +222 -175
  53. package/dist/src/gallery.d.ts +4 -5
  54. package/dist/src/gallery.js +177 -144
  55. package/dist/src/heading.js +11 -11
  56. package/dist/src/hidden.js +2 -7
  57. package/dist/src/imageParameter.d.ts +2 -2
  58. package/dist/src/imageParameter.js +13 -10
  59. package/dist/src/imagemap.d.ts +2 -2
  60. package/dist/src/imagemap.js +155 -123
  61. package/dist/src/imagemapLink.d.ts +2 -2
  62. package/dist/src/index.js +51 -27
  63. package/dist/src/link/base.d.ts +2 -3
  64. package/dist/src/link/base.js +13 -15
  65. package/dist/src/link/file.d.ts +2 -3
  66. package/dist/src/link/file.js +3 -3
  67. package/dist/src/link/galleryImage.d.ts +2 -3
  68. package/dist/src/link/galleryImage.js +7 -13
  69. package/dist/src/magicLink.js +7 -9
  70. package/dist/src/nested.d.ts +2 -2
  71. package/dist/src/nested.js +4 -7
  72. package/dist/src/nowiki/comment.js +2 -5
  73. package/dist/src/nowiki/doubleUnderscore.js +2 -5
  74. package/dist/src/nowiki/index.d.ts +2 -2
  75. package/dist/src/nowiki/index.js +2 -1
  76. package/dist/src/onlyinclude.js +6 -13
  77. package/dist/src/paramTag/index.d.ts +2 -2
  78. package/dist/src/paramTag/index.js +102 -66
  79. package/dist/src/paramTag/inputbox.js +9 -4
  80. package/dist/src/parameter.d.ts +4 -5
  81. package/dist/src/parameter.js +13 -13
  82. package/dist/src/pre.d.ts +4 -5
  83. package/dist/src/pre.js +8 -17
  84. package/dist/src/syntax.d.ts +1 -1
  85. package/dist/src/syntax.js +2 -7
  86. package/dist/src/table/base.d.ts +2 -2
  87. package/dist/src/table/base.js +8 -8
  88. package/dist/src/table/index.js +1 -1
  89. package/dist/src/table/td.d.ts +3 -3
  90. package/dist/src/table/td.js +9 -9
  91. package/dist/src/table/tr.d.ts +2 -2
  92. package/dist/src/tagPair/ext.js +39 -32
  93. package/dist/src/tagPair/index.d.ts +1 -1
  94. package/dist/src/tagPair/index.js +2 -5
  95. package/dist/src/tagPair/translate.d.ts +38 -0
  96. package/dist/src/tagPair/translate.js +129 -0
  97. package/dist/src/transclude.js +6 -7
  98. package/dist/util/html.js +16 -4
  99. package/dist/util/lint.js +17 -30
  100. package/dist/util/sharable.js +29 -1
  101. package/dist/util/sharable.mjs +31 -3
  102. package/dist/util/string.js +14 -1
  103. package/extensions/dist/base.js +1 -1
  104. package/extensions/dist/lsp.js +13 -2
  105. package/extensions/typings.d.ts +2 -2
  106. package/package.json +9 -7
  107. package/extensions/es7/base.js +0 -320
  108. package/extensions/es7/lint.js +0 -97
package/dist/lib/lsp.js CHANGED
@@ -24,7 +24,7 @@ const document_1 = require("./document");
24
24
  const cssRules = {
25
25
  'block-no-empty': null,
26
26
  'property-no-unknown': null,
27
- }, jsonSelector = document_1.jsonTags.map(s => `ext-inner#${s}`).join(), scores = new Map();
27
+ }, jsonSelector = document_1.jsonTags.map(s => `ext#${s}`).join(), mathTags = ['math', 'chem', 'ce'], mathSelector = mathTags.map(s => `ext#${s}`).join(), scores = new Map();
28
28
  let colors;
29
29
  /* NOT FOR BROWSER ONLY END */
30
30
  exports.tasks = new WeakMap();
@@ -286,22 +286,25 @@ class LanguageService {
286
286
  data;
287
287
  /* NOT FOR BROWSER ONLY */
288
288
  lilypond;
289
- /** @private */
290
- lilypondData;
289
+ #lilypondData;
290
+ #mathData;
291
+ #mathSet;
291
292
  /* NOT FOR BROWSER ONLY END */
292
293
  /** @param uri 任务标识 */
293
294
  constructor(uri) {
294
295
  exports.tasks.set(uri, this);
296
+ /* NOT FOR BROWSER ONLY */
297
+ const dataDir = path_1.default.join('..', '..', 'data'), extDir = path_1.default.join(dataDir, 'ext');
298
+ this.#lilypondData = require(path_1.default.join(extDir, 'score'));
299
+ this.#mathData = require(path_1.default.join(extDir, 'math'));
300
+ this.#mathSet = new Set(this.#mathData);
301
+ /* NOT FOR BROWSER ONLY END */
295
302
  Object.defineProperties(this, {
296
303
  config: { enumerable: false },
297
304
  data: {
298
- value: require(path_1.default.join('..', '..', 'data', 'signatures')),
299
- enumerable: false,
300
- },
301
- /* NOT FOR BROWSER ONLY */
302
- lilypondData: {
303
- value: require(path_1.default.join('..', '..', 'data', 'ext', 'score')),
304
305
  enumerable: false,
306
+ /* NOT FOR BROWSER ONLY */
307
+ value: require(path_1.default.join(dataDir, 'signatures')),
305
308
  },
306
309
  });
307
310
  }
@@ -412,14 +415,15 @@ class LanguageService {
412
415
  async provideDocumentColors(rgba, text, hsl = true) {
413
416
  const root = await this.#queue(text);
414
417
  /* NOT FOR BROWSER ONLY */
415
- /* eslint-disable require-atomic-updates */
416
- try {
417
- colors ??= new RegExp(String.raw `\b${Object.keys((await import('color-name')).default).join('|')}\b`, 'giu');
418
- }
419
- catch {
420
- colors = false;
421
- }
422
- /* eslint-enable require-atomic-updates */
418
+ colors ??= (async () => {
419
+ try {
420
+ return new RegExp(String.raw `\b${Object.keys((await import('color-name')).default).join('|')}\b`, 'giu');
421
+ }
422
+ catch {
423
+ return false;
424
+ }
425
+ })();
426
+ const re = await colors;
423
427
  /* NOT FOR BROWSER ONLY END */
424
428
  return root.querySelectorAll('attr-value,parameter-value,arg-default').reverse()
425
429
  .flatMap(token => {
@@ -436,14 +440,14 @@ class LanguageService {
436
440
  /* NOT FOR BROWSER ONLY END */
437
441
  }
438
442
  /* NOT FOR BROWSER ONLY */
439
- const isStyle = colors && type === 'attr-value' && parentNode.name === 'style';
443
+ const isStyle = re && type === 'attr-value' && parentNode.name === 'style';
440
444
  /* NOT FOR BROWSER ONLY END */
441
445
  return childNodes.filter((child) => child.type === 'text').reverse()
442
446
  .flatMap(child => {
443
447
  const { data } = child, parts = (0, common_1.splitColors)(data, hsl).filter(([, , , isColor]) => isColor);
444
448
  /* NOT FOR BROWSER ONLY */
445
449
  if (isStyle) {
446
- parts.push(...[...data.matchAll(colors)].map(({ index, 0: s }) => [s, index, index + s.length, true]));
450
+ parts.push(...[...data.matchAll(re)].map(({ index, 0: s }) => [s, index, index + s.length, true]));
447
451
  }
448
452
  /* NOT FOR BROWSER ONLY END */
449
453
  if (parts.length === 0) {
@@ -487,13 +491,13 @@ class LanguageService {
487
491
  this.config ??= index_1.default.getConfig();
488
492
  const { nsid, ext, html, parserFunction: [insensitive, sensitive, ...other], doubleUnderscore, protocol, img, } = this.config, tags = new Set([ext, html].flat(2));
489
493
  // eslint-disable-next-line @typescript-eslint/no-unused-expressions, es-x/no-regexp-unicode-property-escapes
490
- /(?:<\/?(\w*)|(\{{2,4}|\[\[)\s*([^|{}<>[\]\s][^|{}<>[\]#]*)?|(__(?:(?!__)[\p{L}\d_])*)|(?<!\[)\[([a-z:/]*)|\[\[\s*(?:file|image)\s*:[^[\]{}<>]+\|([^[\]{}<>|=]*)|<(\w+)(?:\s(?:[^<>{}|=\s]+(?:\s*=\s*(?:[^\s"']\S*|(["']).*?\8))?(?=\s))*)?\s(\w*))$/iu;
494
+ /(?:<\/?(\w*)|(\{{2,4}|\[\[)\s*([^|{}<>[\]\s][^|{}<>[\]#]*)?|(__(?:(?!__)[\p{L}\p{N}_])*)|(?<!\[)\[([a-z:/]*)|\[\[\s*(?:file|image)\s*:[^[\]{}<>]+\|([^[\]{}<>|=]*)|<(\w+)(?:\s(?:[^<>{}|=\s]+(?:\s*=\s*(?:[^\s"']\S*|(["']).*?\8))?(?=\s))*)?\s(\w*))$/iu;
491
495
  const re = new RegExp('(?:' // eslint-disable-line prefer-template
492
496
  + String.raw `<(\/?\w*)` // tag
493
497
  + '|'
494
498
  + String.raw `(\{{2,4}|\[\[)\s*([^|{}<>[\]\s][^|{}<>[\]#]*)?` // braces and brackets
495
499
  + '|'
496
- + String.raw `(__(?:(?!__)[\p{L}\d_])*)` // behavior switch
500
+ + String.raw `(__(?:(?!__)[\p{L}\p{N}_])*)` // behavior switch
497
501
  + '|'
498
502
  + String.raw `(?<!\[)\[([a-z:/]*)` // protocol
499
503
  + '|'
@@ -692,23 +696,32 @@ class LanguageService {
692
696
  }
693
697
  const word = /\\?\b(?:\w|\b(?:->?|\.)|\bly:)+$/u.exec(curLine.slice(0, character))?.[0];
694
698
  if (word) {
695
- const { lilypondData } = this;
699
+ const data = this.#lilypondData;
696
700
  return word.startsWith('\\')
697
- ? getCompletion(lilypondData.filter(w => w.startsWith('\\')), 'Function', word, position)
701
+ ? getCompletion(data.filter(w => w.startsWith('\\')), 'Function', word, position)
698
702
  : [
699
- ...getCompletion(lilypondData.filter(w => /^[a-z]/u.test(w)), 'Variable', word, position),
700
- ...getCompletion(lilypondData.filter(w => /^[A-Z]/u.test(w)), 'Class', word, position),
703
+ ...getCompletion(data.filter(w => /^[a-z]/u.test(w)), 'Variable', word, position),
704
+ ...getCompletion(data.filter(w => /^[A-Z]/u.test(w)), 'Class', word, position),
701
705
  ];
702
706
  }
707
+ }
708
+ else if (type === 'ext-inner' && mathTags.includes(cur.name)) {
709
+ const word = /\\\w+$/u.exec(curLine.slice(0, character))?.[0];
710
+ if (word) {
711
+ const data = this.#mathData;
712
+ return getCompletion(cur.name === 'math' && parentNode.getAttr('chem') !== undefined
713
+ ? [...data, String.raw `\ce`]
714
+ : data, 'Function', word, position);
715
+ }
703
716
  /* NOT FOR BROWSER ONLY END */
704
717
  }
705
718
  else if ((0, exports.isAttr)(cur) && isHtmlAttr(parentNode)) {
706
- const data = lint_1.htmlData.provideValues(parentNode.tag, parentNode.name);
719
+ const data = (0, lint_1.provideValues)(parentNode.tag, parentNode.name);
707
720
  if (data.length === 0) {
708
721
  return undefined;
709
722
  }
710
723
  const val = this.#text.slice(cur.getAbsoluteIndex(), root.indexFromPos(line, character)).trimStart();
711
- return getCompletion(data.map(({ name }) => name), 'Value', val, position);
724
+ return getCompletion(data, 'Value', val, position);
712
725
  }
713
726
  return undefined;
714
727
  }
@@ -774,8 +787,11 @@ class LanguageService {
774
787
  });
775
788
  })() :
776
789
  [], jsonDiagnostics = document_1.jsonLSP ?
777
- await Promise.all(root.querySelectorAll(jsonSelector).map(async (token) => {
778
- const textDoc = new document_1.EmbeddedJSONDocument(root, token), severityLevel = token.name === 'templatedata' ? 'error' : 'ignore', e = (await document_1.jsonLSP.doValidation(textDoc, textDoc.jsonDoc, {
790
+ await Promise.all(root.querySelectorAll(jsonSelector).map(async ({ name, lastChild, selfClosing }) => {
791
+ if (selfClosing) {
792
+ return [];
793
+ }
794
+ const textDoc = new document_1.EmbeddedJSONDocument(root, lastChild), severityLevel = name === 'templatedata' ? 'error' : 'ignore', e = (await document_1.jsonLSP.doValidation(textDoc, textDoc.jsonDoc, {
779
795
  comments: severityLevel,
780
796
  trailingCommas: severityLevel,
781
797
  })).map((error) => ({
@@ -830,6 +846,42 @@ class LanguageService {
830
846
  }));
831
847
  }
832
848
  }
849
+ const MathJax = await document_1.MathJax, data = this.#mathSet, mathDiagnostics = root.querySelectorAll(mathSelector)
850
+ .map(token => {
851
+ const { selfClosing, innerText, lastChild, name } = token;
852
+ if (selfClosing) {
853
+ return [];
854
+ }
855
+ const hasCe = name === 'math' && token.getAttr('chem') !== undefined, mathErrors = [...innerText.matchAll(/\\\w+/gu)]
856
+ .filter(([macro]) => !(hasCe && macro === String.raw `\ce` || data.has(macro)))
857
+ .map(({ 0: macro, index }) => {
858
+ const aIndex = lastChild.getAbsoluteIndex() + index;
859
+ return {
860
+ range: createRange(root, aIndex, aIndex + macro.length),
861
+ severity: 2,
862
+ source: 'MathJax',
863
+ code: 'UnknownMacro',
864
+ message: `Unknown macro "${macro}"`,
865
+ };
866
+ });
867
+ if (MathJax) {
868
+ try {
869
+ MathJax.tex2mml(name === 'math' ? innerText : String.raw `\ce{${innerText}}`);
870
+ }
871
+ catch (e) {
872
+ if (e && typeof e === 'object' && 'id' in e && 'message' in e) {
873
+ mathErrors.push({
874
+ range: createNodeRange(lastChild),
875
+ severity: 1,
876
+ source: 'MathJax',
877
+ code: e.id,
878
+ message: e.message,
879
+ });
880
+ }
881
+ }
882
+ }
883
+ return mathErrors;
884
+ });
833
885
  /* NOT FOR BROWSER ONLY END */
834
886
  return [
835
887
  diagnostics,
@@ -837,6 +889,7 @@ class LanguageService {
837
889
  jsonDiagnostics,
838
890
  /* NOT FOR BROWSER ONLY */
839
891
  lilypondDiagnostics,
892
+ mathDiagnostics,
840
893
  ].flat(2);
841
894
  }
842
895
  /**
@@ -889,8 +942,13 @@ class LanguageService {
889
942
  }
890
943
  /* NOT FOR BROWSER ONLY */
891
944
  if (document_1.jsonLSP) {
892
- for (const token of root.querySelectorAll(jsonSelector)) {
893
- ranges.push(...document_1.jsonLSP.getFoldingRanges(new document_1.EmbeddedJSONDocument(root, token)));
945
+ for (const { selfClosing, lastChild } of root.querySelectorAll(jsonSelector)) {
946
+ if (!selfClosing) {
947
+ const foldingRanges = document_1.jsonLSP.getFoldingRanges(new document_1.EmbeddedJSONDocument(root, lastChild));
948
+ if (foldingRanges.length > 0) {
949
+ ranges.push(...foldingRanges);
950
+ }
951
+ }
894
952
  }
895
953
  }
896
954
  /* NOT FOR BROWSER ONLY END */
@@ -1152,10 +1210,10 @@ class LanguageService {
1152
1210
  const textDoc = new document_1.EmbeddedJSONDocument(root, offsetNode);
1153
1211
  return await document_1.jsonLSP.doHover(textDoc, position, textDoc.jsonDoc) ?? undefined;
1154
1212
  }
1155
- else if (lint_1.htmlData.provideTags && lint_1.htmlData.provideAttributes) {
1213
+ else if (document_1.htmlData) {
1156
1214
  if (type === 'html' && offset <= offsetNode.getRelativeIndex(0)
1157
1215
  || type === 'html-attr-dirty' && offset === 0 && parentNode.firstChild === offsetNode) {
1158
- const token = type === 'html' ? offsetNode : parentNode.parentNode, data = lint_1.htmlData.provideTags().find(({ name: n }) => n === token.name);
1216
+ const token = type === 'html' ? offsetNode : parentNode.parentNode, data = document_1.htmlData.provideTags().find(({ name: n }) => n === token.name);
1159
1217
  if (data?.description) {
1160
1218
  const start = positionAt(root, token.getAbsoluteIndex());
1161
1219
  return {
@@ -1171,7 +1229,7 @@ class LanguageService {
1171
1229
  }
1172
1230
  }
1173
1231
  else if (type === 'attr-key' && isHtmlAttr(parentNode)) {
1174
- const data = lint_1.htmlData.provideAttributes(parentNode.tag).find(({ name: n }) => n === parentNode.name);
1232
+ const data = document_1.htmlData.provideAttributes(parentNode.tag).find(({ name: n }) => n === parentNode.name);
1175
1233
  if (data?.description) {
1176
1234
  return {
1177
1235
  contents: data.description,
@@ -1247,16 +1305,20 @@ class LanguageService {
1247
1305
  * @param text source Wikitext / 源代码
1248
1306
  */
1249
1307
  async provideInlayHints(text) {
1250
- const hints = [], root = await this.#queue(text);
1308
+ const root = await this.#queue(text);
1309
+ let hints = [];
1251
1310
  for (const token of root.querySelectorAll('template,magic-word#invoke').reverse()) {
1252
1311
  const { type, childNodes } = token;
1253
- hints.push(...childNodes.slice(type === 'template' ? 1 : 3).filter(({ anon }) => anon)
1254
- .reverse()
1255
- .map((parameter) => ({
1256
- position: positionAt(root, parameter.getAbsoluteIndex()),
1257
- label: `${parameter.name}=`,
1258
- kind: 2,
1259
- })));
1312
+ hints = [
1313
+ ...hints,
1314
+ ...childNodes.slice(type === 'template' ? 1 : 3).filter(({ anon }) => anon)
1315
+ .reverse()
1316
+ .map((parameter) => ({
1317
+ position: positionAt(root, parameter.getAbsoluteIndex()),
1318
+ label: `${parameter.name}=`,
1319
+ kind: 2,
1320
+ })),
1321
+ ];
1260
1322
  }
1261
1323
  return hints;
1262
1324
  }
package/dist/lib/node.js CHANGED
@@ -302,20 +302,6 @@ class AstNode {
302
302
  ...this.getRootNode().posFromIndex(this.getAbsoluteIndex()),
303
303
  };
304
304
  }
305
- /** @private */
306
- seal(key, permanent) {
307
- /* NOT FOR BROWSER */
308
- if (!permanent) {
309
- this.#optional.add(key);
310
- }
311
- /* NOT FOR BROWSER END */
312
- Object.defineProperty(this, key, {
313
- enumerable: !permanent && Boolean(this[key]),
314
- configurable: true,
315
- /* NOT FOR BROWSER */
316
- writable: false,
317
- });
318
- }
319
305
  /**
320
306
  * Whether to be of a certain type
321
307
  *
@@ -344,6 +330,22 @@ class AstNode {
344
330
  this.#lines = value;
345
331
  });
346
332
  }
333
+ /* PRINT ONLY */
334
+ /** @private */
335
+ seal(key, permanent) {
336
+ /* NOT FOR BROWSER */
337
+ if (!permanent) {
338
+ this.#optional.add(key);
339
+ }
340
+ /* NOT FOR BROWSER END */
341
+ Object.defineProperty(this, key, {
342
+ enumerable: !permanent && Boolean(this[key]),
343
+ configurable: true,
344
+ /* NOT FOR BROWSER */
345
+ writable: false,
346
+ });
347
+ }
348
+ /* PRINT ONLY END */
347
349
  /* NOT FOR BROWSER */
348
350
  /* istanbul ignore next */
349
351
  /** @private */
@@ -374,13 +376,8 @@ class AstNode {
374
376
  }
375
377
  return true;
376
378
  }
377
- /**
378
- * 在当前节点前后插入兄弟节点
379
- * @param nodes 插入节点
380
- * @param offset 插入的相对位置
381
- * @throws `Error` 不存在父节点
382
- */
383
- #insertAdjacent(nodes, offset) {
379
+ /** @private */
380
+ insertAdjacent(nodes, offset) {
384
381
  const { parentNode } = this;
385
382
  /* istanbul ignore if */
386
383
  if (!parentNode) {
@@ -398,7 +395,7 @@ class AstNode {
398
395
  * @param nodes nodes to be inserted / 插入节点
399
396
  */
400
397
  after(...nodes) {
401
- this.#insertAdjacent(nodes, 1);
398
+ this.insertAdjacent(nodes, 1);
402
399
  }
403
400
  /**
404
401
  * Insert a batch of sibling nodes before the current node
@@ -407,7 +404,7 @@ class AstNode {
407
404
  * @param nodes nodes to be inserted / 插入节点
408
405
  */
409
406
  before(...nodes) {
410
- this.#insertAdjacent(nodes, 0);
407
+ this.insertAdjacent(nodes, 0);
411
408
  }
412
409
  /**
413
410
  * Remove the current node
@@ -424,7 +421,7 @@ class AstNode {
424
421
  * @param nodes nodes to be inserted / 插入节点
425
422
  */
426
423
  replaceWith(...nodes) {
427
- this.after(...nodes);
424
+ this.insertAdjacent(nodes, 1);
428
425
  this.remove();
429
426
  }
430
427
  /**
package/dist/lib/text.js CHANGED
@@ -127,7 +127,7 @@ const errorSyntaxUrl = new RegExp(source, 'giu'), noLinkTypes = new Set(['attr-v
127
127
  let wordRegex;
128
128
  try {
129
129
  // eslint-disable-next-line prefer-regex-literals, es-x/no-regexp-unicode-property-escapes
130
- wordRegex = new RegExp(String.raw `[\p{L}\d_]`, 'u');
130
+ wordRegex = new RegExp(String.raw `[\p{L}\p{N}_]`, 'u');
131
131
  }
132
132
  catch /* istanbul ignore next */ {
133
133
  wordRegex = /\w/u;
@@ -176,13 +176,12 @@ let AstText = (() => {
176
176
  /** @param text 包含文本 */
177
177
  constructor(text) {
178
178
  super();
179
+ /* NOT FOR BROWSER */
179
180
  Object.defineProperties(this, {
180
181
  data: {
181
182
  value: text,
182
- /* NOT FOR BROWSER */
183
183
  writable: false,
184
184
  },
185
- /* NOT FOR BROWSER */
186
185
  childNodes: { enumerable: false, configurable: false },
187
186
  });
188
187
  }
@@ -250,7 +249,7 @@ let AstText = (() => {
250
249
  || char === '[' && type === 'ext-link-text' && (/&(?:rbrack|#93|#x5[Dd];);/u.test(data.slice(index + 1))
251
250
  || nextSibling?.is('ext') && nextName === 'nowiki'
252
251
  && nextSibling.innerText?.includes(']'))
253
- || magicLink && (!parentNode.getAttribute('plain') || noLinkTypes.has(type))) {
252
+ || magicLink && (!parentNode.isPlain() || noLinkTypes.has(type))) {
254
253
  continue;
255
254
  }
256
255
  else if (char === ']' && (index || length > 1)) {
package/dist/lib/title.js CHANGED
@@ -134,7 +134,7 @@ class Title {
134
134
  /* NOT FOR BROWSER END */
135
135
  const m = title.split(':');
136
136
  if (m.length > 1) {
137
- const k = m[0].trim().toLowerCase(), id = Object.prototype.hasOwnProperty.call(config.nsid, k) && config.nsid[k];
137
+ const k = (0, string_1.trimLc)(m[0]), id = Object.prototype.hasOwnProperty.call(config.nsid, k) && config.nsid[k];
138
138
  if (id) {
139
139
  ns = id;
140
140
  title = m.slice(1).join(':').trim();
@@ -165,6 +165,7 @@ class Title {
165
165
  if (!this.#path.includes('$1')) {
166
166
  this.#path += `${this.#path.endsWith('/') ? '' : '/'}$1`;
167
167
  }
168
+ /* PRINT ONLY */
168
169
  if (!temporary) {
169
170
  Object.defineProperties(this, {
170
171
  encoded: { enumerable: false, writable: false },
@@ -8,7 +8,7 @@ const constants_1 = require("../util/constants");
8
8
  * 子节点含有AttributesToken的类
9
9
  * @param i AttributesToken子节点的位置
10
10
  */
11
- const attributesParent = (i = 0) => (constructor, _) => {
11
+ const attributesParent = (i = 0) => (constructor) => {
12
12
  /** 子节点含有AttributesToken的类 */
13
13
  class AttributesParent extends constructor {
14
14
  /* NOT FOR BROWSER */
@@ -1,5 +1,4 @@
1
1
  /**
2
2
  * 不可增删子节点的类
3
- * @param constructor 基类
4
- * @param _ context
3
+ * @ignore
5
4
  */
@@ -5,10 +5,9 @@ const debug_1 = require("../util/debug");
5
5
  const constants_1 = require("../util/constants");
6
6
  /**
7
7
  * 不可增删子节点的类
8
- * @param constructor 基类
9
- * @param _ context
8
+ * @ignore
10
9
  */
11
- const fixedToken = (constructor, _) => {
10
+ const fixedToken = (constructor) => {
12
11
  /** 不可增删子节点的类 */
13
12
  class FixedToken extends constructor {
14
13
  /** @private */
@@ -0,0 +1,4 @@
1
+ /**
2
+ * 给定 gap 的类
3
+ * @param gap
4
+ */
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gapped = void 0;
4
+ const debug_1 = require("../util/debug");
5
+ /* NOT FOR BROWSER */
6
+ const constants_1 = require("../util/constants");
7
+ /* NOT FOR BROWSER END */
8
+ /**
9
+ * 给定 gap 的类
10
+ * @param gap
11
+ */
12
+ const gapped = (gap = 1) => (constructor) => {
13
+ /** 不可增删子节点的类 */
14
+ class GappedToken extends constructor {
15
+ /** @private */
16
+ getGaps() {
17
+ return gap;
18
+ }
19
+ }
20
+ (0, debug_1.mixin)(GappedToken, constructor);
21
+ return GappedToken;
22
+ };
23
+ exports.gapped = gapped;
24
+ constants_1.mixins['gapped'] = __filename;
@@ -10,7 +10,7 @@ const constants_1 = require("../util/constants");
10
10
  * @param linter 是否覆写 lint 方法
11
11
  * @param html 是否覆写 toHtml 方法
12
12
  */
13
- const hiddenToken = (linter = true, html = true) => (constructor, _) => {
13
+ const hiddenToken = (linter = true, html = true) => (constructor) => {
14
14
  /** 解析后不可见的类 */
15
15
  class AnyHiddenToken extends constructor {
16
16
  /** 没有可见部分 */
@@ -0,0 +1,4 @@
1
+ /**
2
+ * 逐行解析的类
3
+ * @ignore
4
+ */
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.multiLine = void 0;
4
+ const debug_1 = require("../util/debug");
5
+ /* NOT FOR BROWSER */
6
+ const constants_1 = require("../util/constants");
7
+ /* NOT FOR BROWSER END */
8
+ /**
9
+ * 逐行解析的类
10
+ * @ignore
11
+ */
12
+ const multiLine = (constructor) => {
13
+ /** 不可包含换行符的类 */
14
+ class MultiLineToken extends constructor {
15
+ toString(skip) {
16
+ return super.toString(skip, '\n');
17
+ }
18
+ text() {
19
+ return super.text('\n').replace(/\n\s*\n/gu, '\n');
20
+ }
21
+ /** @private */
22
+ getGaps() {
23
+ return 1;
24
+ }
25
+ print() {
26
+ return super.print({ sep: '\n' });
27
+ }
28
+ }
29
+ (0, debug_1.mixin)(MultiLineToken, constructor);
30
+ return MultiLineToken;
31
+ };
32
+ exports.multiLine = multiLine;
33
+ constants_1.mixins['multiLine'] = __filename;
@@ -7,7 +7,7 @@ const constants_1 = require("../util/constants");
7
7
  * 不需要转义的类
8
8
  * @ignore
9
9
  */
10
- const noEscape = (constructor, _) => {
10
+ const noEscape = (constructor) => {
11
11
  /** 不可包含换行符的类 */
12
12
  class NoEscapeToken extends constructor {
13
13
  /** @private */
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 给定 padding 的类
3
+ * @param padding padding 字符串
4
+ * @param padding.length
5
+ */
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.padded = void 0;
4
+ const debug_1 = require("../util/debug");
5
+ /* NOT FOR BROWSER */
6
+ const constants_1 = require("../util/constants");
7
+ /* NOT FOR BROWSER END */
8
+ /**
9
+ * 给定 padding 的类
10
+ * @param padding padding 字符串
11
+ * @param padding.length
12
+ */
13
+ const padded = ({ length }) => (constructor) => {
14
+ /** 不可增删子节点的类 */
15
+ class PaddedToken extends constructor {
16
+ getAttribute(key) {
17
+ return key === 'padding' ? length : super.getAttribute(key);
18
+ }
19
+ }
20
+ (0, debug_1.mixin)(PaddedToken, constructor);
21
+ return PaddedToken;
22
+ };
23
+ exports.padded = padded;
24
+ constants_1.mixins['padded'] = __filename;
@@ -7,7 +7,7 @@ const constants_1 = require("../util/constants");
7
7
  * 不可包含换行符的类
8
8
  * @param strict 是否严格
9
9
  */
10
- const singleLine = (strict = true) => (constructor, _) => {
10
+ const singleLine = (strict = true) => (constructor) => {
11
11
  /** 不可包含换行符的类 */
12
12
  class SingleLineToken extends constructor {
13
13
  toString(skip) {
package/dist/mixin/sol.js CHANGED
@@ -7,7 +7,7 @@ const constants_1 = require("../util/constants");
7
7
  * 只能位于行首的类
8
8
  * @param self 是否允许同类节点相邻
9
9
  */
10
- const sol = (self) => (constructor, _) => {
10
+ const sol = (self) => (constructor) => {
11
11
  /** 只能位于行首的类 */
12
12
  class SolToken extends constructor {
13
13
  /** @implements */
@@ -8,7 +8,7 @@ const string_1 = require("../util/string");
8
8
  * 满足特定语法格式的Token
9
9
  * @param pattern 语法正则
10
10
  */
11
- const syntax = (pattern) => (constructor, _) => {
11
+ const syntax = (pattern) => (constructor) => {
12
12
  /** 满足特定语法格式的Token */
13
13
  class SyntaxToken extends constructor {
14
14
  /** @class */
@@ -29,10 +29,10 @@ const syntax = (pattern) => (constructor, _) => {
29
29
  };
30
30
  this.addEventListener(['remove', 'insert', 'replace', 'text'], syntaxListener);
31
31
  }
32
- replaceChildren(...elements) {
32
+ safeReplaceChildren(elements) {
33
33
  if (debug_1.Shadow.running || this.pattern.test((0, string_1.text)(elements))) {
34
34
  debug_1.Shadow.run(() => {
35
- super.replaceChildren(...elements);
35
+ super.safeReplaceChildren(elements);
36
36
  });
37
37
  }
38
38
  }