@lvce-editor/shared-process 0.11.9 → 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 (42) 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-python/src/tokenizePython.js +1 -1
  8. package/extensions/builtin.language-basics-ruby/README.md +14 -0
  9. package/extensions/builtin.language-basics-ruby/extension.json +48 -0
  10. package/extensions/builtin.language-basics-ruby/src/tokenizeRuby.js +241 -0
  11. package/extensions/builtin.language-basics-scss/README.md +14 -0
  12. package/extensions/builtin.language-basics-scss/extension.json +12 -0
  13. package/extensions/builtin.language-basics-scss/src/tokenizeScss.js +28 -0
  14. package/extensions/builtin.language-basics-shellscript/extension.json +2 -1
  15. package/extensions/builtin.language-basics-shellscript/src/tokenizeShellScript.js +75 -23
  16. package/extensions/builtin.language-basics-toml/src/tokenizeToml.js +87 -13
  17. package/extensions/builtin.language-basics-xml/extension.json +2 -1
  18. package/extensions/builtin.language-basics-xml/src/tokenizeXml.js +7 -0
  19. package/extensions/builtin.language-basics-yaml/src/tokenizeYaml.js +8 -1
  20. package/extensions/builtin.theme-cobalt2/color-theme.json +4 -0
  21. package/extensions/builtin.theme-gruvbox/color-theme.json +4 -0
  22. package/extensions/builtin.theme-palenight/color-theme.json +4 -0
  23. package/extensions/builtin.theme-slime/color-theme.json +9 -1
  24. package/package.json +5 -5
  25. package/src/parts/Cli/Cli.js +2 -2
  26. package/src/parts/CliInstall/CliInstall.js +21 -6
  27. package/src/parts/CliList/CliList.js +3 -2
  28. package/src/parts/CliUnlink/CliUnlink.js +1 -1
  29. package/src/parts/DownloadAndExtract/DownloadAndExtract.js +18 -8
  30. package/src/parts/ErrorHandling/ErrorHandling.js +4 -9
  31. package/src/parts/ExportStatic/ExportStatic.js +57 -330
  32. package/src/parts/ExtensionHost/ExtensionHost.js +4 -7
  33. package/src/parts/ExtensionInstallFromGitHub/ExtensionInstallFromGitHub.js +1 -4
  34. package/src/parts/ExtensionManagement/ExtensionManagementColorTheme.js +3 -4
  35. package/src/parts/FileSystem/FileSystem.js +5 -15
  36. package/src/parts/GetResponse/GetResponse.js +10 -14
  37. package/src/parts/JsonRpc/JsonRpc.js +3 -6
  38. package/src/parts/JsonRpcErrorCode/JsonRpcErrorCode.js +2 -0
  39. package/src/parts/JsonRpcVersion/JsonRpcVersion.js +1 -0
  40. package/src/parts/OutputChannel/OutputChannel.ipc.js +3 -2
  41. package/src/parts/Terminal/Terminal.js +5 -4
  42. package/src/sharedProcessMain.js +2 -5
@@ -0,0 +1,241 @@
1
+ /**
2
+ * @enum number
3
+ */
4
+ export const State = {
5
+ TopLevelContent: 1,
6
+ InsideDoubleQuoteString: 2,
7
+ InsideSingleQuoteString: 3,
8
+ InsideBackTickQuoteString: 4,
9
+ InsideEof: 5,
10
+ }
11
+
12
+ export const StateMap = {
13
+ [State.TopLevelContent]: 'TopLevelContent',
14
+ }
15
+
16
+ /**
17
+ * @enum number
18
+ */
19
+ export const TokenType = {
20
+ None: 1,
21
+ Whitespace: 2,
22
+ PunctuationString: 3,
23
+ String: 4,
24
+ Keyword: 5,
25
+ Numeric: 6,
26
+ Punctuation: 7,
27
+ VariableName: 8,
28
+ Comment: 9,
29
+ KeywordControl: 10,
30
+ LanguageConstant: 11,
31
+ KeywordReturn: 12,
32
+ Regex: 13,
33
+ KeywordImport: 14,
34
+ }
35
+
36
+ export const TokenMap = {
37
+ [TokenType.None]: 'None',
38
+ [TokenType.Whitespace]: 'Whitespace',
39
+ [TokenType.PunctuationString]: 'PunctuationString',
40
+ [TokenType.String]: 'String',
41
+ [TokenType.Keyword]: 'Keyword',
42
+ [TokenType.Numeric]: 'Numeric',
43
+ [TokenType.Punctuation]: 'Punctuation',
44
+ [TokenType.VariableName]: 'VariableName',
45
+ [TokenType.Comment]: 'Comment',
46
+ [TokenType.KeywordControl]: 'KeywordControl',
47
+ [TokenType.LanguageConstant]: 'LanguageConstant',
48
+ [TokenType.KeywordReturn]: 'KeywordReturn',
49
+ [TokenType.Regex]: 'Regex',
50
+ [TokenType.KeywordImport]: 'KeywordImport',
51
+ }
52
+
53
+ const RE_SELECTOR = /^[\.a-zA-Z\d\-\:>]+/
54
+ const RE_WHITESPACE = /^ +/
55
+ const RE_CURLY_OPEN = /^\{/
56
+ const RE_CURLY_CLOSE = /^\}/
57
+ const RE_PROPERTY_NAME = /^[a-zA-Z\-]+\b/
58
+ const RE_COLON = /^:/
59
+ const RE_PROPERTY_VALUE = /^[^;\}]+/
60
+ const RE_SEMICOLON = /^;/
61
+ const RE_COMMA = /^,/
62
+ const RE_ANYTHING = /^.+/s
63
+ const RE_ANYTHING_UNTIL_CLOSE_BRACE = /^[^\}]+/
64
+ const RE_QUOTE_DOUBLE = /^"/
65
+ const RE_QUOTE_SINGLE = /^'/
66
+ const RE_QUOTE_BACKTICK = /^`/
67
+ const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"\\]+/
68
+ const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^'\\]+/
69
+ const RE_STRING_BACKTICK_QUOTE_CONTENT = /^[^`]+/
70
+ const RE_KEYWORD =
71
+ /^(?:alias|and|begin|break|case|class|def|defined\?|do|else|elsif|end|ensure|false|for|if|in|module|next|nil|not|or|redo|require|rescue|retry|return|self|super|then|true|undef|unless|until|when|while|yield)\b/
72
+ const RE_VARIABLE_NAME = /^[a-zA-Z\_\$]+/
73
+ const RE_PUNCTUATION = /^[:,;\{\}\[\]\.=\(\)<>\-\|\&\+\?\!\%\*\/\@\~]/
74
+ const RE_NUMERIC = /^\d+/
75
+ const RE_LINE_COMMENT = /^#.*/s
76
+ const RE_EOF_START = /^<<\-?\s*([\w\!]+)/
77
+ const RE_EOF_CONTENT = /.*/s
78
+ // const RE_REGEX = /^\/.+/
79
+ const RE_REGEX = /^\/.*\//
80
+ const RE_STRING_ESCAPE = /^\\./
81
+
82
+ export const initialLineState = {
83
+ state: State.TopLevelContent,
84
+ tokens: [],
85
+ stringEnd: '',
86
+ }
87
+
88
+ export const isEqualLineState = (lineStateA, lineStateB) => {
89
+ return lineStateA.state === lineStateB.state
90
+ }
91
+
92
+ export const hasArrayReturn = true
93
+
94
+ /**
95
+ * @param {string} line
96
+ */
97
+ export const tokenizeLine = (line, lineState) => {
98
+ let next = null
99
+ let index = 0
100
+ let tokens = []
101
+ let token = TokenType.None
102
+ let state = lineState.state
103
+ let stringEnd = lineState.stringEnd
104
+ while (index < line.length) {
105
+ const part = line.slice(index)
106
+ switch (state) {
107
+ case State.TopLevelContent:
108
+ if ((next = part.match(RE_WHITESPACE))) {
109
+ token = TokenType.Whitespace
110
+ state = State.TopLevelContent
111
+ } else if ((next = part.match(RE_KEYWORD))) {
112
+ switch (next[0]) {
113
+ case 'break':
114
+ case 'case':
115
+ case 'do':
116
+ case 'elsif':
117
+ case 'else':
118
+ case 'for':
119
+ case 'if':
120
+ case 'in':
121
+ case 'then':
122
+ case 'while':
123
+ case 'end':
124
+ case 'begin':
125
+ case 'rescue':
126
+ case 'unless':
127
+ token = TokenType.KeywordControl
128
+ break
129
+ case 'true':
130
+ case 'false':
131
+ case 'nil':
132
+ token = TokenType.LanguageConstant
133
+ break
134
+ case 'return':
135
+ token = TokenType.KeywordReturn
136
+ break
137
+ case 'require':
138
+ token = TokenType.KeywordImport
139
+ break
140
+ default:
141
+ token = TokenType.Keyword
142
+ break
143
+ }
144
+ state = State.TopLevelContent
145
+ } else if ((next = part.match(RE_EOF_START))) {
146
+ token = TokenType.Punctuation
147
+ state = State.InsideEof
148
+ stringEnd = next[1]
149
+ } else if ((next = part.match(RE_REGEX))) {
150
+ token = TokenType.Regex
151
+ state = State.TopLevelContent
152
+ } else if ((next = part.match(RE_PUNCTUATION))) {
153
+ token = TokenType.Punctuation
154
+ state = State.TopLevelContent
155
+ } else if ((next = part.match(RE_VARIABLE_NAME))) {
156
+ token = TokenType.VariableName
157
+ state = State.TopLevelContent
158
+ } else if ((next = part.match(RE_NUMERIC))) {
159
+ token = TokenType.Numeric
160
+ state = State.TopLevelContent
161
+ } else if ((next = part.match(RE_QUOTE_DOUBLE))) {
162
+ token = TokenType.PunctuationString
163
+ state = State.InsideDoubleQuoteString
164
+ } else if ((next = part.match(RE_QUOTE_SINGLE))) {
165
+ token = TokenType.Punctuation
166
+ state = State.InsideSingleQuoteString
167
+ } else if ((next = part.match(RE_QUOTE_BACKTICK))) {
168
+ token = TokenType.Punctuation
169
+ state = State.InsideBackTickQuoteString
170
+ } else if ((next = part.match(RE_LINE_COMMENT))) {
171
+ token = TokenType.Comment
172
+ state = State.TopLevelContent
173
+ } else {
174
+ console.log({ part })
175
+ part //?
176
+ throw new Error('no')
177
+ }
178
+ break
179
+ case State.InsideDoubleQuoteString:
180
+ if ((next = part.match(RE_QUOTE_DOUBLE))) {
181
+ token = TokenType.PunctuationString
182
+ state = State.TopLevelContent
183
+ } else if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
184
+ token = TokenType.String
185
+ state = State.InsideDoubleQuoteString
186
+ } else if ((next = part.match(RE_STRING_ESCAPE))) {
187
+ token = TokenType.String
188
+ state = State.InsideDoubleQuoteString
189
+ } else {
190
+ throw new Error('no')
191
+ }
192
+ break
193
+ case State.InsideSingleQuoteString:
194
+ if ((next = part.match(RE_QUOTE_SINGLE))) {
195
+ token = TokenType.PunctuationString
196
+ state = State.TopLevelContent
197
+ } else if ((next = part.match(RE_STRING_SINGLE_QUOTE_CONTENT))) {
198
+ token = TokenType.String
199
+ state = State.InsideSingleQuoteString
200
+ } else if ((next = part.match(RE_STRING_ESCAPE))) {
201
+ token = TokenType.String
202
+ state = State.InsideSingleQuoteString
203
+ } else {
204
+ throw new Error('no')
205
+ }
206
+ break
207
+ case State.InsideBackTickQuoteString:
208
+ if ((next = part.match(RE_QUOTE_BACKTICK))) {
209
+ token = TokenType.PunctuationString
210
+ state = State.TopLevelContent
211
+ } else if ((next = part.match(RE_STRING_BACKTICK_QUOTE_CONTENT))) {
212
+ token = TokenType.String
213
+ state = State.InsideBackTickQuoteString
214
+ } else {
215
+ throw new Error('no')
216
+ }
217
+ break
218
+ case State.InsideEof:
219
+ if ((next = part.match(stringEnd))) {
220
+ token = TokenType.Punctuation
221
+ state = State.TopLevelContent
222
+ } else if ((next = part.match(RE_EOF_CONTENT))) {
223
+ token = TokenType.String
224
+ state = State.InsideEof
225
+ } else {
226
+ throw new Error('no')
227
+ }
228
+ break
229
+ default:
230
+ throw new Error('no')
231
+ }
232
+ const tokenLength = next[0].length
233
+ index += tokenLength
234
+ tokens.push(token, tokenLength)
235
+ }
236
+ return {
237
+ state,
238
+ tokens,
239
+ stringEnd,
240
+ }
241
+ }
@@ -0,0 +1,14 @@
1
+ # Language Basics Scss
2
+
3
+ ## Contributing
4
+
5
+ ```sh
6
+ git clone git@github.com:lvce-editor/language-basics-scss.git &&
7
+ cd language-basics-scss &&
8
+ npm ci &&
9
+ npm test
10
+ ```
11
+
12
+ ## Gitpod
13
+
14
+ [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/lvce-editor/language-basics-scss)
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "builtin.language-basics-scss",
3
+ "name": "Language Basics Scss",
4
+ "description": "Provides syntax highlighting and bracket matching in Scss files.",
5
+ "languages": [
6
+ {
7
+ "id": "scss",
8
+ "extensions": [".scss"],
9
+ "tokenize": "src/tokenizeScss.js"
10
+ }
11
+ ]
12
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @enum number
3
+ */
4
+ export const TokenType = {
5
+ Text: 1,
6
+ }
7
+
8
+ export const TokenMap = {
9
+ [TokenType.Text]: 'Text',
10
+ }
11
+
12
+ export const initialLineState = {
13
+ state: 1,
14
+ tokens: [],
15
+ }
16
+
17
+ export const hasArrayReturn = true
18
+
19
+ /**
20
+ * @param {string} line
21
+ */
22
+ export const tokenizeLine = (line) => {
23
+ const tokens = [TokenType.Text, line.length]
24
+ return {
25
+ state: 1,
26
+ tokens,
27
+ }
28
+ }
@@ -46,7 +46,8 @@
46
46
  "zprofile",
47
47
  "zlogout",
48
48
  "bashrc_Apple_Terminal",
49
- "zshrc_Apple_Terminal"
49
+ "zshrc_Apple_Terminal",
50
+ "xvfb.init"
50
51
  ],
51
52
  "firstLine": "^#!.*\\b(bash|fish|zsh|sh|ksh|dtksh|pdksh|mksh|ash|dash|yash|sh|csh|jcsh|tcsh|itcsh).*|^#\\s*-\\*-[^*]*mode:\\s*shell-script[^*]*-\\*-",
52
53
  "tokenize": "src/tokenizeShellScript.js"
@@ -72,7 +72,7 @@ const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"\\]+/
72
72
  const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
73
73
  const RE_STRING_BACKTICK_QUOTE_CONTENT = /^[^`]+/
74
74
  const RE_KEYWORD =
75
- /^(?:7za|7zr|alias|ar|awk|bg|bind|break|builtin|bunzip|bunzip2|caller|cargo|case|cat|catdoc|cd|chmod|chown|command|compgen|complete|continue|cp|curl|cygstart|dde-open|dirs|disown|do|done|done|dpkg|echo|elif|else|emulate|enable|enlightenment_open|esac|eval|eval_gettext|exec|exit|expr|false|fc|fg|fi|for|function|gdbus|getopts|gio|gnome-open|grep|grub-mount|gvfs-open|gzip|hash|head|help|history|identity|if|in|ip|jobs|kde-open|kfmclient|kill|less|let|lha|logout|ls|ls|lunzip|lzip|lzma|miniunz|miniunzip|mkdir|mktemp|mv|node|npm|open|pcmanfm|pdftotext|popd|prezip-bin|printf|ps|pushd|pwd|rar|read|readlink|readonly|return|rm|rpm|sed|set|shift|shopt|sleep|snap|sort|source|stty|suspend|tail|tar|tee|test|texi2dvi|then|times|touch|trap|true|tty|type|ulimit|umask|umask|unalias|unarj|unmkinitramfs|unrar|unset|unwrapdiff|unzip|unzoo|wait|which|while|xprop|xz|zoo|zstd)\b/
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
76
  const RE_VARIABLE_NAME = /^[a-zA-Z\_\/\-\$][a-zA-Z\_\/\-\$#\d\-]*/
77
77
  const RE_PUNCTUATION = /^[:,;\{\}\[\]\.=\(\)<>\!\|\+\&\>\)]/
78
78
  const RE_NUMERIC = /^\d+(?=\s|$)/
@@ -140,13 +140,17 @@ export const tokenizeLine = (line, lineState) => {
140
140
  token = TokenType.KeywordControl
141
141
  break
142
142
  case '7za':
143
+ case '7z':
143
144
  case '7za':
144
145
  case '7zr':
145
146
  case 'alias':
147
+ case 'apk':
148
+ case 'apt-get':
146
149
  case 'ar':
147
150
  case 'awk':
148
151
  case 'bg':
149
152
  case 'bind':
153
+ case 'blkid':
150
154
  case 'builtin':
151
155
  case 'bunzip':
152
156
  case 'bunzip2':
@@ -157,72 +161,119 @@ export const tokenizeLine = (line, lineState) => {
157
161
  case 'cd':
158
162
  case 'chmod':
159
163
  case 'chown':
164
+ case 'cmp':
160
165
  case 'command':
161
166
  case 'compgen':
162
167
  case 'complete':
163
168
  case 'cp':
169
+ case 'cryptsetup':
164
170
  case 'curl':
171
+ case 'curl':
172
+ case 'cut':
173
+ case 'cygstart':
174
+ case 'dde-open':
175
+ case 'diff':
176
+ case 'dirname':
165
177
  case 'dirs':
166
178
  case 'disown':
167
179
  case 'dpkg':
180
+ case 'du':
168
181
  case 'echo':
169
182
  case 'emulate':
170
183
  case 'enable':
184
+ case 'enlightenment_open':
171
185
  case 'eval':
172
186
  case 'eval_gettext':
173
187
  case 'exec':
174
188
  case 'exit':
189
+ case 'expr':
175
190
  case 'fc':
176
191
  case 'fg':
192
+ case 'find':
193
+ case 'free':
194
+ case 'fzf':
195
+ case 'g++':
196
+ case 'gcc':
197
+ case 'gdbus':
177
198
  case 'getopts':
199
+ case 'gio':
200
+ case 'git':
201
+ case 'gnome-open':
178
202
  case 'grep':
179
203
  case 'grub-mount':
204
+ case 'gs':
205
+ case 'gulp':
206
+ case 'gvfs-open':
180
207
  case 'gzip':
181
208
  case 'hash':
182
209
  case 'head':
183
210
  case 'help':
211
+ case 'hexdump':
184
212
  case 'history':
185
213
  case 'identity':
214
+ case 'install':
215
+ case 'ip':
186
216
  case 'jobs':
217
+ case 'kde-open':
218
+ case 'kfmclient':
187
219
  case 'kill':
220
+ case 'killall':
188
221
  case 'less':
189
222
  case 'lha':
190
223
  case 'logout':
191
224
  case 'ls':
225
+ case 'ls':
192
226
  case 'lunzip':
193
227
  case 'lzip':
194
228
  case 'lzma':
229
+ case 'makepkg':
195
230
  case 'miniunz':
196
231
  case 'miniunzip':
197
232
  case 'mkdir':
198
233
  case 'mktemp':
234
+ case 'mount':
235
+ case 'mpicc':
199
236
  case 'mv':
200
237
  case 'node':
201
238
  case 'npm':
239
+ case 'open':
240
+ case 'pacman':
241
+ case 'pcmanfm':
202
242
  case 'pdftotext':
243
+ case 'pkg':
203
244
  case 'popd':
245
+ case 'prezip-bin':
204
246
  case 'printf':
205
247
  case 'ps':
206
248
  case 'pushd':
207
249
  case 'pwd':
208
250
  case 'rar':
209
251
  case 'read':
252
+ case 'readlink':
210
253
  case 'rm':
211
254
  case 'rpm':
255
+ case 'rsync':
212
256
  case 'sed':
213
257
  case 'set':
214
258
  case 'shift':
215
259
  case 'shopt':
216
260
  case 'sleep':
217
261
  case 'snap':
262
+ case 'sort':
218
263
  case 'source':
219
264
  case 'stty':
265
+ case 'sudo':
220
266
  case 'suspend':
267
+ case 'tail':
221
268
  case 'tar':
222
269
  case 'tee':
223
270
  case 'test':
271
+ case 'texi2dvi':
224
272
  case 'times':
273
+ case 'touch':
225
274
  case 'trap':
275
+ case 'tty':
276
+ case 'tune2fs':
226
277
  case 'type':
227
278
  case 'ulimit':
228
279
  case 'umask':
@@ -230,38 +281,39 @@ export const tokenizeLine = (line, lineState) => {
230
281
  case 'unalias':
231
282
  case 'unarj':
232
283
  case 'unmkinitramfs':
284
+ case 'unmount':
233
285
  case 'unrar':
234
286
  case 'unset':
235
287
  case 'unwrapdiff':
236
288
  case 'unzip':
237
289
  case 'unzoo':
290
+ case 'vim':
238
291
  case 'wait':
292
+ case 'wc':
293
+ case 'wget':
239
294
  case 'which':
295
+ case 'xargs':
296
+ case 'xprop':
240
297
  case 'xz':
298
+ case 'yarn':
299
+ case 'yum':
300
+ case 'zip':
241
301
  case 'zoo':
242
302
  case 'zstd':
243
- case 'expr':
244
- case 'tty':
245
- case 'sort':
246
- case 'ls':
247
- case 'readlink':
248
- case 'gio':
249
- case 'gvfs-open':
250
- case 'gnome-open':
251
- case 'xprop':
252
- case 'cygstart':
253
- case 'open':
254
- case 'kde-open':
255
- case 'kfmclient':
256
- case 'dde-open':
257
- case 'enlightenment_open':
258
- case 'gdbus':
259
- case 'pcmanfm':
260
- case 'texi2dvi':
261
- case 'tail':
262
- case 'touch':
263
- case 'prezip-bin':
264
- case 'ip':
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':
265
317
  token = TokenType.Function
266
318
  break
267
319
  case 'true':
@@ -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
  }