@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.
Files changed (45) hide show
  1. package/config/defaultKeyBindings.json +25 -0
  2. package/config/defaultSettings.json +2 -7
  3. package/extensions/builtin.language-basics-coffeescript/src/tokenizeCoffeeScript.js +232 -3
  4. package/extensions/builtin.language-basics-cpp/src/tokenizeCpp.js +14 -0
  5. package/extensions/builtin.language-basics-css/src/tokenizeCss.js +8 -0
  6. package/extensions/builtin.language-basics-javascript/src/tokenizeJavaScript.js +52 -4
  7. package/extensions/builtin.language-basics-perl/extension.json +2 -1
  8. package/extensions/builtin.language-basics-perl/src/tokenizePerl.js +53 -6
  9. package/extensions/builtin.language-basics-python/src/tokenizePython.js +86 -3
  10. package/extensions/builtin.language-basics-ruby/README.md +14 -0
  11. package/extensions/builtin.language-basics-ruby/extension.json +48 -0
  12. package/extensions/builtin.language-basics-ruby/src/tokenizeRuby.js +241 -0
  13. package/extensions/builtin.language-basics-scss/README.md +14 -0
  14. package/extensions/builtin.language-basics-scss/extension.json +12 -0
  15. package/extensions/builtin.language-basics-scss/src/tokenizeScss.js +28 -0
  16. package/extensions/builtin.language-basics-shellscript/extension.json +2 -1
  17. package/extensions/builtin.language-basics-shellscript/src/tokenizeShellScript.js +326 -13
  18. package/extensions/builtin.language-basics-toml/src/tokenizeToml.js +87 -13
  19. package/extensions/builtin.language-basics-xml/extension.json +2 -1
  20. package/extensions/builtin.language-basics-xml/src/tokenizeXml.js +7 -0
  21. package/extensions/builtin.language-basics-yaml/src/tokenizeYaml.js +8 -1
  22. package/extensions/builtin.theme-cobalt2/color-theme.json +4 -0
  23. package/extensions/builtin.theme-gruvbox/color-theme.json +4 -0
  24. package/extensions/builtin.theme-palenight/color-theme.json +4 -0
  25. package/extensions/builtin.theme-slime/color-theme.json +9 -1
  26. package/package.json +5 -5
  27. package/src/parts/Cli/Cli.js +2 -2
  28. package/src/parts/CliInstall/CliInstall.js +21 -6
  29. package/src/parts/CliList/CliList.js +3 -2
  30. package/src/parts/CliUnlink/CliUnlink.js +1 -1
  31. package/src/parts/DownloadAndExtract/DownloadAndExtract.js +18 -8
  32. package/src/parts/ErrorCodes/ErrorCodes.js +8 -18
  33. package/src/parts/ErrorHandling/ErrorHandling.js +4 -9
  34. package/src/parts/ExportStatic/ExportStatic.js +57 -330
  35. package/src/parts/ExtensionHost/ExtensionHost.js +4 -7
  36. package/src/parts/ExtensionInstallFromGitHub/ExtensionInstallFromGitHub.js +1 -4
  37. package/src/parts/ExtensionManagement/ExtensionManagementColorTheme.js +3 -4
  38. package/src/parts/FileSystem/FileSystem.js +5 -15
  39. package/src/parts/GetResponse/GetResponse.js +10 -14
  40. package/src/parts/JsonRpc/JsonRpc.js +3 -6
  41. package/src/parts/JsonRpcErrorCode/JsonRpcErrorCode.js +2 -0
  42. package/src/parts/JsonRpcVersion/JsonRpcVersion.js +1 -0
  43. package/src/parts/OutputChannel/OutputChannel.ipc.js +3 -2
  44. package/src/parts/Terminal/Terminal.js +5 -4
  45. package/src/sharedProcessMain.js +2 -5
@@ -3,8 +3,12 @@
3
3
  */
4
4
  export const State = {
5
5
  TopLevelContent: 1,
6
- InsideString: 2,
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 RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"]+/
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 RE_VARIABLE_NAME = /^[a-zA-Z\_\/\-]+/
61
- const RE_PUNCTUATION = /^[:,;\{\}\[\]\.=\(\)<>]/
62
- const RE_NUMERIC = /^\d+/
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
- token = TokenType.VariableName
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.InsideString
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.InsideString:
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.InsideString
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
- InsideString: 5,
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.InsideString
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.InsideString:
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.InsideString
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
  }
@@ -68,7 +68,8 @@
68
68
  ".xoml",
69
69
  ".xpdl",
70
70
  ".xsd",
71
- ".xul"
71
+ ".xul",
72
+ ".tmtheme"
72
73
  ],
73
74
  "fileNames": [".project"],
74
75
  "tokenize": "src/tokenizeXml.js"
@@ -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
  }
@@ -151,6 +151,10 @@
151
151
  {
152
152
  "name": "KeywordReturn",
153
153
  "foreground": "#FF9D00"
154
+ },
155
+ {
156
+ "name": "KeywordOperator",
157
+ "foreground": "#FF9D00"
154
158
  }
155
159
  ]
156
160
  }