wikiparser-node 1.8.0 → 1.9.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/dist/addon/token.js +4 -5
- package/dist/addon/transclude.js +2 -2
- package/dist/base.d.ts +2 -2
- package/dist/base.js +1 -0
- package/dist/index.d.ts +2 -4
- package/dist/index.js +10 -3
- package/dist/lib/element.d.ts +0 -11
- package/dist/lib/element.js +9 -13
- package/dist/lib/node.d.ts +2 -2
- package/dist/lib/node.js +3 -3
- package/dist/lib/range.js +1 -1
- package/dist/lib/text.d.ts +0 -9
- package/dist/lib/text.js +5 -10
- package/dist/mixin/sol.js +1 -1
- package/dist/parser/braces.js +10 -1
- package/dist/parser/externalLinks.js +1 -1
- package/dist/parser/magicLinks.js +34 -17
- package/dist/parser/table.js +1 -1
- package/dist/src/arg.d.ts +0 -4
- package/dist/src/arg.js +3 -3
- package/dist/src/attribute.d.ts +0 -4
- package/dist/src/attribute.js +3 -3
- package/dist/src/attributes.d.ts +0 -4
- package/dist/src/attributes.js +6 -6
- package/dist/src/converter.d.ts +0 -2
- package/dist/src/converter.js +2 -2
- package/dist/src/converterFlags.d.ts +0 -4
- package/dist/src/converterFlags.js +2 -2
- package/dist/src/converterRule.d.ts +0 -2
- package/dist/src/converterRule.js +2 -2
- package/dist/src/extLink.d.ts +0 -4
- package/dist/src/extLink.js +3 -3
- package/dist/src/gallery.d.ts +0 -4
- package/dist/src/gallery.js +3 -3
- package/dist/src/heading.d.ts +0 -4
- package/dist/src/heading.js +4 -4
- package/dist/src/html.d.ts +0 -4
- package/dist/src/html.js +3 -3
- package/dist/src/imageParameter.d.ts +0 -4
- package/dist/src/imageParameter.js +2 -2
- package/dist/src/imagemap.d.ts +0 -4
- package/dist/src/imagemap.js +3 -3
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +35 -19
- package/dist/src/link/base.d.ts +0 -4
- package/dist/src/link/base.js +2 -2
- package/dist/src/link/file.d.ts +0 -2
- package/dist/src/link/file.js +1 -1
- package/dist/src/link/galleryImage.d.ts +0 -2
- package/dist/src/link/galleryImage.js +3 -4
- package/dist/src/link/index.d.ts +0 -2
- package/dist/src/link/index.js +1 -1
- package/dist/src/link/redirectTarget.d.ts +0 -2
- package/dist/src/link/redirectTarget.js +3 -3
- package/dist/src/magicLink.d.ts +9 -9
- package/dist/src/magicLink.js +63 -22
- package/dist/src/nested.d.ts +0 -2
- package/dist/src/nested.js +3 -3
- package/dist/src/nowiki/comment.d.ts +0 -4
- package/dist/src/nowiki/comment.js +2 -2
- package/dist/src/nowiki/doubleUnderscore.d.ts +0 -2
- package/dist/src/nowiki/doubleUnderscore.js +1 -1
- package/dist/src/nowiki/index.d.ts +0 -2
- package/dist/src/nowiki/index.js +1 -1
- package/dist/src/nowiki/quote.d.ts +0 -2
- package/dist/src/nowiki/quote.js +1 -1
- package/dist/src/onlyinclude.d.ts +0 -2
- package/dist/src/onlyinclude.js +1 -1
- package/dist/src/paramTag/index.d.ts +0 -4
- package/dist/src/paramTag/index.js +3 -3
- package/dist/src/parameter.d.ts +0 -4
- package/dist/src/parameter.js +3 -3
- package/dist/src/pre.d.ts +0 -2
- package/dist/src/pre.js +1 -1
- package/dist/src/redirect.d.ts +0 -6
- package/dist/src/redirect.js +4 -4
- package/dist/src/syntax.d.ts +0 -2
- package/dist/src/syntax.js +1 -1
- package/dist/src/table/base.js +1 -1
- package/dist/src/table/index.d.ts +0 -2
- package/dist/src/table/index.js +2 -2
- package/dist/src/table/td.d.ts +0 -4
- package/dist/src/table/td.js +11 -8
- package/dist/src/table/trBase.d.ts +0 -2
- package/dist/src/table/trBase.js +2 -2
- package/dist/src/tagPair/ext.d.ts +0 -2
- package/dist/src/tagPair/ext.js +2 -2
- package/dist/src/tagPair/include.d.ts +0 -2
- package/dist/src/tagPair/include.js +1 -1
- package/dist/src/tagPair/index.d.ts +0 -2
- package/dist/src/tagPair/index.js +3 -3
- package/dist/src/transclude.d.ts +0 -4
- package/dist/src/transclude.js +3 -3
- package/dist/util/lint.js +1 -1
- package/i18n/zh-hans.json +1 -0
- package/i18n/zh-hant.json +1 -0
- package/package.json +4 -4
package/dist/addon/token.js
CHANGED
|
@@ -45,7 +45,7 @@ index_1.Token.prototype.caretPositionFromIndex =
|
|
|
45
45
|
if (index === undefined) {
|
|
46
46
|
return undefined;
|
|
47
47
|
}
|
|
48
|
-
const { length } =
|
|
48
|
+
const { length } = this.toString();
|
|
49
49
|
if (index >= length || index < -length) {
|
|
50
50
|
return undefined;
|
|
51
51
|
}
|
|
@@ -55,7 +55,7 @@ index_1.Token.prototype.caretPositionFromIndex =
|
|
|
55
55
|
const { childNodes } = self;
|
|
56
56
|
acc += self.getAttribute('padding');
|
|
57
57
|
for (let i = 0; acc <= index && i < childNodes.length; i++) {
|
|
58
|
-
const cur = childNodes[i], l =
|
|
58
|
+
const cur = childNodes[i], l = cur.toString().length;
|
|
59
59
|
acc += l;
|
|
60
60
|
if (acc > index) {
|
|
61
61
|
self = cur;
|
|
@@ -167,8 +167,7 @@ index_1.Token.prototype.redoQuotes =
|
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
169
|
const token = debug_1.Shadow.run(() => {
|
|
170
|
-
const node = new index_1.Token(
|
|
171
|
-
node.type = 'plain';
|
|
170
|
+
const node = new index_1.Token(this.toString(), this.getAttribute('config'), accum);
|
|
172
171
|
node.setAttribute('stage', 6);
|
|
173
172
|
return node.parse(7);
|
|
174
173
|
});
|
|
@@ -183,7 +182,7 @@ index_1.Token.prototype.solveConst =
|
|
|
183
182
|
if (type === 'arg' || type === 'magic-word' && magicWords.has(name)) {
|
|
184
183
|
let replace = '';
|
|
185
184
|
if (type === 'arg') {
|
|
186
|
-
replace = target.default === false ?
|
|
185
|
+
replace = target.default === false ? target.toString() : target.default;
|
|
187
186
|
}
|
|
188
187
|
else if (name === 'if' && !var1?.getElementByTypes('magic-word, template')) {
|
|
189
188
|
replace = String(childNodes[String(var1 ?? '').trim() ? 2 : 3] ?? '').trim();
|
package/dist/addon/transclude.js
CHANGED
|
@@ -167,13 +167,13 @@ transclude_1.TranscludeToken.prototype.escapeTables =
|
|
|
167
167
|
if (!/\n[^\S\n]*(?::+[^\S\n]*)?\{\|/u.test(this.text())) {
|
|
168
168
|
return this;
|
|
169
169
|
}
|
|
170
|
-
const stripped =
|
|
170
|
+
const stripped = this.toString().slice(2, -2), include = this.getAttribute('include'), config = this.getAttribute('config'), parsed = index_1.default.parse(stripped, include, 4, config), isTable = (0, debug_1.isToken)('table');
|
|
171
171
|
for (const table of parsed.childNodes) {
|
|
172
172
|
if (isTable(table)) {
|
|
173
173
|
table.escape();
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
|
-
const { firstChild, length } = index_1.default.parse(`{{${
|
|
176
|
+
const { firstChild, length } = index_1.default.parse(`{{${parsed.toString()}}}`, include, undefined, config);
|
|
177
177
|
if (length !== 1 || !(firstChild instanceof transclude_1.TranscludeToken)) {
|
|
178
178
|
throw new Error('转义表格失败!');
|
|
179
179
|
}
|
package/dist/base.d.ts
CHANGED
|
@@ -14,8 +14,8 @@ export interface Config {
|
|
|
14
14
|
readonly conversionTable?: [string, string][];
|
|
15
15
|
readonly redirects?: [string, string][];
|
|
16
16
|
}
|
|
17
|
-
export type TokenTypes = 'root' | 'plain' | 'redirect' | 'redirect-syntax' | 'redirect-target' | 'onlyinclude' | 'noinclude' | 'include' | 'comment' | 'ext' | 'ext-attrs' | 'ext-attr-dirty' | 'ext-attr' | 'attr-key' | 'attr-value' | 'ext-inner' | 'arg' | 'arg-name' | 'arg-default' | 'hidden' | 'magic-word' | 'magic-word-name' | 'invoke-function' | 'invoke-module' | 'template' | 'template-name' | 'parameter' | 'parameter-key' | 'parameter-value' | 'heading' | 'heading-title' | 'heading-trail' | 'html' | 'html-attrs' | 'html-attr-dirty' | 'html-attr' | 'table' | 'tr' | 'td' | 'table-syntax' | 'table-attrs' | 'table-attr-dirty' | 'table-attr' | 'table-inter' | 'td-inner' | 'hr' | 'double-underscore' | 'link' | 'link-target' | 'link-text' | 'category' | 'file' | 'gallery-image' | 'imagemap-image' | 'image-parameter' | 'quote' | 'ext-link' | 'ext-link-text' | 'ext-link-url' | 'free-ext-link' | 'list' | 'dd' | 'converter' | 'converter-flags' | 'converter-flag' | 'converter-rule' | 'converter-rule-variant' | 'converter-rule-to' | 'converter-rule-from' | 'param-line' | 'imagemap-link';
|
|
18
|
-
export declare const rules: readonly ["bold-header", "format-leakage", "fostered-content", "h1", "illegal-attr", "insecure-style", "invalid-gallery", "invalid-imagemap", "invalid-invoke", "lonely-apos", "lonely-bracket", "lonely-http", "nested-link", "no-arg", "no-duplicate", "no-ignored", "obsolete-attr", "obsolete-tag", "parsing-order", "pipe-like", "table-layout", "tag-like", "unbalanced-header", "unclosed-comment", "unclosed-quote", "unclosed-table", "unescaped", "unknown-page", "unmatched-tag", "unterminated-url", "url-encoding", "var-anchor", "void-ext"];
|
|
17
|
+
export type TokenTypes = 'root' | 'plain' | 'redirect' | 'redirect-syntax' | 'redirect-target' | 'onlyinclude' | 'noinclude' | 'include' | 'comment' | 'ext' | 'ext-attrs' | 'ext-attr-dirty' | 'ext-attr' | 'attr-key' | 'attr-value' | 'ext-inner' | 'arg' | 'arg-name' | 'arg-default' | 'hidden' | 'magic-word' | 'magic-word-name' | 'invoke-function' | 'invoke-module' | 'template' | 'template-name' | 'parameter' | 'parameter-key' | 'parameter-value' | 'heading' | 'heading-title' | 'heading-trail' | 'html' | 'html-attrs' | 'html-attr-dirty' | 'html-attr' | 'table' | 'tr' | 'td' | 'table-syntax' | 'table-attrs' | 'table-attr-dirty' | 'table-attr' | 'table-inter' | 'td-inner' | 'hr' | 'double-underscore' | 'link' | 'link-target' | 'link-text' | 'category' | 'file' | 'gallery-image' | 'imagemap-image' | 'image-parameter' | 'quote' | 'ext-link' | 'ext-link-text' | 'ext-link-url' | 'free-ext-link' | 'magic-link' | 'list' | 'dd' | 'converter' | 'converter-flags' | 'converter-flag' | 'converter-rule' | 'converter-rule-variant' | 'converter-rule-to' | 'converter-rule-from' | 'param-line' | 'imagemap-link';
|
|
18
|
+
export declare const rules: readonly ["bold-header", "format-leakage", "fostered-content", "h1", "illegal-attr", "insecure-style", "invalid-gallery", "invalid-imagemap", "invalid-invoke", "invalid-isbn", "lonely-apos", "lonely-bracket", "lonely-http", "nested-link", "no-arg", "no-duplicate", "no-ignored", "obsolete-attr", "obsolete-tag", "parsing-order", "pipe-like", "table-layout", "tag-like", "unbalanced-header", "unclosed-comment", "unclosed-quote", "unclosed-table", "unescaped", "unknown-page", "unmatched-tag", "unterminated-url", "url-encoding", "var-anchor", "void-ext"];
|
|
19
19
|
export declare namespace LintError {
|
|
20
20
|
type Severity = 'error' | 'warning';
|
|
21
21
|
type Rule = typeof rules[number];
|
package/dist/base.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { Title } from './lib/title';
|
|
|
3
3
|
import type { Token } from './internal';
|
|
4
4
|
declare interface Parser extends ParserBase {
|
|
5
5
|
rules: readonly LintError.Rule[];
|
|
6
|
+
viewOnly: boolean;
|
|
6
7
|
conversionTable: Map<string, string>;
|
|
7
8
|
redirects: Map<string, string>;
|
|
8
9
|
warning: boolean;
|
|
@@ -29,7 +30,4 @@ declare const Parser: Parser;
|
|
|
29
30
|
export = Parser;
|
|
30
31
|
export type { Config, LintError };
|
|
31
32
|
export type * from './internal';
|
|
32
|
-
declare global {
|
|
33
|
-
type Acceptable = unknown;
|
|
34
|
-
type PrintOpt = unknown;
|
|
35
|
-
}
|
|
33
|
+
declare global { type Acceptable = unknown; }
|
package/dist/index.js
CHANGED
|
@@ -21,6 +21,7 @@ const Parser = {
|
|
|
21
21
|
i18n: undefined,
|
|
22
22
|
rules: base_1.rules,
|
|
23
23
|
/* NOT FOR BROWSER */
|
|
24
|
+
viewOnly: false,
|
|
24
25
|
conversionTable: new Map(),
|
|
25
26
|
redirects: new Map(),
|
|
26
27
|
warning: true,
|
|
@@ -61,7 +62,11 @@ const Parser = {
|
|
|
61
62
|
return new Title(title, defaultNs, config, decode, selfLink);
|
|
62
63
|
}
|
|
63
64
|
const { Token } = require('./src/index');
|
|
64
|
-
const token = debug_1.Shadow.run(() =>
|
|
65
|
+
const token = debug_1.Shadow.run(() => {
|
|
66
|
+
const root = new Token(title, config);
|
|
67
|
+
root.type = 'root';
|
|
68
|
+
return root.parseOnce(0, include).parseOnce();
|
|
69
|
+
}), titleObj = new Title(token.toString(), defaultNs, config, decode, selfLink);
|
|
65
70
|
debug_1.Shadow.run(() => {
|
|
66
71
|
for (const key of ['main', 'fragment']) {
|
|
67
72
|
const str = titleObj[key];
|
|
@@ -82,13 +87,14 @@ const Parser = {
|
|
|
82
87
|
const { Token } = require('./src/index');
|
|
83
88
|
const root = debug_1.Shadow.run(() => {
|
|
84
89
|
const token = new Token(wikitext, config);
|
|
90
|
+
token.type = 'root';
|
|
85
91
|
try {
|
|
86
92
|
return token.parse(maxStage, include);
|
|
87
93
|
}
|
|
88
94
|
catch (e) {
|
|
89
95
|
if (e instanceof Error) {
|
|
90
96
|
const file = path.join(__dirname, '..', 'errors', new Date().toISOString()), stage = token.getAttribute('stage');
|
|
91
|
-
fs.writeFileSync(file, stage === constants_1.MAX_STAGE ? wikitext :
|
|
97
|
+
fs.writeFileSync(file, stage === constants_1.MAX_STAGE ? wikitext : token.toString());
|
|
92
98
|
fs.writeFileSync(`${file}.err`, e.stack);
|
|
93
99
|
fs.writeFileSync(`${file}.json`, JSON.stringify({ stage, include, config }, null, '\t'));
|
|
94
100
|
}
|
|
@@ -97,7 +103,7 @@ const Parser = {
|
|
|
97
103
|
});
|
|
98
104
|
/* NOT FOR BROWSER */
|
|
99
105
|
if (this.debugging) {
|
|
100
|
-
let restored =
|
|
106
|
+
let restored = root.toString(), process = 'parsing';
|
|
101
107
|
if (restored === wikitext) {
|
|
102
108
|
const entities = { lt: '<', gt: '>', amp: '&' };
|
|
103
109
|
restored = root.print().replace(/<[^<]+?>|&([lg]t|amp);/gu, (_, s) => s ? entities[s] : '');
|
|
@@ -176,6 +182,7 @@ const Parser = {
|
|
|
176
182
|
const { stage, include, config } = require(`${file}.json`), { Token } = require('./src/index');
|
|
177
183
|
return debug_1.Shadow.run(() => {
|
|
178
184
|
const halfParsed = stage < constants_1.MAX_STAGE, token = new Token(halfParsed ? wikitext : (0, string_1.tidy)(wikitext), config);
|
|
185
|
+
token.type = 'root';
|
|
179
186
|
if (halfParsed) {
|
|
180
187
|
token.setAttribute('stage', stage);
|
|
181
188
|
token.parseOnce(stage, include);
|
package/dist/lib/element.d.ts
CHANGED
|
@@ -78,17 +78,6 @@ export declare abstract class AstElement extends AstNode {
|
|
|
78
78
|
* @throws `RangeError` 对应位置的子节点不是文本节点
|
|
79
79
|
*/
|
|
80
80
|
setText(str: string, i?: number): string;
|
|
81
|
-
/**
|
|
82
|
-
* @override
|
|
83
|
-
* @param start
|
|
84
|
-
* @param re 用于`AstText`后代节点的正则表达式
|
|
85
|
-
*/
|
|
86
|
-
lint(start?: number, re?: RegExp): LintError[];
|
|
87
|
-
/**
|
|
88
|
-
* @override
|
|
89
|
-
* @param opt 选项
|
|
90
|
-
*/
|
|
91
|
-
print(opt?: PrintOpt): string;
|
|
92
81
|
/**
|
|
93
82
|
* 保存为JSON
|
|
94
83
|
* @param file 文件名
|
package/dist/lib/element.js
CHANGED
|
@@ -281,26 +281,21 @@ class AstElement extends node_1.AstNode {
|
|
|
281
281
|
toString(separator = '') {
|
|
282
282
|
return this.childNodes.map(String).join(separator);
|
|
283
283
|
}
|
|
284
|
-
/**
|
|
285
|
-
* @override
|
|
286
|
-
* @param start
|
|
287
|
-
* @param re 用于`AstText`后代节点的正则表达式
|
|
288
|
-
*/
|
|
284
|
+
/** @private */
|
|
289
285
|
lint(start = this.getAbsoluteIndex(), re) {
|
|
290
286
|
const errors = [];
|
|
291
287
|
for (let i = 0, cur = start + this.getAttribute('padding'); i < this.length; i++) {
|
|
292
288
|
const child = this.childNodes[i];
|
|
293
289
|
errors.push(...child.lint(cur, re));
|
|
294
|
-
cur +=
|
|
290
|
+
cur += child.toString().length + this.getGaps(i);
|
|
295
291
|
}
|
|
296
292
|
return errors;
|
|
297
293
|
}
|
|
298
|
-
/**
|
|
299
|
-
* @override
|
|
300
|
-
* @param opt 选项
|
|
301
|
-
*/
|
|
294
|
+
/** @private */
|
|
302
295
|
print(opt = {}) {
|
|
303
|
-
return
|
|
296
|
+
return this.toString()
|
|
297
|
+
? `<span class="wpb-${opt.class ?? this.type}">${(0, string_1.print)(this.childNodes, opt)}</span>`
|
|
298
|
+
: '';
|
|
304
299
|
}
|
|
305
300
|
/**
|
|
306
301
|
* 保存为JSON
|
|
@@ -310,11 +305,11 @@ class AstElement extends node_1.AstNode {
|
|
|
310
305
|
json(file, start = this.getAbsoluteIndex()) {
|
|
311
306
|
const json = {
|
|
312
307
|
...this,
|
|
313
|
-
range: [start, start +
|
|
308
|
+
range: [start, start + this.toString().length],
|
|
314
309
|
childNodes: [],
|
|
315
310
|
};
|
|
316
311
|
for (let i = 0, cur = start + this.getAttribute('padding'); i < this.length; i++) {
|
|
317
|
-
const child = this.childNodes[i], { length } =
|
|
312
|
+
const child = this.childNodes[i], { length } = child.toString();
|
|
318
313
|
if (child.type === 'text') {
|
|
319
314
|
json.childNodes.push({ data: child.data, range: [cur, cur + length] });
|
|
320
315
|
}
|
|
@@ -433,6 +428,7 @@ class AstElement extends node_1.AstNode {
|
|
|
433
428
|
case ':any-link':
|
|
434
429
|
return type === 'link'
|
|
435
430
|
|| type === 'free-ext-link'
|
|
431
|
+
|| type === 'magic-link'
|
|
436
432
|
|| type === 'ext-link'
|
|
437
433
|
|| (type === 'file' || type === 'gallery-image' && link);
|
|
438
434
|
case ':local-link':
|
package/dist/lib/node.d.ts
CHANGED
|
@@ -20,8 +20,8 @@ export declare abstract class AstNode implements AstNodeBase {
|
|
|
20
20
|
data?: string | undefined;
|
|
21
21
|
readonly childNodes: readonly AstNodes[];
|
|
22
22
|
abstract text(): string;
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
lint(): LintError[];
|
|
24
|
+
print(): string;
|
|
25
25
|
/** 首位子节点 */
|
|
26
26
|
get firstChild(): AstNodes | undefined;
|
|
27
27
|
/** 末位子节点 */
|
package/dist/lib/node.js
CHANGED
|
@@ -18,7 +18,7 @@ const getDimension = (str) => {
|
|
|
18
18
|
* @param j 子节点序号
|
|
19
19
|
* @param parent 父节点
|
|
20
20
|
*/
|
|
21
|
-
const getIndex = (j, parent) => parent.childNodes.slice(0, j).reduce((acc, cur, i) => acc +
|
|
21
|
+
const getIndex = (j, parent) => parent.childNodes.slice(0, j).reduce((acc, cur, i) => acc + cur.toString().length + parent.getGaps(i), 0)
|
|
22
22
|
+ parent.getAttribute('padding');
|
|
23
23
|
/* NOT FOR BROWSER */
|
|
24
24
|
/**
|
|
@@ -139,8 +139,8 @@ class AstNode {
|
|
|
139
139
|
for (let i = index - 1; i >= 0; i--) {
|
|
140
140
|
const child = childNodes[i];
|
|
141
141
|
if (isQuote(child)) {
|
|
142
|
-
bold = child.bold
|
|
143
|
-
italic = child.italic
|
|
142
|
+
bold = child.bold !== bold;
|
|
143
|
+
italic = child.italic !== italic;
|
|
144
144
|
}
|
|
145
145
|
else if (child.type === 'text' && child.data.includes('\n')) {
|
|
146
146
|
break;
|
package/dist/lib/range.js
CHANGED
|
@@ -351,7 +351,7 @@ class AstRange {
|
|
|
351
351
|
/** @private */
|
|
352
352
|
toString() {
|
|
353
353
|
const { startContainer, startIndex, endIndex } = this;
|
|
354
|
-
return
|
|
354
|
+
return startContainer.getRootNode().toString().slice(startIndex, endIndex);
|
|
355
355
|
}
|
|
356
356
|
/** 获取范围内的全部节点 */
|
|
357
357
|
extractContents() {
|
package/dist/lib/text.d.ts
CHANGED
|
@@ -12,20 +12,11 @@ export declare class AstText extends AstNode {
|
|
|
12
12
|
constructor(text: string);
|
|
13
13
|
/** 可见部分 */
|
|
14
14
|
text(): string;
|
|
15
|
-
/**
|
|
16
|
-
* @override
|
|
17
|
-
* @param start
|
|
18
|
-
* @param errorRegex 正则表达式
|
|
19
|
-
* @throws `Error` 孤立文本节点
|
|
20
|
-
*/
|
|
21
|
-
lint(start?: number, errorRegex?: RegExp): LintError[];
|
|
22
15
|
/**
|
|
23
16
|
* 替换字符串
|
|
24
17
|
* @param text 替换的字符串
|
|
25
18
|
*/
|
|
26
19
|
replaceData(text: string): void;
|
|
27
|
-
/** @override */
|
|
28
|
-
print(): string;
|
|
29
20
|
/** 复制 */
|
|
30
21
|
cloneNode(): AstText;
|
|
31
22
|
/**
|
package/dist/lib/text.js
CHANGED
|
@@ -110,12 +110,7 @@ class AstText extends node_1.AstNode {
|
|
|
110
110
|
text() {
|
|
111
111
|
return this.data;
|
|
112
112
|
}
|
|
113
|
-
/**
|
|
114
|
-
* @override
|
|
115
|
-
* @param start
|
|
116
|
-
* @param errorRegex 正则表达式
|
|
117
|
-
* @throws `Error` 孤立文本节点
|
|
118
|
-
*/
|
|
113
|
+
/** @private */
|
|
119
114
|
lint(start = this.getAbsoluteIndex(), errorRegex) {
|
|
120
115
|
const { data, parentNode, nextSibling, previousSibling } = this;
|
|
121
116
|
if (!parentNode) {
|
|
@@ -167,7 +162,7 @@ class AstText extends node_1.AstNode {
|
|
|
167
162
|
else if (char === 'h' && index === 0 && type === 'ext-link-text' && extImage.test(data)) {
|
|
168
163
|
continue;
|
|
169
164
|
}
|
|
170
|
-
const startIndex = start + index, endIndex = startIndex + length, rootStr =
|
|
165
|
+
const startIndex = start + index, endIndex = startIndex + length, rootStr = root.toString(), nextChar = rootStr[endIndex], previousChar = rootStr[startIndex - 1], severity = length > 1 && !(char === '<' && !/[\s/>]/u.test(nextChar ?? '')
|
|
171
166
|
|| isHtmlAttrVal && (char === '[' || char === ']'))
|
|
172
167
|
|| char === '{' && (nextChar === char || previousChar === '-')
|
|
173
168
|
|| char === '}' && (previousChar === char || nextChar === '-')
|
|
@@ -228,7 +223,7 @@ class AstText extends node_1.AstNode {
|
|
|
228
223
|
];
|
|
229
224
|
}
|
|
230
225
|
else if (char === '[' && type === 'ext-link-text') {
|
|
231
|
-
const i = parentNode.getAbsoluteIndex() +
|
|
226
|
+
const i = parentNode.getAbsoluteIndex() + parentNode.toString().length;
|
|
232
227
|
e.suggestions = [
|
|
233
228
|
{
|
|
234
229
|
desc: 'escape',
|
|
@@ -238,7 +233,7 @@ class AstText extends node_1.AstNode {
|
|
|
238
233
|
];
|
|
239
234
|
}
|
|
240
235
|
else if (char === ']' && previousType === 'free-ext-link' && severity === 'error') {
|
|
241
|
-
const i = start -
|
|
236
|
+
const i = start - previousSibling.toString().length;
|
|
242
237
|
e.fix = {
|
|
243
238
|
range: [i, i],
|
|
244
239
|
text: '[',
|
|
@@ -269,7 +264,7 @@ class AstText extends node_1.AstNode {
|
|
|
269
264
|
replaceData(text) {
|
|
270
265
|
this.#setData(text);
|
|
271
266
|
}
|
|
272
|
-
/** @
|
|
267
|
+
/** @private */
|
|
273
268
|
print() {
|
|
274
269
|
return (0, string_1.escape)(this.data);
|
|
275
270
|
}
|
package/dist/mixin/sol.js
CHANGED
|
@@ -14,7 +14,7 @@ const sol = (constructor, _) => {
|
|
|
14
14
|
#prependNewLine() {
|
|
15
15
|
const { previousVisibleSibling, parentNode, type } = this;
|
|
16
16
|
if (previousVisibleSibling) {
|
|
17
|
-
return
|
|
17
|
+
return previousVisibleSibling.toString().endsWith('\n') ? '' : '\n';
|
|
18
18
|
}
|
|
19
19
|
return parentNode?.type === 'root'
|
|
20
20
|
|| type !== 'heading' && parentNode?.type === 'ext-inner' && parentNode.name === 'poem'
|
package/dist/parser/braces.js
CHANGED
|
@@ -14,7 +14,16 @@ const arg_1 = require("../src/arg");
|
|
|
14
14
|
* @throws TranscludeToken.constructor()
|
|
15
15
|
*/
|
|
16
16
|
const parseBraces = (wikitext, config, accum) => {
|
|
17
|
-
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
18
|
+
/\{\{\s*([!=]|!!|\(!|!\)|!-)\s*\}\}(?!\})/gu;
|
|
19
|
+
const source = `${config.excludes?.includes('heading') ? '' : '^(\0\\d+c\x7F)*={1,6}|'}\\[\\[|\\{{2,}|-\\{(?!\\{)`, { parserFunction: [, , , subst] } = config, stack = [], closes = { '=': '\n', '{': '\\}{2,}|\\|', '-': '\\}-', '[': '\\]\\]' }, marks = new Map([['!', '!'], ['!!', '+'], ['(!', '{'], ['!)', '}'], ['!-', '-'], ['=', '~']]), re = new RegExp(`\\{\\{\\s*(${[...marks.keys()].map(string_1.escapeRegExp).join('|')})\\s*\\}\\}(?!\\})`, 'gu');
|
|
20
|
+
wikitext = wikitext.replace(re, (m, p1) => {
|
|
21
|
+
// @ts-expect-error abstract class
|
|
22
|
+
new transclude_1.TranscludeToken(m.slice(2, -2), [], config, accum);
|
|
23
|
+
return `\0${accum.length - 2}${marks.get(p1)}\x7F`;
|
|
24
|
+
});
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
26
|
+
/^(\0\d+c\x7F)*={1,6}|\[\[|\{{2,}|-\{(?!\{)|[\n|=]|\}{2,}|\}-|\]\]/gmu;
|
|
18
27
|
let regex = new RegExp(source, 'gmu'), mt = regex.exec(wikitext), moreBraces = wikitext.includes('}}'), lastIndex;
|
|
19
28
|
while (mt
|
|
20
29
|
|| lastIndex !== undefined && lastIndex <= wikitext.length && stack[stack.length - 1]?.[0]?.startsWith('=')) {
|
|
@@ -32,7 +32,7 @@ const parseExternalLinks = (wikitext, config, accum, inFile) => {
|
|
|
32
32
|
}
|
|
33
33
|
if (inFile) {
|
|
34
34
|
// @ts-expect-error abstract class
|
|
35
|
-
new magicLink_1.MagicLinkToken(url,
|
|
35
|
+
new magicLink_1.MagicLinkToken(url, 'ext-link-url', config, accum);
|
|
36
36
|
return `[\0${length}f\x7F${space}${text}]`;
|
|
37
37
|
}
|
|
38
38
|
// @ts-expect-error abstract class
|
|
@@ -13,29 +13,46 @@ const magicLink_1 = require("../src/magicLink");
|
|
|
13
13
|
const parseMagicLinks = (wikitext, config, accum) => {
|
|
14
14
|
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
15
15
|
/(^|[^\p{L}\d_])((?:\[[\da-f:.]+\]|[^[\]<>"\t\n\p{Zs}])(?:[^[\]<>"\0\t\n\p{Zs}]|\0\d+c\x7F)*)/giu;
|
|
16
|
-
const regex = new RegExp(
|
|
16
|
+
const space = '[\\p{Zs}\\t]| |�*160;|�*a0;', spdash = `(?:${space}|-)`, regex = new RegExp('(^|[^\\p{L}\\d_])' // lead
|
|
17
|
+
+ '(?:'
|
|
18
|
+
+ `(?:${config.protocol})(${string_1.extUrlCharFirst}${string_1.extUrlChar})` // free external link
|
|
19
|
+
+ '|'
|
|
20
|
+
+ `(?:RFC|PMID)(?:${space})+\\d+\\b` // RFC or PMID
|
|
21
|
+
+ '|'
|
|
22
|
+
+ `ISBN(?:${space})+(?:97[89]${spdash}?)?(?:\\d${spdash}?){9}[\\dx]\\b` // ISBN
|
|
23
|
+
+ ')', 'giu');
|
|
17
24
|
return wikitext.replace(regex, (m, lead, p1) => {
|
|
18
|
-
let
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (sepChars
|
|
28
|
-
correction =
|
|
25
|
+
let url = lead ? m.slice(lead.length) : m;
|
|
26
|
+
if (p1) {
|
|
27
|
+
let trail = '';
|
|
28
|
+
const m2 = /&(?:lt|gt|nbsp|#x0*(?:3[ce]|a0)|#0*(?:6[02]|160));/iu.exec(url);
|
|
29
|
+
if (m2) {
|
|
30
|
+
trail = url.slice(m2.index);
|
|
31
|
+
url = url.slice(0, m2.index);
|
|
32
|
+
}
|
|
33
|
+
const sep = new RegExp(`[,;\\\\.:!?${url.includes('(') ? '' : ')'}]+$`, 'u'), sepChars = sep.exec(url);
|
|
34
|
+
if (sepChars) {
|
|
35
|
+
let correction = 0;
|
|
36
|
+
if (sepChars[0].startsWith(';')
|
|
37
|
+
&& /&(?:[a-z]+|#x[\da-f]+|#\d+)$/iu.test(url.slice(0, sepChars.index))) {
|
|
38
|
+
correction = 1;
|
|
39
|
+
}
|
|
40
|
+
trail = url.slice(sepChars.index + correction) + trail;
|
|
41
|
+
url = url.slice(0, sepChars.index + correction);
|
|
42
|
+
}
|
|
43
|
+
if (trail.length >= p1.length) {
|
|
44
|
+
return m;
|
|
29
45
|
}
|
|
30
|
-
|
|
31
|
-
|
|
46
|
+
// @ts-expect-error abstract class
|
|
47
|
+
new magicLink_1.MagicLinkToken(url, undefined, config, accum);
|
|
48
|
+
return `${lead}\0${accum.length - 1}w\x7F${trail}`;
|
|
32
49
|
}
|
|
33
|
-
if (
|
|
50
|
+
else if (!/^(?:RFC|PMID|ISBN)/u.test(url)) {
|
|
34
51
|
return m;
|
|
35
52
|
}
|
|
36
53
|
// @ts-expect-error abstract class
|
|
37
|
-
new magicLink_1.MagicLinkToken(url,
|
|
38
|
-
return `${lead}\0${accum.length - 1}
|
|
54
|
+
new magicLink_1.MagicLinkToken(url, 'magic-link', config, accum);
|
|
55
|
+
return `${lead}\0${accum.length - 1}i\x7F`;
|
|
39
56
|
});
|
|
40
57
|
};
|
|
41
58
|
exports.parseMagicLinks = parseMagicLinks;
|
package/dist/parser/table.js
CHANGED
package/dist/src/arg.d.ts
CHANGED
|
@@ -25,10 +25,6 @@ export declare abstract class ArgToken extends Token {
|
|
|
25
25
|
/** @override */
|
|
26
26
|
text(): string;
|
|
27
27
|
/** @override */
|
|
28
|
-
lint(start?: number, re?: RegExp): LintError[];
|
|
29
|
-
/** @override */
|
|
30
|
-
print(): string;
|
|
31
|
-
/** @override */
|
|
32
28
|
json(): AST;
|
|
33
29
|
/** @override */
|
|
34
30
|
cloneNode(): this;
|
package/dist/src/arg.js
CHANGED
|
@@ -69,7 +69,7 @@ class ArgToken extends index_2.Token {
|
|
|
69
69
|
getGaps() {
|
|
70
70
|
return 1;
|
|
71
71
|
}
|
|
72
|
-
/** @
|
|
72
|
+
/** @private */
|
|
73
73
|
lint(start = this.getAbsoluteIndex(), re) {
|
|
74
74
|
const { childNodes: [argName, argDefault, ...rest] } = this;
|
|
75
75
|
if (!this.getAttribute('include')) {
|
|
@@ -84,7 +84,7 @@ class ArgToken extends index_2.Token {
|
|
|
84
84
|
}
|
|
85
85
|
const errors = argName.lint(start + 3, re);
|
|
86
86
|
if (argDefault) {
|
|
87
|
-
errors.push(...argDefault.lint(start + 4 +
|
|
87
|
+
errors.push(...argDefault.lint(start + 4 + argName.toString().length, re));
|
|
88
88
|
}
|
|
89
89
|
if (rest.length > 0) {
|
|
90
90
|
const rect = { start, ...this.getRootNode().posFromIndex(start) };
|
|
@@ -109,7 +109,7 @@ class ArgToken extends index_2.Token {
|
|
|
109
109
|
}
|
|
110
110
|
return errors;
|
|
111
111
|
}
|
|
112
|
-
/** @
|
|
112
|
+
/** @private */
|
|
113
113
|
print() {
|
|
114
114
|
return super.print({ pre: '{{{', post: '}}}', sep: '|' });
|
|
115
115
|
}
|
package/dist/src/attribute.d.ts
CHANGED
|
@@ -43,13 +43,9 @@ export declare abstract class AttributeToken extends Token {
|
|
|
43
43
|
constructor(type: AttributeTypes, tag: string, key: string, equal?: string, value?: string, quotes?: readonly [string?, string?], config?: Parser.Config, accum?: Token[]);
|
|
44
44
|
/** @override */
|
|
45
45
|
text(): string;
|
|
46
|
-
/** @override */
|
|
47
|
-
lint(start?: number, re?: RegExp): LintError[];
|
|
48
46
|
/** 获取属性值 */
|
|
49
47
|
getValue(): string | true;
|
|
50
48
|
/** @override */
|
|
51
|
-
print(): string;
|
|
52
|
-
/** @override */
|
|
53
49
|
cloneNode(): this;
|
|
54
50
|
/** 转义等号 */
|
|
55
51
|
escape(): void;
|
package/dist/src/attribute.js
CHANGED
|
@@ -330,7 +330,7 @@ let AttributeToken = (() => {
|
|
|
330
330
|
/** @private */
|
|
331
331
|
toString() {
|
|
332
332
|
const [quoteStart = '', quoteEnd = ''] = this.#quotes;
|
|
333
|
-
return this.#equal ? super.toString(this.#equal + quoteStart) + quoteEnd :
|
|
333
|
+
return this.#equal ? super.toString(this.#equal + quoteStart) + quoteEnd : this.firstChild.toString();
|
|
334
334
|
}
|
|
335
335
|
/** @override */
|
|
336
336
|
text() {
|
|
@@ -340,7 +340,7 @@ let AttributeToken = (() => {
|
|
|
340
340
|
getGaps() {
|
|
341
341
|
return this.#equal ? this.#equal.length + (this.#quotes[0]?.length ?? 0) : 0;
|
|
342
342
|
}
|
|
343
|
-
/** @
|
|
343
|
+
/** @private */
|
|
344
344
|
lint(start = this.getAbsoluteIndex(), re) {
|
|
345
345
|
const errors = super.lint(start, re), { balanced, firstChild, lastChild, type, name, tag } = this, value = this.getValue();
|
|
346
346
|
let rect;
|
|
@@ -414,7 +414,7 @@ let AttributeToken = (() => {
|
|
|
414
414
|
}
|
|
415
415
|
return this.type === 'ext-attr' || '';
|
|
416
416
|
}
|
|
417
|
-
/** @
|
|
417
|
+
/** @private */
|
|
418
418
|
print() {
|
|
419
419
|
const [quoteStart = '', quoteEnd = ''] = this.#quotes;
|
|
420
420
|
return this.#equal ? super.print({ sep: (0, string_1.escape)(this.#equal) + quoteStart, post: quoteEnd }) : super.print();
|
package/dist/src/attributes.d.ts
CHANGED
|
@@ -58,10 +58,6 @@ export declare abstract class AttributesToken extends Token {
|
|
|
58
58
|
* @param key 属性键
|
|
59
59
|
*/
|
|
60
60
|
getAttr(key: string): string | true | undefined;
|
|
61
|
-
/** @override */
|
|
62
|
-
lint(start?: number, re?: RegExp): LintError[];
|
|
63
|
-
/** @override */
|
|
64
|
-
print(): string;
|
|
65
61
|
/** 清理无效属性 */
|
|
66
62
|
sanitize(): void;
|
|
67
63
|
/** @override */
|
package/dist/src/attributes.js
CHANGED
|
@@ -143,7 +143,7 @@ class AttributesToken extends index_2.Token {
|
|
|
143
143
|
getAttr(key) {
|
|
144
144
|
return this.getAttrToken(key)?.getValue();
|
|
145
145
|
}
|
|
146
|
-
/** @
|
|
146
|
+
/** @private */
|
|
147
147
|
lint(start = this.getAbsoluteIndex(), re) {
|
|
148
148
|
const errors = super.lint(start, re), { parentNode, length, childNodes } = this, attrs = new Map(), duplicated = new Set();
|
|
149
149
|
let rect;
|
|
@@ -186,9 +186,9 @@ class AttributesToken extends index_2.Token {
|
|
|
186
186
|
}
|
|
187
187
|
return errors;
|
|
188
188
|
}
|
|
189
|
-
/** @
|
|
189
|
+
/** @private */
|
|
190
190
|
print() {
|
|
191
|
-
return
|
|
191
|
+
return this.toString()
|
|
192
192
|
? `<span class="wpb-${this.type}">${this.childNodes.map(child => child.print(child instanceof atom_1.AtomToken ? { class: 'attr-dirty' } : undefined)).join('')}</span>`
|
|
193
193
|
: '';
|
|
194
194
|
}
|
|
@@ -226,7 +226,7 @@ class AttributesToken extends index_2.Token {
|
|
|
226
226
|
*/
|
|
227
227
|
insertAt(token, i = this.length) {
|
|
228
228
|
if (!(token instanceof attribute_1.AttributeToken)) {
|
|
229
|
-
if (
|
|
229
|
+
if (token.toString().trim()) {
|
|
230
230
|
this.constructorError('只能插入 AttributeToken');
|
|
231
231
|
}
|
|
232
232
|
return super.insertAt(token, i);
|
|
@@ -248,10 +248,10 @@ class AttributesToken extends index_2.Token {
|
|
|
248
248
|
}
|
|
249
249
|
super.insertAt(token, i);
|
|
250
250
|
const { previousVisibleSibling, nextVisibleSibling } = token, type = toDirty(this.type), config = this.getAttribute('config'), acceptable = { [`Stage-${stages[this.type]}`]: ':' };
|
|
251
|
-
if (nextVisibleSibling && !/^\s/u.test(
|
|
251
|
+
if (nextVisibleSibling && !/^\s/u.test(nextVisibleSibling.toString())) {
|
|
252
252
|
super.insertAt(debug_1.Shadow.run(() => new atom_1.AtomToken(' ', type, config, [], acceptable)), i + 1);
|
|
253
253
|
}
|
|
254
|
-
if (previousVisibleSibling && !/\s$/u.test(
|
|
254
|
+
if (previousVisibleSibling && !/\s$/u.test(previousVisibleSibling.toString())) {
|
|
255
255
|
super.insertAt(debug_1.Shadow.run(() => new atom_1.AtomToken(' ', type, config, [], acceptable)), i);
|
|
256
256
|
}
|
|
257
257
|
return token;
|
package/dist/src/converter.d.ts
CHANGED
package/dist/src/converter.js
CHANGED
|
@@ -94,7 +94,7 @@ let ConverterToken = (() => {
|
|
|
94
94
|
/** @private */
|
|
95
95
|
toString() {
|
|
96
96
|
const { childNodes: [flags, ...rules] } = this;
|
|
97
|
-
return `-{${
|
|
97
|
+
return `-{${flags.toString()}${flags.length > 0 ? '|' : ''}${rules.map(String).join(';')}}-`;
|
|
98
98
|
}
|
|
99
99
|
/** @override */
|
|
100
100
|
text() {
|
|
@@ -109,7 +109,7 @@ let ConverterToken = (() => {
|
|
|
109
109
|
getGaps(i) {
|
|
110
110
|
return i || this.firstChild.length > 0 ? 1 : 0;
|
|
111
111
|
}
|
|
112
|
-
/** @
|
|
112
|
+
/** @private */
|
|
113
113
|
print() {
|
|
114
114
|
const { childNodes: [flags, ...rules] } = this;
|
|
115
115
|
return `<span class="wpb-converter">-{${flags.print()}${flags.length > 0 ? '|' : ''}${(0, string_1.print)(rules, { sep: ';' })}}-</span>`;
|
|
@@ -34,10 +34,6 @@ export declare abstract class ConverterFlagsToken extends Token {
|
|
|
34
34
|
/** 获取指定语言变体的转换标记 */
|
|
35
35
|
getVariantFlags(): Set<string>;
|
|
36
36
|
/** @override */
|
|
37
|
-
lint(start?: number, re?: RegExp): LintError[];
|
|
38
|
-
/** @override */
|
|
39
|
-
print(): string;
|
|
40
|
-
/** @override */
|
|
41
37
|
cloneNode(): this;
|
|
42
38
|
/**
|
|
43
39
|
* @override
|