@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.
- 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-python/src/tokenizePython.js +1 -1
- 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 +75 -23
- 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/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
|
@@ -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
|
+
[](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 '
|
|
244
|
-
case '
|
|
245
|
-
case '
|
|
246
|
-
case '
|
|
247
|
-
case '
|
|
248
|
-
case '
|
|
249
|
-
case '
|
|
250
|
-
case '
|
|
251
|
-
case '
|
|
252
|
-
case '
|
|
253
|
-
case '
|
|
254
|
-
case '
|
|
255
|
-
case '
|
|
256
|
-
case '
|
|
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
|
-
|
|
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
|
}
|