@lvce-editor/shared-process 0.0.15 → 0.0.16

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 (40) hide show
  1. package/extensions/builtin.language-basics-cpp/README.md +14 -0
  2. package/extensions/builtin.language-basics-cpp/extension.json +13 -0
  3. package/extensions/builtin.language-basics-cpp/src/tokenizeCpp.js +222 -0
  4. package/extensions/builtin.language-basics-css/README.md +14 -0
  5. package/extensions/builtin.language-basics-css/extension.json +12 -0
  6. package/extensions/builtin.language-basics-css/src/tokenizeCss.js +378 -0
  7. package/extensions/builtin.language-basics-dart/README.md +14 -0
  8. package/extensions/builtin.language-basics-dart/extension.json +12 -0
  9. package/extensions/builtin.language-basics-dart/src/tokenizeDart.js +132 -0
  10. package/extensions/builtin.language-basics-dotenv/README.md +14 -0
  11. package/extensions/builtin.language-basics-dotenv/extension.json +12 -0
  12. package/extensions/builtin.language-basics-dotenv/src/tokenizeDotenv.js +297 -0
  13. package/extensions/builtin.language-basics-elixir/README.md +15 -0
  14. package/extensions/builtin.language-basics-elixir/extension.json +12 -0
  15. package/extensions/builtin.language-basics-elixir/src/tokenizeElixir.js +150 -0
  16. package/extensions/builtin.language-basics-go/README.md +14 -0
  17. package/extensions/builtin.language-basics-go/extension.json +12 -0
  18. package/extensions/builtin.language-basics-go/src/tokenizeGo.js +161 -0
  19. package/extensions/builtin.language-basics-html/README.md +14 -0
  20. package/extensions/builtin.language-basics-html/extension.json +13 -0
  21. package/extensions/builtin.language-basics-html/src/tokenizeHtml.js +278 -0
  22. package/extensions/builtin.language-basics-java/README.md +14 -0
  23. package/extensions/builtin.language-basics-java/extension.json +12 -0
  24. package/extensions/builtin.language-basics-java/src/tokenizeJava.js +135 -0
  25. package/extensions/builtin.language-basics-javascript/README.md +14 -0
  26. package/extensions/builtin.language-basics-javascript/extension.json +13 -0
  27. package/extensions/builtin.language-basics-javascript/src/tokenizeJavaScript.js +295 -0
  28. package/extensions/builtin.language-basics-julia/README.md +18 -0
  29. package/extensions/builtin.language-basics-julia/extension.json +12 -0
  30. package/extensions/builtin.language-basics-julia/src/tokenizeJulia.js +135 -0
  31. package/extensions/builtin.language-basics-kotlin/README.md +15 -0
  32. package/extensions/builtin.language-basics-kotlin/extension.json +12 -0
  33. package/extensions/builtin.language-basics-kotlin/src/tokenizeKotlin.js +127 -0
  34. package/extensions/builtin.language-basics-python/README.md +14 -0
  35. package/extensions/builtin.language-basics-python/extension.json +13 -0
  36. package/extensions/builtin.language-basics-python/src/tokenizePython.js +201 -0
  37. package/extensions/builtin.language-basics-shellscript/README.md +15 -0
  38. package/extensions/builtin.language-basics-shellscript/extension.json +12 -0
  39. package/extensions/builtin.language-basics-shellscript/src/tokenizeShellScript.js +127 -0
  40. package/package.json +3 -3
@@ -0,0 +1,295 @@
1
+ /**
2
+ * @enum number
3
+ */
4
+ const State = {
5
+ None: 0,
6
+ TopLevelContent: 1,
7
+ AfterOpeningAngleBracket: 2,
8
+ InsideOpeningTag: 3,
9
+ InsideOpeningTagAndHasSeenWhitespace: 4,
10
+ AfterClosingTagAngleBrackets: 5,
11
+ AfterClosingTagName: 6,
12
+ AfterAttributeName: 7,
13
+ AfterAttributeEqualSign: 8,
14
+ InsideAttributeDoubleQuote: 9,
15
+ InsideBlockComment: 10,
16
+ InsideString: 11,
17
+ AfterKeyword: 12,
18
+ Keyword: 13,
19
+ InsideLineComment: 14,
20
+ InsideSingleQuoteString: 15,
21
+ InsideDoubleQuoteString: 16,
22
+ InsideBacktickString: 17,
23
+ }
24
+
25
+ /**
26
+ * @enum number
27
+ */
28
+ export const TokenType = {
29
+ None: 99999999,
30
+ Numeric: 30,
31
+ String: 50,
32
+ Whitespace: 777,
33
+ Comment: 60,
34
+ Text: 117,
35
+ PunctuationTag: 228,
36
+ TagName: 118,
37
+ AttributeName: 119,
38
+ Punctuation: 10,
39
+ Error: 141,
40
+ PunctuationString: 11,
41
+ NewLine: 771,
42
+ Keyword: 951,
43
+ VariableName: 952,
44
+ LanguageConstant: 13,
45
+ Regex: 14,
46
+ KeywordImport: 215,
47
+ KeywordControl: 881,
48
+ KeywordModifier: 882,
49
+ KeywordReturn: 883,
50
+ KeywordNew: 884,
51
+ }
52
+
53
+ export const TokenMap = {
54
+ [TokenType.None]: 'None',
55
+ [TokenType.Numeric]: 'Numeric',
56
+ [TokenType.String]: 'String',
57
+ [TokenType.Whitespace]: 'Whitespace',
58
+ [TokenType.Comment]: 'Comment',
59
+ [TokenType.Text]: 'Text',
60
+ [TokenType.PunctuationTag]: 'PunctuationTag',
61
+ [TokenType.TagName]: 'TagName',
62
+ [TokenType.AttributeName]: 'AttributeName',
63
+ [TokenType.Punctuation]: 'Punctuation',
64
+ [TokenType.Error]: 'Error',
65
+ [TokenType.PunctuationString]: 'PunctuationString',
66
+ [TokenType.NewLine]: 'NewLine',
67
+ [TokenType.Keyword]: 'Keyword',
68
+ [TokenType.VariableName]: 'VariableName',
69
+ [TokenType.LanguageConstant]: 'LanguageConstant',
70
+ [TokenType.Regex]: 'Regex',
71
+ [TokenType.KeywordImport]: 'KeywordImport',
72
+ [TokenType.KeywordControl]: 'KeywordControl',
73
+ [TokenType.KeywordModifier]: 'KeywordModifier',
74
+ [TokenType.KeywordReturn]: 'KeywordReturn',
75
+ [TokenType.KeywordNew]: 'KeywordNew',
76
+ }
77
+
78
+ const RE_KEYWORD =
79
+ /^(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|if|implements|import|in|instanceof|interface|let|new|null|package|private|protected|public|return|super|switch|static|this|throw|try|true|typeof|var|void|while|with|yield)\b/
80
+ const RE_CURLY_OPEN = /^\{/
81
+ const RE_CURLY_CLOSE = /^\}/
82
+ const RE_SQUARE_OPEN = /^\[/
83
+ const RE_SQUARE_CLOSE = /^\]/
84
+ const RE_COMMA = /^,/
85
+ const RE_COLON = /^:/
86
+ const RE_NUMERIC =
87
+ /^((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b/
88
+ const RE_LINE_COMMENT_START = /^\/\//
89
+ const RE_LINE_COMMENT_CONTENT = /^[^\n]+/
90
+ const RE_NEWLINE_WHITESPACE = /^\n\s*/
91
+ const RE_BLOCK_COMMENT_START = /^\/\*/
92
+ const RE_BLOCK_COMMENT_CONTENT = /^.+?(?=\*\/)/
93
+ const RE_BLOCK_COMMENT_END = /^\*\//
94
+ const RE_UNKNOWN_VALUE = /^[^\}\{\s,"]+/
95
+ const RE_IMPORT = /^[a-zA-Z\.]+/
96
+ const RE_SEMICOLON = /^;/
97
+ const RE_VARIABLE_NAME = /^[a-zA-Z_][a-zA-Z\d\_]*/
98
+ const RE_LINE_COMMENT = /^\/\/[^\n]*/
99
+ const RE_ROUND_OPEN = /^\(/
100
+ const RE_ROUND_CLOSE = /^\)/
101
+ const RE_DOT = /^\./
102
+ const RE_EQUAL_SIGN = /^=/
103
+ const RE_SINGLE_QUOTE = /^'/
104
+ const RE_PUNCTUATION = /^[\(\)=\+\-><\.:;\{\}\[\]!,&\|\^\?\*]/
105
+ const RE_SLASH = /^\//
106
+ const RE_ANYTHING_UNTIL_END = /^.+/s
107
+ const RE_WHITESPACE = /^\s+/
108
+ const RE_QUOTE_SINGLE = /^'/
109
+ const RE_QUOTE_DOUBLE = /^"/
110
+ const RE_QUOTE_BACKTICK = /^`/
111
+ const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
112
+ const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"]+/
113
+ const RE_STRING_BACKTICK_QUOTE_CONTENT = /^[^`]+/
114
+
115
+ // copied from https://github.com/PrismJS/prism/blob/master/components/prism-javascript.js#L57
116
+ const RE_REGEX =
117
+ /((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/
118
+
119
+ export const initialLineState = {
120
+ state: State.TopLevelContent,
121
+ }
122
+
123
+ export const tokenizeLine = (line, lineState) => {
124
+ let next = null
125
+ let index = 0
126
+ let tokens = []
127
+ let token = TokenType.None
128
+ let state = lineState.state
129
+ while (index < line.length) {
130
+ const part = line.slice(index)
131
+ switch (state) {
132
+ case State.TopLevelContent:
133
+ if ((next = part.match(RE_WHITESPACE))) {
134
+ token = TokenType.Whitespace
135
+ state = State.TopLevelContent
136
+ } else if ((next = part.match(RE_KEYWORD))) {
137
+ switch (next[0]) {
138
+ case 'true':
139
+ case 'false':
140
+ case 'null':
141
+ token = TokenType.LanguageConstant
142
+ break
143
+ case 'import':
144
+ case 'export':
145
+ case 'from':
146
+ token = TokenType.KeywordImport
147
+ break
148
+ case 'as':
149
+ case 'switch':
150
+ case 'default':
151
+ case 'case':
152
+ case 'else':
153
+ case 'if':
154
+ case 'break':
155
+ case 'throw':
156
+ token = TokenType.KeywordControl
157
+ break
158
+ case 'async':
159
+ case 'await':
160
+ token = TokenType.KeywordModifier
161
+ break
162
+ case 'return':
163
+ token = TokenType.KeywordReturn
164
+ break
165
+ case 'new':
166
+ token = TokenType.KeywordNew
167
+ break
168
+ default:
169
+ token = TokenType.Keyword
170
+ break
171
+ }
172
+ state = State.TopLevelContent
173
+ } else if ((next = part.match(RE_VARIABLE_NAME))) {
174
+ token = TokenType.VariableName
175
+ state = State.TopLevelContent
176
+ } else if ((next = part.match(RE_NUMERIC))) {
177
+ token = TokenType.Numeric
178
+ state = State.TopLevelContent
179
+ } else if ((next = part.match(RE_PUNCTUATION))) {
180
+ token = TokenType.Punctuation
181
+ state = State.TopLevelContent
182
+ } else if ((next = part.match(RE_SLASH))) {
183
+ if ((next = part.match(RE_BLOCK_COMMENT_START))) {
184
+ token = TokenType.Comment
185
+ state = State.InsideBlockComment
186
+ } else if ((next = part.match(RE_REGEX))) {
187
+ token = TokenType.Regex
188
+ state = State.TopLevelContent
189
+ } else if ((next = part.match(RE_LINE_COMMENT_START))) {
190
+ token = TokenType.Comment
191
+ state = State.InsideLineComment
192
+ } else {
193
+ next = part.match(RE_PUNCTUATION)
194
+ token = TokenType.Punctuation
195
+ state = State.TopLevelContent
196
+ }
197
+ } else if ((next = part.match(RE_QUOTE_SINGLE))) {
198
+ token = TokenType.Punctuation
199
+ state = State.InsideSingleQuoteString
200
+ } else if ((next = part.match(RE_QUOTE_DOUBLE))) {
201
+ token = TokenType.Punctuation
202
+ state = State.InsideDoubleQuoteString
203
+ } else if ((next = part.match(RE_QUOTE_BACKTICK))) {
204
+ token = TokenType.Punctuation
205
+ state = State.InsideBacktickString
206
+ } else {
207
+ line.slice(0, index) //?
208
+ part //?
209
+ throw new Error('no')
210
+ }
211
+ break
212
+ case State.Keyword:
213
+ const keyword = next[0]
214
+ switch (keyword) {
215
+ case 'true':
216
+ case 'false':
217
+ break
218
+ default:
219
+ token = TokenType.Keyword
220
+ state = State.TopLevelContent
221
+ break
222
+ }
223
+ break
224
+ case State.InsideLineComment:
225
+ if ((next = part.match(RE_ANYTHING_UNTIL_END))) {
226
+ token = TokenType.Comment
227
+ state = State.TopLevelContent
228
+ } else {
229
+ throw new Error('no')
230
+ }
231
+ break
232
+ case State.InsideBlockComment:
233
+ if ((next = part.match(RE_BLOCK_COMMENT_CONTENT))) {
234
+ token = TokenType.Comment
235
+ state = State.InsideBlockComment
236
+ } else if ((next = part.match(RE_BLOCK_COMMENT_END))) {
237
+ token = TokenType.Comment
238
+ state = State.TopLevelContent
239
+ } else if ((next = part.match(RE_ANYTHING_UNTIL_END))) {
240
+ token = TokenType.Comment
241
+ state = State.InsideBlockComment
242
+ } else {
243
+ throw new Error('no')
244
+ }
245
+ break
246
+ case State.InsideSingleQuoteString:
247
+ if ((next = part.match(RE_QUOTE_SINGLE))) {
248
+ token = TokenType.Punctuation
249
+ state = State.TopLevelContent
250
+ } else if ((next = part.match(RE_STRING_SINGLE_QUOTE_CONTENT))) {
251
+ token = TokenType.String
252
+ state = State.InsideSingleQuoteString
253
+ } else {
254
+ throw new Error('no')
255
+ }
256
+ break
257
+ case State.InsideDoubleQuoteString:
258
+ if ((next = part.match(RE_QUOTE_DOUBLE))) {
259
+ token = TokenType.Punctuation
260
+ state = State.TopLevelContent
261
+ } else if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
262
+ token = TokenType.String
263
+ state = State.InsideDoubleQuoteString
264
+ } else {
265
+ throw new Error('no')
266
+ }
267
+ break
268
+ case State.InsideBacktickString:
269
+ if ((next = part.match(RE_QUOTE_BACKTICK))) {
270
+ token = TokenType.Punctuation
271
+ state = State.TopLevelContent
272
+ } else if ((next = part.match(RE_STRING_BACKTICK_QUOTE_CONTENT))) {
273
+ token = TokenType.String
274
+ state = State.InsideBacktickString
275
+ } else {
276
+ throw new Error('no')
277
+ }
278
+ break
279
+ default:
280
+ state
281
+ throw new Error('no')
282
+ }
283
+ index += next[0].length
284
+ tokens.push({
285
+ type: token,
286
+ length: next[0].length,
287
+ })
288
+ }
289
+ return {
290
+ state,
291
+ tokens,
292
+ }
293
+ }
294
+
295
+ tokenizeLine(`\`\``, initialLineState) //?
@@ -0,0 +1,18 @@
1
+ # Language Basics Julia
2
+
3
+ ## Contributing
4
+
5
+ ```sh
6
+ git clone git@github.com:lvce-editor/language-basics-julia.git &&
7
+ cd language-basics-julia &&
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-julia)
15
+
16
+ ## Credits
17
+
18
+ Based on https://github.com/highlightjs/highlight.js/blob/main/src/languages/julia.js by @isagalaev and contributers.
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "builtin.language-basics-julia",
3
+ "name": "Language Basics Julia",
4
+ "description": "Provides syntax highlighting and bracket matching in Julia files.",
5
+ "languages": [
6
+ {
7
+ "id": "julia",
8
+ "extensions": [".jl"],
9
+ "tokenize": "src/tokenizeJulia.js"
10
+ }
11
+ ]
12
+ }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * @enum number
3
+ */
4
+ const State = {
5
+ None: 0,
6
+ TopLevelContent: 1,
7
+ InsideSingleQuoteString: 2,
8
+ InsideDoubleQuoteString: 3,
9
+ InsideTripleQuoteString: 4,
10
+ }
11
+
12
+ /**
13
+ * @enum number
14
+ */
15
+ export const TokenType = {
16
+ None: 99999999,
17
+ Keyword: 951,
18
+ Whitespace: 0,
19
+ NewLine: 771,
20
+ VariableName: 2,
21
+ Punctuation: 3,
22
+ String: 4,
23
+ Numeric: 5,
24
+ Attribute: 6,
25
+ }
26
+
27
+ export const TokenMap = {
28
+ [TokenType.None]: 'None',
29
+ [TokenType.Keyword]: 'Keyword',
30
+ [TokenType.Whitespace]: 'Whitespace',
31
+ [TokenType.NewLine]: 'NewLine',
32
+ [TokenType.VariableName]: 'VariableName',
33
+ [TokenType.Punctuation]: 'Punctuation',
34
+ [TokenType.String]: 'String',
35
+ [TokenType.Numeric]: 'Numeric',
36
+ [TokenType.Attribute]: 'Attribute',
37
+ }
38
+
39
+ export const initialLineState = {
40
+ state: State.TopLevelContent,
41
+ }
42
+
43
+ const RE_KEYWORD =
44
+ /^(?:baremodule|begin|break|catch|ccall|const|continue|do|else|elseif|end|export|false|finally|for|function|global|if|import|in|isa|let|local|macro|module|quote|return|true|try|using|where|while)\b/
45
+ const RE_WHITESPACE = /^\s+/
46
+ const RE_VARIABLE_NAME = /^[A-Za-z_\u00A1-\uFFFF][A-Za-z_0-9\u00A1-\uFFFF]*/
47
+ const RE_PUNCTUATION = /^[:,;\{\}\[\]\.=\(\)>\^\+\-\<\?]/
48
+ const RE_QUOTE_SINGLE = /^'/
49
+ const RE_QUOTE_DOUBLE = /^"/
50
+ const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
51
+ const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"]+/
52
+ const RE_NUMERIC = /^\d+/
53
+
54
+ /**
55
+ * @param {string} line
56
+ * @param {any} lineState
57
+ */
58
+ export const tokenizeLine = (line, lineState) => {
59
+ let next = null
60
+ let index = 0
61
+ let tokens = []
62
+ let token = TokenType.None
63
+ let state = lineState.state
64
+ while (index < line.length) {
65
+ const part = line.slice(index)
66
+ switch (state) {
67
+ case State.TopLevelContent:
68
+ if ((next = part.match(RE_WHITESPACE))) {
69
+ token = TokenType.Whitespace
70
+ state = State.TopLevelContent
71
+ } else if ((next = part.match(RE_KEYWORD))) {
72
+ token = TokenType.Keyword
73
+ state = State.TopLevelContent
74
+ } else if ((next = part.match(RE_VARIABLE_NAME))) {
75
+ token = TokenType.VariableName
76
+ state = State.TopLevelContent
77
+ } else if ((next = part.match(RE_PUNCTUATION))) {
78
+ token = TokenType.Punctuation
79
+ state = State.TopLevelContent
80
+ } else if ((next = part.match(RE_NUMERIC))) {
81
+ token = TokenType.Numeric
82
+ state = State.TopLevelContent
83
+ } else if ((next = part.match(RE_QUOTE_SINGLE))) {
84
+ token = TokenType.Punctuation
85
+ state = State.InsideSingleQuoteString
86
+ } else if ((next = part.match(RE_QUOTE_DOUBLE))) {
87
+ token = TokenType.Punctuation
88
+ state = State.InsideDoubleQuoteString
89
+ } else {
90
+ part //?
91
+ throw new Error('no')
92
+ }
93
+ break
94
+ case State.InsideSingleQuoteString:
95
+ if ((next = part.match(RE_QUOTE_SINGLE))) {
96
+ token = TokenType.Punctuation
97
+ state = State.TopLevelContent
98
+ } else if ((next = part.match(RE_STRING_SINGLE_QUOTE_CONTENT))) {
99
+ token = TokenType.String
100
+ state = State.InsideSingleQuoteString
101
+ } else {
102
+ throw new Error('no')
103
+ }
104
+ break
105
+ case State.InsideDoubleQuoteString:
106
+ if ((next = part.match(RE_QUOTE_DOUBLE))) {
107
+ token = TokenType.Punctuation
108
+ state = State.TopLevelContent
109
+ } else if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
110
+ token = TokenType.String
111
+ state = State.InsideDoubleQuoteString
112
+ } else {
113
+ throw new Error('no')
114
+ }
115
+ break
116
+ default:
117
+ state
118
+ throw new Error('no')
119
+ }
120
+ index += next[0].length
121
+ tokens.push({
122
+ type: token,
123
+ length: next[0].length,
124
+ })
125
+ }
126
+ return {
127
+ state,
128
+ tokens,
129
+ }
130
+ }
131
+
132
+ tokenizeLine(
133
+ `abs(mandelbrot(complex(x, y))) < 2 ? print("*") : print(" ")`,
134
+ initialLineState
135
+ )
@@ -0,0 +1,15 @@
1
+ # Language Basics Kotlin
2
+
3
+
4
+ ## Contributing
5
+
6
+ ```sh
7
+ git clone git@github.com:lvce-editor/language-basics-kotlin.git &&
8
+ cd language-basics-kotlin &&
9
+ npm ci &&
10
+ npm test
11
+ ```
12
+
13
+ ## Gitpod
14
+
15
+ [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/lvce-editor/language-basics-kotlin)
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "builtin.language-basics-kotlin",
3
+ "name": "Language Basics Kotlin",
4
+ "description": "Provides syntax highlighting and bracket matching in Kotlin files.",
5
+ "languages": [
6
+ {
7
+ "id": "kotlin",
8
+ "extensions": [".kt"],
9
+ "tokenize": "src/tokenizeKotlin.js"
10
+ }
11
+ ]
12
+ }
@@ -0,0 +1,127 @@
1
+ /**
2
+ * @enum number
3
+ */
4
+ export const State = {
5
+ TopLevelContent: 1,
6
+ InsideString: 2,
7
+ }
8
+
9
+ export const StateMap = {
10
+ [State.TopLevelContent]: 'TopLevelContent',
11
+ }
12
+
13
+ /**
14
+ * @enum number
15
+ */
16
+ export const TokenType = {
17
+ None: 1,
18
+ Whitespace: 2,
19
+ PunctuationString: 3,
20
+ String: 4,
21
+ Keyword: 5,
22
+ Numeric: 6,
23
+ Punctuation: 7,
24
+ VariableName: 8,
25
+ }
26
+
27
+ export const TokenMap = {
28
+ [TokenType.None]: 'None',
29
+ [TokenType.Whitespace]: 'Whitespace',
30
+ [TokenType.PunctuationString]: 'PunctuationString',
31
+ [TokenType.String]: 'String',
32
+ [TokenType.Keyword]: 'Keyword',
33
+ [TokenType.Numeric]: 'Numeric',
34
+ [TokenType.Punctuation]: 'Punctuation',
35
+ [TokenType.VariableName]: 'VariableName',
36
+ }
37
+
38
+ const RE_SELECTOR = /^[\.a-zA-Z\d\-\:>]+/
39
+ const RE_WHITESPACE = /^ +/
40
+ const RE_CURLY_OPEN = /^\{/
41
+ const RE_CURLY_CLOSE = /^\}/
42
+ const RE_PROPERTY_NAME = /^[a-zA-Z\-]+\b/
43
+ const RE_COLON = /^:/
44
+ const RE_PROPERTY_VALUE = /^[^;\}]+/
45
+ const RE_SEMICOLON = /^;/
46
+ const RE_COMMA = /^,/
47
+ const RE_ANYTHING = /^.*/
48
+ const RE_ANYTHING_UNTIL_CLOSE_BRACE = /^[^\}]+/
49
+ const RE_QUOTE_DOUBLE = /^"/
50
+ const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"]+/
51
+ const RE_KEYWORD =
52
+ /^(?:while|when|var|val|typeof|typealias|try|true|throw|this|super|return|package|object|null|is|interface|in|if|fun|for|false|else|do|continue|class|break|as)\b/
53
+
54
+ const RE_VARIABLE_NAME = /^[a-zA-Z]+/
55
+ const RE_PUNCTUATION = /^[:,;\{\}\[\]\.=\(\)<>]/
56
+ const RE_NUMERIC = /^\d+/
57
+
58
+ export const initialLineState = {
59
+ state: State.TopLevelContent,
60
+ tokens: [],
61
+ }
62
+
63
+ export const isEqualLineState = (lineStateA, lineStateB) => {
64
+ return lineStateA.state === lineStateB.state
65
+ }
66
+
67
+ /**
68
+ * @param {string} line
69
+ */
70
+ export const tokenizeLine = (line, lineState) => {
71
+ let next = null
72
+ let index = 0
73
+ let tokens = []
74
+ let token = TokenType.None
75
+ let state = lineState.state
76
+ while (index < line.length) {
77
+ const part = line.slice(index)
78
+ switch (state) {
79
+ case State.TopLevelContent:
80
+ if ((next = part.match(RE_WHITESPACE))) {
81
+ token = TokenType.Whitespace
82
+ state = State.TopLevelContent
83
+ } else if ((next = part.match(RE_KEYWORD))) {
84
+ token = TokenType.Keyword
85
+ state = State.TopLevelContent
86
+ } else if ((next = part.match(RE_PUNCTUATION))) {
87
+ token = TokenType.Punctuation
88
+ state = State.TopLevelContent
89
+ } else if ((next = part.match(RE_VARIABLE_NAME))) {
90
+ token = TokenType.VariableName
91
+ state = State.TopLevelContent
92
+ } else if ((next = part.match(RE_NUMERIC))) {
93
+ token = TokenType.Numeric
94
+ state = State.TopLevelContent
95
+ } else if ((next = part.match(RE_QUOTE_DOUBLE))) {
96
+ token = TokenType.PunctuationString
97
+ state = State.InsideString
98
+ } else {
99
+ part //?
100
+ throw new Error('no')
101
+ }
102
+ break
103
+ case State.InsideString:
104
+ if ((next = part.match(RE_QUOTE_DOUBLE))) {
105
+ token = TokenType.PunctuationString
106
+ state = State.TopLevelContent
107
+ } else if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
108
+ token = TokenType.String
109
+ state = State.InsideString
110
+ } else {
111
+ throw new Error('no')
112
+ }
113
+ break
114
+ default:
115
+ throw new Error('no')
116
+ }
117
+ index += next[0].length
118
+ tokens.push({
119
+ type: token,
120
+ length: next[0].length,
121
+ })
122
+ }
123
+ return {
124
+ state,
125
+ tokens,
126
+ }
127
+ }
@@ -0,0 +1,14 @@
1
+ # Language Basics Python
2
+
3
+ ## Contributing
4
+
5
+ ```sh
6
+ git clone git@github.com:lvce-editor/language-basics-python.git &&
7
+ cd language-basics-python &&
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-python)
@@ -0,0 +1,13 @@
1
+ {
2
+ "id": "builtin.language-basics-python",
3
+ "name": "Language Basics Python",
4
+ "description": "Provides syntax highlighting and bracket matching in Python files.",
5
+ "languages": [
6
+ {
7
+ "id": "python",
8
+ "extensions": [".py"],
9
+ "configuration": "./languageConfiguration.json",
10
+ "tokenize": "src/tokenizePython.js"
11
+ }
12
+ ]
13
+ }