wikiparser-node 0.7.0-b → 0.7.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 +39 -0
- package/config/default.json +832 -0
- package/config/llwiki.json +630 -0
- package/config/moegirl.json +728 -0
- package/config/zhwiki.json +1269 -0
- package/index.js +321 -0
- package/lib/element.js +611 -0
- package/lib/node.js +772 -0
- package/lib/ranges.js +130 -0
- package/lib/text.js +215 -0
- package/lib/title.js +80 -0
- package/mixin/attributeParent.js +117 -0
- package/mixin/fixedToken.js +40 -0
- package/mixin/hidden.js +21 -0
- package/mixin/singleLine.js +31 -0
- package/mixin/sol.js +65 -0
- package/package.json +11 -9
- package/parser/brackets.js +120 -0
- package/parser/commentAndExt.js +62 -0
- package/parser/converter.js +46 -0
- package/parser/externalLinks.js +33 -0
- package/parser/hrAndDoubleUnderscore.js +38 -0
- package/parser/html.js +42 -0
- package/parser/links.js +94 -0
- package/parser/list.js +59 -0
- package/parser/magicLinks.js +41 -0
- package/parser/quotes.js +64 -0
- package/parser/selector.js +177 -0
- package/parser/table.js +114 -0
- package/src/arg.js +203 -0
- package/src/atom/hidden.js +13 -0
- package/src/atom/index.js +43 -0
- package/src/attribute.js +420 -0
- package/src/attributes.js +452 -0
- package/src/charinsert.js +97 -0
- package/src/converter.js +176 -0
- package/src/converterFlags.js +284 -0
- package/src/converterRule.js +258 -0
- package/src/extLink.js +179 -0
- package/src/gallery.js +151 -0
- package/src/hasNowiki/index.js +44 -0
- package/src/hasNowiki/pre.js +40 -0
- package/src/heading.js +134 -0
- package/src/html.js +248 -0
- package/src/imageParameter.js +277 -0
- package/src/imagemap.js +199 -0
- package/src/imagemapLink.js +41 -0
- package/src/index.js +913 -0
- package/src/link/category.js +49 -0
- package/src/link/file.js +282 -0
- package/src/link/galleryImage.js +120 -0
- package/src/link/index.js +383 -0
- package/src/magicLink.js +149 -0
- package/src/nested/choose.js +24 -0
- package/src/nested/combobox.js +23 -0
- package/src/nested/index.js +96 -0
- package/src/nested/references.js +23 -0
- package/src/nowiki/comment.js +71 -0
- package/src/nowiki/dd.js +59 -0
- package/src/nowiki/doubleUnderscore.js +56 -0
- package/src/nowiki/hr.js +41 -0
- package/src/nowiki/index.js +56 -0
- package/src/nowiki/list.js +16 -0
- package/src/nowiki/noinclude.js +28 -0
- package/src/nowiki/quote.js +69 -0
- package/src/onlyinclude.js +64 -0
- package/src/paramTag/index.js +89 -0
- package/src/paramTag/inputbox.js +44 -0
- package/src/parameter.js +239 -0
- package/src/syntax.js +91 -0
- package/src/table/index.js +984 -0
- package/src/table/td.js +339 -0
- package/src/table/tr.js +319 -0
- package/src/tagPair/ext.js +138 -0
- package/src/tagPair/include.js +60 -0
- package/src/tagPair/index.js +126 -0
- package/src/transclude.js +824 -0
- package/tool/index.js +1202 -0
- package/util/base.js +17 -0
- package/util/debug.js +73 -0
- package/util/diff.js +76 -0
- package/util/lint.js +54 -0
- package/util/string.js +107 -0
- package/bundle/bundle.min.js +0 -40
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const {generateForSelf} = require('../../util/lint'),
|
|
4
|
+
attributeParent = require('../../mixin/attributeParent'),
|
|
5
|
+
path = require('path'),
|
|
6
|
+
Parser = require('../..'),
|
|
7
|
+
Token = require('..'),
|
|
8
|
+
TagPairToken = require('.'),
|
|
9
|
+
AttributesToken = require('../attributes');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 扩展标签
|
|
13
|
+
* @classdesc `{childNodes: [AttributesToken, NowikiToken|Token]}`
|
|
14
|
+
*/
|
|
15
|
+
class ExtToken extends attributeParent(TagPairToken) {
|
|
16
|
+
type = 'ext';
|
|
17
|
+
closed = true;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @param {string} name 标签名
|
|
21
|
+
* @param {string} attr 标签属性
|
|
22
|
+
* @param {string} inner 内部wikitext
|
|
23
|
+
* @param {string|undefined} closed 是否封闭
|
|
24
|
+
* @param {accum} accum
|
|
25
|
+
*/
|
|
26
|
+
constructor(name, attr = '', inner = '', closed = undefined, config = Parser.getConfig(), accum = []) {
|
|
27
|
+
attr = !attr || attr.trimStart() !== attr ? attr : ` ${attr}`;
|
|
28
|
+
const lcName = name.toLowerCase(),
|
|
29
|
+
attrToken = new AttributesToken(attr, 'ext-attrs', lcName, config, accum),
|
|
30
|
+
newConfig = structuredClone(config),
|
|
31
|
+
ext = new Set(newConfig.ext);
|
|
32
|
+
let /** @type {Token} */ innerToken;
|
|
33
|
+
ext.delete(lcName);
|
|
34
|
+
newConfig.ext = [...ext];
|
|
35
|
+
switch (lcName) {
|
|
36
|
+
case 'tab':
|
|
37
|
+
ext.delete('tabs');
|
|
38
|
+
newConfig.ext = [...ext];
|
|
39
|
+
// fall through
|
|
40
|
+
case 'indicator':
|
|
41
|
+
case 'poem':
|
|
42
|
+
case 'ref':
|
|
43
|
+
case 'option':
|
|
44
|
+
case 'combooption':
|
|
45
|
+
case 'tabs':
|
|
46
|
+
case 'poll':
|
|
47
|
+
case 'seo':
|
|
48
|
+
innerToken = new Token(inner, newConfig, true, accum);
|
|
49
|
+
break;
|
|
50
|
+
case 'gallery': {
|
|
51
|
+
const GalleryToken = require('../gallery');
|
|
52
|
+
innerToken = new GalleryToken(inner, newConfig, accum);
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
case 'pre': {
|
|
56
|
+
const PreToken = require('../hasNowiki/pre');
|
|
57
|
+
innerToken = new PreToken(inner, newConfig, accum);
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
case 'charinsert': {
|
|
61
|
+
const CharinsertToken = require('../charinsert');
|
|
62
|
+
innerToken = new CharinsertToken(inner, newConfig, accum);
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
case 'references':
|
|
66
|
+
case 'choose':
|
|
67
|
+
case 'combobox': {
|
|
68
|
+
const NestedToken = require('../nested'),
|
|
69
|
+
/** @type {typeof NestedToken} */ NestedExtToken = require(path.join('..', 'nested', lcName));
|
|
70
|
+
innerToken = new NestedExtToken(inner, newConfig, accum);
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
case 'imagemap': {
|
|
74
|
+
const ImagemapToken = require('../imagemap');
|
|
75
|
+
innerToken = new ImagemapToken(inner, config, accum);
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
case 'dynamicpagelist': {
|
|
79
|
+
const ParamTagToken = require('../paramTag');
|
|
80
|
+
innerToken = new ParamTagToken(inner, newConfig, accum);
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
case 'inputbox': {
|
|
84
|
+
const InputboxToken = require('../paramTag/inputbox');
|
|
85
|
+
innerToken = new InputboxToken(inner, newConfig, accum);
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/*
|
|
90
|
+
* 更多定制扩展的代码示例:
|
|
91
|
+
* ```
|
|
92
|
+
* case 'extensionName': {
|
|
93
|
+
* const ExtensionToken = require('../extension');
|
|
94
|
+
* innerToken = new ExtensionToken(inner, newConfig, accum);
|
|
95
|
+
* break;
|
|
96
|
+
* }
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
default: {
|
|
100
|
+
const NowikiToken = require('../nowiki');
|
|
101
|
+
innerToken = new NowikiToken(inner, config);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
innerToken.setAttribute('name', lcName).type = 'ext-inner';
|
|
105
|
+
super(name, attrToken, innerToken, closed, config, accum);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* @override
|
|
110
|
+
* @param {number} start 起始位置
|
|
111
|
+
*/
|
|
112
|
+
lint(start = 0) {
|
|
113
|
+
const errors = super.lint(start);
|
|
114
|
+
if (this.name !== 'nowiki' && this.closest('html-attrs, table-attrs')) {
|
|
115
|
+
const root = this.getRootNode(),
|
|
116
|
+
excerpt = String(root).slice(Math.max(0, start - 25), start + 25),
|
|
117
|
+
rect = {start, ...root.posFromIndex(start)};
|
|
118
|
+
errors.push({...generateForSelf(this, rect, 'HTML标签属性中的扩展标签'), excerpt});
|
|
119
|
+
}
|
|
120
|
+
return errors;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** @override */
|
|
124
|
+
cloneNode() {
|
|
125
|
+
const inner = this.lastChild.cloneNode(),
|
|
126
|
+
tags = this.getAttribute('tags'),
|
|
127
|
+
config = this.getAttribute('config'),
|
|
128
|
+
attr = String(this.firstChild);
|
|
129
|
+
return Parser.run(() => {
|
|
130
|
+
const token = new ExtToken(tags[0], attr, '', this.selfClosing ? undefined : tags[1], config);
|
|
131
|
+
token.lastChild.safeReplaceWith(inner);
|
|
132
|
+
return token;
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
Parser.classes.ExtToken = __filename;
|
|
138
|
+
module.exports = ExtToken;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const hidden = require('../../mixin/hidden'),
|
|
4
|
+
{generateForSelf} = require('../../util/lint'),
|
|
5
|
+
Parser = require('../..'),
|
|
6
|
+
TagPairToken = require('.');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* `<includeonly>`或`<noinclude>`
|
|
10
|
+
* @classdesc `{childNodes: [AstText, AstText]}`
|
|
11
|
+
*/
|
|
12
|
+
class IncludeToken extends hidden(TagPairToken) {
|
|
13
|
+
type = 'include';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @param {string} name 标签名
|
|
17
|
+
* @param {string} attr 标签属性
|
|
18
|
+
* @param {string|undefined} inner 内部wikitext
|
|
19
|
+
* @param {string|undefined} closed 是否封闭
|
|
20
|
+
* @param {accum} accum
|
|
21
|
+
*/
|
|
22
|
+
constructor(name, attr = '', inner = undefined, closed = undefined, config = Parser.getConfig(), accum = []) {
|
|
23
|
+
super(name, attr, inner ?? '', inner === undefined ? closed : closed ?? '', config, accum);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @override
|
|
28
|
+
* @param {number} start 起始位置
|
|
29
|
+
* @returns {LintError[]}
|
|
30
|
+
*/
|
|
31
|
+
lint(start = 0) {
|
|
32
|
+
return this.closed ? [] : [generateForSelf(this, {start}, '未闭合的标签')];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** @override */
|
|
36
|
+
cloneNode() {
|
|
37
|
+
const tags = this.getAttribute('tags'),
|
|
38
|
+
config = this.getAttribute('config'),
|
|
39
|
+
inner = this.selfClosing ? undefined : String(this.lastChild),
|
|
40
|
+
closing = this.selfClosing || !this.closed ? undefined : tags[1],
|
|
41
|
+
token = Parser.run(() => new IncludeToken(tags[0], String(this.firstChild), inner, closing, config));
|
|
42
|
+
return token;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @override
|
|
47
|
+
* @param {string} str 新文本
|
|
48
|
+
*/
|
|
49
|
+
setText(str) {
|
|
50
|
+
return super.setText(str, 1);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** 清除标签属性 */
|
|
54
|
+
removeAttr() {
|
|
55
|
+
super.setText('', 0);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
Parser.classes.IncludeToken = __filename;
|
|
60
|
+
module.exports = IncludeToken;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const Parser = require('../..'),
|
|
4
|
+
fixedToken = require('../../mixin/fixedToken'),
|
|
5
|
+
Token = require('..');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 成对标签
|
|
9
|
+
* @classdesc `{childNodes: [AstText|AttributesToken, AstText|Token]}`
|
|
10
|
+
*/
|
|
11
|
+
class TagPairToken extends fixedToken(Token) {
|
|
12
|
+
#selfClosing;
|
|
13
|
+
#closed;
|
|
14
|
+
#tags;
|
|
15
|
+
|
|
16
|
+
/** getter */
|
|
17
|
+
get closed() {
|
|
18
|
+
return this.#closed;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
set closed(value) {
|
|
22
|
+
this.#closed ||= Boolean(value);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** getter */
|
|
26
|
+
get selfClosing() {
|
|
27
|
+
return this.#selfClosing;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
set selfClosing(value) {
|
|
31
|
+
value = Boolean(value);
|
|
32
|
+
if (value !== this.#selfClosing && this.lastChild.text()) {
|
|
33
|
+
Parser.warn(`<${this.name}>标签内部的${value ? '文本将被隐藏' : '原有文本将再次可见'}!`);
|
|
34
|
+
}
|
|
35
|
+
this.#selfClosing = value;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** 内部wikitext */
|
|
39
|
+
get innerText() {
|
|
40
|
+
return this.#selfClosing ? undefined : this.lastChild.text();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @param {string} name 标签名
|
|
45
|
+
* @param {string|Token} attr 标签属性
|
|
46
|
+
* @param {string|Token} inner 内部wikitext
|
|
47
|
+
* @param {string|undefined} closed 是否封闭;约定`undefined`表示自闭合,`''`表示未闭合
|
|
48
|
+
* @param {accum} accum
|
|
49
|
+
*/
|
|
50
|
+
constructor(name, attr, inner, closed, config = Parser.getConfig(), accum = []) {
|
|
51
|
+
super(undefined, config, true);
|
|
52
|
+
this.setAttribute('name', name.toLowerCase());
|
|
53
|
+
this.#tags = [name, closed || name];
|
|
54
|
+
this.#selfClosing = closed === undefined;
|
|
55
|
+
this.#closed = closed !== '';
|
|
56
|
+
this.append(attr, inner);
|
|
57
|
+
let index = accum.indexOf(attr);
|
|
58
|
+
if (index === -1) {
|
|
59
|
+
index = accum.indexOf(inner);
|
|
60
|
+
}
|
|
61
|
+
if (index === -1) {
|
|
62
|
+
index = Infinity;
|
|
63
|
+
}
|
|
64
|
+
accum.splice(index, 0, this);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @override
|
|
69
|
+
* @param {string} selector
|
|
70
|
+
*/
|
|
71
|
+
toString(selector) {
|
|
72
|
+
const {firstChild, lastChild, nextSibling, name} = this,
|
|
73
|
+
[opening, closing] = this.#tags;
|
|
74
|
+
if (selector && this.matches(selector)) {
|
|
75
|
+
return '';
|
|
76
|
+
} else if (!this.#closed && nextSibling) {
|
|
77
|
+
Parser.error(`自动闭合 <${name}>`, lastChild);
|
|
78
|
+
this.#closed = true;
|
|
79
|
+
}
|
|
80
|
+
return this.#selfClosing
|
|
81
|
+
? `<${opening}${String(firstChild)}/>`
|
|
82
|
+
: `<${opening}${String(firstChild)}>${String(lastChild)}${this.#closed ? `</${closing}>` : ''}`;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* @override
|
|
87
|
+
* @returns {string}
|
|
88
|
+
*/
|
|
89
|
+
text() {
|
|
90
|
+
const [opening, closing] = this.#tags;
|
|
91
|
+
return this.#selfClosing
|
|
92
|
+
? `<${opening}${this.firstChild.text()}/>`
|
|
93
|
+
: `<${opening}${super.text('>')}${this.#closed ? `</${closing}>` : ''}`;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** @override */
|
|
97
|
+
getPadding() {
|
|
98
|
+
return this.#tags[0].length + 1;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** @override */
|
|
102
|
+
getGaps() {
|
|
103
|
+
return 1;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** @override */
|
|
107
|
+
print() {
|
|
108
|
+
const [opening, closing] = this.#tags;
|
|
109
|
+
return super.print(this.#selfClosing
|
|
110
|
+
? {pre: `<${opening}`, post: '/>'}
|
|
111
|
+
: {pre: `<${opening}`, sep: '>', post: this.#closed ? `</${closing}>` : ''});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* @override
|
|
116
|
+
* @template {string} T
|
|
117
|
+
* @param {T} key 属性键
|
|
118
|
+
* @returns {TokenAttribute<T>}
|
|
119
|
+
*/
|
|
120
|
+
getAttribute(key) {
|
|
121
|
+
return key === 'tags' ? [...this.#tags] : super.getAttribute(key);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
Parser.classes.TagPairToken = __filename;
|
|
126
|
+
module.exports = TagPairToken;
|