@lvce-editor/shared-process 0.11.7 → 0.11.9
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 +4 -0
- package/config/defaultSettings.json +2 -0
- package/extensions/builtin.language-basics-cpp/src/tokenizeCpp.js +29 -6
- package/extensions/builtin.language-basics-css/src/tokenizeCss.js +176 -25
- package/extensions/builtin.language-basics-gn/README.md +14 -0
- package/extensions/builtin.language-basics-gn/extension.json +12 -0
- package/extensions/builtin.language-basics-gn/src/tokenizeGn.js +178 -0
- package/extensions/builtin.language-basics-javascript/src/tokenizeJavaScript.js +5 -0
- package/extensions/builtin.language-basics-json5/README.md +16 -0
- package/extensions/builtin.language-basics-json5/extension.json +12 -0
- package/extensions/builtin.language-basics-json5/src/tokenizeJson5.js +321 -0
- 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/extension.json +2 -1
- package/extensions/builtin.language-basics-python/src/tokenizePython.js +129 -36
- package/extensions/builtin.language-basics-shellscript/src/tokenizeShellScript.js +274 -13
- package/extensions/builtin.language-basics-typescript/src/tokenizeTypeScript.js +197 -15
- package/extensions/builtin.theme-ayu/color-theme.json +2 -0
- package/extensions/builtin.theme-slime/color-theme.json +6 -0
- package/package.json +4 -4
- package/src/parts/Command/Command.js +38 -40
- package/src/parts/ErrorCodes/ErrorCodes.js +9 -17
- package/src/parts/GetResponse/GetResponse.js +2 -2
- package/src/parts/Module/Module.js +2 -2
- package/src/parts/ModuleMap/ModuleMap.js +1 -1
- package/src/parts/PrettyError/PrettyError.js +55 -5
- package/src/parts/RipGrep/RipGrep.js +30 -0
- package/src/parts/SearchFile/SearchFile.js +12 -16
- package/src/parts/TextSearch/TextSearch.ipc.js +7 -0
- package/src/parts/{Search/Search.js → TextSearch/TextSearch.js} +11 -17
- package/src/parts/Search/Search.ipc.js +0 -7
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @enum number
|
|
3
|
+
*/
|
|
4
|
+
export const State = {
|
|
5
|
+
TopLevelContent: 1,
|
|
6
|
+
AfterCurlyOpen: 2,
|
|
7
|
+
InsideString: 3,
|
|
8
|
+
AfterPropertyName: 4,
|
|
9
|
+
AfterPropertyNameAfterColon: 5,
|
|
10
|
+
AfterPropertyValue: 6,
|
|
11
|
+
JsonPropertyKey: 7,
|
|
12
|
+
InsideLineComment: 8,
|
|
13
|
+
InsidePropertyNameString: 9,
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const StateMap = {
|
|
17
|
+
[State.TopLevelContent]: 'TopLevelContent',
|
|
18
|
+
[State.AfterCurlyOpen]: 'AfterCurlyOpen',
|
|
19
|
+
[State.InsideString]: 'InsideString',
|
|
20
|
+
[State.AfterPropertyName]: 'AfterPropertyName',
|
|
21
|
+
[State.AfterPropertyNameAfterColon]: 'AfterPropertyNameAfterColon',
|
|
22
|
+
[State.AfterPropertyValue]: 'AfterPropertyValue',
|
|
23
|
+
[State.JsonPropertyKey]: 'JsonPropertyKey',
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @enum number
|
|
28
|
+
*/
|
|
29
|
+
export const TokenType = {
|
|
30
|
+
CssSelector: 1,
|
|
31
|
+
Whitespace: 2,
|
|
32
|
+
Punctuation: 3,
|
|
33
|
+
PropertyName: 4,
|
|
34
|
+
PropertyValue: 5,
|
|
35
|
+
CurlyOpen: 6,
|
|
36
|
+
CurlyClose: 7,
|
|
37
|
+
PropertyColon: 8,
|
|
38
|
+
PropertySemicolon: 9,
|
|
39
|
+
String: 10,
|
|
40
|
+
LanguageConstant: 11,
|
|
41
|
+
NewLine: 12,
|
|
42
|
+
JsonPropertyName: 13,
|
|
43
|
+
PropertyValueString: 14,
|
|
44
|
+
Numeric: 15,
|
|
45
|
+
LanguageConstantBoolean: 16,
|
|
46
|
+
Comment: 17,
|
|
47
|
+
Error: 18,
|
|
48
|
+
Unknown: 19,
|
|
49
|
+
Text: 20,
|
|
50
|
+
JsonPropertyValueString: 21,
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export const TokenMap = {
|
|
54
|
+
[TokenType.CssSelector]: 'CssSelector',
|
|
55
|
+
[TokenType.Whitespace]: 'Whitespace',
|
|
56
|
+
[TokenType.Punctuation]: 'Punctuation',
|
|
57
|
+
[TokenType.PropertyName]: 'PropertyName',
|
|
58
|
+
[TokenType.PropertyValue]: 'PropertyValue',
|
|
59
|
+
[TokenType.CurlyOpen]: 'CurlyOpen',
|
|
60
|
+
[TokenType.CurlyClose]: 'CurlyClose',
|
|
61
|
+
[TokenType.PropertyColon]: 'PropertyColon',
|
|
62
|
+
[TokenType.PropertySemicolon]: 'PropertySemicolon',
|
|
63
|
+
[TokenType.String]: 'String',
|
|
64
|
+
[TokenType.LanguageConstant]: 'LanguageConstant',
|
|
65
|
+
[TokenType.LanguageConstantBoolean]: 'LanguageConstantBoolean',
|
|
66
|
+
[TokenType.JsonPropertyName]: 'JsonPropertyName',
|
|
67
|
+
[TokenType.PropertyValueString]: 'PropertyValueString',
|
|
68
|
+
[TokenType.Comment]: 'Comment',
|
|
69
|
+
[TokenType.Error]: 'Error',
|
|
70
|
+
[TokenType.Unknown]: 'Unknown',
|
|
71
|
+
[TokenType.NewLine]: 'NewLine',
|
|
72
|
+
[TokenType.Text]: 'Text',
|
|
73
|
+
[TokenType.Numeric]: 'Numeric',
|
|
74
|
+
[TokenType.JsonPropertyValueString]: 'JsonPropertyValueString',
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const RE_SELECTOR = /^[\.a-zA-Z\d\-\:>]+/
|
|
78
|
+
const RE_WHITESPACE = /^\s+/
|
|
79
|
+
const RE_CURLY_OPEN = /^\{/
|
|
80
|
+
const RE_CURLY_CLOSE = /^\}/
|
|
81
|
+
const RE_COLON = /^:/
|
|
82
|
+
const RE_PROPERTY_VALUE = /^[^\n;]+/
|
|
83
|
+
const RE_SEMICOLON = /^;/
|
|
84
|
+
const RE_COMMA = /^,/
|
|
85
|
+
const RE_DOUBLE_QUOTE = /^"/
|
|
86
|
+
const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"\\]+/
|
|
87
|
+
const RE_LANGUAGE_CONSTANT = /^(?:true|false|null)/
|
|
88
|
+
const RE_SQUARE_OPEN = /^\[/
|
|
89
|
+
const RE_SQUARE_CLOSE = /^\]/
|
|
90
|
+
const RE_LINE_COMMENT = /^\/\/.*/
|
|
91
|
+
const RE_ANYTHING = /^.+/s
|
|
92
|
+
const RE_NUMERIC =
|
|
93
|
+
/^((0(x|X)[0-9a-fA-F]*)|(\-?([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b/
|
|
94
|
+
const RE_TEXT = /^[^\s\{\}\[\]]+/
|
|
95
|
+
// const RE_ESCAPED_QUOTE = /^\\"/
|
|
96
|
+
// const RE_BACK_SLASH = /^\\/
|
|
97
|
+
const RE_STRING_ESCAPE = /^\\.?/
|
|
98
|
+
const RE_WORD = /^\w+/
|
|
99
|
+
|
|
100
|
+
export const initialLineState = {
|
|
101
|
+
state: State.TopLevelContent,
|
|
102
|
+
stack: [],
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export const hasArrayReturn = true
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* @param {string} line
|
|
109
|
+
* @param {any} lineState
|
|
110
|
+
*/
|
|
111
|
+
export const tokenizeLine = (line, lineState) => {
|
|
112
|
+
let next
|
|
113
|
+
let index = 0
|
|
114
|
+
let token
|
|
115
|
+
let state = lineState.state
|
|
116
|
+
let __r = 0
|
|
117
|
+
const tokens = []
|
|
118
|
+
const stack = lineState.stack
|
|
119
|
+
state
|
|
120
|
+
while (index < line.length) {
|
|
121
|
+
if (__r++ > 100_000_000_000) {
|
|
122
|
+
throw new Error('endless loop')
|
|
123
|
+
}
|
|
124
|
+
const part = line.slice(index)
|
|
125
|
+
switch (state) {
|
|
126
|
+
case State.TopLevelContent:
|
|
127
|
+
if ((next = part.match(RE_CURLY_OPEN))) {
|
|
128
|
+
token = TokenType.Punctuation
|
|
129
|
+
state = State.AfterCurlyOpen
|
|
130
|
+
stack.push(State.TopLevelContent)
|
|
131
|
+
} else if ((next = part.match(RE_SQUARE_OPEN))) {
|
|
132
|
+
token = TokenType.Punctuation
|
|
133
|
+
state = State.TopLevelContent
|
|
134
|
+
stack.push(State.TopLevelContent)
|
|
135
|
+
} else if ((next = part.match(RE_WHITESPACE))) {
|
|
136
|
+
token = TokenType.Whitespace
|
|
137
|
+
state = State.TopLevelContent
|
|
138
|
+
} else if ((next = part.match(RE_SQUARE_CLOSE))) {
|
|
139
|
+
token = TokenType.Punctuation
|
|
140
|
+
state = stack.pop()
|
|
141
|
+
} else if ((next = part.match(RE_COMMA))) {
|
|
142
|
+
token = TokenType.Punctuation
|
|
143
|
+
state = State.TopLevelContent
|
|
144
|
+
} else if ((next = part.match(RE_NUMERIC))) {
|
|
145
|
+
token = TokenType.Numeric
|
|
146
|
+
state = State.TopLevelContent
|
|
147
|
+
} else if ((next = part.match(RE_LANGUAGE_CONSTANT))) {
|
|
148
|
+
token = TokenType.LanguageConstant
|
|
149
|
+
state = State.TopLevelContent
|
|
150
|
+
} else if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
151
|
+
token = TokenType.Punctuation
|
|
152
|
+
state = State.InsideString
|
|
153
|
+
stack.push(State.TopLevelContent)
|
|
154
|
+
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
155
|
+
token = TokenType.Comment
|
|
156
|
+
state = State.InsideLineComment
|
|
157
|
+
} else if ((next = part.match(RE_CURLY_CLOSE))) {
|
|
158
|
+
token = TokenType.CurlyClose
|
|
159
|
+
state = stack.pop()
|
|
160
|
+
} else if ((next = part.match(RE_ANYTHING))) {
|
|
161
|
+
token = TokenType.Text
|
|
162
|
+
state = State.TopLevelContent
|
|
163
|
+
} else {
|
|
164
|
+
part //?
|
|
165
|
+
throw new Error('no')
|
|
166
|
+
}
|
|
167
|
+
break
|
|
168
|
+
case State.AfterCurlyOpen:
|
|
169
|
+
if ((next = part.match(RE_WHITESPACE))) {
|
|
170
|
+
token = TokenType.Whitespace
|
|
171
|
+
state = State.AfterCurlyOpen
|
|
172
|
+
} else if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
173
|
+
token = TokenType.Punctuation
|
|
174
|
+
state = State.InsidePropertyNameString
|
|
175
|
+
stack.push(State.AfterPropertyName)
|
|
176
|
+
} else if ((next = part.match(RE_CURLY_CLOSE))) {
|
|
177
|
+
token = TokenType.Punctuation
|
|
178
|
+
state = stack.pop()
|
|
179
|
+
if (!state) {
|
|
180
|
+
throw new Error('imbalanced json')
|
|
181
|
+
}
|
|
182
|
+
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
183
|
+
token = TokenType.Comment
|
|
184
|
+
state = State.AfterCurlyOpen
|
|
185
|
+
} else if ((next = part.match(RE_WORD))) {
|
|
186
|
+
token = TokenType.PropertyName
|
|
187
|
+
state = State.AfterPropertyName
|
|
188
|
+
} else if ((next = part.match(RE_ANYTHING))) {
|
|
189
|
+
token = TokenType.Text
|
|
190
|
+
state = State.AfterCurlyOpen
|
|
191
|
+
} else {
|
|
192
|
+
part //?
|
|
193
|
+
throw new Error('no')
|
|
194
|
+
}
|
|
195
|
+
break
|
|
196
|
+
case State.InsidePropertyNameString:
|
|
197
|
+
if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
|
|
198
|
+
token = TokenType.JsonPropertyName
|
|
199
|
+
state = State.InsidePropertyNameString
|
|
200
|
+
} else if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
201
|
+
token = TokenType.Punctuation
|
|
202
|
+
state = stack.pop()
|
|
203
|
+
state
|
|
204
|
+
} else if ((next = part.match(RE_STRING_ESCAPE))) {
|
|
205
|
+
token = TokenType.JsonPropertyName
|
|
206
|
+
state = State.InsidePropertyNameString
|
|
207
|
+
} else {
|
|
208
|
+
throw new Error('no')
|
|
209
|
+
}
|
|
210
|
+
break
|
|
211
|
+
case State.InsideString:
|
|
212
|
+
if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
|
|
213
|
+
token = TokenType.JsonPropertyValueString
|
|
214
|
+
state = State.InsideString
|
|
215
|
+
} else if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
216
|
+
token = TokenType.Punctuation
|
|
217
|
+
state = stack.pop()
|
|
218
|
+
} else if ((next = part.match(RE_STRING_ESCAPE))) {
|
|
219
|
+
token = TokenType.String
|
|
220
|
+
state = State.InsideString
|
|
221
|
+
} else {
|
|
222
|
+
line.slice(0, index) //?
|
|
223
|
+
part //?
|
|
224
|
+
throw new Error('no')
|
|
225
|
+
}
|
|
226
|
+
break
|
|
227
|
+
case State.AfterPropertyName:
|
|
228
|
+
if ((next = part.match(RE_COLON))) {
|
|
229
|
+
token = TokenType.Punctuation
|
|
230
|
+
state = State.AfterPropertyNameAfterColon
|
|
231
|
+
} else if ((next = part.match(RE_WHITESPACE))) {
|
|
232
|
+
token = TokenType.Whitespace
|
|
233
|
+
state = State.AfterPropertyName
|
|
234
|
+
} else if ((next = part.match(RE_ANYTHING))) {
|
|
235
|
+
token = TokenType.Text
|
|
236
|
+
state = State.AfterCurlyOpen
|
|
237
|
+
} else {
|
|
238
|
+
throw new Error('no')
|
|
239
|
+
}
|
|
240
|
+
break
|
|
241
|
+
case State.AfterPropertyNameAfterColon:
|
|
242
|
+
if ((next = part.match(RE_WHITESPACE))) {
|
|
243
|
+
token = TokenType.Whitespace
|
|
244
|
+
state = State.AfterPropertyNameAfterColon
|
|
245
|
+
} else if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
246
|
+
token = TokenType.Punctuation
|
|
247
|
+
state = State.InsideString
|
|
248
|
+
stack.push(State.AfterPropertyValue)
|
|
249
|
+
} else if ((next = part.match(RE_LANGUAGE_CONSTANT))) {
|
|
250
|
+
token = TokenType.LanguageConstant
|
|
251
|
+
state = State.AfterPropertyValue
|
|
252
|
+
} else if ((next = part.match(RE_NUMERIC))) {
|
|
253
|
+
token = TokenType.Numeric
|
|
254
|
+
state = State.AfterPropertyValue
|
|
255
|
+
} else if ((next = part.match(RE_TEXT))) {
|
|
256
|
+
token = TokenType.Text
|
|
257
|
+
state = State.AfterCurlyOpen
|
|
258
|
+
} else if ((next = part.match(RE_CURLY_OPEN))) {
|
|
259
|
+
token = TokenType.Punctuation
|
|
260
|
+
state = State.AfterCurlyOpen
|
|
261
|
+
stack.push(State.AfterPropertyValue)
|
|
262
|
+
} else if ((next = part.match(RE_SQUARE_OPEN))) {
|
|
263
|
+
token = TokenType.Punctuation
|
|
264
|
+
state = State.TopLevelContent
|
|
265
|
+
stack.push(State.AfterPropertyValue)
|
|
266
|
+
} else {
|
|
267
|
+
line.slice(0, index) //?
|
|
268
|
+
throw new Error('no')
|
|
269
|
+
}
|
|
270
|
+
break
|
|
271
|
+
case State.AfterPropertyValue:
|
|
272
|
+
if ((next = part.match(RE_CURLY_CLOSE))) {
|
|
273
|
+
token = TokenType.Punctuation
|
|
274
|
+
state = stack.pop()
|
|
275
|
+
if (!state) {
|
|
276
|
+
throw new Error('inbalanced json')
|
|
277
|
+
}
|
|
278
|
+
} else if ((next = part.match(RE_WHITESPACE))) {
|
|
279
|
+
token = TokenType.Whitespace
|
|
280
|
+
state = State.AfterPropertyValue
|
|
281
|
+
} else if ((next = part.match(RE_COMMA))) {
|
|
282
|
+
token = TokenType.Punctuation
|
|
283
|
+
state = State.AfterCurlyOpen
|
|
284
|
+
} else if ((next = part.match(RE_ANYTHING))) {
|
|
285
|
+
token = TokenType.Text
|
|
286
|
+
state = State.AfterCurlyOpen
|
|
287
|
+
} else {
|
|
288
|
+
part //?
|
|
289
|
+
throw new Error('no')
|
|
290
|
+
}
|
|
291
|
+
break
|
|
292
|
+
case State.InsideLineComment:
|
|
293
|
+
if ((next = part.match(RE_ANYTHING))) {
|
|
294
|
+
token = TokenType.Comment
|
|
295
|
+
state = State.TopLevelContent
|
|
296
|
+
} else {
|
|
297
|
+
throw new Error('no')
|
|
298
|
+
}
|
|
299
|
+
break
|
|
300
|
+
default:
|
|
301
|
+
state
|
|
302
|
+
throw new Error('no')
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const currentTokenText = next[0]
|
|
306
|
+
const currentTokenLength = currentTokenText.length
|
|
307
|
+
index += currentTokenLength
|
|
308
|
+
tokens.push(token, currentTokenLength)
|
|
309
|
+
}
|
|
310
|
+
if (state === State.InsideLineComment) {
|
|
311
|
+
state = State.TopLevelContent
|
|
312
|
+
}
|
|
313
|
+
if (state === State.AfterPropertyValue) {
|
|
314
|
+
state = State.AfterCurlyOpen
|
|
315
|
+
}
|
|
316
|
+
return {
|
|
317
|
+
state,
|
|
318
|
+
stack,
|
|
319
|
+
tokens,
|
|
320
|
+
}
|
|
321
|
+
}
|
|
@@ -5,6 +5,7 @@ export const State = {
|
|
|
5
5
|
TopLevelContent: 1,
|
|
6
6
|
InsideString: 2,
|
|
7
7
|
InsideLineComment: 3,
|
|
8
|
+
InsideSingleQuoteString: 4,
|
|
8
9
|
}
|
|
9
10
|
|
|
10
11
|
export const StateMap = {
|
|
@@ -25,6 +26,9 @@ export const TokenType = {
|
|
|
25
26
|
VariableName: 8,
|
|
26
27
|
Comment: 885,
|
|
27
28
|
Text: 9,
|
|
29
|
+
KeywordControl: 10,
|
|
30
|
+
KeywordReturn: 11,
|
|
31
|
+
Function: 12,
|
|
28
32
|
}
|
|
29
33
|
|
|
30
34
|
export const TokenMap = {
|
|
@@ -38,11 +42,14 @@ export const TokenMap = {
|
|
|
38
42
|
[TokenType.VariableName]: 'VariableName',
|
|
39
43
|
[TokenType.Comment]: 'Comment',
|
|
40
44
|
[TokenType.Text]: 'Text',
|
|
45
|
+
[TokenType.KeywordControl]: 'KeywordControl',
|
|
46
|
+
[TokenType.KeywordReturn]: 'KeywordReturn',
|
|
47
|
+
[TokenType.Function]: 'Function',
|
|
41
48
|
}
|
|
42
49
|
|
|
43
50
|
const RE_LINE_COMMENT = /^#.*/s
|
|
44
51
|
const RE_SELECTOR = /^[\.a-zA-Z\d\-\:>]+/
|
|
45
|
-
const RE_WHITESPACE =
|
|
52
|
+
const RE_WHITESPACE = /^\s+/
|
|
46
53
|
const RE_CURLY_OPEN = /^\{/
|
|
47
54
|
const RE_CURLY_CLOSE = /^\}/
|
|
48
55
|
const RE_PROPERTY_NAME = /^[a-zA-Z\-]+\b/
|
|
@@ -55,11 +62,13 @@ const RE_ANYTHING_UNTIL_CLOSE_BRACE = /^[^\}]+/
|
|
|
55
62
|
const RE_QUOTE_DOUBLE = /^"/
|
|
56
63
|
const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"]+/
|
|
57
64
|
const RE_KEYWORD =
|
|
58
|
-
/^(?:case|continue|default|die|no|else|elsif|eval|exit|for|foreach|given|goto|if|last|next|redo|require|return|select|switch|unless|until|use|wait|when|while)\b/
|
|
59
|
-
|
|
60
|
-
const RE_VARIABLE_NAME = /^[a-zA-Z\_]+/
|
|
61
|
-
const RE_PUNCTUATION = /^[:,;\{\}\[\]\.=\(\)
|
|
65
|
+
/^(?:case|continue|default|die|no|else|elsif|eval|exit|for|foreach|given|goto|if|last|next|push|redo|require|return|select|shift|sub|switch|unless|until|use|wait|when|while)\b/
|
|
66
|
+
const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
|
|
67
|
+
const RE_VARIABLE_NAME = /^[$a-zA-Z\_@%]+/
|
|
68
|
+
const RE_PUNCTUATION = /^[:,;\{\}\[\]\.=\(\)<>\\\-\?]/
|
|
62
69
|
const RE_NUMERIC = /^\d+/
|
|
70
|
+
const RE_QUOTE_BACKTICK = /^`/
|
|
71
|
+
const RE_QUOTE_SINGLE = /^'/
|
|
63
72
|
|
|
64
73
|
export const initialLineState = {
|
|
65
74
|
state: State.TopLevelContent,
|
|
@@ -96,7 +105,31 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
96
105
|
token = TokenType.Whitespace
|
|
97
106
|
state = State.TopLevelContent
|
|
98
107
|
} else if ((next = part.match(RE_KEYWORD))) {
|
|
99
|
-
|
|
108
|
+
switch (next[0]) {
|
|
109
|
+
case 'unless':
|
|
110
|
+
case 'foreach':
|
|
111
|
+
case 'if':
|
|
112
|
+
case 'while':
|
|
113
|
+
case 'next':
|
|
114
|
+
case 'else':
|
|
115
|
+
case 'last':
|
|
116
|
+
case 'elsif':
|
|
117
|
+
token = TokenType.KeywordControl
|
|
118
|
+
break
|
|
119
|
+
case 'return':
|
|
120
|
+
token = TokenType.KeywordReturn
|
|
121
|
+
break
|
|
122
|
+
case 'shift':
|
|
123
|
+
case 'push':
|
|
124
|
+
case 'eval':
|
|
125
|
+
case 'exit':
|
|
126
|
+
case 'die':
|
|
127
|
+
token = TokenType.Function
|
|
128
|
+
break
|
|
129
|
+
default:
|
|
130
|
+
token = TokenType.Keyword
|
|
131
|
+
break
|
|
132
|
+
}
|
|
100
133
|
state = State.TopLevelContent
|
|
101
134
|
} else if ((next = part.match(RE_PUNCTUATION))) {
|
|
102
135
|
token = TokenType.Punctuation
|
|
@@ -110,6 +143,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
110
143
|
} else if ((next = part.match(RE_QUOTE_DOUBLE))) {
|
|
111
144
|
token = TokenType.PunctuationString
|
|
112
145
|
state = State.InsideString
|
|
146
|
+
} else if ((next = part.match(RE_QUOTE_SINGLE))) {
|
|
147
|
+
token = TokenType.Punctuation
|
|
148
|
+
state = State.InsideSingleQuoteString
|
|
113
149
|
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
114
150
|
token = TokenType.Comment
|
|
115
151
|
state = State.TopLevelContent
|
|
@@ -132,6 +168,17 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
132
168
|
throw new Error('no')
|
|
133
169
|
}
|
|
134
170
|
break
|
|
171
|
+
case State.InsideSingleQuoteString:
|
|
172
|
+
if ((next = part.match(RE_QUOTE_SINGLE))) {
|
|
173
|
+
token = TokenType.Punctuation
|
|
174
|
+
state = State.TopLevelContent
|
|
175
|
+
} else if ((next = part.match(RE_STRING_SINGLE_QUOTE_CONTENT))) {
|
|
176
|
+
token = TokenType.String
|
|
177
|
+
state = State.InsideSingleQuoteString
|
|
178
|
+
} else {
|
|
179
|
+
throw new Error('no')
|
|
180
|
+
}
|
|
181
|
+
break
|
|
135
182
|
default:
|
|
136
183
|
throw new Error('no')
|
|
137
184
|
}
|
|
@@ -16,6 +16,8 @@ export const State = {
|
|
|
16
16
|
InsideDoubleQuoteString: 11,
|
|
17
17
|
InsideLineComment: 12,
|
|
18
18
|
InsideSingleQuoteString: 13,
|
|
19
|
+
InsideTripleDoubleQuoteString: 14,
|
|
20
|
+
InsideTripleSingleQuoteString: 15,
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
/**
|
|
@@ -37,6 +39,11 @@ export const TokenType = {
|
|
|
37
39
|
NewLine: 771,
|
|
38
40
|
Keyword: 951,
|
|
39
41
|
VariableName: 952,
|
|
42
|
+
LanguageConstant: 953,
|
|
43
|
+
KeywordReturn: 954,
|
|
44
|
+
KeywordImport: 955,
|
|
45
|
+
KeywordControl: 956,
|
|
46
|
+
Function: 957,
|
|
40
47
|
}
|
|
41
48
|
|
|
42
49
|
export const TokenMap = {
|
|
@@ -55,54 +62,44 @@ export const TokenMap = {
|
|
|
55
62
|
[TokenType.NewLine]: 'NewLine',
|
|
56
63
|
[TokenType.Keyword]: 'Keyword',
|
|
57
64
|
[TokenType.VariableName]: 'VariableName',
|
|
65
|
+
[TokenType.LanguageConstant]: 'LanguageConstant',
|
|
66
|
+
[TokenType.KeywordReturn]: 'KeywordReturn',
|
|
67
|
+
[TokenType.KeywordImport]: 'KeywordImport',
|
|
68
|
+
[TokenType.KeywordControl]: 'KeywordControl',
|
|
69
|
+
[TokenType.Function]: 'Function',
|
|
58
70
|
}
|
|
59
71
|
|
|
60
72
|
const RE_WHITESPACE = /^\s+/
|
|
61
73
|
const RE_DOUBLE_QUOTE = /^"/
|
|
74
|
+
const RE_TRIPLE_DOUBLE_QUOTE = /^"{3}/
|
|
62
75
|
const RE_SINGLE_QUOTE = /^'/
|
|
63
|
-
const RE_ANGLE_BRACKET_OPEN = /^<(?!\s)/
|
|
64
|
-
const RE_ANGLE_BRACKET_CLOSE = /^>/
|
|
65
|
-
const RE_TAGNAME = /^[!\w]+/
|
|
66
76
|
const RE_TEXT = /^.+/
|
|
67
77
|
const RE_ANY_TEXT = /^[^\n]+/
|
|
68
|
-
const
|
|
69
|
-
const
|
|
70
|
-
const
|
|
71
|
-
const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"]+/
|
|
72
|
-
const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
|
|
73
|
-
const RE_PUNCTUATION_SELF_CLOSING = /^\/>/
|
|
74
|
-
const RE_INVALID_INSIDE_OPENING_TAG = /^[^a-zA-Z>]/
|
|
75
|
-
const RE_INVALID_INSIDE_ClOSING_TAG = /^[^a-zA-Z>]/
|
|
76
|
-
const RE_NOT_TAGNAME = /^[^a-zA-Z\d]+/
|
|
77
|
-
const RE_WORD = /^[^\s]+/
|
|
78
|
-
const RE_ANGLE_BRACKET_ONLY = /^</
|
|
79
|
-
const RE_NEWLINE = /^\n/
|
|
80
|
-
const RE_EXCLAMATION_MARK = /^!/
|
|
81
|
-
const RE_SELF_CLOSING = /^\/>/
|
|
82
|
-
const RE_DASH_DASH = /^\-\-/
|
|
83
|
-
const RE_TAG_TEXT = /^[^\s>]+/
|
|
78
|
+
const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"\\]+/
|
|
79
|
+
const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^'\\]+/
|
|
80
|
+
const RE_STRING_TRIPLE_DOUBLE_QUOTE_CONTENT = /^.+(?=""")/
|
|
84
81
|
const RE_LINE_COMMENT = /^#/
|
|
85
|
-
const RE_NEWLINE_WHITESPACE = /^\n\s*/
|
|
86
|
-
const RE_BLOCK_COMMENT_START = /^\/\*/
|
|
87
|
-
const RE_BLOCK_COMMENT_CONTENT = /^.+(?=\*\/)/s
|
|
88
|
-
const RE_BLOCK_COMMENT_END = /^\*\//
|
|
89
|
-
const RE_UNKNOWN_VALUE = /^[^\}\{\s,"]+/
|
|
90
82
|
const RE_KEYWORD =
|
|
91
83
|
/^(?:__debug__|Ellipsis|yield|with|while|try|true|True|return|raise|pass|or|NotImplemented|not|nonlocal|None|lambda|is|in|import|if|global|from|for|finally|False|false|except|else|elif|del|def|continue|class|break|await|async|assert|as|and)\b/
|
|
92
|
-
const RE_FUNCTION_NAME = /^[a-zA-Z\d]+/
|
|
93
|
-
const RE_ROUND_OPEN = /^\(/
|
|
94
84
|
const RE_VARIABLE_NAME = /^[_a-zA-Z][a-zA-Z\d_]*/
|
|
95
|
-
const RE_ROUND_CLOSE = /^\)/
|
|
96
|
-
const RE_OPERATOR = /^(\+|\-|\*|\/)/
|
|
97
85
|
const RE_NUMERIC =
|
|
98
86
|
/^((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b/
|
|
99
87
|
const RE_PUNCTUATION = /^[\(\)\{\}:,\+\-\*&=\/\\\[\]!\.<>%]+/
|
|
88
|
+
const RE_FUNCTION_CALL_NAME = /^[\w]+(?=\s*\()/
|
|
89
|
+
const RE_DECORATOR = /^@[\w]+/
|
|
90
|
+
const RE_TRIPLE_QUOTED_STRING_CONTENT_DOUBLE_QUOTES = /.*(?=""")/s
|
|
91
|
+
const RE_TRIPLE_QUOTED_STRING_CONTENT_SINGLE_QUOTES = /.*(?=''')/s
|
|
92
|
+
const RE_TRIPLE_QUOTED_STRING_CONTENT_COMMON = /.*/s
|
|
93
|
+
const RE_STRING_ESCAPE = /^\\./
|
|
94
|
+
const RE_BACKSLASH = /^\\/
|
|
95
|
+
const RE_TRIPLE_SINGLE_QUOTE = /^'{3}/
|
|
96
|
+
const RE_NUMERIC_OCTAL = /^0(?:o|O)?[0-7][0-7_]*(n)?\b/
|
|
100
97
|
|
|
101
98
|
export const initialLineState = {
|
|
102
99
|
state: State.TopLevelContent,
|
|
103
100
|
}
|
|
104
101
|
|
|
105
|
-
|
|
102
|
+
export const hasArrayReturn = true
|
|
106
103
|
|
|
107
104
|
/**
|
|
108
105
|
*
|
|
@@ -124,7 +121,44 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
124
121
|
token = TokenType.Whitespace
|
|
125
122
|
state = State.TopLevelContent
|
|
126
123
|
} else if ((next = part.match(RE_KEYWORD))) {
|
|
127
|
-
|
|
124
|
+
switch (next[0]) {
|
|
125
|
+
case 'True':
|
|
126
|
+
case 'False':
|
|
127
|
+
case 'None':
|
|
128
|
+
token = TokenType.LanguageConstant
|
|
129
|
+
break
|
|
130
|
+
case 'return':
|
|
131
|
+
token = TokenType.KeywordReturn
|
|
132
|
+
break
|
|
133
|
+
case 'from':
|
|
134
|
+
case 'import':
|
|
135
|
+
token = TokenType.KeywordImport
|
|
136
|
+
break
|
|
137
|
+
case 'if':
|
|
138
|
+
case 'elif':
|
|
139
|
+
case 'else':
|
|
140
|
+
case 'try':
|
|
141
|
+
case 'catch':
|
|
142
|
+
case 'finally':
|
|
143
|
+
case 'while':
|
|
144
|
+
case 'for':
|
|
145
|
+
case 'continue':
|
|
146
|
+
case 'not':
|
|
147
|
+
case 'except':
|
|
148
|
+
case 'with':
|
|
149
|
+
case 'as':
|
|
150
|
+
case 'raise':
|
|
151
|
+
case 'break':
|
|
152
|
+
case 'pass':
|
|
153
|
+
token = TokenType.KeywordControl
|
|
154
|
+
break
|
|
155
|
+
default:
|
|
156
|
+
token = TokenType.Keyword
|
|
157
|
+
break
|
|
158
|
+
}
|
|
159
|
+
state = State.TopLevelContent
|
|
160
|
+
} else if ((next = part.match(RE_FUNCTION_CALL_NAME))) {
|
|
161
|
+
token = TokenType.Function
|
|
128
162
|
state = State.TopLevelContent
|
|
129
163
|
} else if ((next = part.match(RE_VARIABLE_NAME))) {
|
|
130
164
|
token = TokenType.VariableName
|
|
@@ -135,6 +169,15 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
135
169
|
} else if ((next = part.match(RE_NUMERIC))) {
|
|
136
170
|
token = TokenType.Numeric
|
|
137
171
|
state = State.TopLevelContent
|
|
172
|
+
} else if ((next = part.match(RE_NUMERIC_OCTAL))) {
|
|
173
|
+
token = TokenType.Numeric
|
|
174
|
+
state = State.TopLevelContent
|
|
175
|
+
} else if ((next = part.match(RE_TRIPLE_DOUBLE_QUOTE))) {
|
|
176
|
+
token = TokenType.Punctuation
|
|
177
|
+
state = State.InsideTripleDoubleQuoteString
|
|
178
|
+
} else if ((next = part.match(RE_TRIPLE_SINGLE_QUOTE))) {
|
|
179
|
+
token = TokenType.Punctuation
|
|
180
|
+
state = State.InsideTripleSingleQuoteString
|
|
138
181
|
} else if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
139
182
|
token = TokenType.PunctuationString
|
|
140
183
|
state = State.InsideDoubleQuoteString
|
|
@@ -144,6 +187,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
144
187
|
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
145
188
|
token = TokenType.Comment
|
|
146
189
|
state = State.InsideLineComment
|
|
190
|
+
} else if ((next = part.match(RE_DECORATOR))) {
|
|
191
|
+
token = TokenType.VariableName
|
|
192
|
+
state = State.TopLevelContent
|
|
147
193
|
} else if ((next = part.match(RE_TEXT))) {
|
|
148
194
|
token = TokenType.Text
|
|
149
195
|
state = State.TopLevelContent
|
|
@@ -159,6 +205,12 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
159
205
|
} else if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
160
206
|
token = TokenType.PunctuationString
|
|
161
207
|
state = State.TopLevelContent
|
|
208
|
+
} else if ((next = part.match(RE_STRING_ESCAPE))) {
|
|
209
|
+
token = TokenType.String
|
|
210
|
+
state = State.InsideDoubleQuoteString
|
|
211
|
+
} else if ((next = part.match(RE_BACKSLASH))) {
|
|
212
|
+
token = TokenType.String
|
|
213
|
+
state = State.InsideDoubleQuoteString
|
|
162
214
|
} else {
|
|
163
215
|
throw new Error('no')
|
|
164
216
|
}
|
|
@@ -170,6 +222,49 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
170
222
|
} else if ((next = part.match(RE_SINGLE_QUOTE))) {
|
|
171
223
|
token = TokenType.PunctuationString
|
|
172
224
|
state = State.TopLevelContent
|
|
225
|
+
} else if ((next = part.match(RE_STRING_ESCAPE))) {
|
|
226
|
+
token = TokenType.String
|
|
227
|
+
state = State.InsideSingleQuoteString
|
|
228
|
+
} else if ((next = part.match(RE_BACKSLASH))) {
|
|
229
|
+
token = TokenType.String
|
|
230
|
+
state = State.InsideSingleQuoteString
|
|
231
|
+
} else {
|
|
232
|
+
throw new Error('no')
|
|
233
|
+
}
|
|
234
|
+
break
|
|
235
|
+
case State.InsideTripleDoubleQuoteString:
|
|
236
|
+
if ((next = part.match(RE_TRIPLE_DOUBLE_QUOTE))) {
|
|
237
|
+
token = TokenType.Punctuation
|
|
238
|
+
state = State.TopLevelContent
|
|
239
|
+
} else if (
|
|
240
|
+
(next = part.match(RE_TRIPLE_QUOTED_STRING_CONTENT_DOUBLE_QUOTES))
|
|
241
|
+
) {
|
|
242
|
+
token = TokenType.String
|
|
243
|
+
state = State.InsideTripleDoubleQuoteString
|
|
244
|
+
} else if (
|
|
245
|
+
(next = part.match(RE_TRIPLE_QUOTED_STRING_CONTENT_COMMON))
|
|
246
|
+
) {
|
|
247
|
+
token = TokenType.String
|
|
248
|
+
state = State.InsideTripleDoubleQuoteString
|
|
249
|
+
} else {
|
|
250
|
+
throw new Error('no')
|
|
251
|
+
}
|
|
252
|
+
break
|
|
253
|
+
case State.InsideTripleSingleQuoteString:
|
|
254
|
+
if ((next = part.match(RE_TRIPLE_SINGLE_QUOTE))) {
|
|
255
|
+
token = TokenType.Punctuation
|
|
256
|
+
state = State.TopLevelContent
|
|
257
|
+
} else if (
|
|
258
|
+
(next = part.match(RE_TRIPLE_QUOTED_STRING_CONTENT_SINGLE_QUOTES))
|
|
259
|
+
) {
|
|
260
|
+
token = TokenType.String
|
|
261
|
+
state = State.InsideTripleSingleQuoteString
|
|
262
|
+
} else if (
|
|
263
|
+
(next = part.match(RE_TRIPLE_QUOTED_STRING_CONTENT_COMMON))
|
|
264
|
+
) {
|
|
265
|
+
next
|
|
266
|
+
token = TokenType.String
|
|
267
|
+
state = State.InsideTripleSingleQuoteString
|
|
173
268
|
} else {
|
|
174
269
|
throw new Error('no')
|
|
175
270
|
}
|
|
@@ -186,11 +281,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
186
281
|
state
|
|
187
282
|
throw new Error('no')
|
|
188
283
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
length: next[0].length,
|
|
193
|
-
})
|
|
284
|
+
const tokenLength = next[0].length
|
|
285
|
+
index += tokenLength
|
|
286
|
+
tokens.push(token, tokenLength)
|
|
194
287
|
}
|
|
195
288
|
return {
|
|
196
289
|
state,
|
|
@@ -198,4 +291,4 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
198
291
|
}
|
|
199
292
|
}
|
|
200
293
|
|
|
201
|
-
|
|
294
|
+
tokenizeLine(`'''test'''`, initialLineState) //?
|