wikiparser-node 0.11.0 → 1.0.0-beta.1

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 (252) hide show
  1. package/config/.schema.json +26 -0
  2. package/dist/index.d.ts +61 -113
  3. package/dist/index.js +314 -0
  4. package/dist/lib/element.d.ts +122 -108
  5. package/dist/lib/element.js +656 -0
  6. package/dist/lib/node.d.ts +115 -221
  7. package/dist/lib/node.js +473 -0
  8. package/dist/lib/ranges.d.ts +27 -26
  9. package/dist/lib/ranges.js +130 -0
  10. package/dist/lib/text.d.ts +36 -28
  11. package/dist/lib/text.js +215 -0
  12. package/dist/lib/title.d.ts +26 -12
  13. package/dist/lib/title.js +108 -0
  14. package/dist/mixin/attributesParent.js +90 -0
  15. package/dist/mixin/fixed.js +29 -0
  16. package/dist/mixin/hidden.js +19 -0
  17. package/dist/mixin/singleLine.js +23 -0
  18. package/dist/mixin/sol.js +41 -0
  19. package/dist/parser/brackets.js +118 -0
  20. package/dist/parser/commentAndExt.js +48 -0
  21. package/dist/parser/converter.js +31 -0
  22. package/dist/parser/externalLinks.js +22 -0
  23. package/dist/parser/hrAndDoubleUnderscore.js +35 -0
  24. package/dist/parser/html.js +29 -0
  25. package/dist/parser/links.js +86 -0
  26. package/dist/parser/list.js +51 -0
  27. package/dist/parser/magicLinks.js +32 -0
  28. package/dist/parser/quotes.js +57 -0
  29. package/dist/parser/selector.js +158 -0
  30. package/dist/parser/table.js +108 -0
  31. package/dist/src/arg.d.ts +47 -23
  32. package/dist/src/arg.js +196 -0
  33. package/dist/src/atom.d.ts +12 -0
  34. package/dist/src/atom.js +22 -0
  35. package/dist/src/attribute.d.ts +74 -33
  36. package/dist/src/attribute.js +433 -0
  37. package/dist/src/attributes.d.ts +61 -55
  38. package/dist/src/attributes.js +371 -0
  39. package/dist/src/converter.d.ts +45 -71
  40. package/dist/src/converter.js +135 -0
  41. package/dist/src/converterFlags.d.ts +64 -39
  42. package/dist/src/converterFlags.js +235 -0
  43. package/dist/src/converterRule.d.ts +49 -27
  44. package/dist/src/converterRule.js +255 -0
  45. package/dist/src/extLink.d.ts +41 -38
  46. package/dist/src/extLink.js +154 -0
  47. package/dist/src/gallery.d.ts +59 -18
  48. package/dist/src/gallery.js +132 -0
  49. package/dist/src/heading.d.ts +60 -22
  50. package/dist/src/heading.js +135 -0
  51. package/dist/src/hidden.d.ts +20 -0
  52. package/dist/src/hidden.js +24 -0
  53. package/dist/src/html.d.ts +83 -29
  54. package/dist/src/html.js +242 -0
  55. package/dist/src/imageParameter.d.ts +59 -40
  56. package/dist/src/imageParameter.js +251 -0
  57. package/dist/src/imagemap.d.ts +65 -21
  58. package/dist/src/imagemap.js +169 -0
  59. package/dist/src/imagemapLink.d.ts +46 -14
  60. package/dist/src/imagemapLink.js +38 -0
  61. package/dist/src/index.d.ts +71 -105
  62. package/dist/src/index.js +826 -0
  63. package/dist/src/link/base.d.ts +71 -0
  64. package/dist/src/link/base.js +225 -0
  65. package/dist/src/link/category.d.ts +10 -11
  66. package/dist/src/link/category.js +26 -0
  67. package/dist/src/link/file.d.ts +61 -39
  68. package/dist/src/link/file.js +242 -0
  69. package/dist/src/link/galleryImage.d.ts +34 -12
  70. package/dist/src/link/galleryImage.js +98 -0
  71. package/dist/src/link/index.d.ts +25 -63
  72. package/dist/src/link/index.js +136 -0
  73. package/dist/src/magicLink.d.ts +22 -15
  74. package/dist/src/magicLink.js +126 -0
  75. package/dist/src/nested.d.ts +47 -0
  76. package/dist/src/nested.js +84 -0
  77. package/dist/src/nowiki/base.d.ts +39 -0
  78. package/dist/src/nowiki/base.js +29 -0
  79. package/dist/src/nowiki/comment.d.ts +31 -20
  80. package/dist/src/nowiki/comment.js +61 -0
  81. package/dist/src/nowiki/dd.d.ts +17 -11
  82. package/dist/src/nowiki/dd.js +50 -0
  83. package/dist/src/nowiki/doubleUnderscore.d.ts +28 -13
  84. package/dist/src/nowiki/doubleUnderscore.js +45 -0
  85. package/dist/src/nowiki/hr.d.ts +28 -10
  86. package/dist/src/nowiki/hr.js +33 -0
  87. package/dist/src/nowiki/index.d.ts +17 -23
  88. package/dist/src/nowiki/index.js +21 -0
  89. package/dist/src/nowiki/list.d.ts +15 -7
  90. package/dist/src/nowiki/list.js +11 -0
  91. package/dist/src/nowiki/noinclude.d.ts +20 -7
  92. package/dist/src/nowiki/noinclude.js +22 -0
  93. package/dist/src/nowiki/quote.d.ts +25 -10
  94. package/dist/src/nowiki/quote.js +55 -0
  95. package/dist/src/onlyinclude.d.ts +28 -12
  96. package/dist/src/onlyinclude.js +64 -0
  97. package/dist/src/paramTag/index.d.ts +40 -17
  98. package/dist/src/paramTag/index.js +76 -0
  99. package/dist/src/paramTag/inputbox.d.ts +8 -7
  100. package/dist/src/paramTag/inputbox.js +19 -0
  101. package/dist/src/parameter.d.ts +62 -41
  102. package/dist/src/parameter.js +201 -0
  103. package/dist/src/pre.d.ts +32 -0
  104. package/dist/src/pre.js +39 -0
  105. package/dist/src/syntax.d.ts +17 -14
  106. package/dist/src/syntax.js +65 -0
  107. package/dist/src/table/base.d.ts +55 -0
  108. package/dist/src/table/base.js +77 -0
  109. package/dist/src/table/index.d.ts +123 -156
  110. package/dist/src/table/index.js +811 -0
  111. package/dist/src/table/td.d.ts +90 -67
  112. package/dist/src/table/td.js +276 -0
  113. package/dist/src/table/tr.d.ts +30 -85
  114. package/dist/src/table/tr.js +48 -0
  115. package/dist/src/table/trBase.d.ts +72 -0
  116. package/dist/src/table/trBase.js +153 -0
  117. package/dist/src/tagPair/ext.d.ts +47 -11
  118. package/dist/src/tagPair/ext.js +127 -0
  119. package/dist/src/tagPair/include.d.ts +32 -13
  120. package/dist/src/tagPair/include.js +40 -0
  121. package/dist/src/tagPair/index.d.ts +44 -29
  122. package/dist/src/tagPair/index.js +111 -0
  123. package/dist/src/transclude.d.ts +88 -85
  124. package/dist/src/transclude.js +739 -0
  125. package/dist/util/base.js +26 -0
  126. package/dist/util/debug.js +52 -0
  127. package/dist/util/diff.js +69 -0
  128. package/dist/util/lint.js +38 -0
  129. package/dist/util/string.js +103 -0
  130. package/errors/README +1 -0
  131. package/i18n/zh-hans.json +1 -0
  132. package/i18n/zh-hant.json +1 -0
  133. package/package.json +21 -24
  134. package/printed/README +1 -0
  135. package/dist/mixin/attributeParent.d.ts +0 -9
  136. package/dist/mixin/fixedToken.d.ts +0 -8
  137. package/dist/mixin/hidden.d.ts +0 -8
  138. package/dist/mixin/singleLine.d.ts +0 -8
  139. package/dist/mixin/sol.d.ts +0 -8
  140. package/dist/parser/brackets.d.ts +0 -12
  141. package/dist/parser/commentAndExt.d.ts +0 -8
  142. package/dist/parser/converter.d.ts +0 -7
  143. package/dist/parser/externalLinks.d.ts +0 -7
  144. package/dist/parser/hrAndDoubleUnderscore.d.ts +0 -11
  145. package/dist/parser/html.d.ts +0 -7
  146. package/dist/parser/links.d.ts +0 -7
  147. package/dist/parser/list.d.ts +0 -7
  148. package/dist/parser/magicLinks.d.ts +0 -7
  149. package/dist/parser/quotes.d.ts +0 -7
  150. package/dist/parser/selector.d.ts +0 -12
  151. package/dist/parser/table.d.ts +0 -11
  152. package/dist/src/atom/hidden.d.ts +0 -5
  153. package/dist/src/atom/index.d.ts +0 -15
  154. package/dist/src/charinsert.d.ts +0 -32
  155. package/dist/src/hasNowiki/index.d.ts +0 -14
  156. package/dist/src/hasNowiki/pre.d.ts +0 -13
  157. package/dist/src/nested/choose.d.ts +0 -13
  158. package/dist/src/nested/combobox.d.ts +0 -13
  159. package/dist/src/nested/index.d.ts +0 -18
  160. package/dist/src/nested/references.d.ts +0 -13
  161. package/dist/tool/index.d.ts +0 -420
  162. package/dist/util/base.d.ts +0 -10
  163. package/dist/util/debug.d.ts +0 -20
  164. package/dist/util/diff.d.ts +0 -8
  165. package/dist/util/lint.d.ts +0 -28
  166. package/dist/util/string.d.ts +0 -55
  167. package/index.js +0 -333
  168. package/lib/element.js +0 -618
  169. package/lib/node.js +0 -730
  170. package/lib/ranges.js +0 -130
  171. package/lib/text.js +0 -265
  172. package/lib/title.js +0 -83
  173. package/mixin/attributeParent.js +0 -117
  174. package/mixin/fixedToken.js +0 -40
  175. package/mixin/hidden.js +0 -21
  176. package/mixin/singleLine.js +0 -31
  177. package/mixin/sol.js +0 -54
  178. package/parser/brackets.js +0 -128
  179. package/parser/commentAndExt.js +0 -62
  180. package/parser/converter.js +0 -46
  181. package/parser/externalLinks.js +0 -33
  182. package/parser/hrAndDoubleUnderscore.js +0 -49
  183. package/parser/html.js +0 -42
  184. package/parser/links.js +0 -94
  185. package/parser/list.js +0 -59
  186. package/parser/magicLinks.js +0 -41
  187. package/parser/quotes.js +0 -64
  188. package/parser/selector.js +0 -180
  189. package/parser/table.js +0 -114
  190. package/src/arg.js +0 -207
  191. package/src/atom/hidden.js +0 -13
  192. package/src/atom/index.js +0 -43
  193. package/src/attribute.js +0 -472
  194. package/src/attributes.js +0 -453
  195. package/src/charinsert.js +0 -97
  196. package/src/converter.js +0 -176
  197. package/src/converterFlags.js +0 -284
  198. package/src/converterRule.js +0 -256
  199. package/src/extLink.js +0 -180
  200. package/src/gallery.js +0 -149
  201. package/src/hasNowiki/index.js +0 -44
  202. package/src/hasNowiki/pre.js +0 -40
  203. package/src/heading.js +0 -134
  204. package/src/html.js +0 -254
  205. package/src/imageParameter.js +0 -303
  206. package/src/imagemap.js +0 -199
  207. package/src/imagemapLink.js +0 -41
  208. package/src/index.js +0 -938
  209. package/src/link/category.js +0 -44
  210. package/src/link/file.js +0 -287
  211. package/src/link/galleryImage.js +0 -120
  212. package/src/link/index.js +0 -388
  213. package/src/magicLink.js +0 -151
  214. package/src/nested/choose.js +0 -24
  215. package/src/nested/combobox.js +0 -23
  216. package/src/nested/index.js +0 -96
  217. package/src/nested/references.js +0 -23
  218. package/src/nowiki/comment.js +0 -71
  219. package/src/nowiki/dd.js +0 -59
  220. package/src/nowiki/doubleUnderscore.js +0 -56
  221. package/src/nowiki/hr.js +0 -41
  222. package/src/nowiki/index.js +0 -56
  223. package/src/nowiki/list.js +0 -16
  224. package/src/nowiki/noinclude.js +0 -28
  225. package/src/nowiki/quote.js +0 -69
  226. package/src/onlyinclude.js +0 -64
  227. package/src/paramTag/index.js +0 -89
  228. package/src/paramTag/inputbox.js +0 -35
  229. package/src/parameter.js +0 -239
  230. package/src/syntax.js +0 -91
  231. package/src/table/index.js +0 -985
  232. package/src/table/td.js +0 -343
  233. package/src/table/tr.js +0 -319
  234. package/src/tagPair/ext.js +0 -146
  235. package/src/tagPair/include.js +0 -50
  236. package/src/tagPair/index.js +0 -131
  237. package/src/transclude.js +0 -843
  238. package/tool/index.js +0 -1209
  239. package/typings/api.d.ts +0 -9
  240. package/typings/array.d.ts +0 -29
  241. package/typings/event.d.ts +0 -22
  242. package/typings/index.d.ts +0 -118
  243. package/typings/node.d.ts +0 -35
  244. package/typings/parser.d.ts +0 -12
  245. package/typings/table.d.ts +0 -10
  246. package/typings/token.d.ts +0 -31
  247. package/typings/tool.d.ts +0 -6
  248. package/util/base.js +0 -17
  249. package/util/debug.js +0 -73
  250. package/util/diff.js +0 -76
  251. package/util/lint.js +0 -57
  252. package/util/string.js +0 -126
@@ -116,6 +116,32 @@
116
116
  "type": "string",
117
117
  "pattern": "^[-a-z]+$"
118
118
  }
119
+ },
120
+ "conversionTable": {
121
+ "description": "table of unidirectional conversions",
122
+ "type": "array",
123
+ "items": {
124
+ "type": "array",
125
+ "items": {
126
+ "type": "string",
127
+ "pattern": "^[^_<>[\\]{}|]+$"
128
+ },
129
+ "minItems": 2,
130
+ "maxItems": 2
131
+ }
132
+ },
133
+ "redirects": {
134
+ "description": "table of redirects",
135
+ "type": "array",
136
+ "items": {
137
+ "type": "array",
138
+ "items": {
139
+ "type": "string",
140
+ "pattern": "^[^_<>[\\]{}|]+$"
141
+ },
142
+ "minItems": 2,
143
+ "maxItems": 2
144
+ }
119
145
  }
120
146
  },
121
147
  "required": [
package/dist/index.d.ts CHANGED
@@ -1,114 +1,62 @@
1
- import AstElement = require("./lib/element.js")
2
- import AstNode = require("./lib/node.js")
3
- import Ranges = require("./lib/ranges.js")
4
- import AstText = require("./lib/text.js")
5
- import Title = require("./lib/title.js")
6
- import ArgToken = require("./src/arg.js")
7
- import HiddenToken = require("./src/atom/hidden.js")
8
- import AtomToken = require("./src/atom/index.js")
9
- import AttributeToken = require("./src/attribute.js")
10
- import AttributesToken = require("./src/attributes.js")
11
- import CharinsertToken = require("./src/charinsert.js")
12
- import ConverterToken = require("./src/converter.js")
13
- import ConverterFlagsToken = require("./src/converterFlags.js")
14
- import ConverterRuleToken = require("./src/converterRule.js")
15
- import ExtLinkToken = require("./src/extLink.js")
16
- import GalleryToken = require("./src/gallery.js")
17
- import HasNowikiToken = require("./src/hasNowiki/index.js")
18
- import PreToken = require("./src/hasNowiki/pre.js")
19
- import HeadingToken = require("./src/heading.js")
20
- import HtmlToken = require("./src/html.js")
21
- import ImageParameterToken = require("./src/imageParameter.js")
22
- import ImagemapToken = require("./src/imagemap.js")
23
- import ImagemapLinkToken = require("./src/imagemapLink.js")
24
- import Token = require("./src/index.js")
25
- import CategoryToken = require("./src/link/category.js")
26
- import FileToken = require("./src/link/file.js")
27
- import GalleryImageToken = require("./src/link/galleryImage.js")
28
- import LinkToken = require("./src/link/index.js")
29
- import MagicLinkToken = require("./src/magicLink.js")
30
- import ChooseToken = require("./src/nested/choose.js")
31
- import ComboboxToken = require("./src/nested/combobox.js")
32
- import NestedToken = require("./src/nested/index.js")
33
- import ReferencesToken = require("./src/nested/references.js")
34
- import CommentToken = require("./src/nowiki/comment.js")
35
- import DdToken = require("./src/nowiki/dd.js")
36
- import DoubleUnderscoreToken = require("./src/nowiki/doubleUnderscore.js")
37
- import HrToken = require("./src/nowiki/hr.js")
38
- import NowikiToken = require("./src/nowiki/index.js")
39
- import ListToken = require("./src/nowiki/list.js")
40
- import NoincludeToken = require("./src/nowiki/noinclude.js")
41
- import QuoteToken = require("./src/nowiki/quote.js")
42
- import OnlyincludeToken = require("./src/onlyinclude.js")
43
- import ParamTagToken = require("./src/paramTag/index.js")
44
- import InputboxToken = require("./src/paramTag/inputbox.js")
45
- import ParameterToken = require("./src/parameter.js")
46
- import SyntaxToken = require("./src/syntax.js")
47
- import TableToken = require("./src/table/index.js")
48
- import TdToken = require("./src/table/td.js")
49
- import TrToken = require("./src/table/tr.js")
50
- import ExtToken = require("./src/tagPair/ext.js")
51
- import IncludeToken = require("./src/tagPair/include.js")
52
- import TagPairToken = require("./src/tagPair/index.js")
53
- import TranscludeToken = require("./src/transclude.js")
54
-
55
- export = Parser;
56
- declare const Parser: import('./../typings');
57
-
1
+ declare interface Config {
2
+ ext: string[];
3
+ html: [string[], string[], string[]];
4
+ namespaces: Record<string, string>;
5
+ nsid: Record<string, number>;
6
+ parserFunction: [Record<string, string>, string[], string[], string[]];
7
+ doubleUnderscore: [string[], string[]];
8
+ protocol: string;
9
+ img: Record<string, string>;
10
+ variants: string[];
11
+ interwiki: string[];
12
+ excludes?: string[];
13
+ conversionTable?: [string, string][];
14
+ redirects?: [string, string][];
15
+ }
16
+ declare interface LintError {
17
+ message: string;
18
+ severity: 'error' | 'warning';
19
+ startIndex: number;
20
+ endIndex: number;
21
+ startLine: number;
22
+ startCol: number;
23
+ endLine: number;
24
+ endCol: number;
25
+ excerpt: string;
26
+ }
27
+ declare interface Parser {
28
+ /** @browser */
29
+ config: string | Config;
30
+ /** @browser */
31
+ i18n: string | Record<string, string> | undefined;
32
+ conversionTable: Map<string, string>;
33
+ redirects: Map<string, string>;
34
+ /**
35
+ * 规范化页面标题
36
+ * @browser
37
+ * @param title 标题(含或不含命名空间前缀)
38
+ * @param defaultNs 命名空间
39
+ * @param include 是否嵌入
40
+ * @param halfParsed 是否是半解析状态
41
+ * @param decode 是否需要解码
42
+ * @param selfLink 是否允许selfLink
43
+ */
44
+ normalizeTitle(title: string, defaultNs?: number, include?: boolean, config?: Config, halfParsed?: boolean, decode?: boolean, selfLink?: boolean): import('./lib/title');
45
+ /**
46
+ * 解析wikitext
47
+ * @browser
48
+ * @param include 是否嵌入
49
+ * @param maxStage 最大解析层级
50
+ */
51
+ parse(wikitext: string, include?: boolean, maxStage?: number, config?: Config): import('./src');
52
+ /**
53
+ * 是否是跨维基链接
54
+ * @param title 链接标题
55
+ */
56
+ isInterwiki(title: string, config?: Config): [string, string] | null;
57
+ }
58
+ declare const Parser: Parser;
58
59
  declare namespace Parser {
59
- export {
60
- AstElement,
61
- AstNode,
62
- Ranges,
63
- AstText,
64
- Title,
65
- ArgToken,
66
- HiddenToken,
67
- AtomToken,
68
- AttributeToken,
69
- AttributesToken,
70
- CharinsertToken,
71
- ConverterToken,
72
- ConverterFlagsToken,
73
- ConverterRuleToken,
74
- ExtLinkToken,
75
- GalleryToken,
76
- HasNowikiToken,
77
- PreToken,
78
- HeadingToken,
79
- HtmlToken,
80
- ImageParameterToken,
81
- ImagemapToken,
82
- ImagemapLinkToken,
83
- Token,
84
- CategoryToken,
85
- FileToken,
86
- GalleryImageToken,
87
- LinkToken,
88
- MagicLinkToken,
89
- ChooseToken,
90
- ComboboxToken,
91
- NestedToken,
92
- ReferencesToken,
93
- CommentToken,
94
- DdToken,
95
- DoubleUnderscoreToken,
96
- HrToken,
97
- NowikiToken,
98
- ListToken,
99
- NoincludeToken,
100
- QuoteToken,
101
- OnlyincludeToken,
102
- ParamTagToken,
103
- InputboxToken,
104
- ParameterToken,
105
- SyntaxToken,
106
- TableToken,
107
- TdToken,
108
- TrToken,
109
- ExtToken,
110
- IncludeToken,
111
- TagPairToken,
112
- TranscludeToken,
113
- }
114
- }
60
+ export type { Config, LintError, };
61
+ }
62
+ export = Parser;
package/dist/index.js ADDED
@@ -0,0 +1,314 @@
1
+ "use strict";
2
+ const fs = require("fs");
3
+ const path = require("path");
4
+ /**
5
+ * 从根路径require
6
+ * @param file 文件名
7
+ * @param dir 子路径
8
+ */
9
+ const rootRequire = (file, dir = '') => require(`${file.includes('/') ? '' : `../${dir}`}${file}`);
10
+ const Parser = {
11
+ config: 'default',
12
+ i18n: undefined,
13
+ conversionTable: new Map(),
14
+ redirects: new Map(),
15
+ MAX_STAGE: 11,
16
+ warning: true,
17
+ debugging: false,
18
+ running: false,
19
+ classes: {},
20
+ mixins: {},
21
+ parsers: {},
22
+ aliases: [
23
+ ['AstText'],
24
+ ['CommentToken', 'ExtToken', 'IncludeToken', 'NoincludeToken'],
25
+ ['ArgToken', 'TranscludeToken', 'HeadingToken'],
26
+ ['HtmlToken'],
27
+ ['TableToken'],
28
+ ['HrToken', 'DoubleUnderscoreToken'],
29
+ ['LinkToken', 'FileToken', 'CategoryToken'],
30
+ ['QuoteToken'],
31
+ ['ExtLinkToken'],
32
+ ['MagicLinkToken'],
33
+ ['ListToken', 'DdToken'],
34
+ ['ConverterToken'],
35
+ ],
36
+ typeAliases: {
37
+ text: ['string', 'str'],
38
+ plain: ['regular', 'normal'],
39
+ // comment and extension
40
+ onlyinclude: ['only-include'],
41
+ noinclude: ['no-include'],
42
+ include: ['includeonly', 'include-only'],
43
+ comment: undefined,
44
+ ext: ['extension'],
45
+ 'ext-attrs': ['extension-attrs', 'ext-attributes', 'extension-attributes'],
46
+ 'ext-attr-dirty': ['extension-attr-dirty', 'ext-attribute-dirty', 'extension-attribute-dirty'],
47
+ 'ext-attr': ['extension-attr', 'ext-attribute', 'extension-attribute'],
48
+ 'attr-key': ['attribute-key'],
49
+ 'attr-value': ['attribute-value', 'attr-val', 'attribute-val'],
50
+ 'ext-inner': ['extension-inner'],
51
+ // triple brackets
52
+ arg: ['argument'],
53
+ 'arg-name': ['argument-name'],
54
+ 'arg-default': ['argument-default'],
55
+ hidden: ['arg-redundant'],
56
+ // double brackets
57
+ 'magic-word': ['parser-function', 'parser-func'],
58
+ 'magic-word-name': ['parser-function-name', 'parser-func-name'],
59
+ 'invoke-function': ['invoke-func', 'lua-function', 'lua-func', 'module-function', 'module-func'],
60
+ 'invoke-module': ['lua-module'],
61
+ template: undefined,
62
+ 'template-name': undefined,
63
+ parameter: ['param'],
64
+ 'parameter-key': ['param-key'],
65
+ 'parameter-value': ['parameter-val', 'param-value', 'param-val'],
66
+ // heading
67
+ heading: ['header'],
68
+ 'heading-title': ['header-title'],
69
+ 'heading-trail': ['header-trail'],
70
+ // html
71
+ html: undefined,
72
+ 'html-attrs': ['html-attributes'],
73
+ 'html-attr-dirty': ['html-attribute-dirty'],
74
+ 'html-attr': ['html-attribute'],
75
+ // table
76
+ table: undefined,
77
+ tr: ['table-row'],
78
+ td: ['table-cell', 'table-data'],
79
+ 'table-syntax': undefined,
80
+ 'table-attrs': ['tr-attrs', 'td-attrs', 'table-attributes', 'tr-attributes', 'td-attributes'],
81
+ 'table-attr-dirty': ['tr-attr-dirty', 'td-attr-dirty', 'table-attribute-dirty', 'tr-attribute-dirty', 'td-attribute-dirty'],
82
+ 'table-attr': ['tr-attr', 'td-attr', 'table-attribute', 'tr-attribute', 'td-attribute'],
83
+ 'table-inter': undefined,
84
+ 'td-inner': ['table-cell-inner', 'table-data-inner'],
85
+ // hr and double-underscore
86
+ hr: ['horizontal'],
87
+ 'double-underscore': ['underscore', 'behavior-switch', 'behaviour-switch'],
88
+ // link
89
+ link: ['wikilink'],
90
+ 'link-target': ['wikilink-target'],
91
+ 'link-text': ['wikilink-text'],
92
+ category: ['category-link', 'cat', 'cat-link'],
93
+ file: ['file-link', 'image', 'image-link', 'img', 'img-link'],
94
+ 'gallery-image': ['gallery-file', 'gallery-img'],
95
+ 'imagemap-image': ['imagemap-file', 'imagemap-img', 'image-map-image', 'image-map-file', 'image-map-img'],
96
+ 'image-parameter': ['img-parameter', 'image-param', 'img-param'],
97
+ // quotes
98
+ quote: ['quotes', 'quot', 'apostrophe', 'apostrophes', 'apos'],
99
+ // external link
100
+ 'ext-link': ['external-link'],
101
+ 'ext-link-text': ['external-link-text'],
102
+ 'ext-link-url': ['external-link-url'],
103
+ // magic link
104
+ 'free-ext-link': ['free-external-link', 'magic-link'],
105
+ // list
106
+ list: ['ol', 'ordered-list', 'ul', 'unordered-list', 'dl', 'description-list'],
107
+ dd: ['indent', 'indentation'],
108
+ // converter
109
+ converter: ['convert', 'conversion'],
110
+ 'converter-flags': ['convert-flags', 'conversion-flags'],
111
+ 'converter-flag': ['convert-flag', 'conversion-flag'],
112
+ 'converter-rule': ['convert-rule', 'conversion-rule'],
113
+ 'converter-rule-noconvert': ['convert-rule-noconvert', 'conversion-rule-noconvert'],
114
+ 'converter-rule-variant': ['convert-rule-variant', 'conversion-rule-variant'],
115
+ 'converter-rule-to': ['convert-rule-to', 'conversion-rule-to'],
116
+ 'converter-rule-from': ['convert-rule-from', 'conversion-rule-from'],
117
+ // specific extensions
118
+ 'param-line': ['parameter-line'],
119
+ 'charinsert-line': undefined,
120
+ 'imagemap-link': ['image-map-link'],
121
+ },
122
+ promises: [Promise.resolve()],
123
+ /** @implements */
124
+ getConfig() {
125
+ if (typeof this.config === 'string') {
126
+ this.config = rootRequire(this.config, 'config/');
127
+ const { config: { conversionTable, redirects } } = this;
128
+ if (conversionTable) {
129
+ this.conversionTable = new Map(conversionTable);
130
+ }
131
+ if (redirects) {
132
+ this.redirects = new Map(redirects);
133
+ }
134
+ return this.getConfig();
135
+ }
136
+ return { ...this.config, excludes: [] };
137
+ },
138
+ /** @implements */
139
+ msg(msg, arg = '') {
140
+ if (typeof this.i18n === 'string') {
141
+ this.i18n = rootRequire(this.i18n, 'i18n/');
142
+ return this.msg(msg, arg);
143
+ }
144
+ return (this.i18n?.[msg] ?? msg).replace('$1', arg);
145
+ },
146
+ /** @implements */
147
+ normalizeTitle(title, defaultNs = 0, include = false, config = Parser.getConfig(), halfParsed = false, decode = false, selfLink = false) {
148
+ const Title = require('./lib/title');
149
+ if (halfParsed) {
150
+ return new Title(title, defaultNs, config, decode, selfLink);
151
+ }
152
+ const Token = require('./src');
153
+ const token = this.run(() => new Token(title, config).parseOnce(0, include).parseOnce()), titleObj = new Title(String(token.firstChild), defaultNs, config, decode, selfLink);
154
+ /**
155
+ * 重建部分属性值
156
+ * @param keys 属性键
157
+ */
158
+ const build = (keys) => {
159
+ for (const key of keys) {
160
+ if (titleObj[key]?.includes('\0')) {
161
+ titleObj[key] = token.buildFromStr(titleObj[key], 'text');
162
+ }
163
+ }
164
+ };
165
+ this.run(() => {
166
+ build(['main', 'fragment']);
167
+ });
168
+ titleObj.conversionTable = this.conversionTable;
169
+ titleObj.redirects = this.redirects;
170
+ return titleObj;
171
+ },
172
+ /** @implements */
173
+ parse(wikitext, include, maxStage = Parser.MAX_STAGE, config = Parser.getConfig()) {
174
+ if (typeof wikitext !== 'string') {
175
+ throw new TypeError('待解析的内容应为 String!');
176
+ }
177
+ const Token = require('./src');
178
+ let token;
179
+ this.run(() => {
180
+ token = new Token(wikitext, config);
181
+ try {
182
+ token.parse(maxStage, include);
183
+ }
184
+ catch (e) {
185
+ if (e instanceof Error) {
186
+ const file = path.join(__dirname, '..', 'errors', new Date().toISOString()), stage = token.getAttribute('stage');
187
+ fs.writeFileSync(file, stage === this.MAX_STAGE ? wikitext : String(token));
188
+ fs.writeFileSync(`${file}.err`, e.stack);
189
+ fs.writeFileSync(`${file}.json`, JSON.stringify({
190
+ stage, include: token.getAttribute('include'), config: this.config,
191
+ }, null, '\t'));
192
+ }
193
+ throw e;
194
+ }
195
+ });
196
+ if (this.debugging) {
197
+ let restored = String(token), process = '解析';
198
+ if (restored === wikitext) {
199
+ const entities = { lt: '<', gt: '>', amp: '&' };
200
+ restored = token.print().replace(/<[^<]+?>|&([lg]t|amp);/gu, (_, s) => s ? entities[s] : '');
201
+ process = '渲染HTML';
202
+ }
203
+ if (restored !== wikitext) {
204
+ const diff = require('./util/diff');
205
+ const { promises: { 0: cur, length } } = this;
206
+ this.promises.unshift((async () => {
207
+ await cur;
208
+ this.error(`${process}过程中不可逆地修改了原始文本!`);
209
+ return diff(wikitext, restored, length);
210
+ })());
211
+ }
212
+ }
213
+ return token;
214
+ },
215
+ /** @implements */
216
+ run(callback) {
217
+ const { running } = this;
218
+ this.running = true;
219
+ try {
220
+ const result = callback();
221
+ this.running = running;
222
+ return result;
223
+ }
224
+ catch (e) {
225
+ this.running = running;
226
+ throw e;
227
+ }
228
+ },
229
+ /** @implements */
230
+ warn(msg, ...args) {
231
+ if (this.warning) {
232
+ console.warn('\x1B[33m%s\x1B[0m', msg, ...args);
233
+ }
234
+ },
235
+ /** @implements */
236
+ debug(msg, ...args) {
237
+ if (this.debugging) {
238
+ console.debug('\x1B[34m%s\x1B[0m', msg, ...args);
239
+ }
240
+ },
241
+ /** @implements */
242
+ error(msg, ...args) {
243
+ console.error('\x1B[31m%s\x1B[0m', msg, ...args);
244
+ },
245
+ /** @implements */
246
+ info(msg, ...args) {
247
+ console.info('\x1B[32m%s\x1B[0m', msg, ...args);
248
+ },
249
+ /** @implements */
250
+ log(f) {
251
+ if (typeof f === 'function') {
252
+ console.log(String(f));
253
+ }
254
+ },
255
+ /** @implements */
256
+ clearCache() {
257
+ const entries = [
258
+ ...Object.entries(this.classes),
259
+ ...Object.entries(this.mixins),
260
+ ...Object.entries(this.parsers),
261
+ ];
262
+ for (const [, filePath] of entries) {
263
+ try {
264
+ delete require.cache[require.resolve(filePath)];
265
+ }
266
+ catch { }
267
+ }
268
+ for (const [name, filePath] of entries) {
269
+ if (name in global) {
270
+ global[name] = require(filePath);
271
+ }
272
+ }
273
+ },
274
+ /** @implements */
275
+ isInterwiki(title, { interwiki } = Parser.getConfig()) {
276
+ return new RegExp(`^(${interwiki.join('|')})\\s*:`, 'iu')
277
+ .exec(title.replaceAll('_', ' ').replace(/^\s*:?\s*/u, ''));
278
+ },
279
+ /** @implements */
280
+ reparse(date) {
281
+ const main = fs.readdirSync(path.join(__dirname, '..', 'errors'))
282
+ .find(name => name.startsWith(date) && name.endsWith('Z'));
283
+ if (!main) {
284
+ throw new RangeError(`找不到对应时间戳的错误记录:${date}`);
285
+ }
286
+ const file = path.join(__dirname, '..', 'errors', main), wikitext = fs.readFileSync(file, 'utf8');
287
+ const { stage, include, config } = require(`${file}.json`), Token = require('./src');
288
+ this.config = config;
289
+ return this.run(() => {
290
+ const halfParsed = stage < this.MAX_STAGE, token = new Token(wikitext, this.getConfig(), halfParsed);
291
+ if (halfParsed) {
292
+ token.setAttribute('stage', stage).parseOnce(stage, include);
293
+ }
294
+ else {
295
+ token.parse(undefined, include);
296
+ }
297
+ fs.unlinkSync(file);
298
+ fs.unlinkSync(`${file}.err`);
299
+ fs.unlinkSync(`${file}.json`);
300
+ return token;
301
+ });
302
+ },
303
+ };
304
+ const def = {}, immutable = new Set(['MAX_STAGE', 'aliases', 'typeAliases', 'promises']), enumerable = new Set(['config', 'conversionTable', 'redirects', 'normalizeTitle', 'parse', 'isInterwiki']);
305
+ for (const key in Parser) {
306
+ if (immutable.has(key)) {
307
+ def[key] = { enumerable: false, writable: false };
308
+ }
309
+ else if (!enumerable.has(key)) {
310
+ def[key] = { enumerable: false };
311
+ }
312
+ }
313
+ Object.defineProperties(Parser, def);
314
+ module.exports = Parser;