wikiparser-node 1.12.5-b → 1.12.6
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 +392 -0
- package/dist/addon/transclude.js +184 -0
- package/dist/base.d.ts +82 -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 +377 -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 +55 -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 +49 -0
- package/dist/src/arg.js +220 -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 +482 -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 +153 -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 +51 -0
- package/dist/src/gallery.js +166 -0
- package/dist/src/heading.d.ts +44 -0
- package/dist/src/heading.js +222 -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 +790 -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 +345 -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 +229 -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 +146 -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,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.undo = exports.mixin = exports.emptyArray = exports.setChildNodes = exports.isToken = exports.Shadow = void 0;
|
|
4
|
+
exports.Shadow = {
|
|
5
|
+
running: false,
|
|
6
|
+
/** @private */
|
|
7
|
+
run(callback) {
|
|
8
|
+
const { running } = this;
|
|
9
|
+
this.running = true;
|
|
10
|
+
try {
|
|
11
|
+
const { Token: AnyToken } = require('../src/index');
|
|
12
|
+
const result = callback();
|
|
13
|
+
if (result instanceof AnyToken && !result.getAttribute('built')) {
|
|
14
|
+
result.afterBuild();
|
|
15
|
+
}
|
|
16
|
+
this.running = running;
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
this.running = running;
|
|
21
|
+
throw e;
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
rev: 0,
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* 是否是某一特定类型的节点
|
|
28
|
+
* @param type 节点类型
|
|
29
|
+
*/
|
|
30
|
+
const isToken = (type) => (node) => node.type === type;
|
|
31
|
+
exports.isToken = isToken;
|
|
32
|
+
/**
|
|
33
|
+
* 更新chldNodes
|
|
34
|
+
* @param parent 父节点
|
|
35
|
+
* @param position 子节点位置
|
|
36
|
+
* @param deleteCount 移除的子节点数量
|
|
37
|
+
* @param inserted 插入的子节点
|
|
38
|
+
*/
|
|
39
|
+
const setChildNodes = (parent, position, deleteCount, inserted = []) => {
|
|
40
|
+
const childNodes = [...parent.childNodes], removed = childNodes.splice(position, deleteCount, ...inserted);
|
|
41
|
+
parent.setAttribute('childNodes', childNodes);
|
|
42
|
+
for (const node of inserted) {
|
|
43
|
+
node.setAttribute('parentNode', parent);
|
|
44
|
+
}
|
|
45
|
+
/* NOT FOR BROWSER */
|
|
46
|
+
for (const node of removed) {
|
|
47
|
+
node.setAttribute('parentNode', undefined);
|
|
48
|
+
}
|
|
49
|
+
/* NOT FOR BROWSER END */
|
|
50
|
+
return removed;
|
|
51
|
+
};
|
|
52
|
+
exports.setChildNodes = setChildNodes;
|
|
53
|
+
/**
|
|
54
|
+
* 生成一个指定长度的空数组
|
|
55
|
+
* @param n 数组长度
|
|
56
|
+
* @param callback 回调函数
|
|
57
|
+
*/
|
|
58
|
+
const emptyArray = (n, callback) => new Array(n).fill(undefined).map((_, i) => callback(i));
|
|
59
|
+
exports.emptyArray = emptyArray;
|
|
60
|
+
/**
|
|
61
|
+
* 同步混入的类名
|
|
62
|
+
* @param target 混入的目标
|
|
63
|
+
* @param source 混入的源
|
|
64
|
+
*/
|
|
65
|
+
const mixin = (target, source) => {
|
|
66
|
+
Object.defineProperty(target, 'name', { value: source.name });
|
|
67
|
+
};
|
|
68
|
+
exports.mixin = mixin;
|
|
69
|
+
/* NOT FOR BROWSER */
|
|
70
|
+
/**
|
|
71
|
+
* 撤销最近一次Mutation
|
|
72
|
+
* @param e 事件
|
|
73
|
+
* @param data 事件数据
|
|
74
|
+
* @throws `RangeError` 无法撤销的事件类型
|
|
75
|
+
*/
|
|
76
|
+
const undo = (e, data) => {
|
|
77
|
+
const { target, type } = e;
|
|
78
|
+
switch (data.type) {
|
|
79
|
+
case 'remove':
|
|
80
|
+
(0, exports.setChildNodes)(target, data.position, 0, [data.removed]);
|
|
81
|
+
break;
|
|
82
|
+
case 'insert':
|
|
83
|
+
(0, exports.setChildNodes)(target, data.position, 1);
|
|
84
|
+
break;
|
|
85
|
+
case 'replace':
|
|
86
|
+
(0, exports.setChildNodes)(target.parentNode, data.position, 1, [data.oldToken]);
|
|
87
|
+
break;
|
|
88
|
+
case 'text':
|
|
89
|
+
target.replaceData(data.oldText);
|
|
90
|
+
break;
|
|
91
|
+
default:
|
|
92
|
+
throw new RangeError(`Unable to undo events with an unknown type: ${type}`);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
exports.undo = undo;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.info = exports.error = exports.diff = exports.cmd = void 0;
|
|
4
|
+
const fs = require("fs/promises");
|
|
5
|
+
const child_process_1 = require("child_process");
|
|
6
|
+
const chalk = require("chalk");
|
|
7
|
+
process.on('unhandledRejection', e => {
|
|
8
|
+
console.error(e);
|
|
9
|
+
});
|
|
10
|
+
/**
|
|
11
|
+
* 将shell命令转化为Promise对象
|
|
12
|
+
* @param command shell指令
|
|
13
|
+
* @param args shell输入参数
|
|
14
|
+
*/
|
|
15
|
+
const cmd = (command, args) => new Promise(resolve => {
|
|
16
|
+
let timer, shell;
|
|
17
|
+
/**
|
|
18
|
+
* 清除进程并返回
|
|
19
|
+
* @param val 返回值
|
|
20
|
+
*/
|
|
21
|
+
const r = (val) => {
|
|
22
|
+
clearTimeout(timer);
|
|
23
|
+
shell?.kill('SIGINT');
|
|
24
|
+
resolve(val);
|
|
25
|
+
};
|
|
26
|
+
try {
|
|
27
|
+
shell = (0, child_process_1.spawn)(command, args);
|
|
28
|
+
timer = setTimeout(() => {
|
|
29
|
+
shell.kill('SIGINT');
|
|
30
|
+
}, 60 * 1000);
|
|
31
|
+
let buf = '';
|
|
32
|
+
shell.stdout.on('data', data => {
|
|
33
|
+
buf += String(data);
|
|
34
|
+
});
|
|
35
|
+
shell.stdout.on('end', () => {
|
|
36
|
+
r(buf);
|
|
37
|
+
});
|
|
38
|
+
shell.on('exit', () => {
|
|
39
|
+
r(shell.killed ? undefined : '');
|
|
40
|
+
});
|
|
41
|
+
shell.on('error', () => {
|
|
42
|
+
r(undefined);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
r(undefined);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
exports.cmd = cmd;
|
|
50
|
+
/**
|
|
51
|
+
* 比较两个文件
|
|
52
|
+
* @param oldStr 旧文本
|
|
53
|
+
* @param newStr 新文本
|
|
54
|
+
* @param uid 唯一标识
|
|
55
|
+
*/
|
|
56
|
+
const diff = async (oldStr, newStr, uid) => {
|
|
57
|
+
if (oldStr === newStr) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const oldFile = `diffOld${uid}`, newFile = `diffNew${uid}`;
|
|
61
|
+
await Promise.all([fs.writeFile(oldFile, oldStr), fs.writeFile(newFile, newStr)]);
|
|
62
|
+
const stdout = await (0, exports.cmd)('git', [
|
|
63
|
+
'diff',
|
|
64
|
+
'--color-words=[\xC0-\xFF][\x80-\xBF]+|<?/?\\w+/?>?|[^[:space:]]',
|
|
65
|
+
'-U0',
|
|
66
|
+
'--no-index',
|
|
67
|
+
oldFile,
|
|
68
|
+
newFile,
|
|
69
|
+
]);
|
|
70
|
+
console.log(stdout?.split('\n').slice(4).join('\n'));
|
|
71
|
+
await Promise.all([fs.unlink(oldFile), fs.unlink(newFile)]);
|
|
72
|
+
};
|
|
73
|
+
exports.diff = diff;
|
|
74
|
+
/** @implements */
|
|
75
|
+
const error = (msg, ...args) => {
|
|
76
|
+
console.error(chalk.red(msg), ...args);
|
|
77
|
+
};
|
|
78
|
+
exports.error = error;
|
|
79
|
+
/** @implements */
|
|
80
|
+
const info = (msg, ...args) => {
|
|
81
|
+
console.info(chalk.green(msg), ...args);
|
|
82
|
+
};
|
|
83
|
+
exports.info = info;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.font = exports.html = exports.getCommon = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* get common prefix length
|
|
6
|
+
* @param prefix
|
|
7
|
+
* @param lastPrefix
|
|
8
|
+
*/
|
|
9
|
+
const getCommon = (prefix, lastPrefix) => prefix.startsWith(lastPrefix) ? lastPrefix.length : [...lastPrefix].findIndex((ch, i) => ch !== prefix[i]);
|
|
10
|
+
exports.getCommon = getCommon;
|
|
11
|
+
/**
|
|
12
|
+
* get next list item
|
|
13
|
+
* @param char list syntax
|
|
14
|
+
* @param state
|
|
15
|
+
* @param state.dt whether a <dt> tag is open
|
|
16
|
+
*/
|
|
17
|
+
const nextItem = (char, state) => {
|
|
18
|
+
if (char === '*' || char === '#') {
|
|
19
|
+
return '</li>\n<li>';
|
|
20
|
+
}
|
|
21
|
+
const close = state.dt[0] ? '</dt>\n' : '</dd>\n';
|
|
22
|
+
if (char === ';') {
|
|
23
|
+
state.dt[0] = true;
|
|
24
|
+
return `${close}<dt>`;
|
|
25
|
+
}
|
|
26
|
+
state.dt[0] = false;
|
|
27
|
+
return `${close}<dd>`;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* close list item
|
|
31
|
+
* @param chars list syntax
|
|
32
|
+
* @param state
|
|
33
|
+
* @param state.dt whether a <dt> tag is open
|
|
34
|
+
*/
|
|
35
|
+
const closeList = (chars, state) => {
|
|
36
|
+
let result = '';
|
|
37
|
+
for (let i = chars.length - 1; i >= 0; i--) {
|
|
38
|
+
const char = chars[i];
|
|
39
|
+
switch (char) {
|
|
40
|
+
case '*':
|
|
41
|
+
case '#':
|
|
42
|
+
result += `</li></${char === '*' ? 'ul' : 'ol'}>`;
|
|
43
|
+
break;
|
|
44
|
+
case ':':
|
|
45
|
+
result += `</${state.dt.shift() ? 'dt' : 'dd'}></dl>`;
|
|
46
|
+
break;
|
|
47
|
+
default:
|
|
48
|
+
//
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return result;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* open list item
|
|
55
|
+
* @param chars list syntax
|
|
56
|
+
* @param state
|
|
57
|
+
* @param state.dt whether a <dt> tag is open
|
|
58
|
+
*/
|
|
59
|
+
const openList = (chars, state) => {
|
|
60
|
+
let result = '';
|
|
61
|
+
for (const char of chars) {
|
|
62
|
+
switch (char) {
|
|
63
|
+
case '*':
|
|
64
|
+
case '#':
|
|
65
|
+
result += `<${char === '*' ? 'ul' : 'ol'}><li>`;
|
|
66
|
+
break;
|
|
67
|
+
case ':':
|
|
68
|
+
state.dt.unshift(false);
|
|
69
|
+
result += '<dl><dd>';
|
|
70
|
+
break;
|
|
71
|
+
default:
|
|
72
|
+
state.dt.unshift(true);
|
|
73
|
+
result += '<dl><dt>';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* convert to HTML
|
|
80
|
+
* @param childNodes a Token's contents
|
|
81
|
+
* @param separator delimiter between nodes
|
|
82
|
+
* @param nowrap whether to normalize newlines
|
|
83
|
+
* @param nocc whether to perform language conversion
|
|
84
|
+
*/
|
|
85
|
+
const html = (childNodes, separator = '', nowrap, nocc) => {
|
|
86
|
+
let lastPrefix = '';
|
|
87
|
+
const results = [], state = { dt: [] };
|
|
88
|
+
for (let j = 0; j < childNodes.length; j++) {
|
|
89
|
+
const child = childNodes[j];
|
|
90
|
+
let result = child.toHtmlInternal(nowrap, nocc);
|
|
91
|
+
if (child.is('list-range')) {
|
|
92
|
+
result = result.trim();
|
|
93
|
+
const { previousSibling: { firstChild: { data } } } = child, prefix = data.trim(), prefix2 = prefix.replaceAll(';', ':'), commonPrefixLength = (0, exports.getCommon)(prefix2, lastPrefix);
|
|
94
|
+
let pre = closeList(lastPrefix.slice(commonPrefixLength), state);
|
|
95
|
+
if (prefix.length === commonPrefixLength) {
|
|
96
|
+
pre += nextItem(prefix.slice(-1), state);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
if (state.dt[0] && prefix[commonPrefixLength - 1] === ':') {
|
|
100
|
+
pre += nextItem(':', state);
|
|
101
|
+
}
|
|
102
|
+
if (lastPrefix) {
|
|
103
|
+
pre += '\n';
|
|
104
|
+
}
|
|
105
|
+
pre += openList(prefix.slice(commonPrefixLength), state);
|
|
106
|
+
}
|
|
107
|
+
result = pre + result;
|
|
108
|
+
let { nextSibling } = child;
|
|
109
|
+
while (nextSibling?.type === 'dd') {
|
|
110
|
+
const next = nextSibling.nextSibling;
|
|
111
|
+
for (let i = 0; i < nextSibling.indent; i++) {
|
|
112
|
+
result += nextItem(':', state);
|
|
113
|
+
}
|
|
114
|
+
result += next.toHtmlInternal(nowrap).trim();
|
|
115
|
+
({ nextSibling } = next);
|
|
116
|
+
j += 2;
|
|
117
|
+
}
|
|
118
|
+
if (nextSibling?.type === 'text'
|
|
119
|
+
&& nextSibling.data === '\n'
|
|
120
|
+
&& nextSibling.nextVisibleSibling?.type === 'list') {
|
|
121
|
+
j += 2;
|
|
122
|
+
lastPrefix = prefix2;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
lastPrefix = '';
|
|
126
|
+
result += closeList(prefix2, state);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
results.push(result);
|
|
130
|
+
}
|
|
131
|
+
return results.join(separator);
|
|
132
|
+
};
|
|
133
|
+
exports.html = html;
|
|
134
|
+
/**
|
|
135
|
+
* wrap text with <b> and <i> tags
|
|
136
|
+
* @param node
|
|
137
|
+
* @param strOrOmit
|
|
138
|
+
*/
|
|
139
|
+
const font = (node, strOrOmit) => {
|
|
140
|
+
const { font: { bold, italic } } = node, str = strOrOmit ?? '', i = str.indexOf('\n');
|
|
141
|
+
const wrap = /** @ignore */ (s) => s === ''
|
|
142
|
+
? ''
|
|
143
|
+
: (italic ? '<i>' : '') + (bold ? '<b>' : '') + (s ?? '') + (bold ? '</b>' : '') + (italic ? '</i>' : '');
|
|
144
|
+
return i === -1 ? wrap(strOrOmit) : wrap(str.slice(0, i)) + str.slice(i);
|
|
145
|
+
};
|
|
146
|
+
exports.font = font;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateForSelf = exports.generateForChild = void 0;
|
|
4
|
+
const rect_1 = require("../lib/rect");
|
|
5
|
+
const index_1 = require("../index");
|
|
6
|
+
/**
|
|
7
|
+
* 生成lint函数
|
|
8
|
+
* @param func lint函数
|
|
9
|
+
*/
|
|
10
|
+
const factory = (func) => (token, rect, rule, msg, severity = 'error') => {
|
|
11
|
+
const { start } = rect, { top, left } = rect instanceof rect_1.BoundingRect ? rect : new rect_1.BoundingRect(token, start), { offsetHeight, offsetWidth } = token, { startIndex, startLine, startCol } = func(token, start, top, left);
|
|
12
|
+
return {
|
|
13
|
+
rule,
|
|
14
|
+
message: index_1.default.msg(msg),
|
|
15
|
+
severity,
|
|
16
|
+
startIndex,
|
|
17
|
+
endIndex: startIndex + token.toString().length,
|
|
18
|
+
startLine,
|
|
19
|
+
endLine: startLine + offsetHeight - 1,
|
|
20
|
+
startCol,
|
|
21
|
+
endCol: offsetHeight === 1 ? startCol + offsetWidth : offsetWidth,
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
exports.generateForChild = factory((child, start, line, col) => {
|
|
25
|
+
const index = child.getRelativeIndex(), { top, left } = child.parentNode.posFromIndex(index);
|
|
26
|
+
return {
|
|
27
|
+
startIndex: start + index,
|
|
28
|
+
startLine: line + top,
|
|
29
|
+
startCol: top ? left : col + left,
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
exports.generateForSelf = factory((_, startIndex, startLine, startCol) => ({ startIndex, startLine, startCol }));
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.removeCommentLine = exports.newline = exports.sanitizeAlt = exports.sanitizeId = exports.sanitizeAttr = exports.sanitize = exports.normalizeSpace = exports.encode = exports.print = exports.escape = exports.noWrap = exports.decodeNumber = exports.decodeHtml = exports.text = exports.rawurldecode = exports.escapeRegExp = exports.removeComment = exports.tidy = exports.extUrlChar = exports.extUrlCharFirst = void 0;
|
|
4
|
+
const commonExtUrlChar = String.raw `[^[\]<>"\0-\x1F\x7F\p{Zs}\uFFFD]`;
|
|
5
|
+
exports.extUrlCharFirst = String.raw `(?:\[[\da-f:.]+\]|${commonExtUrlChar})`;
|
|
6
|
+
exports.extUrlChar = String.raw `(?:${commonExtUrlChar}|\0\d+[cn!~]\x7F)*`;
|
|
7
|
+
/**
|
|
8
|
+
* 生成正则替换函数
|
|
9
|
+
* @param regex 正则表达式
|
|
10
|
+
* @param replace 替换字符串或函数
|
|
11
|
+
*/
|
|
12
|
+
const factory = (regex, replace) => (str) => str.replace(regex, replace);
|
|
13
|
+
/** 清理解析专用的不可见字符 */
|
|
14
|
+
exports.tidy = factory(/[\0\x7F]|\r$/gmu, '');
|
|
15
|
+
/** remove half-parsed comment-like tokens */
|
|
16
|
+
exports.removeComment = factory(/\0\d+[cn]\x7F/gu, '');
|
|
17
|
+
/** escape special chars for RegExp constructor */
|
|
18
|
+
exports.escapeRegExp = factory(/[\\{}()|.?*+^$[\]]/gu, String.raw `\$&`);
|
|
19
|
+
/**
|
|
20
|
+
* PHP的`rawurldecode`函数的JavaScript实现
|
|
21
|
+
* @param str 要解码的字符串
|
|
22
|
+
*/
|
|
23
|
+
const rawurldecode = (str) => decodeURIComponent(str.replace(/%(?![\da-f]{2})/giu, '%25'));
|
|
24
|
+
exports.rawurldecode = rawurldecode;
|
|
25
|
+
/**
|
|
26
|
+
* extract effective wikitext
|
|
27
|
+
* @param childNodes a Token's contents
|
|
28
|
+
* @param separator delimiter between nodes
|
|
29
|
+
*/
|
|
30
|
+
const text = (childNodes, separator = '') => childNodes.map(child => typeof child === 'string' ? child : child.text()).join(separator);
|
|
31
|
+
exports.text = text;
|
|
32
|
+
const names = { lt: '<', gt: '>', lbrack: '[', rbrack: ']', lbrace: '{', rbrace: '}', nbsp: ' ', amp: '&', quot: '"' };
|
|
33
|
+
/** decode HTML entities */
|
|
34
|
+
exports.decodeHtml = factory(/&(?:#(\d+|[Xx][\da-fA-F]+)|([lLgG][tT]|[lr]brac[ke]|nbsp|amp|AMP|quot|QUOT));/gu, (_, code, name) => code
|
|
35
|
+
? String.fromCodePoint(Number((/^x/iu.test(code) ? '0' : '') + code))
|
|
36
|
+
: names[name.toLowerCase()]);
|
|
37
|
+
/** decode numbered HTML entities */
|
|
38
|
+
exports.decodeNumber = factory(/&#(\d+|x[\da-f]+);/giu, (_, code) => String.fromCodePoint(Number((/^x/iu.test(code) ? '0' : '') + code)));
|
|
39
|
+
/** escape newlines */
|
|
40
|
+
exports.noWrap = factory(/\n/gu, String.raw `\n`);
|
|
41
|
+
const entities = { '&': 'amp', '<': 'lt', '>': 'gt', '"': 'quot', '\n': '#10' };
|
|
42
|
+
/**
|
|
43
|
+
* replace by HTML entities
|
|
44
|
+
* @param re regex
|
|
45
|
+
*/
|
|
46
|
+
const replaceEntities = (re) => factory(re, p => `&${entities[p]};`);
|
|
47
|
+
/** escape HTML entities */
|
|
48
|
+
exports.escape = replaceEntities(/[&<>]/gu);
|
|
49
|
+
/**
|
|
50
|
+
* 以HTML格式打印
|
|
51
|
+
* @param childNodes 子节点
|
|
52
|
+
* @param opt 选项
|
|
53
|
+
*/
|
|
54
|
+
const print = (childNodes, opt = {}) => {
|
|
55
|
+
const { pre = '', post = '', sep = '' } = opt;
|
|
56
|
+
return pre + childNodes.map(child => child.print()).join(sep) + post;
|
|
57
|
+
};
|
|
58
|
+
exports.print = print;
|
|
59
|
+
/* NOT FOR BROWSER */
|
|
60
|
+
/** encode URI */
|
|
61
|
+
exports.encode = factory(/[<>[\]#|=]+/gu, encodeURIComponent);
|
|
62
|
+
/**
|
|
63
|
+
* convert newline in text nodes to single whitespace
|
|
64
|
+
* @param token 父节点
|
|
65
|
+
*/
|
|
66
|
+
const normalizeSpace = (token) => {
|
|
67
|
+
if (token) {
|
|
68
|
+
for (const child of token.childNodes) {
|
|
69
|
+
if (child.type === 'text') {
|
|
70
|
+
child.replaceData(child.data.replace(/\n+/gu, ' '));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
exports.normalizeSpace = normalizeSpace;
|
|
76
|
+
/** escape HTML entities */
|
|
77
|
+
exports.sanitize = replaceEntities(/[<>]|&(?=amp(?!;))/giu);
|
|
78
|
+
/** escape HTML entities in attributes */
|
|
79
|
+
exports.sanitizeAttr = replaceEntities(/[<>"]/gu);
|
|
80
|
+
/** escape HTML entities in heading id */
|
|
81
|
+
exports.sanitizeId = replaceEntities(/["&]/gu);
|
|
82
|
+
/**
|
|
83
|
+
* sanitize selected HTML attributes
|
|
84
|
+
* @param str attribute value
|
|
85
|
+
*/
|
|
86
|
+
const sanitizeAlt = (str) => str?.replace(/<\/?[a-z].*?>/gu, '').trim().replace(/\s+/gu, ' ').replaceAll('"', '"');
|
|
87
|
+
exports.sanitizeAlt = sanitizeAlt;
|
|
88
|
+
/** escape newline */
|
|
89
|
+
exports.newline = factory(/\n/gu, ' ');
|
|
90
|
+
/**
|
|
91
|
+
* remove lines that only contain comments
|
|
92
|
+
* @param str
|
|
93
|
+
* @param standalone whether for a standalone document
|
|
94
|
+
*/
|
|
95
|
+
const removeCommentLine = (str, standalone) => {
|
|
96
|
+
const lines = str.split('\n'), { length } = lines;
|
|
97
|
+
if (!standalone && length < 3) {
|
|
98
|
+
return (0, exports.removeComment)(str);
|
|
99
|
+
}
|
|
100
|
+
const offset = standalone ? 0 : 1, end = length - offset;
|
|
101
|
+
return (0, exports.removeComment)([
|
|
102
|
+
...lines.slice(0, offset),
|
|
103
|
+
...lines.slice(offset, end).filter(line => !/^(?!\s*$)(?:\s|\0\d+c\x7F)*$/u.test(line)),
|
|
104
|
+
...lines.slice(end),
|
|
105
|
+
].join('\n'));
|
|
106
|
+
};
|
|
107
|
+
exports.removeCommentLine = removeCommentLine;
|
package/errors/README
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wikiparser-node",
|
|
3
|
-
"version": "1.12.
|
|
3
|
+
"version": "1.12.6",
|
|
4
4
|
"description": "A Node.js parser for MediaWiki markup with AST",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mediawiki",
|
|
@@ -14,50 +14,43 @@
|
|
|
14
14
|
"license": "GPL-3.0",
|
|
15
15
|
"author": "Bhsd",
|
|
16
16
|
"files": [
|
|
17
|
-
"/
|
|
18
|
-
"/
|
|
19
|
-
"/extensions/*.css",
|
|
20
|
-
"!/extensions/dist/gh-page.js",
|
|
21
|
-
"!/extensions/gh-page.css",
|
|
22
|
-
"!/extensions/dist/parserTests.js",
|
|
23
|
-
"!/extensions/test-page.css",
|
|
17
|
+
"/errors/README",
|
|
18
|
+
"/printed/README",
|
|
24
19
|
"/config/",
|
|
25
20
|
"/i18n/",
|
|
26
|
-
"
|
|
21
|
+
"/dist/",
|
|
22
|
+
"!/dist/[bt]*/"
|
|
27
23
|
],
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"types": "./extensions/typings.d.ts",
|
|
24
|
+
"main": "./dist/index.js",
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
31
26
|
"repository": {
|
|
32
27
|
"type": "git",
|
|
33
28
|
"url": "git+https://github.com/bhsd-harry/wikiparser-node.git"
|
|
34
29
|
},
|
|
35
30
|
"scripts": {
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"build:
|
|
40
|
-
"build": "npm run build:core &&
|
|
31
|
+
"toc": "node ./dist/bin/toc.js",
|
|
32
|
+
"declaration": "grep -rl --include='*.d.ts' '@private' dist/ | xargs bash sed.sh -i -E '/^\\s+\\/\\*\\* @private/,+1d'; grep -rl --include='*.d.ts' '/util/' dist/ | xargs bash sed.sh -i -E '/^import .+\\/util\\//d'; bash sed.sh -i -E 's/abstract (lint|print|text)\\b/\\1/' dist/lib/node.d.ts; node ./dist/bin/declaration.js",
|
|
33
|
+
"prepublishOnly": "npm run build:core",
|
|
34
|
+
"build:core": "bash build.sh",
|
|
35
|
+
"build": "npm run build:core && node ./dist/bin/parserTests.js",
|
|
41
36
|
"diff": "bash diff.sh",
|
|
42
37
|
"diff:stat": "f() { git diff --stat --ignore-all-space --color=always $1 $2 -- . ':!extensions/' ':!bin/' | grep '\\.ts'; }; f",
|
|
43
|
-
"lint:ts": "tsc --noEmit &&
|
|
38
|
+
"lint:ts": "tsc --noEmit && eslint --cache .",
|
|
44
39
|
"lint:json": "v8r -s config/.schema.json config/*.json",
|
|
45
|
-
"lint
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"test": "
|
|
49
|
-
"test:parser": "node --enable-source-maps dist/test/parserTests.js",
|
|
50
|
-
"test:server": "npm run build && bash sed.sh -i 's|importScripts.*|importScripts(\"http://127.0.0.1:8080/wikiparser-node/bundle/bundle.min.js\");|' extensions/dist/base.js; npm run server",
|
|
40
|
+
"lint": "npm run lint:ts && npm run lint:json",
|
|
41
|
+
"prof": "node dist/test/prof.js",
|
|
42
|
+
"test": "node dist/test/test.js",
|
|
43
|
+
"test:parser": "node dist/test/parserTests.js",
|
|
51
44
|
"test:end": "pkill -x http-server",
|
|
52
|
-
"test:real": "node
|
|
45
|
+
"test:real": "node dist/test/real.js"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"chalk": "^4.1.2"
|
|
53
49
|
},
|
|
54
50
|
"devDependencies": {
|
|
55
|
-
"@bhsd/codemirror-mediawiki": "^2.14.0",
|
|
56
51
|
"@bhsd/common": "^0.0.0",
|
|
57
52
|
"@codemirror/lint": "^6.8.0",
|
|
58
53
|
"@types/node": "^20.11.6",
|
|
59
|
-
"@types/prismjs": "^1.26.3",
|
|
60
|
-
"chalk": "^4.1.2",
|
|
61
54
|
"codejar-async": "^4.2.0",
|
|
62
55
|
"monaco-editor": "^0.50.0",
|
|
63
56
|
"v8r": "^3.0.0"
|
package/printed/README
ADDED