@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.
Files changed (31) hide show
  1. package/config/defaultKeyBindings.json +4 -0
  2. package/config/defaultSettings.json +2 -0
  3. package/extensions/builtin.language-basics-cpp/src/tokenizeCpp.js +29 -6
  4. package/extensions/builtin.language-basics-css/src/tokenizeCss.js +176 -25
  5. package/extensions/builtin.language-basics-gn/README.md +14 -0
  6. package/extensions/builtin.language-basics-gn/extension.json +12 -0
  7. package/extensions/builtin.language-basics-gn/src/tokenizeGn.js +178 -0
  8. package/extensions/builtin.language-basics-javascript/src/tokenizeJavaScript.js +5 -0
  9. package/extensions/builtin.language-basics-json5/README.md +16 -0
  10. package/extensions/builtin.language-basics-json5/extension.json +12 -0
  11. package/extensions/builtin.language-basics-json5/src/tokenizeJson5.js +321 -0
  12. package/extensions/builtin.language-basics-perl/extension.json +2 -1
  13. package/extensions/builtin.language-basics-perl/src/tokenizePerl.js +53 -6
  14. package/extensions/builtin.language-basics-python/extension.json +2 -1
  15. package/extensions/builtin.language-basics-python/src/tokenizePython.js +129 -36
  16. package/extensions/builtin.language-basics-shellscript/src/tokenizeShellScript.js +274 -13
  17. package/extensions/builtin.language-basics-typescript/src/tokenizeTypeScript.js +197 -15
  18. package/extensions/builtin.theme-ayu/color-theme.json +2 -0
  19. package/extensions/builtin.theme-slime/color-theme.json +6 -0
  20. package/package.json +4 -4
  21. package/src/parts/Command/Command.js +38 -40
  22. package/src/parts/ErrorCodes/ErrorCodes.js +9 -17
  23. package/src/parts/GetResponse/GetResponse.js +2 -2
  24. package/src/parts/Module/Module.js +2 -2
  25. package/src/parts/ModuleMap/ModuleMap.js +1 -1
  26. package/src/parts/PrettyError/PrettyError.js +55 -5
  27. package/src/parts/RipGrep/RipGrep.js +30 -0
  28. package/src/parts/SearchFile/SearchFile.js +12 -16
  29. package/src/parts/TextSearch/TextSearch.ipc.js +7 -0
  30. package/src/parts/{Search/Search.js → TextSearch/TextSearch.js} +11 -17
  31. 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
+ }
@@ -6,7 +6,8 @@
6
6
  {
7
7
  "id": "perl",
8
8
  "extensions": [".pl", ".pm", ".pod", ".t", ".pL", ".psgi"],
9
- "tokenize": "src/tokenizePerl.js"
9
+ "tokenize": "src/tokenizePerl.js",
10
+ "firstLine": "^#!.*\\bperl\\b"
10
11
  }
11
12
  ]
12
13
  }
@@ -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
- token = TokenType.Keyword
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
  }
@@ -7,7 +7,8 @@
7
7
  "id": "python",
8
8
  "extensions": [".py"],
9
9
  "configuration": "./languageConfiguration.json",
10
- "tokenize": "src/tokenizePython.js"
10
+ "tokenize": "src/tokenizePython.js",
11
+ "firstLine": "^#!\\s*/?.*\\bpython[0-9.-]*\\b"
11
12
  }
12
13
  ]
13
14
  }
@@ -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 RE_SLASH = /^\//
69
- const RE_ATTRIBUTE_NAME = /^[a-zA-Z\d\-]+/
70
- const RE_EQUAL_SIGN = /^=/
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
- // TODO maybe reverse order of parameters -> line, context (context may be optional)
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
- token = TokenType.Keyword
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
- index += next[0].length
190
- tokens.push({
191
- type: token,
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
- // tokenizeLine(initialContext, `def add(a,b):`) //?
294
+ tokenizeLine(`'''test'''`, initialLineState) //?