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.
- package/README.md +3 -0
- package/bundle/bundle-es7.min.js +25 -32
- package/bundle/bundle-lsp.min.js +26 -99
- package/bundle/bundle.min.js +25 -32
- package/config/default.json +49 -3
- package/config/minimum.json +5 -1
- package/data/ext/math.json +660 -0
- package/dist/addon/table.js +24 -5
- package/dist/addon/transclude.js +5 -5
- package/dist/base.d.mts +4 -3
- package/dist/base.d.ts +4 -3
- package/dist/bin/config.js +26 -8
- package/dist/index.d.ts +2 -2
- package/dist/index.js +10 -1
- package/dist/internal.d.ts +2 -0
- package/dist/lib/document.d.ts +5 -0
- package/dist/lib/document.js +31 -2
- package/dist/lib/element.js +15 -21
- package/dist/lib/lsp.js +104 -42
- package/dist/lib/node.js +21 -24
- package/dist/lib/text.js +3 -4
- package/dist/lib/title.js +2 -1
- package/dist/mixin/attributesParent.js +1 -1
- package/dist/mixin/fixed.d.ts +1 -2
- package/dist/mixin/fixed.js +2 -3
- package/dist/mixin/gapped.d.ts +4 -0
- package/dist/mixin/gapped.js +24 -0
- package/dist/mixin/hidden.js +1 -1
- package/dist/mixin/multiLine.d.ts +4 -0
- package/dist/mixin/multiLine.js +33 -0
- package/dist/mixin/noEscape.js +1 -1
- package/dist/mixin/padded.d.ts +5 -0
- package/dist/mixin/padded.js +24 -0
- package/dist/mixin/singleLine.js +1 -1
- package/dist/mixin/sol.js +1 -1
- package/dist/mixin/syntax.js +3 -3
- package/dist/parser/braces.js +9 -13
- package/dist/parser/commentAndExt.js +18 -2
- package/dist/parser/magicLinks.js +2 -2
- package/dist/parser/selector.js +5 -2
- package/dist/src/arg.js +10 -13
- package/dist/src/atom.js +2 -7
- package/dist/src/attribute.js +6 -6
- package/dist/src/attributes.js +8 -12
- package/dist/src/commented.d.ts +26 -0
- package/dist/src/commented.js +52 -0
- package/dist/src/converter.js +3 -6
- package/dist/src/converterFlags.js +266 -223
- package/dist/src/converterRule.d.ts +2 -2
- package/dist/src/converterRule.js +2 -2
- package/dist/src/extLink.d.ts +2 -3
- package/dist/src/extLink.js +222 -175
- package/dist/src/gallery.d.ts +4 -5
- package/dist/src/gallery.js +177 -144
- package/dist/src/heading.js +11 -11
- package/dist/src/hidden.js +2 -7
- package/dist/src/imageParameter.d.ts +2 -2
- package/dist/src/imageParameter.js +13 -10
- package/dist/src/imagemap.d.ts +2 -2
- package/dist/src/imagemap.js +155 -123
- package/dist/src/imagemapLink.d.ts +2 -2
- package/dist/src/index.js +51 -27
- package/dist/src/link/base.d.ts +2 -3
- package/dist/src/link/base.js +13 -15
- package/dist/src/link/file.d.ts +2 -3
- package/dist/src/link/file.js +3 -3
- package/dist/src/link/galleryImage.d.ts +2 -3
- package/dist/src/link/galleryImage.js +7 -13
- package/dist/src/magicLink.js +7 -9
- package/dist/src/nested.d.ts +2 -2
- package/dist/src/nested.js +4 -7
- package/dist/src/nowiki/comment.js +2 -5
- package/dist/src/nowiki/doubleUnderscore.js +2 -5
- package/dist/src/nowiki/index.d.ts +2 -2
- package/dist/src/nowiki/index.js +2 -1
- package/dist/src/onlyinclude.js +6 -13
- package/dist/src/paramTag/index.d.ts +2 -2
- package/dist/src/paramTag/index.js +102 -66
- package/dist/src/paramTag/inputbox.js +9 -4
- package/dist/src/parameter.d.ts +4 -5
- package/dist/src/parameter.js +13 -13
- package/dist/src/pre.d.ts +4 -5
- package/dist/src/pre.js +8 -17
- package/dist/src/syntax.d.ts +1 -1
- package/dist/src/syntax.js +2 -7
- package/dist/src/table/base.d.ts +2 -2
- package/dist/src/table/base.js +8 -8
- package/dist/src/table/index.js +1 -1
- package/dist/src/table/td.d.ts +3 -3
- package/dist/src/table/td.js +9 -9
- package/dist/src/table/tr.d.ts +2 -2
- package/dist/src/tagPair/ext.js +39 -32
- package/dist/src/tagPair/index.d.ts +1 -1
- package/dist/src/tagPair/index.js +2 -5
- package/dist/src/tagPair/translate.d.ts +38 -0
- package/dist/src/tagPair/translate.js +129 -0
- package/dist/src/transclude.js +6 -7
- package/dist/util/html.js +16 -4
- package/dist/util/lint.js +17 -30
- package/dist/util/sharable.js +29 -1
- package/dist/util/sharable.mjs +31 -3
- package/dist/util/string.js +14 -1
- package/extensions/dist/base.js +1 -1
- package/extensions/dist/lsp.js +13 -2
- package/extensions/typings.d.ts +2 -2
- package/package.json +9 -7
- package/extensions/es7/base.js +0 -320
- 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
|
|
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
|
-
|
|
290
|
-
|
|
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
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
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 =
|
|
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(
|
|
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}\
|
|
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}\
|
|
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
|
|
699
|
+
const data = this.#lilypondData;
|
|
696
700
|
return word.startsWith('\\')
|
|
697
|
-
? getCompletion(
|
|
701
|
+
? getCompletion(data.filter(w => w.startsWith('\\')), 'Function', word, position)
|
|
698
702
|
: [
|
|
699
|
-
...getCompletion(
|
|
700
|
-
...getCompletion(
|
|
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.
|
|
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
|
|
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 (
|
|
778
|
-
|
|
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
|
|
893
|
-
|
|
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 (
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
1254
|
-
|
|
1255
|
-
.
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
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
|
|
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
|
|
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.
|
|
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}\
|
|
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.
|
|
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]
|
|
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 */
|
package/dist/mixin/fixed.d.ts
CHANGED
package/dist/mixin/fixed.js
CHANGED
|
@@ -5,10 +5,9 @@ const debug_1 = require("../util/debug");
|
|
|
5
5
|
const constants_1 = require("../util/constants");
|
|
6
6
|
/**
|
|
7
7
|
* 不可增删子节点的类
|
|
8
|
-
* @
|
|
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,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;
|
package/dist/mixin/hidden.js
CHANGED
|
@@ -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,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;
|
package/dist/mixin/noEscape.js
CHANGED
|
@@ -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;
|
package/dist/mixin/singleLine.js
CHANGED
|
@@ -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 */
|
package/dist/mixin/syntax.js
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
35
|
+
super.safeReplaceChildren(elements);
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
38
|
}
|