@lvce-editor/shared-process 0.11.8 → 0.11.10
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/defaultKeyBindings.json +25 -0
- package/config/defaultSettings.json +2 -7
- package/extensions/builtin.language-basics-coffeescript/src/tokenizeCoffeeScript.js +232 -3
- package/extensions/builtin.language-basics-cpp/src/tokenizeCpp.js +14 -0
- package/extensions/builtin.language-basics-css/src/tokenizeCss.js +8 -0
- package/extensions/builtin.language-basics-javascript/src/tokenizeJavaScript.js +52 -4
- package/extensions/builtin.language-basics-perl/extension.json +2 -1
- package/extensions/builtin.language-basics-perl/src/tokenizePerl.js +53 -6
- package/extensions/builtin.language-basics-python/src/tokenizePython.js +86 -3
- package/extensions/builtin.language-basics-ruby/README.md +14 -0
- package/extensions/builtin.language-basics-ruby/extension.json +48 -0
- package/extensions/builtin.language-basics-ruby/src/tokenizeRuby.js +241 -0
- package/extensions/builtin.language-basics-scss/README.md +14 -0
- package/extensions/builtin.language-basics-scss/extension.json +12 -0
- package/extensions/builtin.language-basics-scss/src/tokenizeScss.js +28 -0
- package/extensions/builtin.language-basics-shellscript/extension.json +2 -1
- package/extensions/builtin.language-basics-shellscript/src/tokenizeShellScript.js +326 -13
- package/extensions/builtin.language-basics-toml/src/tokenizeToml.js +87 -13
- package/extensions/builtin.language-basics-xml/extension.json +2 -1
- package/extensions/builtin.language-basics-xml/src/tokenizeXml.js +7 -0
- package/extensions/builtin.language-basics-yaml/src/tokenizeYaml.js +8 -1
- package/extensions/builtin.theme-cobalt2/color-theme.json +4 -0
- package/extensions/builtin.theme-gruvbox/color-theme.json +4 -0
- package/extensions/builtin.theme-palenight/color-theme.json +4 -0
- package/extensions/builtin.theme-slime/color-theme.json +9 -1
- package/package.json +5 -5
- package/src/parts/Cli/Cli.js +2 -2
- package/src/parts/CliInstall/CliInstall.js +21 -6
- package/src/parts/CliList/CliList.js +3 -2
- package/src/parts/CliUnlink/CliUnlink.js +1 -1
- package/src/parts/DownloadAndExtract/DownloadAndExtract.js +18 -8
- package/src/parts/ErrorCodes/ErrorCodes.js +8 -18
- package/src/parts/ErrorHandling/ErrorHandling.js +4 -9
- package/src/parts/ExportStatic/ExportStatic.js +57 -330
- package/src/parts/ExtensionHost/ExtensionHost.js +4 -7
- package/src/parts/ExtensionInstallFromGitHub/ExtensionInstallFromGitHub.js +1 -4
- package/src/parts/ExtensionManagement/ExtensionManagementColorTheme.js +3 -4
- package/src/parts/FileSystem/FileSystem.js +5 -15
- package/src/parts/GetResponse/GetResponse.js +10 -14
- package/src/parts/JsonRpc/JsonRpc.js +3 -6
- package/src/parts/JsonRpcErrorCode/JsonRpcErrorCode.js +2 -0
- package/src/parts/JsonRpcVersion/JsonRpcVersion.js +1 -0
- package/src/parts/OutputChannel/OutputChannel.ipc.js +3 -2
- package/src/parts/Terminal/Terminal.js +5 -4
- package/src/sharedProcessMain.js +2 -5
|
@@ -3,8 +3,12 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const State = {
|
|
5
5
|
TopLevelContent: 1,
|
|
6
|
-
|
|
6
|
+
InsideDoubleQuoteString: 2,
|
|
7
7
|
InsideLineComment: 3,
|
|
8
|
+
InsideSingleQuoteString: 4,
|
|
9
|
+
InsideBackTickString: 5,
|
|
10
|
+
InsideEof: 6,
|
|
11
|
+
AfterKeywordFunction: 7,
|
|
8
12
|
}
|
|
9
13
|
|
|
10
14
|
export const StateMap = {
|
|
@@ -25,6 +29,10 @@ export const TokenType = {
|
|
|
25
29
|
VariableName: 8,
|
|
26
30
|
Comment: 885,
|
|
27
31
|
Text: 9,
|
|
32
|
+
KeywordControl: 10,
|
|
33
|
+
Function: 11,
|
|
34
|
+
LanguageConstant: 12,
|
|
35
|
+
KeywordReturn: 13,
|
|
28
36
|
}
|
|
29
37
|
|
|
30
38
|
export const TokenMap = {
|
|
@@ -38,11 +46,15 @@ export const TokenMap = {
|
|
|
38
46
|
[TokenType.VariableName]: 'VariableName',
|
|
39
47
|
[TokenType.Comment]: 'Comment',
|
|
40
48
|
[TokenType.Text]: 'Text',
|
|
49
|
+
[TokenType.KeywordControl]: 'KeywordControl',
|
|
50
|
+
[TokenType.Function]: 'Function',
|
|
51
|
+
[TokenType.LanguageConstant]: 'LanguageConstant',
|
|
52
|
+
[TokenType.KeywordReturn]: 'KeywordReturn',
|
|
41
53
|
}
|
|
42
54
|
|
|
43
55
|
const RE_LINE_COMMENT = /^#.*/s
|
|
44
56
|
const RE_SELECTOR = /^[\.a-zA-Z\d\-\:>]+/
|
|
45
|
-
const RE_WHITESPACE =
|
|
57
|
+
const RE_WHITESPACE = /^\s+/
|
|
46
58
|
const RE_CURLY_OPEN = /^\{/
|
|
47
59
|
const RE_CURLY_CLOSE = /^\}/
|
|
48
60
|
const RE_PROPERTY_NAME = /^[a-zA-Z\-]+\b/
|
|
@@ -50,20 +62,31 @@ const RE_COLON = /^:/
|
|
|
50
62
|
const RE_PROPERTY_VALUE = /^[^;\}]+/
|
|
51
63
|
const RE_SEMICOLON = /^;/
|
|
52
64
|
const RE_COMMA = /^,/
|
|
65
|
+
const RE_ANYTHING_SHORT = /^[^\s"']+/
|
|
53
66
|
const RE_ANYTHING = /^.+/s
|
|
54
67
|
const RE_ANYTHING_UNTIL_CLOSE_BRACE = /^[^\}]+/
|
|
55
68
|
const RE_QUOTE_DOUBLE = /^"/
|
|
56
|
-
const
|
|
69
|
+
const RE_QUOTE_SINGLE = /^'/
|
|
70
|
+
const RE_QUOTE_BACKTICK = /^`/
|
|
71
|
+
const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"\\]+/
|
|
72
|
+
const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
|
|
73
|
+
const RE_STRING_BACKTICK_QUOTE_CONTENT = /^[^`]+/
|
|
57
74
|
const RE_KEYWORD =
|
|
58
|
-
/^(?:alias|bg|bind|break|builtin|caller|cd|command|compgen|complete|dirs|disown|echo|enable|eval|exec|exit|false|fc|fg|getopts|hash|help|history|jobs|kill|let|logout|popd|printf|pushd|pwd|read|readonly|set|shift|shopt|source|suspend|test|times|trap|true|type|ulimit|umask|unalias|unset|wait)\b/
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
const
|
|
62
|
-
const
|
|
75
|
+
/^(?:7z|7za|7zr|alias|apk|apt-get|ar|asciidoctor|awk|basename|bash|bg|bind|blkid|break|brew|brotli|builtin|bunzip|bunzip2|caller|cargo|case|cat|catdoc|cd|chmod|chown|cmp|command|compgen|complete|continue|cp|cryptsetup|curl|curl|cut|cygstart|dde-open|defaults|diff|dirname|dirs|disown|do|docker|done|done|dpkg|du|echo|elif|else|emulate|enable|enlightenment_open|esac|eval|eval_gettext|exec|exit|expr|false|fc|fg|fi|find|for|free|function|fzf|g\+\+|gcc|gcloud|gdbus|getopts|gio|git|gnome-open|grep|grub-mount|gs|gulp|gvfs-open|gzip|hash|head|help|hexdump|history|identity|if|in|install|ip|jobs|kde-open|kfmclient|kill|killall|less|let|lha|local|logout|ls|ls|lunzip|lzip|lzma|makepkg|miniunz|miniunzip|mkdir|mktemp|mount|mpicc|mv|node|npm|npx|open|pacman|pcmanfm|pdftotext|pkg|plutil|popd|prezip-bin|printf|println|ps|pushd|pwd|python3|rar|read|readlink|readonly|return|rm|rpm|rsync|sed|set|sha256sum|shift|shopt|sleep|snap|sort|source|stty|sudo|suspend|tail|tar|tee|test|texi2dvi|then|times|touch|trap|true|tty|tune2fs|type|ulimit|umask|umask|unalias|unarj|unmkinitramfs|unmount|unrar|unset|unwrapdiff|unzip|unzoo|vim|wait|wc|wget|which|while|xargs|xprop|xz|yarn|yum|zip|zoo|zsh|zstd)\b/
|
|
76
|
+
const RE_VARIABLE_NAME = /^[a-zA-Z\_\/\-\$][a-zA-Z\_\/\-\$#\d\-]*/
|
|
77
|
+
const RE_PUNCTUATION = /^[:,;\{\}\[\]\.=\(\)<>\!\|\+\&\>\)]/
|
|
78
|
+
const RE_NUMERIC = /^\d+(?=\s|$)/
|
|
79
|
+
const RE_FUNCTION_NAME = /^\w+(?=\s*\()/
|
|
80
|
+
const RE_EOF_START = /^<<\s*([\w\!]+)/
|
|
81
|
+
const RE_EOF_CONTENT = /.*/s
|
|
82
|
+
const RE_STRING_ESCAPE = /^\\./
|
|
83
|
+
const RE_BACKSLASH_AT_END = /^\\$/
|
|
63
84
|
|
|
64
85
|
export const initialLineState = {
|
|
65
86
|
state: State.TopLevelContent,
|
|
66
87
|
tokens: [],
|
|
88
|
+
knownFunctionNames: new Set(),
|
|
89
|
+
stringEnd: '',
|
|
67
90
|
}
|
|
68
91
|
|
|
69
92
|
/**
|
|
@@ -88,6 +111,8 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
88
111
|
let tokens = []
|
|
89
112
|
let token = TokenType.None
|
|
90
113
|
let state = lineState.state
|
|
114
|
+
let stringEnd = lineState.stringEnd
|
|
115
|
+
const knownFunctionNames = new Set(lineState.knownFunctionNames)
|
|
91
116
|
while (index < line.length) {
|
|
92
117
|
const part = line.slice(index)
|
|
93
118
|
switch (state) {
|
|
@@ -96,23 +121,252 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
96
121
|
token = TokenType.Whitespace
|
|
97
122
|
state = State.TopLevelContent
|
|
98
123
|
} else if ((next = part.match(RE_KEYWORD))) {
|
|
99
|
-
token = TokenType.Keyword
|
|
100
124
|
state = State.TopLevelContent
|
|
125
|
+
switch (next[0]) {
|
|
126
|
+
case 'break':
|
|
127
|
+
case 'case':
|
|
128
|
+
case 'continue':
|
|
129
|
+
case 'do':
|
|
130
|
+
case 'done':
|
|
131
|
+
case 'elif':
|
|
132
|
+
case 'else':
|
|
133
|
+
case 'esac':
|
|
134
|
+
case 'fi':
|
|
135
|
+
case 'for':
|
|
136
|
+
case 'if':
|
|
137
|
+
case 'in':
|
|
138
|
+
case 'then':
|
|
139
|
+
case 'while':
|
|
140
|
+
token = TokenType.KeywordControl
|
|
141
|
+
break
|
|
142
|
+
case '7za':
|
|
143
|
+
case '7z':
|
|
144
|
+
case '7za':
|
|
145
|
+
case '7zr':
|
|
146
|
+
case 'alias':
|
|
147
|
+
case 'apk':
|
|
148
|
+
case 'apt-get':
|
|
149
|
+
case 'ar':
|
|
150
|
+
case 'awk':
|
|
151
|
+
case 'bg':
|
|
152
|
+
case 'bind':
|
|
153
|
+
case 'blkid':
|
|
154
|
+
case 'builtin':
|
|
155
|
+
case 'bunzip':
|
|
156
|
+
case 'bunzip2':
|
|
157
|
+
case 'caller':
|
|
158
|
+
case 'cargo':
|
|
159
|
+
case 'cat':
|
|
160
|
+
case 'catdoc':
|
|
161
|
+
case 'cd':
|
|
162
|
+
case 'chmod':
|
|
163
|
+
case 'chown':
|
|
164
|
+
case 'cmp':
|
|
165
|
+
case 'command':
|
|
166
|
+
case 'compgen':
|
|
167
|
+
case 'complete':
|
|
168
|
+
case 'cp':
|
|
169
|
+
case 'cryptsetup':
|
|
170
|
+
case 'curl':
|
|
171
|
+
case 'curl':
|
|
172
|
+
case 'cut':
|
|
173
|
+
case 'cygstart':
|
|
174
|
+
case 'dde-open':
|
|
175
|
+
case 'diff':
|
|
176
|
+
case 'dirname':
|
|
177
|
+
case 'dirs':
|
|
178
|
+
case 'disown':
|
|
179
|
+
case 'dpkg':
|
|
180
|
+
case 'du':
|
|
181
|
+
case 'echo':
|
|
182
|
+
case 'emulate':
|
|
183
|
+
case 'enable':
|
|
184
|
+
case 'enlightenment_open':
|
|
185
|
+
case 'eval':
|
|
186
|
+
case 'eval_gettext':
|
|
187
|
+
case 'exec':
|
|
188
|
+
case 'exit':
|
|
189
|
+
case 'expr':
|
|
190
|
+
case 'fc':
|
|
191
|
+
case 'fg':
|
|
192
|
+
case 'find':
|
|
193
|
+
case 'free':
|
|
194
|
+
case 'fzf':
|
|
195
|
+
case 'g++':
|
|
196
|
+
case 'gcc':
|
|
197
|
+
case 'gdbus':
|
|
198
|
+
case 'getopts':
|
|
199
|
+
case 'gio':
|
|
200
|
+
case 'git':
|
|
201
|
+
case 'gnome-open':
|
|
202
|
+
case 'grep':
|
|
203
|
+
case 'grub-mount':
|
|
204
|
+
case 'gs':
|
|
205
|
+
case 'gulp':
|
|
206
|
+
case 'gvfs-open':
|
|
207
|
+
case 'gzip':
|
|
208
|
+
case 'hash':
|
|
209
|
+
case 'head':
|
|
210
|
+
case 'help':
|
|
211
|
+
case 'hexdump':
|
|
212
|
+
case 'history':
|
|
213
|
+
case 'identity':
|
|
214
|
+
case 'install':
|
|
215
|
+
case 'ip':
|
|
216
|
+
case 'jobs':
|
|
217
|
+
case 'kde-open':
|
|
218
|
+
case 'kfmclient':
|
|
219
|
+
case 'kill':
|
|
220
|
+
case 'killall':
|
|
221
|
+
case 'less':
|
|
222
|
+
case 'lha':
|
|
223
|
+
case 'logout':
|
|
224
|
+
case 'ls':
|
|
225
|
+
case 'ls':
|
|
226
|
+
case 'lunzip':
|
|
227
|
+
case 'lzip':
|
|
228
|
+
case 'lzma':
|
|
229
|
+
case 'makepkg':
|
|
230
|
+
case 'miniunz':
|
|
231
|
+
case 'miniunzip':
|
|
232
|
+
case 'mkdir':
|
|
233
|
+
case 'mktemp':
|
|
234
|
+
case 'mount':
|
|
235
|
+
case 'mpicc':
|
|
236
|
+
case 'mv':
|
|
237
|
+
case 'node':
|
|
238
|
+
case 'npm':
|
|
239
|
+
case 'open':
|
|
240
|
+
case 'pacman':
|
|
241
|
+
case 'pcmanfm':
|
|
242
|
+
case 'pdftotext':
|
|
243
|
+
case 'pkg':
|
|
244
|
+
case 'popd':
|
|
245
|
+
case 'prezip-bin':
|
|
246
|
+
case 'printf':
|
|
247
|
+
case 'ps':
|
|
248
|
+
case 'pushd':
|
|
249
|
+
case 'pwd':
|
|
250
|
+
case 'rar':
|
|
251
|
+
case 'read':
|
|
252
|
+
case 'readlink':
|
|
253
|
+
case 'rm':
|
|
254
|
+
case 'rpm':
|
|
255
|
+
case 'rsync':
|
|
256
|
+
case 'sed':
|
|
257
|
+
case 'set':
|
|
258
|
+
case 'shift':
|
|
259
|
+
case 'shopt':
|
|
260
|
+
case 'sleep':
|
|
261
|
+
case 'snap':
|
|
262
|
+
case 'sort':
|
|
263
|
+
case 'source':
|
|
264
|
+
case 'stty':
|
|
265
|
+
case 'sudo':
|
|
266
|
+
case 'suspend':
|
|
267
|
+
case 'tail':
|
|
268
|
+
case 'tar':
|
|
269
|
+
case 'tee':
|
|
270
|
+
case 'test':
|
|
271
|
+
case 'texi2dvi':
|
|
272
|
+
case 'times':
|
|
273
|
+
case 'touch':
|
|
274
|
+
case 'trap':
|
|
275
|
+
case 'tty':
|
|
276
|
+
case 'tune2fs':
|
|
277
|
+
case 'type':
|
|
278
|
+
case 'ulimit':
|
|
279
|
+
case 'umask':
|
|
280
|
+
case 'umask':
|
|
281
|
+
case 'unalias':
|
|
282
|
+
case 'unarj':
|
|
283
|
+
case 'unmkinitramfs':
|
|
284
|
+
case 'unmount':
|
|
285
|
+
case 'unrar':
|
|
286
|
+
case 'unset':
|
|
287
|
+
case 'unwrapdiff':
|
|
288
|
+
case 'unzip':
|
|
289
|
+
case 'unzoo':
|
|
290
|
+
case 'vim':
|
|
291
|
+
case 'wait':
|
|
292
|
+
case 'wc':
|
|
293
|
+
case 'wget':
|
|
294
|
+
case 'which':
|
|
295
|
+
case 'xargs':
|
|
296
|
+
case 'xprop':
|
|
297
|
+
case 'xz':
|
|
298
|
+
case 'yarn':
|
|
299
|
+
case 'yum':
|
|
300
|
+
case 'zip':
|
|
301
|
+
case 'zoo':
|
|
302
|
+
case 'zstd':
|
|
303
|
+
case 'basename':
|
|
304
|
+
case 'brew':
|
|
305
|
+
case 'sha256sum':
|
|
306
|
+
case 'brotli':
|
|
307
|
+
case 'zsh':
|
|
308
|
+
case 'asciidoctor':
|
|
309
|
+
case 'docker':
|
|
310
|
+
case 'python3':
|
|
311
|
+
case 'bash':
|
|
312
|
+
case 'npx':
|
|
313
|
+
case 'gcloud':
|
|
314
|
+
case 'println':
|
|
315
|
+
case 'plutil':
|
|
316
|
+
case 'defaults':
|
|
317
|
+
token = TokenType.Function
|
|
318
|
+
break
|
|
319
|
+
case 'true':
|
|
320
|
+
case 'false':
|
|
321
|
+
token = TokenType.LanguageConstant
|
|
322
|
+
break
|
|
323
|
+
case 'return':
|
|
324
|
+
token = TokenType.KeywordReturn
|
|
325
|
+
break
|
|
326
|
+
case 'function':
|
|
327
|
+
token = TokenType.Keyword
|
|
328
|
+
state = State.AfterKeywordFunction
|
|
329
|
+
break
|
|
330
|
+
default:
|
|
331
|
+
token = TokenType.Keyword
|
|
332
|
+
break
|
|
333
|
+
}
|
|
334
|
+
} else if ((next = part.match(RE_EOF_START))) {
|
|
335
|
+
token = TokenType.Punctuation
|
|
336
|
+
state = State.InsideEof
|
|
337
|
+
stringEnd = next[1]
|
|
101
338
|
} else if ((next = part.match(RE_PUNCTUATION))) {
|
|
102
339
|
token = TokenType.Punctuation
|
|
103
340
|
state = State.TopLevelContent
|
|
341
|
+
} else if ((next = part.match(RE_FUNCTION_NAME))) {
|
|
342
|
+
token = TokenType.Function
|
|
343
|
+
state = State.TopLevelContent
|
|
344
|
+
knownFunctionNames.add(next[0])
|
|
104
345
|
} else if ((next = part.match(RE_VARIABLE_NAME))) {
|
|
105
|
-
|
|
346
|
+
if (knownFunctionNames.has(next[0])) {
|
|
347
|
+
token = TokenType.Function
|
|
348
|
+
} else {
|
|
349
|
+
token = TokenType.VariableName
|
|
350
|
+
}
|
|
106
351
|
state = State.TopLevelContent
|
|
107
352
|
} else if ((next = part.match(RE_NUMERIC))) {
|
|
108
353
|
token = TokenType.Numeric
|
|
109
354
|
state = State.TopLevelContent
|
|
110
355
|
} else if ((next = part.match(RE_QUOTE_DOUBLE))) {
|
|
111
356
|
token = TokenType.PunctuationString
|
|
112
|
-
state = State.
|
|
357
|
+
state = State.InsideDoubleQuoteString
|
|
358
|
+
} else if ((next = part.match(RE_QUOTE_SINGLE))) {
|
|
359
|
+
token = TokenType.Punctuation
|
|
360
|
+
state = State.InsideSingleQuoteString
|
|
361
|
+
} else if ((next = part.match(RE_QUOTE_BACKTICK))) {
|
|
362
|
+
token = TokenType.Punctuation
|
|
363
|
+
state = State.InsideBackTickString
|
|
113
364
|
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
114
365
|
token = TokenType.Comment
|
|
115
366
|
state = State.TopLevelContent
|
|
367
|
+
} else if ((next = part.match(RE_ANYTHING_SHORT))) {
|
|
368
|
+
token = TokenType.VariableName
|
|
369
|
+
state = State.TopLevelContent
|
|
116
370
|
} else if ((next = part.match(RE_ANYTHING))) {
|
|
117
371
|
token = TokenType.Text
|
|
118
372
|
state = State.TopLevelContent
|
|
@@ -121,13 +375,70 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
121
375
|
throw new Error('no')
|
|
122
376
|
}
|
|
123
377
|
break
|
|
124
|
-
case State.
|
|
378
|
+
case State.InsideDoubleQuoteString:
|
|
125
379
|
if ((next = part.match(RE_QUOTE_DOUBLE))) {
|
|
126
380
|
token = TokenType.PunctuationString
|
|
127
381
|
state = State.TopLevelContent
|
|
128
382
|
} else if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
|
|
129
383
|
token = TokenType.String
|
|
130
|
-
state = State.
|
|
384
|
+
state = State.InsideDoubleQuoteString
|
|
385
|
+
} else if ((next = part.match(RE_STRING_ESCAPE))) {
|
|
386
|
+
token = TokenType.String
|
|
387
|
+
state = State.InsideDoubleQuoteString
|
|
388
|
+
} else if ((next = part.match(RE_BACKSLASH_AT_END))) {
|
|
389
|
+
token = TokenType.String
|
|
390
|
+
state = State.InsideDoubleQuoteString
|
|
391
|
+
} else {
|
|
392
|
+
throw new Error('no')
|
|
393
|
+
}
|
|
394
|
+
break
|
|
395
|
+
case State.InsideSingleQuoteString:
|
|
396
|
+
if ((next = part.match(RE_QUOTE_SINGLE))) {
|
|
397
|
+
token = TokenType.PunctuationString
|
|
398
|
+
state = State.TopLevelContent
|
|
399
|
+
} else if ((next = part.match(RE_STRING_SINGLE_QUOTE_CONTENT))) {
|
|
400
|
+
token = TokenType.String
|
|
401
|
+
state = State.InsideSingleQuoteString
|
|
402
|
+
} else if ((next = part.match(RE_BACKSLASH_AT_END))) {
|
|
403
|
+
token = TokenType.String
|
|
404
|
+
state = State.InsideSingleQuoteString
|
|
405
|
+
} else {
|
|
406
|
+
throw new Error('no')
|
|
407
|
+
}
|
|
408
|
+
break
|
|
409
|
+
case State.InsideBackTickString:
|
|
410
|
+
if ((next = part.match(RE_QUOTE_BACKTICK))) {
|
|
411
|
+
token = TokenType.PunctuationString
|
|
412
|
+
state = State.TopLevelContent
|
|
413
|
+
} else if ((next = part.match(RE_STRING_BACKTICK_QUOTE_CONTENT))) {
|
|
414
|
+
token = TokenType.String
|
|
415
|
+
state = State.InsideBackTickString
|
|
416
|
+
} else {
|
|
417
|
+
throw new Error('no')
|
|
418
|
+
}
|
|
419
|
+
break
|
|
420
|
+
case State.InsideEof:
|
|
421
|
+
if ((next = part.match(stringEnd))) {
|
|
422
|
+
token = TokenType.Punctuation
|
|
423
|
+
state = State.TopLevelContent
|
|
424
|
+
} else if ((next = part.match(RE_EOF_CONTENT))) {
|
|
425
|
+
token = TokenType.String
|
|
426
|
+
state = State.InsideEof
|
|
427
|
+
} else {
|
|
428
|
+
throw new Error('no')
|
|
429
|
+
}
|
|
430
|
+
break
|
|
431
|
+
case State.AfterKeywordFunction:
|
|
432
|
+
if ((next = part.match(RE_VARIABLE_NAME))) {
|
|
433
|
+
token = TokenType.Function
|
|
434
|
+
state = State.TopLevelContent
|
|
435
|
+
knownFunctionNames.add(next[0])
|
|
436
|
+
} else if ((next = part.match(RE_WHITESPACE))) {
|
|
437
|
+
token = TokenType.Whitespace
|
|
438
|
+
state = State.AfterKeywordFunction
|
|
439
|
+
} else if ((next = part.match(RE_ANYTHING))) {
|
|
440
|
+
token = TokenType.Text
|
|
441
|
+
state = State.TopLevelContent
|
|
131
442
|
} else {
|
|
132
443
|
throw new Error('no')
|
|
133
444
|
}
|
|
@@ -142,5 +453,7 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
142
453
|
return {
|
|
143
454
|
state,
|
|
144
455
|
tokens,
|
|
456
|
+
knownFunctionNames,
|
|
457
|
+
stringEnd,
|
|
145
458
|
}
|
|
146
459
|
}
|
|
@@ -5,7 +5,10 @@ export const State = {
|
|
|
5
5
|
TopLevelContent: 1,
|
|
6
6
|
AfterPropertyName: 3,
|
|
7
7
|
AfterPropertyNameAfterEqualSign: 4,
|
|
8
|
-
|
|
8
|
+
InsideDoubleQuoteString: 5,
|
|
9
|
+
InsideSingleQuoteString: 6,
|
|
10
|
+
InsideArray: 7,
|
|
11
|
+
InsideObject: 8,
|
|
9
12
|
}
|
|
10
13
|
|
|
11
14
|
export const StateMap = {
|
|
@@ -84,7 +87,9 @@ const RE_LANGUAGE_CONSTANT = /^(?:true|false)\b/
|
|
|
84
87
|
const RE_EQUAL_SIGN = /^=/
|
|
85
88
|
const RE_LOCAL_TIME = /\d{2}:\d{2}:\d{2}(?:\.\d+)?/
|
|
86
89
|
const RE_QUOTE_DOUBLE = /^"/
|
|
90
|
+
const RE_QUOTE_SINGLE = /^'/
|
|
87
91
|
const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"]+/
|
|
92
|
+
const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
|
|
88
93
|
|
|
89
94
|
export const initialLineState = {
|
|
90
95
|
state: State.TopLevelContent,
|
|
@@ -104,6 +109,7 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
104
109
|
let tokens = []
|
|
105
110
|
let token = TokenType.None
|
|
106
111
|
let state = lineState.state
|
|
112
|
+
let stack = lineState.stack
|
|
107
113
|
while (index < line.length) {
|
|
108
114
|
const part = line.slice(index)
|
|
109
115
|
switch (state) {
|
|
@@ -118,6 +124,7 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
118
124
|
token = TokenType.Whitespace
|
|
119
125
|
state = State.TopLevelContent
|
|
120
126
|
} else if ((next = part.match(RE_ANYTHING))) {
|
|
127
|
+
part
|
|
121
128
|
token = TokenType.Text
|
|
122
129
|
state = State.TopLevelContent
|
|
123
130
|
} else {
|
|
@@ -142,28 +149,37 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
142
149
|
state = State.AfterPropertyNameAfterEqualSign
|
|
143
150
|
} else if ((next = part.match(RE_LANGUAGE_CONSTANT))) {
|
|
144
151
|
token = TokenType.LanguageConstant
|
|
145
|
-
state = State.TopLevelContent
|
|
152
|
+
state = stack.pop() || State.TopLevelContent
|
|
146
153
|
} else if ((next = part.match(RE_LOCAL_TIME))) {
|
|
147
154
|
token = TokenType.Numeric
|
|
148
|
-
state = State.TopLevelContent
|
|
155
|
+
state = stack.pop() || State.TopLevelContent
|
|
149
156
|
} else if ((next = part.match(RE_NUMERIC_INTEGER))) {
|
|
150
157
|
token = TokenType.Numeric
|
|
151
|
-
state = State.TopLevelContent
|
|
158
|
+
state = stack.pop() || State.TopLevelContent
|
|
152
159
|
} else if ((next = part.match(RE_NUMERIC_FLOAT))) {
|
|
153
160
|
token = TokenType.Numeric
|
|
154
|
-
state = State.TopLevelContent
|
|
161
|
+
state = stack.pop() || State.TopLevelContent
|
|
155
162
|
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
156
163
|
token = TokenType.Comment
|
|
157
|
-
state = State.TopLevelContent
|
|
164
|
+
state = stack.pop() || State.TopLevelContent
|
|
158
165
|
} else if ((next = part.match(RE_NAN))) {
|
|
159
166
|
token = TokenType.Numeric
|
|
160
|
-
state = State.TopLevelContent
|
|
167
|
+
state = stack.pop() || State.TopLevelContent
|
|
161
168
|
} else if ((next = part.match(RE_INF))) {
|
|
162
169
|
token = TokenType.Numeric
|
|
163
|
-
state = State.TopLevelContent
|
|
170
|
+
state = stack.pop() || State.TopLevelContent
|
|
164
171
|
} else if ((next = part.match(RE_QUOTE_DOUBLE))) {
|
|
165
172
|
token = TokenType.Punctuation
|
|
166
|
-
state = State.
|
|
173
|
+
state = State.InsideDoubleQuoteString
|
|
174
|
+
} else if ((next = part.match(RE_QUOTE_SINGLE))) {
|
|
175
|
+
token = TokenType.Punctuation
|
|
176
|
+
state = State.InsideSingleQuoteString
|
|
177
|
+
} else if ((next = part.match(RE_SQUARE_OPEN))) {
|
|
178
|
+
token = TokenType.Punctuation
|
|
179
|
+
state = State.InsideArray
|
|
180
|
+
} else if ((next = part.match(RE_CURLY_OPEN))) {
|
|
181
|
+
token = TokenType.Punctuation
|
|
182
|
+
state = State.InsideObject
|
|
167
183
|
} else if ((next = part.match(RE_ANYTHING))) {
|
|
168
184
|
token = TokenType.PropertyValueString
|
|
169
185
|
state = State.TopLevelContent
|
|
@@ -171,19 +187,76 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
171
187
|
throw new Error('no')
|
|
172
188
|
}
|
|
173
189
|
break
|
|
174
|
-
case State.
|
|
190
|
+
case State.InsideDoubleQuoteString:
|
|
175
191
|
if ((next = part.match(RE_QUOTE_DOUBLE))) {
|
|
176
192
|
token = TokenType.PunctuationString
|
|
177
|
-
state = State.TopLevelContent
|
|
193
|
+
state = stack.pop() || State.TopLevelContent
|
|
178
194
|
} else if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
|
|
179
195
|
token = TokenType.String
|
|
180
|
-
state = State.
|
|
196
|
+
state = State.InsideDoubleQuoteString
|
|
197
|
+
} else {
|
|
198
|
+
throw new Error('no')
|
|
199
|
+
}
|
|
200
|
+
break
|
|
201
|
+
case State.InsideSingleQuoteString:
|
|
202
|
+
if ((next = part.match(RE_QUOTE_SINGLE))) {
|
|
203
|
+
token = TokenType.PunctuationString
|
|
204
|
+
state = stack.pop() || State.TopLevelContent
|
|
205
|
+
} else if ((next = part.match(RE_STRING_SINGLE_QUOTE_CONTENT))) {
|
|
206
|
+
token = TokenType.String
|
|
207
|
+
state = State.InsideSingleQuoteString
|
|
208
|
+
} else {
|
|
209
|
+
throw new Error('no')
|
|
210
|
+
}
|
|
211
|
+
break
|
|
212
|
+
case State.InsideArray:
|
|
213
|
+
if ((next = part.match(RE_WHITESPACE))) {
|
|
214
|
+
token = TokenType.Whitespace
|
|
215
|
+
state = State.InsideArray
|
|
216
|
+
} else if ((next = part.match(RE_SQUARE_CLOSE))) {
|
|
217
|
+
token = TokenType.Punctuation
|
|
218
|
+
state = stack.pop() || State.TopLevelContent
|
|
219
|
+
} else if ((next = part.match(RE_QUOTE_DOUBLE))) {
|
|
220
|
+
token = TokenType.Punctuation
|
|
221
|
+
state = State.InsideDoubleQuoteString
|
|
222
|
+
stack.push(State.InsideArray)
|
|
223
|
+
} else if ((next = part.match(RE_COMMA))) {
|
|
224
|
+
token = TokenType.Punctuation
|
|
225
|
+
state = State.InsideArray
|
|
226
|
+
} else if ((next = part.match(RE_NUMERIC_INTEGER))) {
|
|
227
|
+
token = TokenType.Numeric
|
|
228
|
+
state = State.InsideArray
|
|
229
|
+
} else {
|
|
230
|
+
part
|
|
231
|
+
throw new Error('no')
|
|
232
|
+
}
|
|
233
|
+
break
|
|
234
|
+
case State.InsideObject:
|
|
235
|
+
if ((next = part.match(RE_WHITESPACE))) {
|
|
236
|
+
token = TokenType.Whitespace
|
|
237
|
+
state = State.InsideObject
|
|
238
|
+
} else if ((next = part.match(RE_PROPERTY_NAME))) {
|
|
239
|
+
token = TokenType.PropertyName
|
|
240
|
+
state = State.InsideObject
|
|
241
|
+
} else if ((next = part.match(RE_EQUAL_SIGN))) {
|
|
242
|
+
token = TokenType.Punctuation
|
|
243
|
+
state = State.AfterPropertyNameAfterEqualSign
|
|
244
|
+
stack.push(State.InsideObject)
|
|
245
|
+
} else if ((next = part.match(RE_CURLY_CLOSE))) {
|
|
246
|
+
token = TokenType.Punctuation
|
|
247
|
+
state = stack.pop() || State.TopLevelContent
|
|
248
|
+
} else if ((next = part.match(RE_SQUARE_OPEN))) {
|
|
249
|
+
token = TokenType.Punctuation
|
|
250
|
+
state = State.InsideArray
|
|
251
|
+
stack.push(State.InsideObject)
|
|
252
|
+
} else if ((next = part.match(RE_COMMA))) {
|
|
253
|
+
token = TokenType.Punctuation
|
|
254
|
+
state = State.InsideObject
|
|
181
255
|
} else {
|
|
182
256
|
throw new Error('no')
|
|
183
257
|
}
|
|
184
258
|
break
|
|
185
259
|
default:
|
|
186
|
-
console.log({ state, line })
|
|
187
260
|
throw new Error('no')
|
|
188
261
|
}
|
|
189
262
|
const tokenLength = next[0].length
|
|
@@ -193,5 +266,6 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
193
266
|
return {
|
|
194
267
|
state,
|
|
195
268
|
tokens,
|
|
269
|
+
stack,
|
|
196
270
|
}
|
|
197
271
|
}
|
|
@@ -83,6 +83,7 @@ const RE_TAGNAME = /^[!\w\-]+/
|
|
|
83
83
|
const RE_TEXT = /^[^<>\n]+/
|
|
84
84
|
const RE_WHITESPACE = /^\s+/
|
|
85
85
|
const RE_WORD = /^[^\s]+/
|
|
86
|
+
const RE_QUESTION_MARK_TAG_NAME = /^\?\w+/
|
|
86
87
|
|
|
87
88
|
export const initialLineState = {
|
|
88
89
|
state: State.TopLevelContent,
|
|
@@ -143,6 +144,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
143
144
|
} else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
|
|
144
145
|
token = TokenType.PunctuationTag
|
|
145
146
|
state = State.TopLevelContent
|
|
147
|
+
} else if ((next = part.match(RE_QUESTION_MARK_TAG_NAME))) {
|
|
148
|
+
token = TokenType.TagName
|
|
149
|
+
state = State.InsideOpeningTag
|
|
146
150
|
} else if ((next = part.match(RE_ANY_TEXT))) {
|
|
147
151
|
token = TokenType.Text
|
|
148
152
|
state = State.TopLevelContent
|
|
@@ -205,6 +209,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
205
209
|
} else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
|
|
206
210
|
token = TokenType.PunctuationTag
|
|
207
211
|
state = State.TopLevelContent
|
|
212
|
+
} else if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
213
|
+
token = TokenType.PunctuationString
|
|
214
|
+
state = State.InsideDoubleQuoteString
|
|
208
215
|
} else if ((next = part.match(RE_TAG_TEXT))) {
|
|
209
216
|
token = TokenType.Text
|
|
210
217
|
state = State.TopLevelContent
|
|
@@ -109,6 +109,7 @@ export const initialLineState = {
|
|
|
109
109
|
tokens: [],
|
|
110
110
|
indent: '',
|
|
111
111
|
keyOffset: 0,
|
|
112
|
+
stack: [],
|
|
112
113
|
}
|
|
113
114
|
|
|
114
115
|
export const hasArrayReturn = true
|
|
@@ -137,6 +138,7 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
137
138
|
let token = TokenType.None
|
|
138
139
|
let state = lineState.state
|
|
139
140
|
let keyOffset = lineState.keyOffset
|
|
141
|
+
const stack = lineState.stack
|
|
140
142
|
while (index < line.length) {
|
|
141
143
|
const part = line.slice(index)
|
|
142
144
|
switch (state) {
|
|
@@ -184,7 +186,7 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
184
186
|
case State.InsideLineComment:
|
|
185
187
|
if ((next = part.match(RE_ANYTHING))) {
|
|
186
188
|
token = TokenType.Comment
|
|
187
|
-
state = State.TopLevelContent
|
|
189
|
+
state = stack.pop() || State.TopLevelContent
|
|
188
190
|
} else {
|
|
189
191
|
throw new Error('no')
|
|
190
192
|
}
|
|
@@ -245,6 +247,10 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
245
247
|
if ((next = part.match(RE_WHITESPACE))) {
|
|
246
248
|
token = TokenType.Whitespace
|
|
247
249
|
state = State.AfterPipe
|
|
250
|
+
} else if ((next = part.match(RE_LINE_COMMENT_START))) {
|
|
251
|
+
token = TokenType.Comment
|
|
252
|
+
state = State.InsideLineComment
|
|
253
|
+
stack.push(State.AfterPipe)
|
|
248
254
|
} else {
|
|
249
255
|
throw new Error('no')
|
|
250
256
|
}
|
|
@@ -387,5 +393,6 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
387
393
|
state,
|
|
388
394
|
tokens,
|
|
389
395
|
keyOffset,
|
|
396
|
+
stack,
|
|
390
397
|
}
|
|
391
398
|
}
|