@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,14 @@
1
+ # Language Basics Cpp
2
+
3
+ ## Contributing
4
+
5
+ ```sh
6
+ git clone git@github.com:lvce-editor/language-basics-cpp.git &&
7
+ cd language-basics-cpp &&
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-cpp)
@@ -0,0 +1,13 @@
1
+ {
2
+ "id": "builtin.language-basics-cpp",
3
+ "name": "Language Basics C++",
4
+ "description": "Provides syntax highlighting and bracket matching in C++ files.",
5
+ "languages": [
6
+ {
7
+ "id": "cpp",
8
+ "extensions": [".cpp", ".hpp", ".cu"],
9
+ "configuration": "./languageConfiguration.json",
10
+ "tokenize": "src/tokenizeCpp.js"
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,222 @@
1
+ /**
2
+ * @enum number
3
+ */
4
+ export const State = {
5
+ TopLevelContent: 1,
6
+ InsideDoubleQuoteString: 2,
7
+ InsideLineComment: 3,
8
+ AfterInclude: 4,
9
+ AfterIncludeAfterWhitespace: 5,
10
+ AfterMacroError: 6,
11
+ AfterMacroErrorAfterWhitespace: 7,
12
+ }
13
+
14
+ /**
15
+ * @enum number
16
+ */
17
+ export const TokenType = {
18
+ None: 901,
19
+ Whitespace: 0,
20
+ PlainText: 117,
21
+ Comment: 60,
22
+ String: 50,
23
+ Numeric: 30,
24
+ Text: 117,
25
+ TagName: 118,
26
+ Punctuation: 10,
27
+ Error: 141,
28
+ NewLine: 771,
29
+ Keyword: 951,
30
+ VariableName: 952,
31
+ Include: 222,
32
+ Type: 555,
33
+ Macro: 71,
34
+ }
35
+
36
+ export const TokenMap = {
37
+ [TokenType.Whitespace]: 'Whitespace',
38
+ [TokenType.Keyword]: 'Keyword',
39
+ [TokenType.PlainText]: 'PlainText',
40
+ [TokenType.Comment]: 'Comment',
41
+ [TokenType.Text]: 'Text',
42
+ [TokenType.Punctuation]: 'Punctuation',
43
+ [TokenType.VariableName]: 'VariableName',
44
+ [TokenType.Include]: 'KeywordImport',
45
+ [TokenType.String]: 'String',
46
+ [TokenType.Type]: 'Type',
47
+ [TokenType.Macro]: 'Macro',
48
+ }
49
+
50
+ const RE_WHITESPACE = /^\s+/
51
+ const RE_WHITESPACE_SINGLE_LINE = /^( |\t)+/
52
+ const RE_WHITESPACE_NEWLINE = /^\n/
53
+ const RE_CONSTANT = /^(true|false|null)/
54
+ const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"\n]+/
55
+ const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^'\n]+/
56
+ const RE_DOUBLE_QUOTE = /^"/
57
+ const RE_CURLY_OPEN = /^\{/
58
+ const RE_CURLY_CLOSE = /^\}/
59
+ const RE_SQUARE_OPEN = /^\[/
60
+ const RE_SQUARE_CLOSE = /^\]/
61
+ const RE_COMMA = /^,/
62
+ const RE_COLON = /^:/
63
+ const RE_NUMERIC =
64
+ /^((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)/
65
+ const RE_NEWLINE_WHITESPACE = /^\n\s*/
66
+ const RE_BLOCK_COMMENT_START = /^\/\*/
67
+ const RE_BLOCK_COMMENT_CONTENT = /^.+(?=\*\/|$)/s
68
+ const RE_BLOCK_COMMENT_END = /^\*\//
69
+ const RE_UNKNOWN_VALUE = /^[^\}\{\s,"]+/
70
+ const RE_IMPORT = /^[a-zA-Z\.]+/
71
+ const RE_SEMICOLON = /^;/
72
+ const RE_VARIABLE_NAME = /^[a-zA-Z\_][a-zA-Z\_\d]*/
73
+ const RE_LINE_COMMENT = /^\/\//
74
+ const RE_ROUND_OPEN = /^\(/
75
+ const RE_ROUND_CLOSE = /^\)/
76
+ const RE_DOT = /^\./
77
+ const RE_EQUAL_SIGN = /^=/
78
+ const RE_SINGLE_QUOTE = /^'/
79
+ const RE_PUNCTUATION = /^[\(\)=\+\-><\.,\/\*\^\[\]\{\}\|:]/
80
+ const RE_ANYTHING_UNTIL_END = /^.+/s
81
+ const RE_START_OF_FUNCTION = /^( )*\(/
82
+ const RE_COLON_COLON = /^::/
83
+ const RE_BASH_SLASH = /^\\/
84
+ const RE_ANY_CHAR = /^./
85
+ const RE_SQUARE_OPEN_SQUARE_OPEN = /^\[\[/
86
+ const RE_SQUARE_CLOSE_SQUARE_CLOSE = /^\]\]/
87
+ const RE_STRING_MULTILINE_CONTENT = /^.+?(?=\]\]|$)/s
88
+ const RE_KEYWORD =
89
+ /^(?:while|volatile|void|virtual|unsigned|union|using|typedef|try|throw|this|template|switch|struct|static|sizeof|signed|short|return|register|public|protected|private|operator|new|namespace|long|int|inline|if|goto|friend|for|float|extern|enum|else|double|do|delete|default|continue|const|constexpr|class|char|catch|case|bool|break|auto|asm)\b/
90
+ const RE_TEXT = /^.+/s
91
+ const RE_INCLUDE = /^#include/
92
+ const RE_INCLUDE_WITH_QUOTES = /^"([^"]*)"/
93
+ const RE_INCLUDE_WITH_ANGLE_BRACKETS = /^<[^>]*>/
94
+ const RE_TYPE = /^(?:size_t)\b/
95
+ const RE_MACRO = /^#[a-z]+/
96
+
97
+ export const initialLineState = {
98
+ state: State.TopLevelContent,
99
+ }
100
+
101
+ export const isLineStateEqual = (lineStateA, lineStateB) => {
102
+ return lineStateA.state === lineStateB.state
103
+ }
104
+
105
+ /**
106
+ *
107
+ * @param {string} line
108
+ * @param {any} lineState
109
+ * @returns
110
+ */
111
+ export const tokenizeLine = (line, lineState) => {
112
+ let next = null
113
+ let index = 0
114
+ let tokens = []
115
+ let token = TokenType.None
116
+ let state = lineState.state
117
+ while (index < line.length) {
118
+ const part = line.slice(index)
119
+ switch (state) {
120
+ case State.TopLevelContent:
121
+ if ((next = part.match(RE_WHITESPACE))) {
122
+ token = TokenType.Whitespace
123
+ state = State.TopLevelContent
124
+ } else if ((next = part.match(RE_KEYWORD))) {
125
+ token = TokenType.Keyword
126
+ state = State.TopLevelContent
127
+ } else if ((next = part.match(RE_TYPE))) {
128
+ token = TokenType.Type
129
+ state = State.TopLevelContent
130
+ } else if ((next = part.match(RE_VARIABLE_NAME))) {
131
+ token = TokenType.VariableName
132
+ state = State.TopLevelContent
133
+ } else if ((next = part.match(RE_MACRO))) {
134
+ const macro = next[0]
135
+ switch (macro) {
136
+ case '#include':
137
+ token = TokenType.Include
138
+ state = State.AfterInclude
139
+ break
140
+ case '#error':
141
+ token = TokenType.Macro
142
+ state = State.AfterMacroError
143
+ next
144
+ break
145
+ default:
146
+ token = TokenType.Macro
147
+ state = State.TopLevelContent
148
+ break
149
+ }
150
+ } else if ((next = part.match(RE_LINE_COMMENT))) {
151
+ token = TokenType.Comment
152
+ state = State.InsideLineComment
153
+ } else if ((next = part.match(RE_PUNCTUATION))) {
154
+ token = TokenType.Punctuation
155
+ state = State.TopLevelContent
156
+ } else if ((next = part.match(RE_TEXT))) {
157
+ token = TokenType.Text
158
+ state = State.TopLevelContent
159
+ } else {
160
+ part //?
161
+ throw new Error('no')
162
+ }
163
+ break
164
+ case State.AfterInclude:
165
+ if ((next = part.match(RE_WHITESPACE))) {
166
+ token = TokenType.Whitespace
167
+ state = State.AfterIncludeAfterWhitespace
168
+ } else {
169
+ throw new Error('no')
170
+ }
171
+ break
172
+ case State.AfterIncludeAfterWhitespace:
173
+ if ((next = part.match(RE_INCLUDE_WITH_ANGLE_BRACKETS))) {
174
+ token = TokenType.String
175
+ state = State.TopLevelContent
176
+ } else if ((next = part.match(RE_INCLUDE_WITH_QUOTES))) {
177
+ token = TokenType.String
178
+ state = State.TopLevelContent
179
+ } else {
180
+ console.log({ line: part })
181
+ throw new Error('no')
182
+ }
183
+ break
184
+ case State.InsideLineComment:
185
+ if ((next = part.match(RE_TEXT))) {
186
+ token = TokenType.Comment
187
+ state = State.TopLevelContent
188
+ } else {
189
+ throw new Error('no')
190
+ }
191
+ break
192
+ case State.AfterMacroError:
193
+ if ((next = part.match(RE_WHITESPACE))) {
194
+ token = TokenType.Whitespace
195
+ state = State.AfterMacroErrorAfterWhitespace
196
+ } else {
197
+ throw new Error('no')
198
+ }
199
+ break
200
+ case State.AfterMacroErrorAfterWhitespace:
201
+ if ((next = part.match(RE_ANYTHING_UNTIL_END))) {
202
+ token = TokenType.String
203
+ state = State.TopLevelContent
204
+ } else {
205
+ throw new Error('no')
206
+ }
207
+ break
208
+ default:
209
+ state
210
+ throw new Error('no')
211
+ }
212
+ index += next[0].length
213
+ tokens.push({
214
+ type: token,
215
+ length: next[0].length,
216
+ })
217
+ }
218
+ return {
219
+ state,
220
+ tokens,
221
+ }
222
+ }
@@ -0,0 +1,14 @@
1
+ # Language Basics CSS
2
+
3
+ ## Contributing
4
+
5
+ ```sh
6
+ git clone git@github.com:lvce-editor/language-basics-css.git &&
7
+ cd language-basics-css &&
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-css)
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "builtin.language-basics-css",
3
+ "name": "Language Basics CSS",
4
+ "description": "Provides syntax highlighting and bracket matching in CSS files.",
5
+ "languages": [
6
+ {
7
+ "id": "css",
8
+ "extensions": [".css"],
9
+ "tokenize": "src/tokenizeCss.js"
10
+ }
11
+ ]
12
+ }
@@ -0,0 +1,378 @@
1
+ /**
2
+ * @enum number
3
+ */
4
+ export const State = {
5
+ TopLevelContent: 1,
6
+ AfterSelector: 2,
7
+ InsideSelector: 3,
8
+ AfterPropertyName: 4,
9
+ AfterPropertyNameAfterColon: 5,
10
+ AfterPropertyValue: 6,
11
+ InsideBlockComment: 7,
12
+ InsidePseudoSelector: 8,
13
+ InsideAttributeSelector: 9,
14
+ AfterQuery: 10,
15
+ InsideRound: 11,
16
+ AfterQueryWithRules: 12,
17
+ }
18
+
19
+ export const StateMap = {
20
+ [State.TopLevelContent]: 'TopLevelContent',
21
+ [State.AfterSelector]: 'AfterSelector',
22
+ [State.InsideSelector]: 'InsideSelector',
23
+ [State.AfterPropertyName]: 'AfterPropertyName',
24
+ [State.AfterPropertyNameAfterColon]: 'AfterPropertyNameAfterColon',
25
+ [State.AfterPropertyValue]: 'AfterPropertyValue',
26
+ }
27
+
28
+ /**
29
+ * @enum number
30
+ */
31
+ export const TokenType = {
32
+ CssSelector: 1,
33
+ Whitespace: 2,
34
+ Punctuation: 3,
35
+ CssPropertyName: 4,
36
+ CssPropertyValue: 5,
37
+ CurlyOpen: 6,
38
+ CurlyClose: 7,
39
+ PropertyColon: 8,
40
+ CssPropertySemicolon: 9,
41
+ Variable: 10,
42
+ None: 57,
43
+ Unknown: 881,
44
+ CssPropertyColon: 882,
45
+ Numeric: 883,
46
+ NewLine: 884,
47
+ Comment: 885,
48
+ Query: 886,
49
+ Text: 887,
50
+ }
51
+
52
+ export const TokenMap = {
53
+ [TokenType.CssSelector]: 'CssSelector',
54
+ [TokenType.Whitespace]: 'Whitespace',
55
+ [TokenType.Punctuation]: 'Punctuation',
56
+ [TokenType.CssPropertyName]: 'CssPropertyName',
57
+ [TokenType.CssPropertyValue]: 'CssPropertyValue',
58
+ [TokenType.CurlyOpen]: 'Punctuation',
59
+ [TokenType.CurlyClose]: 'Punctuation',
60
+ [TokenType.PropertyColon]: 'Punctuation',
61
+ [TokenType.CssPropertySemicolon]: 'Punctuation',
62
+ [TokenType.Variable]: 'Variable',
63
+ [TokenType.None]: 'None',
64
+ [TokenType.CssPropertyValue]: 'CssPropertyValue',
65
+ [TokenType.Unknown]: 'Unknown',
66
+ [TokenType.CssPropertyColon]: 'Punctuation',
67
+ [TokenType.Numeric]: 'Numeric',
68
+ [TokenType.NewLine]: 'NewLine',
69
+ [TokenType.Comment]: 'Comment',
70
+ [TokenType.Query]: 'Query',
71
+ [TokenType.Text]: 'Text',
72
+ }
73
+
74
+ const RE_SELECTOR = /^[\.a-zA-Z\d\-\:>\+\~]+/
75
+ const RE_WHITESPACE = /^ +/
76
+ const RE_CURLY_OPEN = /^\{/
77
+ const RE_CURLY_CLOSE = /^\}/
78
+ const RE_PROPERTY_NAME = /^[a-zA-Z\-]+\b/
79
+ const RE_COLON = /^:/
80
+ const RE_PROPERTY_VALUE = /^[^;\}]+/
81
+ const RE_SEMICOLON = /^;/
82
+ const RE_COMMA = /^,/
83
+ const RE_ANYTHING = /^.*/
84
+ const RE_NUMERIC = /^(([0-9]+\.?[0-9]*)|(\.[0-9]+))/
85
+ const RE_ANYTHING_UNTIL_CLOSE_BRACE = /^[^\}]+/
86
+ const RE_BLOCK_COMMENT_START = /^\/\*/
87
+ const RE_BLOCK_COMMENT_END = /^\*\//
88
+ const RE_BLOCK_COMMENT_CONTENT = /^.+?(?=\*\/|$)/s
89
+ const RE_ROUND_OPEN = /^\(/
90
+ const RE_ROUND_CLOSE = /^\)/
91
+ const RE_PSEUDO_SELECTOR_CONTENT = /^[^\)]+/
92
+ const RE_SQUARE_OPEN = /^\[/
93
+ const RE_SQUARE_CLOSE = /^\]/
94
+ const RE_ATTRIBUTE_SELECTOR_CONTENT = /^[^\]]+/
95
+ const RE_QUERY = /^@[a-z\-]+/
96
+ const RE_STAR = /^\*/
97
+ const RE_QUERY_NAME = /^[a-z\-]+/
98
+ const RE_QUERY_CONTENT = /^[^\)]+/
99
+ const RE_COMBINATOR = /^[\+\>\~]/
100
+
101
+ export const initialLineState = {
102
+ state: State.TopLevelContent,
103
+ tokens: [],
104
+ stack: [],
105
+ }
106
+
107
+ export const isEqualLineState = (lineStateA, lineStateB) => {
108
+ return lineStateA.state === lineStateB.state
109
+ }
110
+
111
+ /**
112
+ * @param {string} line
113
+ */
114
+ export const tokenizeLine = (line, lineState) => {
115
+ let next = null
116
+ let index = 0
117
+ let tokens = []
118
+ let token = TokenType.None
119
+ let state = lineState.state
120
+ const stack = lineState.stack
121
+ while (index < line.length) {
122
+ const part = line.slice(index)
123
+ switch (state) {
124
+ case State.TopLevelContent:
125
+ if ((next = part.match(RE_SELECTOR))) {
126
+ token = TokenType.CssSelector
127
+ state = State.AfterSelector
128
+ } else if ((next = part.match(RE_WHITESPACE))) {
129
+ token = TokenType.Whitespace
130
+ state = State.TopLevelContent
131
+ } else if ((next = part.match(RE_CURLY_OPEN))) {
132
+ token = TokenType.CurlyOpen
133
+ state = State.InsideSelector
134
+ } else if ((next = part.match(RE_BLOCK_COMMENT_START))) {
135
+ token = TokenType.Comment
136
+ state = State.InsideBlockComment
137
+ } else if ((next = part.match(RE_SQUARE_OPEN))) {
138
+ token = TokenType.Punctuation
139
+ state = State.InsideAttributeSelector
140
+ } else if ((next = part.match(RE_QUERY))) {
141
+ if (
142
+ next[0] === '@font-face' ||
143
+ next[0] === '@-ms-viewport' ||
144
+ next[0] === '@-o-viewport' ||
145
+ next[0] === '@viewport'
146
+ ) {
147
+ token = TokenType.Query
148
+ state = State.AfterQueryWithRules
149
+ } else {
150
+ token = TokenType.Query
151
+ state = State.AfterQuery
152
+ }
153
+ } else if ((next = part.match(RE_STAR))) {
154
+ token = TokenType.CssSelector
155
+ state = State.AfterSelector
156
+ } else if ((next = part.match(RE_CURLY_CLOSE))) {
157
+ token = TokenType.Punctuation
158
+ state = State.TopLevelContent
159
+ } else if ((next = part.match(RE_ANYTHING))) {
160
+ token = TokenType.Unknown
161
+ state = State.TopLevelContent
162
+ } else {
163
+ part //?
164
+ throw new Error('no')
165
+ }
166
+ break
167
+ case State.AfterSelector:
168
+ if ((next = part.match(RE_WHITESPACE))) {
169
+ token = TokenType.Whitespace
170
+ state = State.AfterSelector
171
+ } else if ((next = part.match(RE_CURLY_OPEN))) {
172
+ token = TokenType.CurlyOpen
173
+ state = State.InsideSelector
174
+ } else if ((next = part.match(RE_SELECTOR))) {
175
+ token = TokenType.CssSelector
176
+ state = State.AfterSelector
177
+ } else if ((next = part.match(RE_COMMA))) {
178
+ token = TokenType.Punctuation
179
+ state = State.AfterSelector
180
+ } else if ((next = part.match(RE_ROUND_OPEN))) {
181
+ token = TokenType.Punctuation
182
+ state = State.InsidePseudoSelector
183
+ } else if ((next = part.match(RE_SQUARE_OPEN))) {
184
+ token = TokenType.Punctuation
185
+ state = State.InsideAttributeSelector
186
+ } else if ((next = part.match(RE_ANYTHING))) {
187
+ token = TokenType.Unknown
188
+ state = State.TopLevelContent
189
+ } else {
190
+ tokens.map((x) => TokenMap[x.type]) //?
191
+ part //?
192
+ throw new Error('no')
193
+ }
194
+ break
195
+ case State.AfterQuery:
196
+ if ((next = part.match(RE_WHITESPACE))) {
197
+ token = TokenType.Whitespace
198
+ state = State.AfterQuery
199
+ } else if ((next = part.match(RE_QUERY_NAME))) {
200
+ token = TokenType.Text
201
+ state = State.AfterQuery
202
+ } else if ((next = part.match(RE_CURLY_OPEN))) {
203
+ token = TokenType.Punctuation
204
+ state = State.TopLevelContent
205
+ // stack.push(State.que )
206
+ } else if ((next = part.match(RE_ROUND_OPEN))) {
207
+ token = TokenType.Punctuation
208
+ state = State.InsideRound
209
+ stack.push(State.AfterQuery)
210
+ } else {
211
+ part
212
+ throw new Error('no')
213
+ }
214
+ break
215
+ case State.AfterQueryWithRules:
216
+ if ((next = part.match(RE_WHITESPACE))) {
217
+ token = TokenType.Whitespace
218
+ state = State.AfterQueryWithRules
219
+ } else if ((next = part.match(RE_CURLY_OPEN))) {
220
+ token = TokenType.Punctuation
221
+ state = State.InsideSelector
222
+ } else {
223
+ throw new Error('no')
224
+ }
225
+ break
226
+ case State.InsideBlockComment:
227
+ if ((next = part.match(RE_BLOCK_COMMENT_END))) {
228
+ token = TokenType.Comment
229
+ state = State.TopLevelContent
230
+ } else if ((next = part.match(RE_BLOCK_COMMENT_CONTENT))) {
231
+ token = TokenType.Comment
232
+ state = State.InsideBlockComment
233
+ } else {
234
+ throw new Error('no')
235
+ }
236
+ break
237
+ // TODO support css nesting https://www.w3.org/TR/css-nesting-1/
238
+ case State.InsideSelector:
239
+ if ((next = part.match(RE_WHITESPACE))) {
240
+ token = TokenType.Whitespace
241
+ state = State.InsideSelector
242
+ } else if ((next = part.match(RE_PROPERTY_NAME))) {
243
+ token = TokenType.CssPropertyName
244
+ state = State.AfterPropertyName
245
+ if (next[0].startsWith('--')) {
246
+ token = TokenType.Variable
247
+ }
248
+ } else if ((next = part.match(RE_ANYTHING_UNTIL_CLOSE_BRACE))) {
249
+ token = TokenType.Unknown
250
+ state = State.InsideSelector
251
+ } else if ((next = part.match(RE_CURLY_CLOSE))) {
252
+ token = TokenType.CurlyClose
253
+ state = State.TopLevelContent
254
+ } else {
255
+ throw new Error('no')
256
+ }
257
+ break
258
+ case State.AfterPropertyName:
259
+ if ((next = part.match(RE_COLON))) {
260
+ token = TokenType.CssPropertyColon
261
+ state = State.AfterPropertyNameAfterColon
262
+ } else if ((next = part.match(RE_CURLY_CLOSE))) {
263
+ token = TokenType.CurlyClose
264
+ state = State.TopLevelContent
265
+ } else if ((next = part.match(RE_WHITESPACE))) {
266
+ token = TokenType.Whitespace
267
+ state = State.AfterPropertyName
268
+ } else if ((next = part.match(RE_ANYTHING_UNTIL_CLOSE_BRACE))) {
269
+ token = TokenType.Unknown
270
+ state = State.InsideSelector
271
+ } else {
272
+ tokens
273
+ part //?
274
+ throw new Error('no')
275
+ }
276
+ break
277
+ case State.AfterPropertyNameAfterColon:
278
+ if ((next = part.match(RE_WHITESPACE))) {
279
+ token = TokenType.Whitespace
280
+ state = State.AfterPropertyNameAfterColon
281
+ } else if ((next = part.match(RE_NUMERIC))) {
282
+ token = TokenType.Numeric
283
+ state = State.AfterPropertyValue
284
+ } else if ((next = part.match(RE_PROPERTY_VALUE))) {
285
+ token = TokenType.CssPropertyValue
286
+ state = State.AfterPropertyValue
287
+ } else if ((next = part.match(RE_SEMICOLON))) {
288
+ token = TokenType.Punctuation
289
+ state = State.InsideSelector
290
+ } else {
291
+ throw new Error('no')
292
+ }
293
+ break
294
+ case State.AfterPropertyValue:
295
+ if ((next = part.match(RE_SEMICOLON))) {
296
+ token = TokenType.CssPropertySemicolon
297
+ state = State.InsideSelector
298
+ } else if ((next = part.match(RE_WHITESPACE))) {
299
+ token = TokenType.Whitespace
300
+ state = State.AfterPropertyValue
301
+ } else if ((next = part.match(RE_NUMERIC))) {
302
+ token = TokenType.Numeric
303
+ state = State.AfterPropertyValue
304
+ } else if ((next = part.match(RE_PROPERTY_VALUE))) {
305
+ token = TokenType.CssPropertyValue
306
+ state = State.AfterPropertyValue
307
+ } else if ((next = part.match(RE_CURLY_CLOSE))) {
308
+ token = TokenType.Punctuation
309
+ state = State.TopLevelContent
310
+ } else {
311
+ part //?
312
+ throw new Error('no')
313
+ }
314
+ break
315
+ case State.InsidePseudoSelector:
316
+ if ((next = part.match(RE_PSEUDO_SELECTOR_CONTENT))) {
317
+ token = TokenType.CssSelector
318
+ state = State.InsidePseudoSelector
319
+ } else if ((next = part.match(RE_ROUND_CLOSE))) {
320
+ token = TokenType.Punctuation
321
+ state = State.AfterSelector
322
+ } else {
323
+ throw new Error('no')
324
+ }
325
+ break
326
+ case State.InsideRound:
327
+ if ((next = part.match(RE_QUERY_CONTENT))) {
328
+ token = TokenType.Text
329
+ state = State.InsideRound
330
+ } else if ((next = part.match(RE_ROUND_CLOSE))) {
331
+ token = TokenType.Punctuation
332
+ state = stack.pop()
333
+ } else {
334
+ throw new Error('no')
335
+ }
336
+ break
337
+ case State.InsideAttributeSelector:
338
+ if ((next = part.match(RE_ATTRIBUTE_SELECTOR_CONTENT))) {
339
+ token = TokenType.CssSelector
340
+ state = State.InsideAttributeSelector
341
+ } else if ((next = part.match(RE_SQUARE_CLOSE))) {
342
+ token = TokenType.Punctuation
343
+ state = State.AfterSelector
344
+ } else {
345
+ throw new Error('no')
346
+ }
347
+ break
348
+ default:
349
+ console.log({ state, line })
350
+ throw new Error('no')
351
+ }
352
+ index += next[0].length
353
+ tokens.push({
354
+ type: token,
355
+ length: next[0].length,
356
+ })
357
+ }
358
+ return {
359
+ state,
360
+ tokens,
361
+ stack,
362
+ }
363
+ }
364
+
365
+ tokenizeLine(
366
+ `@font-face { font-family: 'Glyphicons Halflings';}`,
367
+ initialLineState
368
+ ) //?
369
+ // tokenizeLine(``)
370
+
371
+ // tokenize(`.QuickPickItemLabel {
372
+ // pointer-events: none;
373
+ // font-size: 13px;
374
+ // }
375
+ // `) //?
376
+ // TODO test :hover, :after, :before, ::first-letter
377
+
378
+ // TODO test complex background image url("data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%206%203'%20enable-background%3D'new%200%200%206%203'%20height%3D'3'%20width%3D'6'%3E%3Cg%20fill%3D'%23b64e4e'%3E%3Cpolygon%20points%3D'5.5%2C0%202.5%2C3%201.1%2C3%204.1%2C0'%2F%3E%3Cpolygon%20points%3D'4%2C0%206%2C2%206%2C0.6%205.4%2C0'%2F%3E%3Cpolygon%20points%3D'0%2C2%201%2C3%202.4%2C3%200%2C0.6'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")
@@ -0,0 +1,14 @@
1
+ # Language Basics Dart
2
+
3
+ ## Contributing
4
+
5
+ ```sh
6
+ git clone git@github.com:lvce-editor/language-basics-dart.git &&
7
+ cd language-basics-dart &&
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-dart)
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "builtin.language-basics-dart",
3
+ "name": "Language Basics Dart",
4
+ "description": "Provides syntax highlighting and bracket matching in Dart files.",
5
+ "languages": [
6
+ {
7
+ "id": "dart",
8
+ "extensions": [".dart"],
9
+ "tokenize": "src/tokenizeDart.js"
10
+ }
11
+ ]
12
+ }