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
package/src/parameter.js DELETED
@@ -1,239 +0,0 @@
1
- 'use strict';
2
-
3
- const {noWrap, extUrlChar, extUrlCharFirst} = require('../util/string'),
4
- {generateForChild} = require('../util/lint'),
5
- fixedToken = require('../mixin/fixedToken'),
6
- Parser = require('..'),
7
- Token = require('.');
8
-
9
- /**
10
- * 模板或魔术字参数
11
- * @classdesc `{childNodes: [Token, Token]}`
12
- */
13
- class ParameterToken extends fixedToken(Token) {
14
- type = 'parameter';
15
-
16
- /** 是否是匿名参数 */
17
- get anon() {
18
- return this.firstChild.length === 0;
19
- }
20
-
21
- /** getValue()的getter */
22
- get value() {
23
- return this.getValue();
24
- }
25
-
26
- set value(value) {
27
- this.setValue(value);
28
- }
29
-
30
- /**
31
- * 是否是重复参数
32
- * @this {ParameterToken & {parentNode: TranscludeToken}}
33
- */
34
- get duplicated() {
35
- const TranscludeToken = require('./transclude');
36
- try {
37
- return Boolean(this.parentNode?.getDuplicatedArgs()?.some(([key]) => key === this.name));
38
- } catch {
39
- return false;
40
- }
41
- }
42
-
43
- /**
44
- * @param {string|number} key 参数名
45
- * @param {string} value 参数值
46
- * @param {import('../typings/token').accum} accum
47
- */
48
- constructor(key, value, config = Parser.getConfig(), accum = []) {
49
- super(undefined, config, true, accum);
50
- const keyToken = new Token(typeof key === 'number' ? undefined : key, config, true, accum, {
51
- 'Stage-11': ':', '!HeadingToken': '',
52
- }),
53
- token = new Token(value, config, true, accum);
54
- keyToken.type = 'parameter-key';
55
- token.type = 'parameter-value';
56
- this.append(keyToken, token.setAttribute('stage', 2));
57
- }
58
-
59
- /** @override */
60
- afterBuild() {
61
- if (!this.anon) {
62
- const TranscludeToken = require('./transclude');
63
- const name = this.firstChild.toString('comment, noinclude, include')
64
- .replace(/^[ \t\n\0\v]+|(?<=[^ \t\n\0\v])[ \t\n\0\v]+$/gu, ''),
65
- {parentNode} = this;
66
- this.setAttribute('name', name);
67
- if (parentNode instanceof TranscludeToken) {
68
- parentNode.getAttribute('keys').add(name);
69
- parentNode.getArgs(name, false, false).add(this);
70
- }
71
- }
72
- const /** @type {import('../typings/event').AstListener} */ parameterListener = ({prevTarget}, data) => {
73
- if (!this.anon) { // 匿名参数不管怎么变动还是匿名
74
- const {firstChild, name} = this;
75
- if (prevTarget === firstChild) {
76
- const newKey = firstChild.toString('comment, noinclude, include')
77
- .replace(/^[ \t\n\0\v]+|(?<=[^ \t\n\0\v])[ \t\n\0\v]+$/gu, '');
78
- data.oldKey = name;
79
- data.newKey = newKey;
80
- this.setAttribute('name', newKey);
81
- }
82
- }
83
- };
84
- this.addEventListener(['remove', 'insert', 'replace', 'text'], parameterListener);
85
- }
86
-
87
- /**
88
- * @override
89
- * @param {string} selector
90
- * @returns {string}
91
- */
92
- toString(selector) {
93
- return this.anon && !(selector && this.matches(selector))
94
- ? this.lastChild.toString(selector)
95
- : super.toString(selector, '=');
96
- }
97
-
98
- /**
99
- * @override
100
- * @returns {string}
101
- */
102
- text() {
103
- return this.anon ? this.lastChild.text() : super.text('=');
104
- }
105
-
106
- /** @override */
107
- getGaps() {
108
- return this.anon ? 0 : 1;
109
- }
110
-
111
- /** @override */
112
- print() {
113
- return super.print({sep: this.anon ? '' : '='});
114
- }
115
-
116
- /**
117
- * @override
118
- * @param {number} start 起始位置
119
- */
120
- lint(start = this.getAbsoluteIndex()) {
121
- const errors = super.lint(start),
122
- {firstChild, lastChild} = this,
123
- link = new RegExp(`https?://${extUrlCharFirst}${extUrlChar}$`, 'iu')
124
- .exec(firstChild.toString('comment, noinclude, include'))?.[0];
125
- if (link && new URL(link).search) {
126
- const e = generateForChild(firstChild, {start}, 'unescaped query string in an anonymous parameter');
127
- errors.push({
128
- ...e,
129
- startIndex: e.endIndex,
130
- endIndex: e.endIndex + 1,
131
- startLine: e.endLine,
132
- startCol: e.endCol,
133
- endCol: e.endCol + 1,
134
- excerpt: `${String(firstChild).slice(-25)}=${String(lastChild).slice(0, 25)}`,
135
- });
136
- }
137
- return errors;
138
- }
139
-
140
- /**
141
- * 获取参数值
142
- * @this {ParameterToken & {parentNode: TranscludeToken}}
143
- */
144
- getValue() {
145
- const TranscludeToken = require('./transclude');
146
- const value = this.lastChild.text();
147
- return this.anon && this.parentNode?.isTemplate() ? value : value.trim();
148
- }
149
-
150
- /** @override */
151
- cloneNode() {
152
- const [key, value] = this.cloneChildNodes(),
153
- config = this.getAttribute('config');
154
- return Parser.run(() => {
155
- const token = new ParameterToken(this.anon ? Number(this.name) : undefined, undefined, config);
156
- token.firstChild.safeReplaceWith(key);
157
- token.lastChild.safeReplaceWith(value);
158
- token.afterBuild();
159
- return token;
160
- });
161
- }
162
-
163
- /**
164
- * @override
165
- * @param {ParameterToken} token 待替换的节点
166
- * @complexity `n`
167
- */
168
- safeReplaceWith(token) {
169
- Parser.warn(`${this.constructor.name}.safeReplaceWith 方法退化到 replaceWith。`);
170
- return this.replaceWith(token);
171
- }
172
-
173
- /**
174
- * 设置参数值
175
- * @this {ParameterToken & {parentNode: TranscludeToken}}
176
- * @param {string} value 参数值
177
- * @throws `SyntaxError` 非法的模板参数
178
- */
179
- setValue(value) {
180
- value = String(value);
181
- const TranscludeToken = require('./transclude');
182
- const templateLike = this.parentNode?.isTemplate(),
183
- wikitext = `{{${templateLike ? ':T|' : 'lc:'}${this.anon ? '' : '1='}${value}}}`,
184
- root = Parser.parse(wikitext, this.getAttribute('include'), 2, this.getAttribute('config')),
185
- {length, firstChild: transclude} = root,
186
- /** @type {Token & {lastChild: ParameterToken}} */
187
- {lastChild: parameter, type, name, length: transcludeLength} = transclude,
188
- targetType = templateLike ? 'template' : 'magic-word',
189
- targetName = templateLike ? 'T' : 'lc';
190
- if (length !== 1 || type !== targetType || name !== targetName || transcludeLength !== 2
191
- || parameter.anon !== this.anon || parameter.name !== '1'
192
- ) {
193
- throw new SyntaxError(`非法的模板参数:${noWrap(value)}`);
194
- }
195
- const {lastChild} = parameter;
196
- parameter.destroy();
197
- this.lastChild.safeReplaceWith(lastChild);
198
- }
199
-
200
- /**
201
- * 修改参数名
202
- * @this {ParameterToken & {parentNode: TranscludeToken}}
203
- * @param {string} key 新参数名
204
- * @param {boolean} force 是否无视冲突命名
205
- * @throws `Error` 仅用于模板参数
206
- * @throws `SyntaxError` 非法的模板参数名
207
- * @throws `RangeError` 更名造成重复参数
208
- */
209
- rename(key, force) {
210
- key = String(key);
211
- const TranscludeToken = require('./transclude');
212
- const {parentNode} = this;
213
- // 必须检测是否是TranscludeToken
214
- if (!parentNode?.isTemplate() || !(parentNode instanceof TranscludeToken)) {
215
- throw new Error(`${this.constructor.name}.rename 方法仅用于模板参数!`);
216
- }
217
- const root = Parser.parse(`{{:T|${key}=}}`, this.getAttribute('include'), 2, this.getAttribute('config')),
218
- {length, firstChild: template} = root,
219
- {type, name, lastChild: parameter, length: templateLength} = template;
220
- if (length !== 1 || type !== 'template' || name !== 'T' || templateLength !== 2) {
221
- throw new SyntaxError(`非法的模板参数名:${key}`);
222
- }
223
- const {name: parameterName, firstChild} = parameter;
224
- if (this.name === parameterName) {
225
- Parser.warn('未改变实际参数名', parameterName);
226
- } else if (parentNode.hasArg(parameterName)) {
227
- if (force) {
228
- Parser.warn('参数更名造成重复参数', parameterName);
229
- } else {
230
- throw new RangeError(`参数更名造成重复参数:${parameterName}`);
231
- }
232
- }
233
- parameter.destroy();
234
- this.firstChild.safeReplaceWith(firstChild);
235
- }
236
- }
237
-
238
- Parser.classes.ParameterToken = __filename;
239
- module.exports = ParameterToken;
package/src/syntax.js DELETED
@@ -1,91 +0,0 @@
1
- 'use strict';
2
-
3
- const Parser = require('..'),
4
- {undo} = require('../util/debug'),
5
- {text} = require('../util/string'),
6
- Token = require('.');
7
-
8
- /**
9
- * 满足特定语法格式的plain Token
10
- * @classdesc `{childNodes: ...AstText|Token}`
11
- */
12
- class SyntaxToken extends Token {
13
- #pattern;
14
-
15
- /**
16
- * @param {string} wikitext 语法wikitext
17
- * @param {RegExp} pattern 语法正则
18
- * @param {string} type Token.type
19
- * @param {import('../typings/token').accum} accum
20
- * @param {import('../typings/token').acceptable} acceptable 可接受的子节点设置
21
- * @throws `RangeError` 含有g修饰符的语法正则
22
- */
23
- constructor(wikitext, pattern, type = 'plain', config = Parser.getConfig(), accum = [], acceptable = undefined) {
24
- if (pattern.global) {
25
- throw new RangeError(`SyntaxToken 的语法正则不能含有 g 修饰符:${pattern}`);
26
- }
27
- super(wikitext, config, true, accum, acceptable);
28
- this.type = type;
29
- this.#pattern = pattern;
30
- }
31
-
32
- /** @override */
33
- cloneNode() {
34
- const cloned = this.cloneChildNodes(),
35
- config = this.getAttribute('config'),
36
- acceptable = this.getAttribute('acceptable');
37
- return Parser.run(() => {
38
- const token = new SyntaxToken(undefined, this.#pattern, this.type, config, [], acceptable);
39
- token.append(...cloned);
40
- token.afterBuild();
41
- return token;
42
- });
43
- }
44
-
45
- /** @override */
46
- afterBuild() {
47
- const /** @type {import('../typings/event').AstListener} */ syntaxListener = (e, data) => {
48
- const pattern = this.#pattern;
49
- if (!Parser.running && !pattern.test(this.text())) {
50
- undo(e, data);
51
- Parser.error(`不可修改 ${this.constructor.name} 的语法!`, pattern);
52
- throw new Error(`不可修改 ${this.constructor.name} 的语法!`);
53
- }
54
- };
55
- this.addEventListener(['remove', 'insert', 'replace', 'text'], syntaxListener);
56
- }
57
-
58
- /**
59
- * @override
60
- * @template {string} T
61
- * @param {T} key 属性键
62
- * @returns {import('../typings/node').TokenAttribute<T>}
63
- */
64
- getAttribute(key) {
65
- return key === 'pattern' ? this.#pattern : super.getAttribute(key);
66
- }
67
-
68
- /**
69
- * @override
70
- * @param {PropertyKey} key 属性键
71
- */
72
- hasAttribute(key) {
73
- return key === 'pattern' || super.hasAttribute(key);
74
- }
75
-
76
- /**
77
- * @override
78
- * @param {...Token} elements 待替换的子节点
79
- * @complexity `n`
80
- */
81
- replaceChildren(...elements) {
82
- if (this.#pattern.test(text(elements))) {
83
- Parser.run(() => {
84
- super.replaceChildren(...elements);
85
- });
86
- }
87
- }
88
- }
89
-
90
- Parser.classes.SyntaxToken = __filename;
91
- module.exports = SyntaxToken;