@lvce-editor/shared-process 0.0.14 → 0.0.17

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 (43) 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-json/README.md +14 -0
  29. package/extensions/builtin.language-basics-json/extension.json +12 -0
  30. package/extensions/builtin.language-basics-json/src/tokenizeJson.js +323 -0
  31. package/extensions/builtin.language-basics-julia/README.md +18 -0
  32. package/extensions/builtin.language-basics-julia/extension.json +12 -0
  33. package/extensions/builtin.language-basics-julia/src/tokenizeJulia.js +135 -0
  34. package/extensions/builtin.language-basics-kotlin/README.md +15 -0
  35. package/extensions/builtin.language-basics-kotlin/extension.json +12 -0
  36. package/extensions/builtin.language-basics-kotlin/src/tokenizeKotlin.js +127 -0
  37. package/extensions/builtin.language-basics-python/README.md +14 -0
  38. package/extensions/builtin.language-basics-python/extension.json +13 -0
  39. package/extensions/builtin.language-basics-python/src/tokenizePython.js +201 -0
  40. package/extensions/builtin.language-basics-shellscript/README.md +14 -0
  41. package/extensions/builtin.language-basics-shellscript/extension.json +12 -0
  42. package/extensions/builtin.language-basics-shellscript/src/tokenizeShellScript.js +127 -0
  43. package/package.json +3 -3
@@ -0,0 +1,161 @@
1
+ /**
2
+ * @enum number
3
+ */
4
+ export const State = {
5
+ TopLevelContent: 1,
6
+ InsideDoubleQuoteString: 2,
7
+ InsideLineComment: 3,
8
+ }
9
+
10
+ /**
11
+ * @enum number
12
+ */
13
+ export const TokenType = {
14
+ None: 901,
15
+ Whitespace: 0,
16
+ TypeName: 35,
17
+ PlainText: 117,
18
+ Comment: 60,
19
+ String: 50,
20
+ Numeric: 30,
21
+ FunctionName: 112,
22
+ TypeNamePrimitive: 36,
23
+ Text: 117,
24
+ PunctuationTag: 228,
25
+ TagName: 118,
26
+ AttributeName: 119,
27
+ Punctuation: 10,
28
+ Error: 141,
29
+ PunctuationString: 11,
30
+ NewLine: 771,
31
+ Keyword: 951,
32
+ VariableName: 952,
33
+ }
34
+
35
+ export const TokenMap = {
36
+ [TokenType.Whitespace]: 'Whitespace',
37
+ [TokenType.TypeName]: 'TypeName',
38
+ [TokenType.PlainText]: 'PlainText',
39
+ [TokenType.Comment]: 'Comment',
40
+ [TokenType.String]: 'String',
41
+ [TokenType.Numeric]: 'Numeric',
42
+ [TokenType.FunctionName]: 'FunctionName',
43
+ [TokenType.TypeNamePrimitive]: 'TypeNamePrimitive',
44
+ [TokenType.Text]: 'Text',
45
+ [TokenType.PunctuationTag]: 'PunctuationTag',
46
+ [TokenType.TagName]: 'TagName',
47
+ [TokenType.AttributeName]: 'AttributeName',
48
+ [TokenType.Punctuation]: 'Punctuation',
49
+ [TokenType.Error]: 'Error',
50
+ [TokenType.PunctuationString]: 'PunctuationString',
51
+ [TokenType.NewLine]: 'NewLine',
52
+ [TokenType.Keyword]: 'Keyword',
53
+ [TokenType.VariableName]: 'VariableName',
54
+ }
55
+
56
+ const RE_WHITESPACE = /^\s+/
57
+ const RE_WHITESPACE_SINGLE_LINE = /^( |\t)+/
58
+ const RE_WHITESPACE_NEWLINE = /^\n/
59
+ const RE_CONSTANT = /^(true|false|null)/
60
+ const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"\n]+/
61
+ const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^'\n]+/
62
+ const RE_DOUBLE_QUOTE = /^"/
63
+ const RE_CURLY_OPEN = /^\{/
64
+ const RE_CURLY_CLOSE = /^\}/
65
+ const RE_SQUARE_OPEN = /^\[/
66
+ const RE_SQUARE_CLOSE = /^\]/
67
+ const RE_COMMA = /^,/
68
+ const RE_COLON = /^:/
69
+ const RE_NUMERIC =
70
+ /^((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)/
71
+ const RE_NEWLINE_WHITESPACE = /^\n\s*/
72
+ const RE_BLOCK_COMMENT_START = /^\/\*/
73
+ const RE_BLOCK_COMMENT_CONTENT = /^.+(?=\*\/|$)/s
74
+ const RE_BLOCK_COMMENT_END = /^\*\//
75
+ const RE_UNKNOWN_VALUE = /^[^\}\{\s,"]+/
76
+ const RE_IMPORT = /^[a-zA-Z\.]+/
77
+ const RE_SEMICOLON = /^;/
78
+ const RE_VARIABLE_NAME = /^[a-zA-Z\_][a-zA-Z\_\d]*/
79
+ const RE_LINE_COMMENT = /^\/\//
80
+ const RE_ROUND_OPEN = /^\(/
81
+ const RE_ROUND_CLOSE = /^\)/
82
+ const RE_DOT = /^\./
83
+ const RE_EQUAL_SIGN = /^=/
84
+ const RE_SINGLE_QUOTE = /^'/
85
+ const RE_PUNCTUATION = /^[\(\)=\+\-><\.,\/\*\^\[\]\{\}\|:]/
86
+ const RE_ANYTHING_UNTIL_END = /^.+/s
87
+ const RE_START_OF_FUNCTION = /^( )*\(/
88
+ const RE_COLON_COLON = /^::/
89
+ const RE_BASH_SLASH = /^\\/
90
+ const RE_ANY_CHAR = /^./
91
+ const RE_SQUARE_OPEN_SQUARE_OPEN = /^\[\[/
92
+ const RE_SQUARE_CLOSE_SQUARE_CLOSE = /^\]\]/
93
+ const RE_STRING_MULTILINE_CONTENT = /^.+?(?=\]\]|$)/s
94
+ const RE_KEYWORD =
95
+ /^(?:var|type|switch|struct|select|return|range|package|map|interface|import|if|goto|go|func|default|continue|const|chan|case|break)\b/
96
+ const RE_TEXT = /^.+/s
97
+
98
+ export const initialLineState = {
99
+ state: State.TopLevelContent,
100
+ }
101
+
102
+ export const isLineStateEqual = (lineStateA, lineStateB) => {
103
+ return lineStateA.state === lineStateB.state
104
+ }
105
+
106
+ export const tokenizeLine = (line, lineState) => {
107
+ let next = null
108
+ let index = 0
109
+ let tokens = []
110
+ let token = TokenType.None
111
+ let state = lineState.state
112
+ while (index < line.length) {
113
+ const part = line.slice(index)
114
+ switch (state) {
115
+ case State.TopLevelContent:
116
+ if ((next = part.match(RE_WHITESPACE))) {
117
+ token = TokenType.Whitespace
118
+ state = State.TopLevelContent
119
+ } else if ((next = part.match(RE_KEYWORD))) {
120
+ token = TokenType.Keyword
121
+ state = State.TopLevelContent
122
+ } else if ((next = part.match(RE_VARIABLE_NAME))) {
123
+ token = TokenType.VariableName
124
+ state = State.TopLevelContent
125
+ } else if ((next = part.match(RE_LINE_COMMENT))) {
126
+ token = TokenType.Comment
127
+ state = State.InsideLineComment
128
+ } else if ((next = part.match(RE_PUNCTUATION))) {
129
+ token = TokenType.Punctuation
130
+ state = State.TopLevelContent
131
+ } else if ((next = part.match(RE_TEXT))) {
132
+ token = TokenType.Text
133
+ state = State.TopLevelContent
134
+ } else {
135
+ part //?
136
+ throw new Error('no')
137
+ }
138
+ break
139
+ case State.InsideLineComment:
140
+ if ((next = part.match(RE_TEXT))) {
141
+ token = TokenType.Comment
142
+ state = State.TopLevelContent
143
+ } else {
144
+ throw new Error('no')
145
+ }
146
+ break
147
+ default:
148
+ state
149
+ throw new Error('no')
150
+ }
151
+ index += next[0].length
152
+ tokens.push({
153
+ type: token,
154
+ length: next[0].length,
155
+ })
156
+ }
157
+ return {
158
+ state,
159
+ tokens,
160
+ }
161
+ }
@@ -0,0 +1,14 @@
1
+ # Language Basics HTML
2
+
3
+ ## Contributing
4
+
5
+ ```sh
6
+ git clone git@github.com:lvce-editor/language-basics-html.git &&
7
+ cd language-basics-html &&
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-html)
@@ -0,0 +1,13 @@
1
+ {
2
+ "id": "builtin.language-basics-html",
3
+ "name": "Language Basics HTML",
4
+ "description": "Provides syntax highlighting and bracket matching in HTML files.",
5
+ "languages": [
6
+ {
7
+ "id": "html",
8
+ "extensions": [".html"],
9
+ "tokenize": "src/tokenizeHtml.js",
10
+ "configuration": "./languageConfiguration.json"
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,278 @@
1
+ /**
2
+ * @enum number
3
+ */
4
+ const State = {
5
+ TopLevelContent: 1,
6
+ AfterOpeningAngleBracket: 2,
7
+ InsideOpeningTag: 3,
8
+ InsideOpeningTagAndHasSeenWhitespace: 4,
9
+ AfterClosingTagAngleBrackets: 5,
10
+ AfterClosingTagName: 6,
11
+ AfterAttributeName: 7,
12
+ AfterAttributeEqualSign: 8,
13
+ InsideAttributeDoubleQuote: 9,
14
+ InsideBlockComment: 10,
15
+ None: 11,
16
+ InsideString: 12,
17
+ }
18
+
19
+ export const StateMap = {}
20
+
21
+ /**
22
+ * @enum number
23
+ */
24
+ export const TokenType = {
25
+ None: 99999999,
26
+ Numeric: 30,
27
+ String: 50,
28
+ Whitespace: 0,
29
+ Comment: 60,
30
+ Text: 117,
31
+ PunctuationTag: 228,
32
+ TagName: 118,
33
+ AttributeName: 119,
34
+ Punctuation: 10,
35
+ Error: 141,
36
+ PunctuationString: 11,
37
+ NewLine: 891,
38
+ }
39
+
40
+ export const TokenMap = {
41
+ [TokenType.None]: 'None',
42
+ [TokenType.Numeric]: 'Numeric',
43
+ [TokenType.String]: 'String',
44
+ [TokenType.Whitespace]: 'Whitespace',
45
+ [TokenType.Comment]: 'Comment',
46
+ [TokenType.Text]: 'Text',
47
+ [TokenType.PunctuationTag]: 'PunctuationTag',
48
+ [TokenType.TagName]: 'TagName',
49
+ [TokenType.AttributeName]: 'AttributeName',
50
+ [TokenType.Punctuation]: 'Punctuation',
51
+ [TokenType.Error]: 'Error',
52
+ [TokenType.PunctuationString]: 'PunctuationString',
53
+ }
54
+
55
+ const RE_WHITESPACE = /^\s+/
56
+ const RE_DOUBLE_QUOTE = /^"/
57
+ const RE_NEWLINE_WHITESPACE = /^\n\s*/
58
+ const RE_BLOCK_COMMENT_START = /^<!--/
59
+ const RE_BLOCK_COMMENT_CONTENT = /^.(?:.*?)(?=-->|$)/s
60
+ const RE_BLOCK_COMMENT_END = /^-->/
61
+ const RE_ANGLE_BRACKET_OPEN_TAG = /^<(?!\s)/
62
+ const RE_ANGLE_BRACKET_CLOSE = /^>/
63
+ const RE_TAGNAME = /^[!\w]+/
64
+ const RE_TEXT = /^[^<>\n]+/
65
+ const RE_ANY_TEXT = /^[^\n]+/
66
+ const RE_SLASH = /^\//
67
+ const RE_ATTRIBUTE_NAME = /^[a-zA-Z\d\-]+/
68
+ const RE_EQUAL_SIGN = /^=/
69
+ const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"]+/
70
+ const RE_PUNCTUATION_SELF_CLOSING = /^\/>/
71
+ const RE_INVALID_INSIDE_OPENING_TAG = /^[^a-zA-Z>]/
72
+ const RE_INVALID_INSIDE_ClOSING_TAG = /^[^a-zA-Z>]/
73
+ const RE_PUNCTUATION = /^[<;'".,]/
74
+ const RE_NOT_TAGNAME = /^[^a-zA-Z\d]+/
75
+ const RE_WORD = /^[^\s]+/
76
+ const RE_ANGLE_BRACKET_ONLY = /^</
77
+ const RE_NEWLINE = /^\n/
78
+ const RE_EXCLAMATION_MARK = /^!/
79
+ const RE_SELF_CLOSING = /^\/>/
80
+ const RE_DASH_DASH = /^\-\-/
81
+ const RE_TAG_TEXT = /^[^\s>]+/
82
+ const RE_ANGLE_BRACKET_OPEN = /^</
83
+
84
+ export const initialLineState = {
85
+ state: State.TopLevelContent,
86
+ }
87
+
88
+ export const isLineStateEqual = (lineStateA, lineStateB) => {
89
+ return lineStateA.state === lineStateB.state
90
+ }
91
+
92
+ export const tokenizeLine = (line, lineState) => {
93
+ let next = null
94
+ let index = 0
95
+ let tokens = []
96
+ let token = TokenType.None
97
+ let state = lineState.state
98
+ while (index < line.length) {
99
+ const part = line.slice(index)
100
+ switch (state) {
101
+ case State.TopLevelContent:
102
+ if ((next = part.match(RE_ANGLE_BRACKET_OPEN_TAG))) {
103
+ token = TokenType.PunctuationTag
104
+ state = State.AfterOpeningAngleBracket
105
+ } else if ((next = part.match(RE_TEXT))) {
106
+ token = TokenType.Text
107
+ state = State.TopLevelContent
108
+ } else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
109
+ token = TokenType.Text
110
+ state = State.TopLevelContent
111
+ } else if ((next = part.match(RE_ANGLE_BRACKET_OPEN))) {
112
+ token = TokenType.Text
113
+ state = State.TopLevelContent
114
+ } else {
115
+ part //?
116
+ throw new Error('no')
117
+ }
118
+ break
119
+ case State.AfterOpeningAngleBracket:
120
+ if ((next = part.match(RE_TAGNAME))) {
121
+ token = TokenType.TagName
122
+ state = State.InsideOpeningTag
123
+ } else if ((next = part.match(RE_SLASH))) {
124
+ token = TokenType.PunctuationTag
125
+ state = State.AfterClosingTagAngleBrackets
126
+ } else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
127
+ token = TokenType.PunctuationTag
128
+ state = State.TopLevelContent
129
+ } else if ((next = part.match(RE_ANY_TEXT))) {
130
+ token = TokenType.Text
131
+ state = State.TopLevelContent
132
+ } else {
133
+ part //?
134
+ throw new Error('no')
135
+ }
136
+ break
137
+ case State.InsideOpeningTag:
138
+ if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
139
+ token = TokenType.PunctuationTag
140
+ state = State.TopLevelContent
141
+ } else if ((next = part.match(RE_EXCLAMATION_MARK))) {
142
+ token = TokenType.PunctuationTag
143
+ state = State.InsideOpeningTag
144
+ } else if ((next = part.match(RE_WHITESPACE))) {
145
+ token = TokenType.Whitespace
146
+ state = State.InsideOpeningTagAndHasSeenWhitespace
147
+ } else if ((next = part.match(RE_DASH_DASH))) {
148
+ token = TokenType.Comment
149
+ state = State.InsideBlockComment
150
+ } else if ((next = part.match(RE_TAG_TEXT))) {
151
+ token = TokenType.Text
152
+ state = State.InsideOpeningTag
153
+ } else {
154
+ part //?
155
+ throw new Error('no')
156
+ }
157
+ break
158
+ case State.AfterClosingTagAngleBrackets:
159
+ if ((next = part.match(RE_TAGNAME))) {
160
+ token = TokenType.TagName
161
+ state = State.AfterClosingTagName
162
+ } else if ((next = part.match(RE_ANY_TEXT))) {
163
+ token = TokenType.Text
164
+ state = State.TopLevelContent
165
+ } else {
166
+ part //?
167
+ throw new Error('no')
168
+ }
169
+ break
170
+ case State.AfterClosingTagName:
171
+ if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
172
+ token = TokenType.PunctuationTag
173
+ state = State.TopLevelContent
174
+ } else if ((next = part.match(RE_TEXT))) {
175
+ token = TokenType.Text
176
+ state = State.TopLevelContent
177
+ } else {
178
+ throw new Error('no')
179
+ }
180
+ break
181
+ case State.InsideOpeningTagAndHasSeenWhitespace:
182
+ if ((next = part.match(RE_ATTRIBUTE_NAME))) {
183
+ token = TokenType.AttributeName
184
+ state = State.AfterAttributeName
185
+ } else if ((next = part.match(RE_SELF_CLOSING))) {
186
+ token = TokenType.PunctuationTag
187
+ state = State.TopLevelContent
188
+ } else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
189
+ token = TokenType.PunctuationTag
190
+ state = State.TopLevelContent
191
+ } else if ((next = part.match(RE_TAG_TEXT))) {
192
+ token = TokenType.Text
193
+ state = State.TopLevelContent
194
+ } else {
195
+ part //?
196
+ throw new Error('no')
197
+ }
198
+ break
199
+ case State.AfterAttributeName:
200
+ if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
201
+ token = TokenType.PunctuationTag
202
+ state = State.TopLevelContent
203
+ } else if ((next = part.match(RE_EQUAL_SIGN))) {
204
+ token = TokenType.Punctuation
205
+ state = State.AfterAttributeEqualSign
206
+ } else if ((next = part.match(RE_DOUBLE_QUOTE))) {
207
+ token = TokenType.PunctuationString
208
+ state = State.InsideString
209
+ } else if ((next = part.match(RE_TAG_TEXT))) {
210
+ token = TokenType.Text
211
+ state = State.InsideOpeningTag
212
+ } else if ((next = part.match(RE_WHITESPACE))) {
213
+ token = TokenType.Whitespace
214
+ state = State.InsideOpeningTagAndHasSeenWhitespace
215
+ } else {
216
+ // TODO check quotation mark
217
+ part //?
218
+ throw new Error('no')
219
+ }
220
+ break
221
+ case State.AfterAttributeEqualSign:
222
+ if ((next = part.match(RE_DOUBLE_QUOTE))) {
223
+ token = TokenType.PunctuationString
224
+ state = State.InsideString
225
+ } else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
226
+ token = TokenType.PunctuationTag
227
+ state = State.TopLevelContent
228
+ } else {
229
+ throw new Error('no')
230
+ }
231
+ break
232
+ case State.InsideString:
233
+ if ((next = part.match(RE_DOUBLE_QUOTE))) {
234
+ token = TokenType.PunctuationString
235
+ state = State.InsideOpeningTag
236
+ } else if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
237
+ token = TokenType.String
238
+ state = State.InsideString
239
+ } else {
240
+ throw new Error('no')
241
+ }
242
+ break
243
+ case State.InsideBlockComment:
244
+ if ((next = part.match(RE_BLOCK_COMMENT_CONTENT))) {
245
+ token = TokenType.Comment
246
+ state = State.InsideBlockComment
247
+ } else if ((next = part.match(RE_BLOCK_COMMENT_END))) {
248
+ token = TokenType.Comment
249
+ state = State.TopLevelContent
250
+ } else {
251
+ throw new Error('no')
252
+ }
253
+ break
254
+ default:
255
+ state
256
+ throw new Error('no')
257
+ }
258
+ index += next[0].length
259
+ tokens.push({
260
+ type: token,
261
+ length: next[0].length,
262
+ })
263
+ }
264
+ return {
265
+ state,
266
+ tokens,
267
+ }
268
+ }
269
+
270
+ // tokenizeLine(initialContext, ' <h1$0></h1>') //?
271
+ // tokenizeLine(initialContext, `<<`)
272
+
273
+ // tokenizeLine(initialContext, `<h1><//`) //?
274
+ // tokenizeLine(initialContext, `<h1 class=></h1>`) //?
275
+
276
+ // tokenizeLine(initialLineState, `<h1234567 class""=></h1234567>`)
277
+
278
+ tokenizeLine('<input disabled autofocus>', initialLineState) //?
@@ -0,0 +1,14 @@
1
+ # Language Basics Java
2
+
3
+ ## Contributing
4
+
5
+ ```sh
6
+ git clone git@github.com:lvce-editor/language-basics-java.git &&
7
+ cd language-basics-java &&
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-java)
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "builtin.language-basics-java",
3
+ "name": "Language Basics Java",
4
+ "description": "Provides syntax highlighting and bracket matching in Java files.",
5
+ "languages": [
6
+ {
7
+ "id": "java",
8
+ "extensions": [".java"],
9
+ "tokenize": "src/tokenizeJava.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
+ }
10
+
11
+ /**
12
+ * @enum number
13
+ */
14
+ export const TokenType = {
15
+ None: 99999999,
16
+ Keyword: 951,
17
+ Whitespace: 0,
18
+ NewLine: 771,
19
+ VariableName: 2,
20
+ Punctuation: 3,
21
+ String: 4,
22
+ Numeric: 5,
23
+ Attribute: 6,
24
+ }
25
+
26
+ export const TokenMap = {
27
+ [TokenType.None]: 'None',
28
+ [TokenType.Keyword]: 'Keyword',
29
+ [TokenType.Whitespace]: 'Whitespace',
30
+ [TokenType.NewLine]: 'NewLine',
31
+ [TokenType.VariableName]: 'VariableName',
32
+ [TokenType.Punctuation]: 'Punctuation',
33
+ [TokenType.String]: 'String',
34
+ [TokenType.Numeric]: 'Numeric',
35
+ [TokenType.Attribute]: 'Attribute',
36
+ }
37
+
38
+ export const initialLineState = {
39
+ state: State.TopLevelContent,
40
+ }
41
+
42
+ const RE_KEYWORD =
43
+ /^(?:_|abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\b/
44
+ const RE_WHITESPACE = /^\s+/
45
+ const RE_VARIABLE_NAME = /^[a-zA-Z]+/
46
+ const RE_PUNCTUATION = /^[:,;\{\}\[\]\.=\(\)>]/
47
+ const RE_QUOTE_SINGLE = /^'/
48
+ const RE_QUOTE_DOUBLE = /^"/
49
+ const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
50
+ const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"]+/
51
+ const RE_NUMERIC = /^\d+/
52
+ const RE_TRIPLE_DOUBLE_QUOTE = /^"""/
53
+ const RE_STRING_TRIPLE_CONTENT = /^.+?(?="""|$)/s
54
+ const RE_ATTRIBUTE = /^@\w+/
55
+
56
+ /**
57
+ * @param {string} line
58
+ * @param {any} lineState
59
+ */
60
+ export const tokenizeLine = (line, lineState) => {
61
+ let next = null
62
+ let index = 0
63
+ let tokens = []
64
+ let token = TokenType.None
65
+ let state = lineState.state
66
+ while (index < line.length) {
67
+ const part = line.slice(index)
68
+ switch (state) {
69
+ case State.TopLevelContent:
70
+ if ((next = part.match(RE_WHITESPACE))) {
71
+ token = TokenType.Whitespace
72
+ state = State.TopLevelContent
73
+ } else if ((next = part.match(RE_KEYWORD))) {
74
+ token = TokenType.Keyword
75
+ state = State.TopLevelContent
76
+ } else if ((next = part.match(RE_VARIABLE_NAME))) {
77
+ token = TokenType.VariableName
78
+ state = State.TopLevelContent
79
+ } else if ((next = part.match(RE_PUNCTUATION))) {
80
+ token = TokenType.Punctuation
81
+ state = State.TopLevelContent
82
+ } else if ((next = part.match(RE_NUMERIC))) {
83
+ token = TokenType.Numeric
84
+ state = State.TopLevelContent
85
+ } else if ((next = part.match(RE_QUOTE_SINGLE))) {
86
+ token = TokenType.Punctuation
87
+ state = State.InsideSingleQuoteString
88
+ } else if ((next = part.match(RE_QUOTE_DOUBLE))) {
89
+ token = TokenType.Punctuation
90
+ state = State.InsideDoubleQuoteString
91
+ } else if ((next = part.match(RE_ATTRIBUTE))) {
92
+ token = TokenType.Attribute
93
+ state = State.TopLevelContent
94
+ } else {
95
+ part //?
96
+ throw new Error('no')
97
+ }
98
+ break
99
+ case State.InsideSingleQuoteString:
100
+ if ((next = part.match(RE_QUOTE_SINGLE))) {
101
+ token = TokenType.Punctuation
102
+ state = State.TopLevelContent
103
+ } else if ((next = part.match(RE_STRING_SINGLE_QUOTE_CONTENT))) {
104
+ token = TokenType.String
105
+ state = State.InsideSingleQuoteString
106
+ } else {
107
+ throw new Error('no')
108
+ }
109
+ break
110
+ case State.InsideDoubleQuoteString:
111
+ if ((next = part.match(RE_QUOTE_DOUBLE))) {
112
+ token = TokenType.Punctuation
113
+ state = State.TopLevelContent
114
+ } else if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
115
+ token = TokenType.String
116
+ state = State.InsideDoubleQuoteString
117
+ } else {
118
+ throw new Error('no')
119
+ }
120
+ break
121
+ default:
122
+ state
123
+ throw new Error('no')
124
+ }
125
+ index += next[0].length
126
+ tokens.push({
127
+ type: token,
128
+ length: next[0].length,
129
+ })
130
+ }
131
+ return {
132
+ state,
133
+ tokens,
134
+ }
135
+ }
@@ -0,0 +1,14 @@
1
+ # Language Basics JavaScript
2
+
3
+ ## Contributing
4
+
5
+ ```sh
6
+ git clone git@github.com:lvce-editor/language-basics-javascript.git &&
7
+ cd language-basics-javascript &&
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-javascript)
@@ -0,0 +1,13 @@
1
+ {
2
+ "id": "builtin.language-basics-javascript",
3
+ "name": "Language Basics JavaScript",
4
+ "description": "Provides syntax highlighting and bracket matching in JavaScript files.",
5
+ "languages": [
6
+ {
7
+ "id": "javascript",
8
+ "extensions": [".js"],
9
+ "tokenize": "src/tokenizeJavaScript.js",
10
+ "configuration": "./languageConfiguration.json"
11
+ }
12
+ ]
13
+ }