wikiparser-node 1.12.3-b → 1.12.3
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/config/.schema.json +203 -0
- package/config/default.json +30 -29
- package/config/enwiki.json +829 -15
- package/config/llwiki.json +56 -21
- package/config/moegirl.json +65 -21
- package/config/zhwiki.json +494 -28
- package/dist/addon/table.js +494 -0
- package/dist/addon/token.js +391 -0
- package/dist/addon/transclude.js +184 -0
- package/dist/base.d.ts +81 -0
- package/dist/base.js +40 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +275 -0
- package/dist/internal.d.ts +47 -0
- package/dist/lib/element.d.ts +125 -0
- package/dist/lib/element.js +376 -0
- package/dist/lib/node.d.ts +173 -0
- package/dist/lib/node.js +478 -0
- package/dist/lib/range.d.ts +105 -0
- package/dist/lib/range.js +406 -0
- package/dist/lib/ranges.d.ts +28 -0
- package/dist/lib/ranges.js +126 -0
- package/dist/lib/rect.d.ts +18 -0
- package/dist/lib/rect.js +36 -0
- package/dist/lib/text.d.ts +58 -0
- package/dist/lib/text.js +414 -0
- package/dist/lib/title.d.ts +49 -0
- package/dist/lib/title.js +253 -0
- package/dist/mixin/attributesParent.d.ts +49 -0
- package/dist/mixin/attributesParent.js +80 -0
- package/dist/mixin/fixed.d.ts +5 -0
- package/dist/mixin/fixed.js +32 -0
- package/dist/mixin/flagsParent.d.ts +43 -0
- package/dist/mixin/flagsParent.js +64 -0
- package/dist/mixin/hidden.d.ts +7 -0
- package/dist/mixin/hidden.js +39 -0
- package/dist/mixin/magicLinkParent.d.ts +19 -0
- package/dist/mixin/magicLinkParent.js +43 -0
- package/dist/mixin/singleLine.d.ts +5 -0
- package/dist/mixin/singleLine.js +25 -0
- package/dist/mixin/sol.d.ts +6 -0
- package/dist/mixin/sol.js +45 -0
- package/dist/mixin/syntax.d.ts +8 -0
- package/dist/mixin/syntax.js +46 -0
- package/dist/parser/braces.js +152 -0
- package/dist/parser/commentAndExt.js +84 -0
- package/dist/parser/converter.js +41 -0
- package/dist/parser/externalLinks.js +39 -0
- package/dist/parser/hrAndDoubleUnderscore.js +44 -0
- package/dist/parser/html.js +40 -0
- package/dist/parser/links.js +103 -0
- package/dist/parser/list.js +116 -0
- package/dist/parser/magicLinks.js +54 -0
- package/dist/parser/quotes.js +69 -0
- package/dist/parser/redirect.js +28 -0
- package/dist/parser/selector.js +393 -0
- package/dist/parser/table.js +125 -0
- package/dist/src/arg.d.ts +51 -0
- package/dist/src/arg.js +225 -0
- package/dist/src/atom.d.ts +14 -0
- package/dist/src/atom.js +54 -0
- package/dist/src/attribute.d.ts +64 -0
- package/dist/src/attribute.js +478 -0
- package/dist/src/attributes.d.ts +103 -0
- package/dist/src/attributes.js +380 -0
- package/dist/src/converter.d.ts +28 -0
- package/dist/src/converter.js +150 -0
- package/dist/src/converterFlags.d.ts +80 -0
- package/dist/src/converterFlags.js +241 -0
- package/dist/src/converterRule.d.ts +71 -0
- package/dist/src/converterRule.js +218 -0
- package/dist/src/extLink.d.ts +36 -0
- package/dist/src/extLink.js +223 -0
- package/dist/src/gallery.d.ts +47 -0
- package/dist/src/gallery.js +145 -0
- package/dist/src/heading.d.ts +42 -0
- package/dist/src/heading.js +209 -0
- package/dist/src/hidden.d.ts +9 -0
- package/dist/src/hidden.js +82 -0
- package/dist/src/html.d.ts +61 -0
- package/dist/src/html.js +344 -0
- package/dist/src/imageParameter.d.ts +60 -0
- package/dist/src/imageParameter.js +262 -0
- package/dist/src/imagemap.d.ts +47 -0
- package/dist/src/imagemap.js +148 -0
- package/dist/src/imagemapLink.d.ts +35 -0
- package/dist/src/imagemapLink.js +99 -0
- package/dist/src/index.d.ts +136 -0
- package/dist/src/index.js +779 -0
- package/dist/src/link/base.d.ts +52 -0
- package/dist/src/link/base.js +258 -0
- package/dist/src/link/category.d.ts +22 -0
- package/dist/src/link/category.js +36 -0
- package/dist/src/link/file.d.ts +102 -0
- package/dist/src/link/file.js +335 -0
- package/dist/src/link/galleryImage.d.ts +29 -0
- package/dist/src/link/galleryImage.js +133 -0
- package/dist/src/link/index.d.ts +39 -0
- package/dist/src/link/index.js +100 -0
- package/dist/src/link/redirectTarget.d.ts +27 -0
- package/dist/src/link/redirectTarget.js +71 -0
- package/dist/src/magicLink.d.ts +57 -0
- package/dist/src/magicLink.js +261 -0
- package/dist/src/nested.d.ts +40 -0
- package/dist/src/nested.js +108 -0
- package/dist/src/nowiki/base.d.ts +28 -0
- package/dist/src/nowiki/base.js +90 -0
- package/dist/src/nowiki/comment.d.ts +14 -0
- package/dist/src/nowiki/comment.js +123 -0
- package/dist/src/nowiki/dd.d.ts +8 -0
- package/dist/src/nowiki/dd.js +74 -0
- package/dist/src/nowiki/doubleUnderscore.d.ts +15 -0
- package/dist/src/nowiki/doubleUnderscore.js +101 -0
- package/dist/src/nowiki/hr.d.ts +5 -0
- package/dist/src/nowiki/hr.js +72 -0
- package/dist/src/nowiki/index.d.ts +14 -0
- package/dist/src/nowiki/index.js +30 -0
- package/dist/src/nowiki/list.d.ts +5 -0
- package/dist/src/nowiki/list.js +67 -0
- package/dist/src/nowiki/listBase.d.ts +23 -0
- package/dist/src/nowiki/listBase.js +100 -0
- package/dist/src/nowiki/noinclude.d.ts +6 -0
- package/dist/src/nowiki/noinclude.js +77 -0
- package/dist/src/nowiki/quote.d.ts +14 -0
- package/dist/src/nowiki/quote.js +149 -0
- package/dist/src/onlyinclude.d.ts +13 -0
- package/dist/src/onlyinclude.js +60 -0
- package/dist/src/paramTag/index.d.ts +28 -0
- package/dist/src/paramTag/index.js +80 -0
- package/dist/src/paramTag/inputbox.d.ts +8 -0
- package/dist/src/paramTag/inputbox.js +24 -0
- package/dist/src/parameter.d.ts +60 -0
- package/dist/src/parameter.js +267 -0
- package/dist/src/pre.d.ts +28 -0
- package/dist/src/pre.js +62 -0
- package/dist/src/redirect.d.ts +30 -0
- package/dist/src/redirect.js +128 -0
- package/dist/src/syntax.d.ts +15 -0
- package/dist/src/syntax.js +87 -0
- package/dist/src/table/base.d.ts +28 -0
- package/dist/src/table/base.js +81 -0
- package/dist/src/table/index.d.ts +230 -0
- package/dist/src/table/index.js +506 -0
- package/dist/src/table/td.d.ts +72 -0
- package/dist/src/table/td.js +375 -0
- package/dist/src/table/tr.d.ts +30 -0
- package/dist/src/table/tr.js +61 -0
- package/dist/src/table/trBase.d.ts +49 -0
- package/dist/src/table/trBase.js +165 -0
- package/dist/src/tagPair/ext.d.ts +29 -0
- package/dist/src/tagPair/ext.js +217 -0
- package/dist/src/tagPair/include.d.ts +33 -0
- package/dist/src/tagPair/include.js +132 -0
- package/dist/src/tagPair/index.d.ts +23 -0
- package/dist/src/tagPair/index.js +130 -0
- package/dist/src/transclude.d.ts +159 -0
- package/dist/src/transclude.js +598 -0
- package/dist/util/constants.js +26 -0
- package/dist/util/debug.js +95 -0
- package/dist/util/diff.js +83 -0
- package/dist/util/html.js +145 -0
- package/dist/util/lint.js +32 -0
- package/dist/util/string.js +107 -0
- package/errors/README +3 -0
- package/package.json +21 -28
- package/printed/README +3 -0
- package/bundle/bundle.min.js +0 -37
- package/extensions/dist/base.js +0 -163
- package/extensions/dist/codejar.js +0 -52
- package/extensions/dist/editor.js +0 -159
- package/extensions/dist/highlight.js +0 -30
- package/extensions/dist/lint.js +0 -72
- package/extensions/editor.css +0 -59
- package/extensions/ui.css +0 -162
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AstElement = void 0;
|
|
4
|
+
const string_1 = require("../util/string");
|
|
5
|
+
const debug_1 = require("../util/debug");
|
|
6
|
+
const node_1 = require("./node");
|
|
7
|
+
/* NOT FOR BROWSER */
|
|
8
|
+
const fs = require("fs");
|
|
9
|
+
const path = require("path");
|
|
10
|
+
const constants_1 = require("../util/constants");
|
|
11
|
+
const selector_1 = require("../parser/selector");
|
|
12
|
+
/**
|
|
13
|
+
* 将选择器转化为类型谓词
|
|
14
|
+
* @param selector 选择器
|
|
15
|
+
*/
|
|
16
|
+
const getCondition = (selector) => {
|
|
17
|
+
/* NOT FOR BROWSER */
|
|
18
|
+
if (/[^a-z\-,\s]/u.test(selector)) {
|
|
19
|
+
return (0, selector_1.checkToken)(selector);
|
|
20
|
+
}
|
|
21
|
+
/* NOT FOR BROWSER END */
|
|
22
|
+
const types = new Set(selector.split(',').map(str => str.trim()));
|
|
23
|
+
return (({ type }) => types.has(type));
|
|
24
|
+
};
|
|
25
|
+
/** 类似HTMLElement */
|
|
26
|
+
class AstElement extends node_1.AstNode {
|
|
27
|
+
/** 子节点总数 */
|
|
28
|
+
get length() {
|
|
29
|
+
return this.childNodes.length;
|
|
30
|
+
}
|
|
31
|
+
/* NOT FOR BROWSER */
|
|
32
|
+
set length(n) {
|
|
33
|
+
if (n >= 0 && n < this.length) {
|
|
34
|
+
for (let i = this.length - 1; i >= n; i--) {
|
|
35
|
+
this.removeAt(i);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** 全部非文本子节点 */
|
|
40
|
+
get children() {
|
|
41
|
+
return this.childNodes.filter((child) => child.type !== 'text');
|
|
42
|
+
}
|
|
43
|
+
/** 首位非文本子节点 */
|
|
44
|
+
get firstElementChild() {
|
|
45
|
+
return this.childNodes.find((child) => child.type !== 'text');
|
|
46
|
+
}
|
|
47
|
+
/** 末位非文本子节点 */
|
|
48
|
+
get lastElementChild() {
|
|
49
|
+
return this.children[this.childElementCount - 1];
|
|
50
|
+
}
|
|
51
|
+
/** 非文本子节点总数 */
|
|
52
|
+
get childElementCount() {
|
|
53
|
+
return this.children.length;
|
|
54
|
+
}
|
|
55
|
+
/** 父节点 */
|
|
56
|
+
get parentElement() {
|
|
57
|
+
return this.parentNode;
|
|
58
|
+
}
|
|
59
|
+
/** AstElement.prototype.text()的getter写法 */
|
|
60
|
+
get outerText() {
|
|
61
|
+
return this.text();
|
|
62
|
+
}
|
|
63
|
+
/** 不可见 */
|
|
64
|
+
get hidden() {
|
|
65
|
+
return this.text() === '';
|
|
66
|
+
}
|
|
67
|
+
/** 内部高度 */
|
|
68
|
+
get clientHeight() {
|
|
69
|
+
const { innerText } = this;
|
|
70
|
+
return typeof innerText === 'string' ? innerText.split('\n').length : undefined;
|
|
71
|
+
}
|
|
72
|
+
/** 内部宽度 */
|
|
73
|
+
get clientWidth() {
|
|
74
|
+
const { innerText } = this;
|
|
75
|
+
if (typeof innerText === 'string') {
|
|
76
|
+
const lines = innerText.split('\n');
|
|
77
|
+
return lines.at(-1).length;
|
|
78
|
+
}
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
constructor() {
|
|
82
|
+
super();
|
|
83
|
+
this.seal('name');
|
|
84
|
+
}
|
|
85
|
+
/* NOT FOR BROWSER END */
|
|
86
|
+
/** @private */
|
|
87
|
+
text(separator) {
|
|
88
|
+
return (0, string_1.text)(this.childNodes, separator);
|
|
89
|
+
}
|
|
90
|
+
/** 合并相邻的文本子节点 */
|
|
91
|
+
normalize() {
|
|
92
|
+
const childNodes = [...this.childNodes];
|
|
93
|
+
/**
|
|
94
|
+
* 移除子节点
|
|
95
|
+
* @param i 移除位置
|
|
96
|
+
*/
|
|
97
|
+
const remove = (i) => {
|
|
98
|
+
childNodes[i].setAttribute('parentNode', undefined);
|
|
99
|
+
childNodes.splice(i, 1);
|
|
100
|
+
};
|
|
101
|
+
for (let i = childNodes.length - 1; i >= 0; i--) {
|
|
102
|
+
const { type, data } = childNodes[i];
|
|
103
|
+
if (type !== 'text' || this.getGaps(i - 1)) {
|
|
104
|
+
//
|
|
105
|
+
}
|
|
106
|
+
else if (data === '') {
|
|
107
|
+
remove(i);
|
|
108
|
+
/* NOT FOR BROWSER */
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
const prev = childNodes[i - 1];
|
|
112
|
+
if (prev?.type === 'text') {
|
|
113
|
+
prev.setAttribute('data', prev.data + data);
|
|
114
|
+
remove(i);
|
|
115
|
+
}
|
|
116
|
+
/* NOT FOR BROWSER END */
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
this.setAttribute('childNodes', childNodes);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 移除子节点
|
|
123
|
+
* @param i 移除位置
|
|
124
|
+
*/
|
|
125
|
+
removeAt(i) {
|
|
126
|
+
/* NOT FOR BROWSER */
|
|
127
|
+
this.verifyChild(i);
|
|
128
|
+
/* NOT FOR BROWSER END */
|
|
129
|
+
return (0, debug_1.setChildNodes)(this, i, 1)[0];
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 插入子节点
|
|
133
|
+
* @param node 待插入的子节点
|
|
134
|
+
* @param i 插入位置
|
|
135
|
+
* @throws `RangeError` 不能插入祖先或子节点
|
|
136
|
+
*/
|
|
137
|
+
insertAt(node, i = this.length) {
|
|
138
|
+
/* NOT FOR BROWSER */
|
|
139
|
+
if (node.contains(this)) {
|
|
140
|
+
throw new RangeError('Cannot insert an ancestor node!');
|
|
141
|
+
}
|
|
142
|
+
else if (this.childNodes.includes(node)) {
|
|
143
|
+
throw new RangeError('Cannot insert its own child node!');
|
|
144
|
+
}
|
|
145
|
+
this.verifyChild(i, 1);
|
|
146
|
+
node.parentNode?.removeChild(node);
|
|
147
|
+
/* NOT FOR BROWSER END */
|
|
148
|
+
(0, debug_1.setChildNodes)(this, i, 0, [node]);
|
|
149
|
+
return node;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* 最近的祖先节点
|
|
153
|
+
* @param selector 选择器
|
|
154
|
+
*/
|
|
155
|
+
closest(selector) {
|
|
156
|
+
const condition = getCondition(selector);
|
|
157
|
+
let { parentNode } = this;
|
|
158
|
+
while (parentNode) {
|
|
159
|
+
if (condition(parentNode)) {
|
|
160
|
+
return parentNode;
|
|
161
|
+
}
|
|
162
|
+
({ parentNode } = parentNode);
|
|
163
|
+
}
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* 符合条件的第一个后代节点
|
|
168
|
+
* @param condition 条件
|
|
169
|
+
*/
|
|
170
|
+
#getElementBy(condition) {
|
|
171
|
+
for (const child of this.childNodes) {
|
|
172
|
+
if (child.type === 'text') {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
else if (condition(child)) {
|
|
176
|
+
return child;
|
|
177
|
+
}
|
|
178
|
+
const descendant = child.#getElementBy(condition);
|
|
179
|
+
if (descendant) {
|
|
180
|
+
return descendant;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return undefined;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* 符合选择器的第一个后代节点
|
|
187
|
+
* @param selector 选择器
|
|
188
|
+
*/
|
|
189
|
+
querySelector(selector) {
|
|
190
|
+
const condition = getCondition(selector);
|
|
191
|
+
return this.#getElementBy(condition);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* 符合条件的所有后代节点
|
|
195
|
+
* @param condition 条件
|
|
196
|
+
*/
|
|
197
|
+
#getElementsBy(condition) {
|
|
198
|
+
const descendants = [];
|
|
199
|
+
for (const child of this.childNodes) {
|
|
200
|
+
if (child.type === 'text') {
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
else if (condition(child)) {
|
|
204
|
+
descendants.push(child);
|
|
205
|
+
}
|
|
206
|
+
descendants.push(...child.#getElementsBy(condition));
|
|
207
|
+
}
|
|
208
|
+
return descendants;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* 符合选择器的所有后代节点
|
|
212
|
+
* @param selector 选择器
|
|
213
|
+
*/
|
|
214
|
+
querySelectorAll(selector) {
|
|
215
|
+
const condition = getCondition(selector);
|
|
216
|
+
return this.#getElementsBy(condition);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* 在末尾批量插入子节点
|
|
220
|
+
* @param elements 插入节点
|
|
221
|
+
*/
|
|
222
|
+
append(...elements) {
|
|
223
|
+
for (const element of elements) {
|
|
224
|
+
this.insertAt(element);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* 批量替换子节点
|
|
229
|
+
* @param elements 新的子节点
|
|
230
|
+
*/
|
|
231
|
+
replaceChildren(...elements) {
|
|
232
|
+
for (let i = this.length - 1; i >= 0; i--) {
|
|
233
|
+
this.removeAt(i);
|
|
234
|
+
}
|
|
235
|
+
this.append(...elements);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* 修改文本子节点
|
|
239
|
+
* @param str 新文本
|
|
240
|
+
* @param i 子节点位置
|
|
241
|
+
* @throws `RangeError` 对应位置的子节点不是文本节点
|
|
242
|
+
*/
|
|
243
|
+
setText(str, i = 0) {
|
|
244
|
+
i += i < 0 ? this.length : 0;
|
|
245
|
+
/* NOT FOR BROWSER */
|
|
246
|
+
this.verifyChild(i);
|
|
247
|
+
/* NOT FOR BROWSER END */
|
|
248
|
+
const oldText = this.childNodes[i];
|
|
249
|
+
if (oldText.type === 'text') { // eslint-disable-line @typescript-eslint/no-unnecessary-condition
|
|
250
|
+
const { data } = oldText;
|
|
251
|
+
oldText.replaceData(str);
|
|
252
|
+
return data;
|
|
253
|
+
}
|
|
254
|
+
/* NOT FOR BROWSER */
|
|
255
|
+
throw new RangeError(`The child node at position ${i} is ${oldText.constructor.name}!`);
|
|
256
|
+
}
|
|
257
|
+
/** @private */
|
|
258
|
+
toString(skip, separator = '') {
|
|
259
|
+
return this.childNodes.map(child => child.toString(skip)).join(separator);
|
|
260
|
+
}
|
|
261
|
+
/** @private */
|
|
262
|
+
lint(start = this.getAbsoluteIndex(), re) {
|
|
263
|
+
const errors = [];
|
|
264
|
+
for (let i = 0, cur = start + this.getAttribute('padding'); i < this.length; i++) {
|
|
265
|
+
const child = this.childNodes[i];
|
|
266
|
+
errors.push(...child.lint(cur, re));
|
|
267
|
+
cur += child.toString().length + this.getGaps(i);
|
|
268
|
+
}
|
|
269
|
+
return errors;
|
|
270
|
+
}
|
|
271
|
+
/** @private */
|
|
272
|
+
print(opt = {}) {
|
|
273
|
+
const cl = opt.class;
|
|
274
|
+
return this.toString()
|
|
275
|
+
? `${cl === '' ? '' : `<span class="wpb-${cl ?? this.type}">`}${(0, string_1.print)(this.childNodes, opt)}${cl === '' ? '' : '</span>'}`
|
|
276
|
+
: '';
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* 保存为JSON
|
|
280
|
+
* @param file 文件名
|
|
281
|
+
* @param start
|
|
282
|
+
*/
|
|
283
|
+
json(file, start = this.getAbsoluteIndex()) {
|
|
284
|
+
const json = {
|
|
285
|
+
...this,
|
|
286
|
+
type: this.type,
|
|
287
|
+
range: [start, start + this.toString().length],
|
|
288
|
+
childNodes: [],
|
|
289
|
+
};
|
|
290
|
+
for (let i = 0, cur = start + this.getAttribute('padding'); i < this.length; i++) {
|
|
291
|
+
const child = this.childNodes[i], { length } = child.toString();
|
|
292
|
+
json.childNodes.push(child.type === 'text'
|
|
293
|
+
? { data: child.data, range: [cur, cur + length] }
|
|
294
|
+
: child.json(undefined, cur));
|
|
295
|
+
cur += length + this.getGaps(i);
|
|
296
|
+
}
|
|
297
|
+
/* NOT FOR BROWSER */
|
|
298
|
+
if (typeof file === 'string') {
|
|
299
|
+
fs.writeFileSync(path.join(__dirname, '..', '..', 'printed', file + (file.endsWith('.json') ? '' : '.json')), JSON.stringify(json, null, 2));
|
|
300
|
+
}
|
|
301
|
+
/* NOT FOR BROWSER END */
|
|
302
|
+
return json;
|
|
303
|
+
}
|
|
304
|
+
/* NOT FOR BROWSER */
|
|
305
|
+
/**
|
|
306
|
+
* 检查是否符合选择器
|
|
307
|
+
* @param selector 选择器
|
|
308
|
+
*/
|
|
309
|
+
matches(selector) {
|
|
310
|
+
return selector === undefined || getCondition(selector)(this);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* 类型选择器
|
|
314
|
+
* @param types
|
|
315
|
+
*/
|
|
316
|
+
getElementByTypes(types) {
|
|
317
|
+
const typeSet = new Set(types.split(',').map(str => str.trim()));
|
|
318
|
+
return this.#getElementBy((({ type }) => typeSet.has(type)));
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* id选择器
|
|
322
|
+
* @param id id名
|
|
323
|
+
*/
|
|
324
|
+
getElementById(id) {
|
|
325
|
+
return this.#getElementBy((token => 'id' in token && token.id === id));
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* 类选择器
|
|
329
|
+
* @param className 类名之一
|
|
330
|
+
*/
|
|
331
|
+
getElementsByClassName(className) {
|
|
332
|
+
return this.#getElementsBy((token => 'classList' in token && token.classList.has(className)));
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* 标签名选择器
|
|
336
|
+
* @param tag 标签名
|
|
337
|
+
*/
|
|
338
|
+
getElementsByTagName(tag) {
|
|
339
|
+
return this.#getElementsBy((({ type, name }) => name === tag && (type === 'html' || type === 'ext')));
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* 在开头批量插入子节点
|
|
343
|
+
* @param elements 插入节点
|
|
344
|
+
*/
|
|
345
|
+
prepend(...elements) {
|
|
346
|
+
for (let i = 0; i < elements.length; i++) {
|
|
347
|
+
this.insertAt(elements[i], i);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* 获取子节点的位置
|
|
352
|
+
* @param node 子节点
|
|
353
|
+
* @throws `RangeError` 找不到子节点
|
|
354
|
+
*/
|
|
355
|
+
#getChildIndex(node) {
|
|
356
|
+
const i = this.childNodes.indexOf(node);
|
|
357
|
+
if (i === -1) {
|
|
358
|
+
throw new RangeError('Not a child node!');
|
|
359
|
+
}
|
|
360
|
+
return i;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* 移除子节点
|
|
364
|
+
* @param node 子节点
|
|
365
|
+
*/
|
|
366
|
+
removeChild(node) {
|
|
367
|
+
return this.removeAt(this.#getChildIndex(node));
|
|
368
|
+
}
|
|
369
|
+
insertBefore(child, reference) {
|
|
370
|
+
return reference === undefined
|
|
371
|
+
? this.insertAt(child)
|
|
372
|
+
: this.insertAt(child, this.#getChildIndex(reference));
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
exports.AstElement = AstElement;
|
|
376
|
+
constants_1.classes['AstElement'] = __filename;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import type { LintError, AstNode as AstNodeBase, TokenTypes } from '../base';
|
|
2
|
+
import type { AstText, Token } from '../internal';
|
|
3
|
+
export type AstNodes = AstText | Token;
|
|
4
|
+
export interface Dimension {
|
|
5
|
+
readonly height: number;
|
|
6
|
+
readonly width: number;
|
|
7
|
+
}
|
|
8
|
+
export interface Position {
|
|
9
|
+
readonly top: number;
|
|
10
|
+
readonly left: number;
|
|
11
|
+
}
|
|
12
|
+
export interface CaretPosition {
|
|
13
|
+
readonly offsetNode: AstNodes;
|
|
14
|
+
readonly offset: number;
|
|
15
|
+
}
|
|
16
|
+
/** 类似Node */
|
|
17
|
+
export declare abstract class AstNode implements AstNodeBase {
|
|
18
|
+
#private;
|
|
19
|
+
data?: string | undefined;
|
|
20
|
+
readonly childNodes: readonly AstNodes[];
|
|
21
|
+
abstract get type(): TokenTypes | 'text';
|
|
22
|
+
abstract set type(value: TokenTypes | 'text');
|
|
23
|
+
/** 可见部分 */
|
|
24
|
+
text(): string;
|
|
25
|
+
lint(): LintError[];
|
|
26
|
+
print(): string;
|
|
27
|
+
/** 首位子节点 */
|
|
28
|
+
get firstChild(): AstNodes | undefined;
|
|
29
|
+
/** 末位子节点 */
|
|
30
|
+
get lastChild(): AstNodes | undefined;
|
|
31
|
+
/** 父节点 */
|
|
32
|
+
get parentNode(): Token | undefined;
|
|
33
|
+
/** 后一个兄弟节点 */
|
|
34
|
+
get nextSibling(): AstNodes | undefined;
|
|
35
|
+
/** 前一个兄弟节点 */
|
|
36
|
+
get previousSibling(): AstNodes | undefined;
|
|
37
|
+
/** 行数 */
|
|
38
|
+
get offsetHeight(): number;
|
|
39
|
+
/** 最后一行的列数 */
|
|
40
|
+
get offsetWidth(): number;
|
|
41
|
+
/** 后一个非文本兄弟节点 */
|
|
42
|
+
get nextElementSibling(): Token | undefined;
|
|
43
|
+
/** 前一个非文本兄弟节点 */
|
|
44
|
+
get previousElementSibling(): Token | undefined;
|
|
45
|
+
/** 后一个可见的兄弟节点 */
|
|
46
|
+
get nextVisibleSibling(): AstNodes | undefined;
|
|
47
|
+
/** 前一个可见的兄弟节点 */
|
|
48
|
+
get previousVisibleSibling(): AstNodes | undefined;
|
|
49
|
+
/** 是否具有根节点 */
|
|
50
|
+
get isConnected(): boolean;
|
|
51
|
+
/** 后方是否还有其他节点(不含后代) */
|
|
52
|
+
get eof(): boolean | undefined;
|
|
53
|
+
/** 相对于父容器的行号 */
|
|
54
|
+
get offsetTop(): number;
|
|
55
|
+
/** 相对于父容器的列号 */
|
|
56
|
+
get offsetLeft(): number;
|
|
57
|
+
/** 位置、大小和padding */
|
|
58
|
+
get style(): Position & Dimension & {
|
|
59
|
+
padding: number;
|
|
60
|
+
};
|
|
61
|
+
/** 字体样式 */
|
|
62
|
+
get font(): {
|
|
63
|
+
bold: boolean;
|
|
64
|
+
italic: boolean;
|
|
65
|
+
};
|
|
66
|
+
/** 是否粗体 */
|
|
67
|
+
get bold(): boolean;
|
|
68
|
+
/** 是否斜体 */
|
|
69
|
+
get italic(): boolean;
|
|
70
|
+
constructor();
|
|
71
|
+
/** 获取根节点 */
|
|
72
|
+
getRootNode(): Token | this;
|
|
73
|
+
/**
|
|
74
|
+
* 将字符位置转换为行列号
|
|
75
|
+
* @param index 字符位置
|
|
76
|
+
*/
|
|
77
|
+
posFromIndex(index: number): Position | undefined;
|
|
78
|
+
/**
|
|
79
|
+
* 获取当前节点的相对字符位置,或其第`j`个子节点的相对字符位置
|
|
80
|
+
* @param j 子节点序号
|
|
81
|
+
*/
|
|
82
|
+
getRelativeIndex(j?: number): number;
|
|
83
|
+
/** 获取当前节点的绝对位置 */
|
|
84
|
+
getAbsoluteIndex(): number;
|
|
85
|
+
/**
|
|
86
|
+
* 是否是某种类型的节点
|
|
87
|
+
* @param type 节点类型
|
|
88
|
+
*/
|
|
89
|
+
is<T extends Token>(type: string): this is T;
|
|
90
|
+
/**
|
|
91
|
+
* 是否是全同节点
|
|
92
|
+
* @param node 待比较的节点
|
|
93
|
+
* @throws `assert.AssertionError`
|
|
94
|
+
*/
|
|
95
|
+
isEqualNode(node: AstNode): boolean;
|
|
96
|
+
/**
|
|
97
|
+
* 在后方批量插入兄弟节点
|
|
98
|
+
* @param nodes 插入节点
|
|
99
|
+
*/
|
|
100
|
+
after(...nodes: (AstNodes | string)[]): void;
|
|
101
|
+
/**
|
|
102
|
+
* 在前方批量插入兄弟节点
|
|
103
|
+
* @param nodes 插入节点
|
|
104
|
+
*/
|
|
105
|
+
before(...nodes: (AstNodes | string)[]): void;
|
|
106
|
+
/** 移除当前节点 */
|
|
107
|
+
remove(): void;
|
|
108
|
+
/**
|
|
109
|
+
* 将当前节点批量替换为新的节点
|
|
110
|
+
* @param nodes 插入节点
|
|
111
|
+
*/
|
|
112
|
+
replaceWith(...nodes: (AstNodes | string)[]): void;
|
|
113
|
+
/**
|
|
114
|
+
* 是自身或后代节点
|
|
115
|
+
* @param node 待检测节点
|
|
116
|
+
*/
|
|
117
|
+
contains(node: AstNode): boolean;
|
|
118
|
+
/**
|
|
119
|
+
* 添加事件监听
|
|
120
|
+
* @param types 事件类型
|
|
121
|
+
* @param listener 监听函数
|
|
122
|
+
* @param options 选项
|
|
123
|
+
* @param options.once 仅执行一次
|
|
124
|
+
*/
|
|
125
|
+
addEventListener(types: string | string[], listener: (...args: any[]) => void, options?: {
|
|
126
|
+
once?: boolean;
|
|
127
|
+
}): void;
|
|
128
|
+
/**
|
|
129
|
+
* 移除事件监听
|
|
130
|
+
* @param types 事件类型
|
|
131
|
+
* @param listener 监听函数
|
|
132
|
+
*/
|
|
133
|
+
removeEventListener(types: string | string[], listener: (...args: any[]) => void): void;
|
|
134
|
+
/**
|
|
135
|
+
* 移除事件的所有监听
|
|
136
|
+
* @param types 事件类型
|
|
137
|
+
*/
|
|
138
|
+
removeAllEventListeners(types: string | string[]): void;
|
|
139
|
+
/**
|
|
140
|
+
* 列举事件监听
|
|
141
|
+
* @param type 事件类型
|
|
142
|
+
*/
|
|
143
|
+
listEventListeners(type: string): Function[];
|
|
144
|
+
/**
|
|
145
|
+
* 触发事件
|
|
146
|
+
* @param e 事件对象
|
|
147
|
+
* @param data 事件数据
|
|
148
|
+
*/
|
|
149
|
+
dispatchEvent(e: Event, data: unknown): void;
|
|
150
|
+
/** 获取所有祖先节点 */
|
|
151
|
+
getAncestors(): Token[];
|
|
152
|
+
/**
|
|
153
|
+
* 比较和另一个节点的相对位置
|
|
154
|
+
* @param other 待比较的节点
|
|
155
|
+
* @throws `RangeError` 不在同一个语法树
|
|
156
|
+
*/
|
|
157
|
+
compareDocumentPosition(other: AstNodes): number;
|
|
158
|
+
/**
|
|
159
|
+
* 将行列号转换为字符位置
|
|
160
|
+
* @param top 行号
|
|
161
|
+
* @param left 列号
|
|
162
|
+
*/
|
|
163
|
+
indexFromPos(top: number, left: number): number | undefined;
|
|
164
|
+
/** 获取当前节点的行列位置和大小 */
|
|
165
|
+
getBoundingClientRect(): Dimension & Position;
|
|
166
|
+
/** 销毁 */
|
|
167
|
+
destroy(): void;
|
|
168
|
+
/**
|
|
169
|
+
* 获取某一行的wikitext
|
|
170
|
+
* @param n 行号
|
|
171
|
+
*/
|
|
172
|
+
getLine(n: number): string | undefined;
|
|
173
|
+
}
|