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.
Files changed (174) hide show
  1. package/config/.schema.json +203 -0
  2. package/config/default.json +30 -29
  3. package/config/enwiki.json +829 -15
  4. package/config/llwiki.json +56 -21
  5. package/config/moegirl.json +65 -21
  6. package/config/zhwiki.json +494 -28
  7. package/dist/addon/table.js +494 -0
  8. package/dist/addon/token.js +392 -0
  9. package/dist/addon/transclude.js +184 -0
  10. package/dist/base.d.ts +82 -0
  11. package/dist/base.js +40 -0
  12. package/dist/index.d.ts +33 -0
  13. package/dist/index.js +275 -0
  14. package/dist/internal.d.ts +47 -0
  15. package/dist/lib/element.d.ts +125 -0
  16. package/dist/lib/element.js +377 -0
  17. package/dist/lib/node.d.ts +173 -0
  18. package/dist/lib/node.js +478 -0
  19. package/dist/lib/range.d.ts +105 -0
  20. package/dist/lib/range.js +406 -0
  21. package/dist/lib/ranges.d.ts +28 -0
  22. package/dist/lib/ranges.js +126 -0
  23. package/dist/lib/rect.d.ts +18 -0
  24. package/dist/lib/rect.js +36 -0
  25. package/dist/lib/text.d.ts +58 -0
  26. package/dist/lib/text.js +414 -0
  27. package/dist/lib/title.d.ts +49 -0
  28. package/dist/lib/title.js +253 -0
  29. package/dist/mixin/attributesParent.d.ts +49 -0
  30. package/dist/mixin/attributesParent.js +80 -0
  31. package/dist/mixin/fixed.d.ts +5 -0
  32. package/dist/mixin/fixed.js +32 -0
  33. package/dist/mixin/flagsParent.d.ts +43 -0
  34. package/dist/mixin/flagsParent.js +64 -0
  35. package/dist/mixin/hidden.d.ts +7 -0
  36. package/dist/mixin/hidden.js +39 -0
  37. package/dist/mixin/magicLinkParent.d.ts +19 -0
  38. package/dist/mixin/magicLinkParent.js +43 -0
  39. package/dist/mixin/singleLine.d.ts +5 -0
  40. package/dist/mixin/singleLine.js +25 -0
  41. package/dist/mixin/sol.d.ts +6 -0
  42. package/dist/mixin/sol.js +45 -0
  43. package/dist/mixin/syntax.d.ts +8 -0
  44. package/dist/mixin/syntax.js +46 -0
  45. package/dist/parser/braces.js +152 -0
  46. package/dist/parser/commentAndExt.js +84 -0
  47. package/dist/parser/converter.js +41 -0
  48. package/dist/parser/externalLinks.js +39 -0
  49. package/dist/parser/hrAndDoubleUnderscore.js +44 -0
  50. package/dist/parser/html.js +40 -0
  51. package/dist/parser/links.js +103 -0
  52. package/dist/parser/list.js +116 -0
  53. package/dist/parser/magicLinks.js +55 -0
  54. package/dist/parser/quotes.js +69 -0
  55. package/dist/parser/redirect.js +28 -0
  56. package/dist/parser/selector.js +393 -0
  57. package/dist/parser/table.js +125 -0
  58. package/dist/src/arg.d.ts +49 -0
  59. package/dist/src/arg.js +220 -0
  60. package/dist/src/atom.d.ts +14 -0
  61. package/dist/src/atom.js +54 -0
  62. package/dist/src/attribute.d.ts +64 -0
  63. package/dist/src/attribute.js +482 -0
  64. package/dist/src/attributes.d.ts +103 -0
  65. package/dist/src/attributes.js +380 -0
  66. package/dist/src/converter.d.ts +28 -0
  67. package/dist/src/converter.js +153 -0
  68. package/dist/src/converterFlags.d.ts +80 -0
  69. package/dist/src/converterFlags.js +241 -0
  70. package/dist/src/converterRule.d.ts +71 -0
  71. package/dist/src/converterRule.js +218 -0
  72. package/dist/src/extLink.d.ts +36 -0
  73. package/dist/src/extLink.js +223 -0
  74. package/dist/src/gallery.d.ts +51 -0
  75. package/dist/src/gallery.js +166 -0
  76. package/dist/src/heading.d.ts +44 -0
  77. package/dist/src/heading.js +222 -0
  78. package/dist/src/hidden.d.ts +9 -0
  79. package/dist/src/hidden.js +82 -0
  80. package/dist/src/html.d.ts +61 -0
  81. package/dist/src/html.js +344 -0
  82. package/dist/src/imageParameter.d.ts +60 -0
  83. package/dist/src/imageParameter.js +262 -0
  84. package/dist/src/imagemap.d.ts +47 -0
  85. package/dist/src/imagemap.js +148 -0
  86. package/dist/src/imagemapLink.d.ts +35 -0
  87. package/dist/src/imagemapLink.js +99 -0
  88. package/dist/src/index.d.ts +136 -0
  89. package/dist/src/index.js +790 -0
  90. package/dist/src/link/base.d.ts +52 -0
  91. package/dist/src/link/base.js +258 -0
  92. package/dist/src/link/category.d.ts +22 -0
  93. package/dist/src/link/category.js +36 -0
  94. package/dist/src/link/file.d.ts +102 -0
  95. package/dist/src/link/file.js +345 -0
  96. package/dist/src/link/galleryImage.d.ts +29 -0
  97. package/dist/src/link/galleryImage.js +133 -0
  98. package/dist/src/link/index.d.ts +39 -0
  99. package/dist/src/link/index.js +100 -0
  100. package/dist/src/link/redirectTarget.d.ts +27 -0
  101. package/dist/src/link/redirectTarget.js +71 -0
  102. package/dist/src/magicLink.d.ts +57 -0
  103. package/dist/src/magicLink.js +261 -0
  104. package/dist/src/nested.d.ts +40 -0
  105. package/dist/src/nested.js +108 -0
  106. package/dist/src/nowiki/base.d.ts +28 -0
  107. package/dist/src/nowiki/base.js +90 -0
  108. package/dist/src/nowiki/comment.d.ts +14 -0
  109. package/dist/src/nowiki/comment.js +123 -0
  110. package/dist/src/nowiki/dd.d.ts +8 -0
  111. package/dist/src/nowiki/dd.js +74 -0
  112. package/dist/src/nowiki/doubleUnderscore.d.ts +15 -0
  113. package/dist/src/nowiki/doubleUnderscore.js +101 -0
  114. package/dist/src/nowiki/hr.d.ts +5 -0
  115. package/dist/src/nowiki/hr.js +72 -0
  116. package/dist/src/nowiki/index.d.ts +14 -0
  117. package/dist/src/nowiki/index.js +30 -0
  118. package/dist/src/nowiki/list.d.ts +5 -0
  119. package/dist/src/nowiki/list.js +67 -0
  120. package/dist/src/nowiki/listBase.d.ts +23 -0
  121. package/dist/src/nowiki/listBase.js +100 -0
  122. package/dist/src/nowiki/noinclude.d.ts +6 -0
  123. package/dist/src/nowiki/noinclude.js +77 -0
  124. package/dist/src/nowiki/quote.d.ts +14 -0
  125. package/dist/src/nowiki/quote.js +149 -0
  126. package/dist/src/onlyinclude.d.ts +13 -0
  127. package/dist/src/onlyinclude.js +60 -0
  128. package/dist/src/paramTag/index.d.ts +28 -0
  129. package/dist/src/paramTag/index.js +80 -0
  130. package/dist/src/paramTag/inputbox.d.ts +8 -0
  131. package/dist/src/paramTag/inputbox.js +24 -0
  132. package/dist/src/parameter.d.ts +60 -0
  133. package/dist/src/parameter.js +267 -0
  134. package/dist/src/pre.d.ts +28 -0
  135. package/dist/src/pre.js +62 -0
  136. package/dist/src/redirect.d.ts +30 -0
  137. package/dist/src/redirect.js +128 -0
  138. package/dist/src/syntax.d.ts +15 -0
  139. package/dist/src/syntax.js +87 -0
  140. package/dist/src/table/base.d.ts +28 -0
  141. package/dist/src/table/base.js +81 -0
  142. package/dist/src/table/index.d.ts +230 -0
  143. package/dist/src/table/index.js +506 -0
  144. package/dist/src/table/td.d.ts +72 -0
  145. package/dist/src/table/td.js +375 -0
  146. package/dist/src/table/tr.d.ts +30 -0
  147. package/dist/src/table/tr.js +61 -0
  148. package/dist/src/table/trBase.d.ts +49 -0
  149. package/dist/src/table/trBase.js +165 -0
  150. package/dist/src/tagPair/ext.d.ts +29 -0
  151. package/dist/src/tagPair/ext.js +229 -0
  152. package/dist/src/tagPair/include.d.ts +33 -0
  153. package/dist/src/tagPair/include.js +132 -0
  154. package/dist/src/tagPair/index.d.ts +23 -0
  155. package/dist/src/tagPair/index.js +130 -0
  156. package/dist/src/transclude.d.ts +159 -0
  157. package/dist/src/transclude.js +598 -0
  158. package/dist/util/constants.js +26 -0
  159. package/dist/util/debug.js +95 -0
  160. package/dist/util/diff.js +83 -0
  161. package/dist/util/html.js +146 -0
  162. package/dist/util/lint.js +32 -0
  163. package/dist/util/string.js +107 -0
  164. package/errors/README +3 -0
  165. package/package.json +21 -28
  166. package/printed/README +3 -0
  167. package/bundle/bundle.min.js +0 -37
  168. package/extensions/dist/base.js +0 -163
  169. package/extensions/dist/codejar.js +0 -52
  170. package/extensions/dist/editor.js +0 -159
  171. package/extensions/dist/highlight.js +0 -30
  172. package/extensions/dist/lint.js +0 -72
  173. package/extensions/editor.css +0 -59
  174. 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('"', '&quot;');
87
+ exports.sanitizeAlt = sanitizeAlt;
88
+ /** escape newline */
89
+ exports.newline = factory(/\n/gu, '&#10;');
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
@@ -0,0 +1,3 @@
1
+ 这里记录解析失败时处于半解析状态的维基文本以及错误信息。
2
+
3
+ When parsing fails, the half-parsed wikitext and the error message are recorded here.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wikiparser-node",
3
- "version": "1.12.5-b",
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
- "/bundle/bundle.min.js",
18
- "/extensions/dist/",
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
- "!/config/.schema.json"
21
+ "/dist/",
22
+ "!/dist/[bt]*/"
27
23
  ],
28
- "browser": "/bundle/bundle.min.js",
29
- "main": "./bundle/bundle.min.js",
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
- "prepublishOnly": "npm run build",
37
- "build:core": "esbuild index.ts --bundle --minify --target=es2018 --sourcemap --outfile=bundle/bundle.min.js && eslint --no-eslintrc -c .eslintrc.browser.json bundle/bundle.min.js",
38
- "build:ext": "bash build-ext.sh",
39
- "build:test": "npm run build:core && tsc --project tsconfig.dist.json",
40
- "build": "npm run build:core && npm run build:ext",
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 && tsc --noEmit --project extensions/tsconfig.json && tsc --noEmit --project extensions/tsconfig.codejar.json && eslint --cache .",
38
+ "lint:ts": "tsc --noEmit && eslint --cache .",
44
39
  "lint:json": "v8r -s config/.schema.json config/*.json",
45
- "lint:css": "stylelint extensions/*.css",
46
- "lint": "npm run lint:ts && npm run lint:json && npm run lint:css",
47
- "server": "npm run test:end; http-server .. -c-1 --cors &",
48
- "test": " node --enable-source-maps dist/test/test.js",
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 --enable-source-maps dist/test/real.js"
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
@@ -0,0 +1,3 @@
1
+ 这里存放以 JSON 格式打印的 AST。
2
+
3
+ AST as JSON files are saved here.