wikilint 2.8.0 → 2.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/base.d.ts +2 -2
- package/dist/base.js +1 -0
- package/dist/index.d.ts +1 -3
- package/dist/index.js +7 -2
- package/dist/lib/element.d.ts +0 -6
- package/dist/lib/element.js +2 -6
- package/dist/lib/node.d.ts +1 -1
- package/dist/lib/node.js +1 -1
- package/dist/lib/text.d.ts +0 -6
- package/dist/lib/text.js +4 -8
- 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 -2
- package/dist/src/arg.js +2 -2
- package/dist/src/attribute.d.ts +0 -2
- package/dist/src/attribute.js +2 -2
- package/dist/src/attributes.d.ts +0 -2
- package/dist/src/attributes.js +1 -1
- package/dist/src/converter.js +1 -1
- package/dist/src/converterFlags.d.ts +0 -2
- package/dist/src/converterFlags.js +1 -1
- package/dist/src/converterRule.js +1 -1
- package/dist/src/extLink.d.ts +0 -2
- package/dist/src/extLink.js +2 -2
- package/dist/src/gallery.d.ts +0 -2
- package/dist/src/gallery.js +2 -2
- package/dist/src/heading.d.ts +0 -2
- package/dist/src/heading.js +3 -3
- package/dist/src/html.d.ts +0 -2
- package/dist/src/html.js +2 -2
- package/dist/src/imageParameter.d.ts +0 -2
- package/dist/src/imageParameter.js +1 -1
- package/dist/src/imagemap.d.ts +0 -2
- package/dist/src/imagemap.js +2 -2
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +29 -15
- package/dist/src/link/base.d.ts +0 -2
- package/dist/src/link/base.js +1 -1
- 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 +2 -3
- 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 +7 -5
- package/dist/src/magicLink.js +37 -5
- package/dist/src/nested.d.ts +0 -2
- package/dist/src/nested.js +3 -3
- package/dist/src/nowiki/comment.d.ts +0 -2
- package/dist/src/nowiki/comment.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/paramTag/index.d.ts +0 -2
- package/dist/src/paramTag/index.js +2 -2
- package/dist/src/parameter.d.ts +0 -2
- package/dist/src/parameter.js +2 -2
- package/dist/src/pre.d.ts +0 -2
- package/dist/src/pre.js +1 -1
- package/dist/src/redirect.d.ts +0 -4
- package/dist/src/redirect.js +3 -3
- package/dist/src/syntax.d.ts +0 -2
- package/dist/src/syntax.js +1 -1
- package/dist/src/table/index.d.ts +0 -2
- package/dist/src/table/index.js +1 -1
- package/dist/src/table/td.d.ts +0 -2
- package/dist/src/table/td.js +2 -2
- 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 +1 -1
- package/dist/src/tagPair/include.d.ts +0 -2
- package/dist/src/tagPair/include.js +1 -1
- package/dist/src/tagPair/index.js +2 -2
- package/dist/src/transclude.d.ts +0 -2
- package/dist/src/transclude.js +2 -2
- 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/src/index.js
CHANGED
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
// e: ExtToken
|
|
29
29
|
// f: MagicLinkToken inside ImageParameterToken
|
|
30
30
|
// h: HeadingToken
|
|
31
|
+
// i: RFC/PMID/ISBN
|
|
31
32
|
// l: LinkToken
|
|
32
33
|
// m: `{{fullurl:}}`、`{{canonicalurl:}}`或`{{filepath:}}`
|
|
33
34
|
// q: QuoteToken
|
|
@@ -51,13 +52,15 @@ const text_1 = require("../lib/text");
|
|
|
51
52
|
* @classdesc `{childNodes: ...(AstText|Token)}`
|
|
52
53
|
*/
|
|
53
54
|
class Token extends element_1.AstElement {
|
|
54
|
-
type = '
|
|
55
|
+
type = 'plain';
|
|
55
56
|
/** 解析阶段,参见顶部注释。只对plain Token有意义。 */
|
|
56
57
|
#stage = 0;
|
|
57
58
|
#config;
|
|
58
59
|
/** 这个数组起两个作用:1. 数组中的Token会在build时替换`/\0\d+.\x7F/`标记;2. 数组中的Token会依次执行parseOnce和build方法。 */
|
|
59
60
|
#accum;
|
|
60
61
|
#include;
|
|
62
|
+
#built = false;
|
|
63
|
+
#string;
|
|
61
64
|
/** @class */
|
|
62
65
|
constructor(wikitext, config = index_1.default.getConfig(), accum = [], acceptable) {
|
|
63
66
|
super();
|
|
@@ -165,6 +168,7 @@ class Token extends element_1.AstElement {
|
|
|
165
168
|
token.afterBuild();
|
|
166
169
|
}
|
|
167
170
|
}
|
|
171
|
+
this.#built = true;
|
|
168
172
|
}
|
|
169
173
|
/** @private */
|
|
170
174
|
parse(n = constants_1.MAX_STAGE, include) {
|
|
@@ -181,7 +185,7 @@ class Token extends element_1.AstElement {
|
|
|
181
185
|
/** 解析重定向 */
|
|
182
186
|
#parseRedirect() {
|
|
183
187
|
const { parseRedirect } = require('../parser/redirect');
|
|
184
|
-
const wikitext =
|
|
188
|
+
const wikitext = this.firstChild.toString(), parsed = parseRedirect(wikitext, this.#config, this.#accum);
|
|
185
189
|
if (parsed) {
|
|
186
190
|
this.setText(parsed);
|
|
187
191
|
}
|
|
@@ -193,12 +197,12 @@ class Token extends element_1.AstElement {
|
|
|
193
197
|
*/
|
|
194
198
|
#parseCommentAndExt(includeOnly) {
|
|
195
199
|
const { parseCommentAndExt } = require('../parser/commentAndExt');
|
|
196
|
-
this.setText(parseCommentAndExt(
|
|
200
|
+
this.setText(parseCommentAndExt(this.firstChild.toString(), this.#config, this.#accum, includeOnly));
|
|
197
201
|
}
|
|
198
202
|
/** 解析花括号 */
|
|
199
203
|
#parseBraces() {
|
|
200
204
|
const { parseBraces } = require('../parser/braces');
|
|
201
|
-
const str = this.type === 'root' ?
|
|
205
|
+
const str = this.type === 'root' ? this.firstChild.toString() : `\0${this.firstChild.toString()}`, parsed = parseBraces(str, this.#config, this.#accum);
|
|
202
206
|
this.setText(this.type === 'root' ? parsed : parsed.slice(1));
|
|
203
207
|
}
|
|
204
208
|
/** 解析HTML标签 */
|
|
@@ -207,7 +211,7 @@ class Token extends element_1.AstElement {
|
|
|
207
211
|
return;
|
|
208
212
|
}
|
|
209
213
|
const { parseHtml } = require('../parser/html');
|
|
210
|
-
this.setText(parseHtml(
|
|
214
|
+
this.setText(parseHtml(this.firstChild.toString(), this.#config, this.#accum));
|
|
211
215
|
}
|
|
212
216
|
/** 解析表格 */
|
|
213
217
|
#parseTable() {
|
|
@@ -228,7 +232,7 @@ class Token extends element_1.AstElement {
|
|
|
228
232
|
/** 解析内部链接 */
|
|
229
233
|
#parseLinks() {
|
|
230
234
|
const { parseLinks } = require('../parser/links');
|
|
231
|
-
this.setText(parseLinks(
|
|
235
|
+
this.setText(parseLinks(this.firstChild.toString(), this.#config, this.#accum));
|
|
232
236
|
}
|
|
233
237
|
/** 解析单引号 */
|
|
234
238
|
#parseQuotes() {
|
|
@@ -236,7 +240,7 @@ class Token extends element_1.AstElement {
|
|
|
236
240
|
return;
|
|
237
241
|
}
|
|
238
242
|
const { parseQuotes } = require('../parser/quotes');
|
|
239
|
-
const lines =
|
|
243
|
+
const lines = this.firstChild.toString().split('\n');
|
|
240
244
|
for (let i = 0; i < lines.length; i++) {
|
|
241
245
|
lines[i] = parseQuotes(lines[i], this.#config, this.#accum);
|
|
242
246
|
}
|
|
@@ -248,7 +252,7 @@ class Token extends element_1.AstElement {
|
|
|
248
252
|
return;
|
|
249
253
|
}
|
|
250
254
|
const { parseExternalLinks } = require('../parser/externalLinks');
|
|
251
|
-
this.setText(parseExternalLinks(
|
|
255
|
+
this.setText(parseExternalLinks(this.firstChild.toString(), this.#config, this.#accum));
|
|
252
256
|
}
|
|
253
257
|
/** 解析自由外链 */
|
|
254
258
|
#parseMagicLinks() {
|
|
@@ -256,7 +260,7 @@ class Token extends element_1.AstElement {
|
|
|
256
260
|
return;
|
|
257
261
|
}
|
|
258
262
|
const { parseMagicLinks } = require('../parser/magicLinks');
|
|
259
|
-
this.setText(parseMagicLinks(
|
|
263
|
+
this.setText(parseMagicLinks(this.firstChild.toString(), this.#config, this.#accum));
|
|
260
264
|
}
|
|
261
265
|
/** 解析列表 */
|
|
262
266
|
#parseList() {
|
|
@@ -264,7 +268,7 @@ class Token extends element_1.AstElement {
|
|
|
264
268
|
return;
|
|
265
269
|
}
|
|
266
270
|
const { parseList } = require('../parser/list');
|
|
267
|
-
const lines =
|
|
271
|
+
const lines = this.firstChild.toString().split('\n');
|
|
268
272
|
let i = this.type === 'root' || this.type === 'ext-inner' && this.name === 'poem' ? 0 : 1;
|
|
269
273
|
for (; i < lines.length; i++) {
|
|
270
274
|
lines[i] = parseList(lines[i], this.#config, this.#accum);
|
|
@@ -275,7 +279,7 @@ class Token extends element_1.AstElement {
|
|
|
275
279
|
#parseConverter() {
|
|
276
280
|
if (this.#config.variants.length > 0) {
|
|
277
281
|
const { parseConverter } = require('../parser/converter');
|
|
278
|
-
this.setText(parseConverter(
|
|
282
|
+
this.setText(parseConverter(this.firstChild.toString(), this.#config, this.#accum));
|
|
279
283
|
}
|
|
280
284
|
}
|
|
281
285
|
/** @private */
|
|
@@ -330,9 +334,9 @@ class Token extends element_1.AstElement {
|
|
|
330
334
|
normalizeTitle(title, defaultNs = 0, halfParsed, decode, selfLink) {
|
|
331
335
|
return index_1.default.normalizeTitle(title, defaultNs, this.#include, this.#config, halfParsed, decode, selfLink);
|
|
332
336
|
}
|
|
333
|
-
/** @
|
|
337
|
+
/** @private */
|
|
334
338
|
lint(start = this.getAbsoluteIndex(), re) {
|
|
335
|
-
|
|
339
|
+
let errors = super.lint(start, re);
|
|
336
340
|
if (this.type === 'root') {
|
|
337
341
|
const record = {};
|
|
338
342
|
for (const cat of this.querySelectorAll('category')) {
|
|
@@ -359,7 +363,7 @@ class Token extends element_1.AstElement {
|
|
|
359
363
|
}));
|
|
360
364
|
}
|
|
361
365
|
}
|
|
362
|
-
const regex = /<!--\s*lint-(disable(?:(?:-next)?-line)?|enable)(\s[\sa-z,-]*)?-->/gu, wikitext =
|
|
366
|
+
const regex = /<!--\s*lint-(disable(?:(?:-next)?-line)?|enable)(\s[\sa-z,-]*)?-->/gu, wikitext = this.toString(), ignores = [];
|
|
363
367
|
let mt = regex.exec(wikitext), last = 0, curLine = 0;
|
|
364
368
|
while (mt) {
|
|
365
369
|
const { 1: type, index } = mt, detail = mt[2]?.trim();
|
|
@@ -373,7 +377,7 @@ class Token extends element_1.AstElement {
|
|
|
373
377
|
});
|
|
374
378
|
mt = regex.exec(wikitext);
|
|
375
379
|
}
|
|
376
|
-
|
|
380
|
+
errors = errors.filter(({ rule, startLine, startIndex }) => {
|
|
377
381
|
const nearest = { pos: 0 };
|
|
378
382
|
for (const { line, from, to, rules } of ignores) {
|
|
379
383
|
if (line > startLine + 1) {
|
|
@@ -399,5 +403,15 @@ class Token extends element_1.AstElement {
|
|
|
399
403
|
}
|
|
400
404
|
return errors;
|
|
401
405
|
}
|
|
406
|
+
/** @override */
|
|
407
|
+
toString(separator) {
|
|
408
|
+
const root = this.getRootNode();
|
|
409
|
+
if (root.type === 'root'
|
|
410
|
+
&& root.#built) {
|
|
411
|
+
this.#string ??= super.toString(separator);
|
|
412
|
+
return this.#string;
|
|
413
|
+
}
|
|
414
|
+
return super.toString(separator);
|
|
415
|
+
}
|
|
402
416
|
}
|
|
403
417
|
exports.Token = Token;
|
package/dist/src/link/base.d.ts
CHANGED
|
@@ -22,6 +22,4 @@ export declare abstract class LinkBaseToken extends Token {
|
|
|
22
22
|
constructor(link: string, linkText?: string, config?: Parser.Config, accum?: Token[], delimiter?: string);
|
|
23
23
|
/** @override */
|
|
24
24
|
text(): string;
|
|
25
|
-
/** @override */
|
|
26
|
-
lint(start?: number, re?: RegExp): LintError[];
|
|
27
25
|
}
|
package/dist/src/link/base.js
CHANGED
|
@@ -71,7 +71,7 @@ class LinkBaseToken extends index_2.Token {
|
|
|
71
71
|
getGaps(i) {
|
|
72
72
|
return i === 0 ? this.#delimiter.length : 1;
|
|
73
73
|
}
|
|
74
|
-
/** @
|
|
74
|
+
/** @private */
|
|
75
75
|
lint(start = this.getAbsoluteIndex(), re) {
|
|
76
76
|
const errors = super.lint(start, re), { childNodes: [target, linkText], type: linkType } = this, { encoded, fragment } = this.#title;
|
|
77
77
|
let rect;
|
package/dist/src/link/file.d.ts
CHANGED
|
@@ -20,8 +20,6 @@ export declare abstract class FileToken extends LinkBaseToken {
|
|
|
20
20
|
* @param delimiter `|`
|
|
21
21
|
*/
|
|
22
22
|
constructor(link: string, text?: string, config?: Parser.Config, accum?: Token[], delimiter?: string);
|
|
23
|
-
/** @override */
|
|
24
|
-
lint(start?: number, re?: RegExp): LintError[];
|
|
25
23
|
/** 获取所有图片参数节点 */
|
|
26
24
|
getAllArgs(): ImageParameterToken[];
|
|
27
25
|
/**
|
package/dist/src/link/file.js
CHANGED
|
@@ -56,7 +56,7 @@ class FileToken extends base_1.LinkBaseToken {
|
|
|
56
56
|
// @ts-expect-error abstract class
|
|
57
57
|
part => new imageParameter_1.ImageParameterToken(part, extension, config, accum)));
|
|
58
58
|
}
|
|
59
|
-
/** @
|
|
59
|
+
/** @private */
|
|
60
60
|
lint(start = this.getAbsoluteIndex(), re) {
|
|
61
61
|
const errors = super.lint(start, re), args = this.getAllArgs().filter(({ childNodes }) => {
|
|
62
62
|
const visibleNodes = childNodes.filter(node => node.text().trim());
|
|
@@ -14,7 +14,5 @@ export declare abstract class GalleryImageToken extends FileToken {
|
|
|
14
14
|
* @param text 图片参数
|
|
15
15
|
*/
|
|
16
16
|
constructor(type: GalleryTypes, link: string, text?: string, config?: Parser.Config, accum?: Token[]);
|
|
17
|
-
/** @override */
|
|
18
|
-
lint(start?: number, re?: RegExp): LintError[];
|
|
19
17
|
}
|
|
20
18
|
export {};
|
|
@@ -18,7 +18,6 @@ class GalleryImageToken extends file_1.FileToken {
|
|
|
18
18
|
if (text !== undefined) {
|
|
19
19
|
const { length } = accum;
|
|
20
20
|
token = new index_2.Token(text, config, accum);
|
|
21
|
-
token.type = 'plain';
|
|
22
21
|
for (let n = 1; n < constants_1.MAX_STAGE; n++) {
|
|
23
22
|
token.parseOnce();
|
|
24
23
|
}
|
|
@@ -31,13 +30,13 @@ class GalleryImageToken extends file_1.FileToken {
|
|
|
31
30
|
/** @private */
|
|
32
31
|
getTitle() {
|
|
33
32
|
const imagemap = this.type === 'imagemap-image';
|
|
34
|
-
return this.normalizeTitle(
|
|
33
|
+
return this.normalizeTitle(this.firstChild.toString(), imagemap ? 0 : 6, true, !imagemap);
|
|
35
34
|
}
|
|
36
35
|
/** @private */
|
|
37
36
|
getAttribute(key) {
|
|
38
37
|
return key === 'padding' ? 0 : super.getAttribute(key);
|
|
39
38
|
}
|
|
40
|
-
/** @
|
|
39
|
+
/** @private */
|
|
41
40
|
lint(start = this.getAbsoluteIndex(), re) {
|
|
42
41
|
const errors = super.lint(start, re), { ns, interwiki } = this.getAttribute('title');
|
|
43
42
|
if (interwiki || ns !== 6) {
|
package/dist/src/link/index.d.ts
CHANGED
|
@@ -8,6 +8,4 @@ import type { Token, AtomToken } from '../../internal';
|
|
|
8
8
|
export declare abstract class LinkToken extends LinkBaseToken {
|
|
9
9
|
readonly type = "link";
|
|
10
10
|
readonly childNodes: readonly [AtomToken] | readonly [AtomToken, Token];
|
|
11
|
-
/** @override */
|
|
12
|
-
lint(start?: number, re?: RegExp): LintError[];
|
|
13
11
|
}
|
package/dist/src/link/index.js
CHANGED
|
@@ -9,7 +9,7 @@ const base_1 = require("./base");
|
|
|
9
9
|
*/
|
|
10
10
|
class LinkToken extends base_1.LinkBaseToken {
|
|
11
11
|
type = 'link';
|
|
12
|
-
/** @
|
|
12
|
+
/** @private */
|
|
13
13
|
lint(start = this.getAbsoluteIndex(), re) {
|
|
14
14
|
const errors = super.lint(start, re);
|
|
15
15
|
if (this.closest('ext-link-text')) {
|
|
@@ -25,13 +25,13 @@ class RedirectTargetToken extends base_1.LinkBaseToken {
|
|
|
25
25
|
}
|
|
26
26
|
/** @private */
|
|
27
27
|
getTitle() {
|
|
28
|
-
return this.normalizeTitle(
|
|
28
|
+
return this.normalizeTitle(this.firstChild.toString(), 0, true, true);
|
|
29
29
|
}
|
|
30
30
|
/** @override */
|
|
31
31
|
text() {
|
|
32
|
-
return `[[${
|
|
32
|
+
return `[[${this.firstChild.toString()}]]`;
|
|
33
33
|
}
|
|
34
|
-
/** @
|
|
34
|
+
/** @private */
|
|
35
35
|
lint(start = this.getAbsoluteIndex()) {
|
|
36
36
|
const errors = super.lint(start, /\]\]/u);
|
|
37
37
|
if (this.length === 2) {
|
package/dist/src/magicLink.d.ts
CHANGED
|
@@ -2,20 +2,22 @@ import Parser from '../index';
|
|
|
2
2
|
import { Token } from './index';
|
|
3
3
|
import type { LintError } from '../base';
|
|
4
4
|
import type { AstText, CommentToken, IncludeToken, NoincludeToken, TranscludeToken } from '../internal';
|
|
5
|
+
declare type ExtLinkTypes = 'free-ext-link' | 'ext-link-url' | 'magic-link';
|
|
5
6
|
/**
|
|
6
7
|
* 自由外链
|
|
7
8
|
* @classdesc `{childNodes: ...AstText|CommentToken|IncludeToken|NoincludeToken}`
|
|
8
9
|
*/
|
|
9
10
|
export declare abstract class MagicLinkToken extends Token {
|
|
10
|
-
type:
|
|
11
|
+
type: ExtLinkTypes;
|
|
11
12
|
readonly childNodes: readonly (AstText | CommentToken | IncludeToken | NoincludeToken | TranscludeToken)[];
|
|
12
13
|
abstract get firstChild(): AstText | TranscludeToken;
|
|
13
14
|
abstract get lastChild(): AstText | CommentToken | IncludeToken | NoincludeToken | TranscludeToken;
|
|
15
|
+
/** 和内链保持一致 */
|
|
16
|
+
get link(): string;
|
|
14
17
|
/**
|
|
15
18
|
* @param url 网址
|
|
16
|
-
* @param
|
|
19
|
+
* @param type 类型
|
|
17
20
|
*/
|
|
18
|
-
constructor(url?: string,
|
|
19
|
-
/** @override */
|
|
20
|
-
lint(start?: number, re?: RegExp): LintError[];
|
|
21
|
+
constructor(url?: string, type?: ExtLinkTypes, config?: Parser.Config, accum?: Token[]);
|
|
21
22
|
}
|
|
23
|
+
export {};
|
package/dist/src/magicLink.js
CHANGED
|
@@ -2,25 +2,57 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MagicLinkToken = void 0;
|
|
4
4
|
const lint_1 = require("../util/lint");
|
|
5
|
+
const string_1 = require("../util/string");
|
|
5
6
|
const index_1 = require("../index");
|
|
6
7
|
const index_2 = require("./index");
|
|
8
|
+
const space = '(?:[\\p{Zs}\\t]| |�*160;|&#[xX]0*[aA]0;)';
|
|
7
9
|
/**
|
|
8
10
|
* 自由外链
|
|
9
11
|
* @classdesc `{childNodes: ...AstText|CommentToken|IncludeToken|NoincludeToken}`
|
|
10
12
|
*/
|
|
11
13
|
class MagicLinkToken extends index_2.Token {
|
|
14
|
+
/** 和内链保持一致 */
|
|
15
|
+
get link() {
|
|
16
|
+
const map = { '!': '|', '=': '=' };
|
|
17
|
+
let link = (0, string_1.text)(this.childNodes.map(child => {
|
|
18
|
+
const { type, name } = child;
|
|
19
|
+
return type === 'magic-word' && String(name) in map ? map[name] : child;
|
|
20
|
+
}));
|
|
21
|
+
if (this.type === 'magic-link') {
|
|
22
|
+
link = link.replace(new RegExp(`${space}+`, 'gu'), ' ');
|
|
23
|
+
if (link.startsWith('ISBN')) {
|
|
24
|
+
link = `ISBN ${link.slice(5).replace(/[- ]/gu, '').replace(/x$/u, 'X')}`;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return link;
|
|
28
|
+
}
|
|
12
29
|
/**
|
|
13
30
|
* @param url 网址
|
|
14
|
-
* @param
|
|
31
|
+
* @param type 类型
|
|
15
32
|
*/
|
|
16
|
-
constructor(url,
|
|
33
|
+
constructor(url, type = 'free-ext-link', config = index_1.default.getConfig(), accum = []) {
|
|
17
34
|
super(url, config, accum, {});
|
|
18
|
-
this.type =
|
|
35
|
+
this.type = type;
|
|
19
36
|
}
|
|
20
|
-
/** @
|
|
37
|
+
/** @private */
|
|
21
38
|
lint(start = this.getAbsoluteIndex(), re) {
|
|
22
|
-
const errors = super.lint(start, re)
|
|
39
|
+
const errors = super.lint(start, re);
|
|
23
40
|
let rect;
|
|
41
|
+
if (this.type === 'magic-link') {
|
|
42
|
+
const { link } = this;
|
|
43
|
+
if (link.startsWith('ISBN')) {
|
|
44
|
+
// eslint-disable-next-line unicorn/no-useless-spread
|
|
45
|
+
const digits = [...link.slice(5)].map(s => s === 'X' ? 10 : Number(s));
|
|
46
|
+
if (digits.length === 10 && digits.reduce((sum, d, i) => sum + d * (10 - i), 0) % 11
|
|
47
|
+
|| digits.length === 13 && (digits[12] === 10
|
|
48
|
+
|| digits.reduce((sum, d, i) => sum + d * (i % 2 ? 3 : 1), 0) % 10)) {
|
|
49
|
+
rect = { start, ...this.getRootNode().posFromIndex(start) };
|
|
50
|
+
errors.push((0, lint_1.generateForSelf)(this, rect, 'invalid-isbn', 'invalid ISBN'));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return errors;
|
|
54
|
+
}
|
|
55
|
+
const source = `[,;。:!?()]+${this.type === 'ext-link-url' ? '|\\|+' : ''}`, regex = new RegExp(source, 'u'), regexGlobal = new RegExp(source, 'gu');
|
|
24
56
|
for (const child of this.childNodes) {
|
|
25
57
|
const { type, data } = child;
|
|
26
58
|
if (type !== 'text' || !regex.test(data)) {
|
package/dist/src/nested.d.ts
CHANGED
|
@@ -23,6 +23,4 @@ export declare abstract class NestedToken extends Token {
|
|
|
23
23
|
* @param tags 内层标签名
|
|
24
24
|
*/
|
|
25
25
|
constructor(wikitext: string | undefined, regex: RegExp, tags: readonly string[], config?: Parser.Config, accum?: Token[]);
|
|
26
|
-
/** @override */
|
|
27
|
-
lint(start?: number, re?: RegExp): LintError[];
|
|
28
26
|
}
|
package/dist/src/nested.js
CHANGED
|
@@ -37,7 +37,7 @@ class NestedToken extends index_2.Token {
|
|
|
37
37
|
});
|
|
38
38
|
super(wikitext, config, accum, {});
|
|
39
39
|
}
|
|
40
|
-
/** @
|
|
40
|
+
/** @private */
|
|
41
41
|
lint(start = this.getAbsoluteIndex(), re) {
|
|
42
42
|
let rect;
|
|
43
43
|
return [
|
|
@@ -46,7 +46,7 @@ class NestedToken extends index_2.Token {
|
|
|
46
46
|
if (child.type === 'ext' || child.type === 'comment') {
|
|
47
47
|
return false;
|
|
48
48
|
}
|
|
49
|
-
const str =
|
|
49
|
+
const str = child.toString().trim();
|
|
50
50
|
return str && !/^<!--.*-->$/su.test(str);
|
|
51
51
|
}).map(child => {
|
|
52
52
|
rect ??= { start, ...this.getRootNode().posFromIndex(start) };
|
|
@@ -60,7 +60,7 @@ class NestedToken extends index_2.Token {
|
|
|
60
60
|
{
|
|
61
61
|
desc: 'comment',
|
|
62
62
|
range: [e.startIndex, e.startIndex],
|
|
63
|
-
text: `<!--${
|
|
63
|
+
text: `<!--${child.toString()}-->`,
|
|
64
64
|
},
|
|
65
65
|
];
|
|
66
66
|
return e;
|
|
@@ -7,7 +7,5 @@ export declare abstract class CommentToken extends NowikiBaseToken {
|
|
|
7
7
|
closed: boolean;
|
|
8
8
|
/** @param closed 是否闭合 */
|
|
9
9
|
constructor(wikitext: string, closed?: boolean, config?: Parser.Config, accum?: Token[]);
|
|
10
|
-
/** @override */
|
|
11
|
-
lint(start?: number): LintError[];
|
|
12
10
|
}
|
|
13
11
|
export {};
|
|
@@ -18,7 +18,7 @@ class CommentToken extends (0, hidden_1.hiddenToken)(base_1.NowikiBaseToken) {
|
|
|
18
18
|
getAttribute(key) {
|
|
19
19
|
return key === 'padding' ? 4 : super.getAttribute(key);
|
|
20
20
|
}
|
|
21
|
-
/** @
|
|
21
|
+
/** @private */
|
|
22
22
|
lint(start = this.getAbsoluteIndex()) {
|
|
23
23
|
if (this.closed) {
|
|
24
24
|
return [];
|
|
@@ -8,6 +8,4 @@ export declare abstract class NowikiToken extends NowikiBaseToken {
|
|
|
8
8
|
abstract get nextSibling(): undefined;
|
|
9
9
|
abstract get previousSibling(): AttributesToken;
|
|
10
10
|
abstract get parentNode(): ExtToken | undefined;
|
|
11
|
-
/** @override */
|
|
12
|
-
lint(start?: number): LintError[];
|
|
13
11
|
}
|
package/dist/src/nowiki/index.js
CHANGED
|
@@ -7,7 +7,7 @@ const base_1 = require("./base");
|
|
|
7
7
|
/** 扩展标签内的纯文字Token */
|
|
8
8
|
class NowikiToken extends base_1.NowikiBaseToken {
|
|
9
9
|
type = 'ext-inner';
|
|
10
|
-
/** @
|
|
10
|
+
/** @private */
|
|
11
11
|
lint(start = this.getAbsoluteIndex()) {
|
|
12
12
|
const { name, firstChild: { data } } = this;
|
|
13
13
|
if ((name === 'templatestyles' || name === 'section') && data) {
|
package/dist/src/nowiki/quote.js
CHANGED
|
@@ -15,7 +15,7 @@ class QuoteToken extends base_1.NowikiBaseToken {
|
|
|
15
15
|
get italic() {
|
|
16
16
|
return this.innerText.length !== 3;
|
|
17
17
|
}
|
|
18
|
-
/** @
|
|
18
|
+
/** @private */
|
|
19
19
|
lint(start = this.getAbsoluteIndex()) {
|
|
20
20
|
const { previousSibling, nextSibling, bold } = this, message = index_1.default.msg('lonely "$1"', `'`), errors = [];
|
|
21
21
|
let refError;
|
|
@@ -31,11 +31,11 @@ class ParamTagToken extends index_2.Token {
|
|
|
31
31
|
getGaps() {
|
|
32
32
|
return 1;
|
|
33
33
|
}
|
|
34
|
-
/** @
|
|
34
|
+
/** @private */
|
|
35
35
|
lint(start = this.getAbsoluteIndex()) {
|
|
36
36
|
let rect;
|
|
37
37
|
return this.childNodes.filter(child => {
|
|
38
|
-
const { childNodes } = child, i = childNodes.findIndex(({ type }) => type !== 'text'), str = (i >= 0 ? childNodes.slice(0, i).map(String).join('') :
|
|
38
|
+
const { childNodes } = child, i = childNodes.findIndex(({ type }) => type !== 'text'), str = (i >= 0 ? childNodes.slice(0, i).map(String).join('') : child.toString()).trim();
|
|
39
39
|
return str && !(i >= 0 ? /^[a-z]+(?:\[\])?\s*(?:=|$)/iu : /^[a-z]+(?:\[\])?\s*=/iu).test(str);
|
|
40
40
|
}).map(child => {
|
|
41
41
|
rect ??= { start, ...this.getRootNode().posFromIndex(start) };
|
package/dist/src/parameter.d.ts
CHANGED
|
@@ -24,6 +24,4 @@ export declare abstract class ParameterToken extends Token {
|
|
|
24
24
|
constructor(key?: string | number, value?: string, config?: Parser.Config, accum?: Token[]);
|
|
25
25
|
/** @override */
|
|
26
26
|
text(): string;
|
|
27
|
-
/** @override */
|
|
28
|
-
lint(start?: number, re?: RegExp): LintError[];
|
|
29
27
|
}
|
package/dist/src/parameter.js
CHANGED
|
@@ -44,7 +44,7 @@ class ParameterToken extends index_2.Token {
|
|
|
44
44
|
}
|
|
45
45
|
/** @private */
|
|
46
46
|
toString() {
|
|
47
|
-
return this.anon ?
|
|
47
|
+
return this.anon ? this.lastChild.toString() : super.toString('=');
|
|
48
48
|
}
|
|
49
49
|
/** @override */
|
|
50
50
|
text() {
|
|
@@ -54,7 +54,7 @@ class ParameterToken extends index_2.Token {
|
|
|
54
54
|
getGaps() {
|
|
55
55
|
return this.anon ? 0 : 1;
|
|
56
56
|
}
|
|
57
|
-
/** @
|
|
57
|
+
/** @private */
|
|
58
58
|
lint(start = this.getAbsoluteIndex(), re) {
|
|
59
59
|
const errors = super.lint(start, re), { firstChild } = this, link = new RegExp(`https?://${string_1.extUrlCharFirst}${string_1.extUrlChar}$`, 'iu').exec(firstChild.text())?.[0];
|
|
60
60
|
if (link && new URL(link).search) {
|
package/dist/src/pre.d.ts
CHANGED
package/dist/src/pre.js
CHANGED
|
@@ -35,7 +35,7 @@ class PreToken extends index_2.Token {
|
|
|
35
35
|
getAttribute(key) {
|
|
36
36
|
return (key === 'plain') || super.getAttribute(key);
|
|
37
37
|
}
|
|
38
|
-
/** @
|
|
38
|
+
/** @private */
|
|
39
39
|
lint(start = this.getAbsoluteIndex()) {
|
|
40
40
|
return super.lint(start, /<\s*\/\s*(pre)\b/giu);
|
|
41
41
|
}
|
package/dist/src/redirect.d.ts
CHANGED
|
@@ -18,9 +18,5 @@ export declare abstract class RedirectToken extends Token {
|
|
|
18
18
|
* @param post trailing whitespace
|
|
19
19
|
*/
|
|
20
20
|
constructor(pre: string, syntax: string | undefined, link: string, text: string | undefined, post: string, config?: Parser.Config, accum?: Token[]);
|
|
21
|
-
/** @override */
|
|
22
|
-
toString(): string;
|
|
23
|
-
/** @override */
|
|
24
|
-
lint(start?: number): LintError[];
|
|
25
21
|
}
|
|
26
22
|
export {};
|
package/dist/src/redirect.js
CHANGED
|
@@ -34,13 +34,13 @@ class RedirectToken extends (0, hidden_1.hiddenToken)(index_2.Token) {
|
|
|
34
34
|
getAttribute(key) {
|
|
35
35
|
return key === 'padding' ? this.#pre.length : super.getAttribute(key);
|
|
36
36
|
}
|
|
37
|
-
/** @
|
|
37
|
+
/** @private */
|
|
38
38
|
toString() {
|
|
39
39
|
return this.#pre + super.toString() + this.#post;
|
|
40
40
|
}
|
|
41
|
-
/** @
|
|
41
|
+
/** @private */
|
|
42
42
|
lint(start = this.getAbsoluteIndex()) {
|
|
43
|
-
return this.lastChild.lint(start + this.#pre.length +
|
|
43
|
+
return this.lastChild.lint(start + this.#pre.length + this.firstChild.toString().length);
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
exports.RedirectToken = RedirectToken;
|
package/dist/src/syntax.d.ts
CHANGED
|
@@ -6,7 +6,5 @@ export declare class SyntaxToken extends Token {
|
|
|
6
6
|
type: SyntaxTypes;
|
|
7
7
|
/** @param pattern 语法正则 */
|
|
8
8
|
constructor(wikitext: string | undefined, pattern: RegExp, type?: SyntaxTypes, config?: Parser.Config, accum?: Token[], acceptable?: Acceptable);
|
|
9
|
-
/** @override */
|
|
10
|
-
lint(): [];
|
|
11
9
|
}
|
|
12
10
|
export {};
|
package/dist/src/syntax.js
CHANGED
|
@@ -27,8 +27,6 @@ export declare abstract class TableToken extends TrBaseToken {
|
|
|
27
27
|
* @param attr 表格属性
|
|
28
28
|
*/
|
|
29
29
|
constructor(syntax: string, attr?: string, config?: Parser.Config, accum?: Token[]);
|
|
30
|
-
/** @override */
|
|
31
|
-
lint(start?: number, re?: RegExp): LintError[];
|
|
32
30
|
/**
|
|
33
31
|
* 获取表格布局
|
|
34
32
|
* @param stop 中止条件
|
package/dist/src/table/index.js
CHANGED
|
@@ -34,7 +34,7 @@ class TableToken extends trBase_1.TrBaseToken {
|
|
|
34
34
|
constructor(syntax, attr, config = index_1.default.getConfig(), accum = []) {
|
|
35
35
|
super(/^(?:\{\||\{\{\{\s*!\s*\}\}|\{\{\s*\(!\s*\}\})$/u, syntax, attr, config, accum, {});
|
|
36
36
|
}
|
|
37
|
-
/** @
|
|
37
|
+
/** @private */
|
|
38
38
|
lint(start = this.getAbsoluteIndex(), re) {
|
|
39
39
|
const errors = super.lint(start, re);
|
|
40
40
|
if (!this.closed) {
|
package/dist/src/table/td.d.ts
CHANGED
|
@@ -33,8 +33,6 @@ export declare abstract class TdToken extends TableBaseToken {
|
|
|
33
33
|
constructor(syntax: string, inner?: string, config?: Parser.Config, accum?: Token[]);
|
|
34
34
|
/** @override */
|
|
35
35
|
text(): string;
|
|
36
|
-
/** @override */
|
|
37
|
-
lint(start?: number, re?: RegExp): LintError[];
|
|
38
36
|
/** 是否位于行首 */
|
|
39
37
|
isIndependent(): boolean;
|
|
40
38
|
/**
|
package/dist/src/table/td.js
CHANGED
|
@@ -72,7 +72,7 @@ class TdToken extends base_1.TableBaseToken {
|
|
|
72
72
|
/** @private */
|
|
73
73
|
toString() {
|
|
74
74
|
const { childNodes: [syntax, attr, inner] } = this;
|
|
75
|
-
return
|
|
75
|
+
return syntax.toString() + attr.toString() + this.#innerSyntax + inner.toString();
|
|
76
76
|
}
|
|
77
77
|
/** @override */
|
|
78
78
|
text() {
|
|
@@ -86,7 +86,7 @@ class TdToken extends base_1.TableBaseToken {
|
|
|
86
86
|
}
|
|
87
87
|
return 0;
|
|
88
88
|
}
|
|
89
|
-
/** @
|
|
89
|
+
/** @private */
|
|
90
90
|
lint(start = this.getAbsoluteIndex(), re) {
|
|
91
91
|
const errors = super.lint(start, re);
|
|
92
92
|
start += this.getRelativeIndex(this.length - 1);
|
|
@@ -11,8 +11,6 @@ export interface TableCoords {
|
|
|
11
11
|
/** 表格行或表格 */
|
|
12
12
|
export declare abstract class TrBaseToken extends TableBaseToken {
|
|
13
13
|
type: 'table' | 'tr';
|
|
14
|
-
/** @override */
|
|
15
|
-
lint(start?: number, re?: RegExp): LintError[];
|
|
16
14
|
/** 获取行数 */
|
|
17
15
|
getRowCount(): number;
|
|
18
16
|
/**
|