@lvce-editor/shared-process 0.11.8 → 0.11.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/defaultKeyBindings.json +25 -0
- package/config/defaultSettings.json +2 -7
- package/extensions/builtin.language-basics-coffeescript/src/tokenizeCoffeeScript.js +232 -3
- package/extensions/builtin.language-basics-cpp/src/tokenizeCpp.js +14 -0
- package/extensions/builtin.language-basics-css/src/tokenizeCss.js +8 -0
- package/extensions/builtin.language-basics-javascript/src/tokenizeJavaScript.js +52 -4
- package/extensions/builtin.language-basics-perl/extension.json +2 -1
- package/extensions/builtin.language-basics-perl/src/tokenizePerl.js +53 -6
- package/extensions/builtin.language-basics-python/src/tokenizePython.js +86 -3
- package/extensions/builtin.language-basics-ruby/README.md +14 -0
- package/extensions/builtin.language-basics-ruby/extension.json +48 -0
- package/extensions/builtin.language-basics-ruby/src/tokenizeRuby.js +241 -0
- package/extensions/builtin.language-basics-scss/README.md +14 -0
- package/extensions/builtin.language-basics-scss/extension.json +12 -0
- package/extensions/builtin.language-basics-scss/src/tokenizeScss.js +28 -0
- package/extensions/builtin.language-basics-shellscript/extension.json +2 -1
- package/extensions/builtin.language-basics-shellscript/src/tokenizeShellScript.js +326 -13
- package/extensions/builtin.language-basics-toml/src/tokenizeToml.js +87 -13
- package/extensions/builtin.language-basics-xml/extension.json +2 -1
- package/extensions/builtin.language-basics-xml/src/tokenizeXml.js +7 -0
- package/extensions/builtin.language-basics-yaml/src/tokenizeYaml.js +8 -1
- package/extensions/builtin.theme-cobalt2/color-theme.json +4 -0
- package/extensions/builtin.theme-gruvbox/color-theme.json +4 -0
- package/extensions/builtin.theme-palenight/color-theme.json +4 -0
- package/extensions/builtin.theme-slime/color-theme.json +9 -1
- package/package.json +5 -5
- package/src/parts/Cli/Cli.js +2 -2
- package/src/parts/CliInstall/CliInstall.js +21 -6
- package/src/parts/CliList/CliList.js +3 -2
- package/src/parts/CliUnlink/CliUnlink.js +1 -1
- package/src/parts/DownloadAndExtract/DownloadAndExtract.js +18 -8
- package/src/parts/ErrorCodes/ErrorCodes.js +8 -18
- package/src/parts/ErrorHandling/ErrorHandling.js +4 -9
- package/src/parts/ExportStatic/ExportStatic.js +57 -330
- package/src/parts/ExtensionHost/ExtensionHost.js +4 -7
- package/src/parts/ExtensionInstallFromGitHub/ExtensionInstallFromGitHub.js +1 -4
- package/src/parts/ExtensionManagement/ExtensionManagementColorTheme.js +3 -4
- package/src/parts/FileSystem/FileSystem.js +5 -15
- package/src/parts/GetResponse/GetResponse.js +10 -14
- package/src/parts/JsonRpc/JsonRpc.js +3 -6
- package/src/parts/JsonRpcErrorCode/JsonRpcErrorCode.js +2 -0
- package/src/parts/JsonRpcVersion/JsonRpcVersion.js +1 -0
- package/src/parts/OutputChannel/OutputChannel.ipc.js +3 -2
- package/src/parts/Terminal/Terminal.js +5 -4
- package/src/sharedProcessMain.js +2 -5
|
@@ -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
|
/**
|
|
@@ -69,19 +71,29 @@ export const TokenMap = {
|
|
|
69
71
|
|
|
70
72
|
const RE_WHITESPACE = /^\s+/
|
|
71
73
|
const RE_DOUBLE_QUOTE = /^"/
|
|
74
|
+
const RE_TRIPLE_DOUBLE_QUOTE = /^"{3}/
|
|
72
75
|
const RE_SINGLE_QUOTE = /^'/
|
|
73
76
|
const RE_TEXT = /^.+/
|
|
74
77
|
const RE_ANY_TEXT = /^[^\n]+/
|
|
75
|
-
const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"]+/
|
|
76
|
-
const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
|
|
78
|
+
const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"\\]+/
|
|
79
|
+
const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^'\\]+/
|
|
80
|
+
const RE_STRING_TRIPLE_DOUBLE_QUOTE_CONTENT = /^.+(?=""")/
|
|
77
81
|
const RE_LINE_COMMENT = /^#/
|
|
78
82
|
const RE_KEYWORD =
|
|
79
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/
|
|
80
84
|
const RE_VARIABLE_NAME = /^[_a-zA-Z][a-zA-Z\d_]*/
|
|
81
85
|
const RE_NUMERIC =
|
|
82
86
|
/^((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b/
|
|
83
|
-
const RE_PUNCTUATION = /^[\(\)\{\}:,\+\-\*&=\/\\\[\]
|
|
87
|
+
const RE_PUNCTUATION = /^[\(\)\{\}:,\+\-\*&=\/\\\[\]!\.<>%\|\~]+/
|
|
84
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/
|
|
85
97
|
|
|
86
98
|
export const initialLineState = {
|
|
87
99
|
state: State.TopLevelContent,
|
|
@@ -130,6 +142,14 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
130
142
|
case 'finally':
|
|
131
143
|
case 'while':
|
|
132
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':
|
|
133
153
|
token = TokenType.KeywordControl
|
|
134
154
|
break
|
|
135
155
|
default:
|
|
@@ -149,6 +169,15 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
149
169
|
} else if ((next = part.match(RE_NUMERIC))) {
|
|
150
170
|
token = TokenType.Numeric
|
|
151
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
|
|
152
181
|
} else if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
153
182
|
token = TokenType.PunctuationString
|
|
154
183
|
state = State.InsideDoubleQuoteString
|
|
@@ -158,6 +187,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
158
187
|
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
159
188
|
token = TokenType.Comment
|
|
160
189
|
state = State.InsideLineComment
|
|
190
|
+
} else if ((next = part.match(RE_DECORATOR))) {
|
|
191
|
+
token = TokenType.VariableName
|
|
192
|
+
state = State.TopLevelContent
|
|
161
193
|
} else if ((next = part.match(RE_TEXT))) {
|
|
162
194
|
token = TokenType.Text
|
|
163
195
|
state = State.TopLevelContent
|
|
@@ -173,6 +205,12 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
173
205
|
} else if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
174
206
|
token = TokenType.PunctuationString
|
|
175
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
|
|
176
214
|
} else {
|
|
177
215
|
throw new Error('no')
|
|
178
216
|
}
|
|
@@ -184,6 +222,49 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
184
222
|
} else if ((next = part.match(RE_SINGLE_QUOTE))) {
|
|
185
223
|
token = TokenType.PunctuationString
|
|
186
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
|
|
187
268
|
} else {
|
|
188
269
|
throw new Error('no')
|
|
189
270
|
}
|
|
@@ -209,3 +290,5 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
209
290
|
tokens,
|
|
210
291
|
}
|
|
211
292
|
}
|
|
293
|
+
|
|
294
|
+
tokenizeLine(`'''test'''`, initialLineState) //?
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Language Basics Ruby
|
|
2
|
+
|
|
3
|
+
## Contributing
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
git clone git@github.com:lvce-editor/language-basics-ruby.git &&
|
|
7
|
+
cd language-basics-ruby &&
|
|
8
|
+
npm ci &&
|
|
9
|
+
npm test
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Gitpod
|
|
13
|
+
|
|
14
|
+
[](https://gitpod.io/#https://github.com/lvce-editor/language-basics-ruby)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "builtin.language-basics-ruby",
|
|
3
|
+
"name": "Language Basics Ruby",
|
|
4
|
+
"description": "Provides syntax highlighting and bracket matching in Ruby files.",
|
|
5
|
+
"languages": [
|
|
6
|
+
{
|
|
7
|
+
"id": "ruby",
|
|
8
|
+
"extensions": [
|
|
9
|
+
".rb",
|
|
10
|
+
".rbx",
|
|
11
|
+
".rjs",
|
|
12
|
+
".gemspec",
|
|
13
|
+
".rake",
|
|
14
|
+
".ru",
|
|
15
|
+
".erb",
|
|
16
|
+
".podspec",
|
|
17
|
+
".rbi"
|
|
18
|
+
],
|
|
19
|
+
"fileNames": [
|
|
20
|
+
"rakefile",
|
|
21
|
+
"gemfile",
|
|
22
|
+
"guardfile",
|
|
23
|
+
"podfile",
|
|
24
|
+
"capfile",
|
|
25
|
+
"cheffile",
|
|
26
|
+
"hobofile",
|
|
27
|
+
"vagrantfile",
|
|
28
|
+
"appraisals",
|
|
29
|
+
"rantfile",
|
|
30
|
+
"berksfile",
|
|
31
|
+
"berksfile.lock",
|
|
32
|
+
"thorfile",
|
|
33
|
+
"puppetfile",
|
|
34
|
+
"dangerfile",
|
|
35
|
+
"brewfile",
|
|
36
|
+
"fastfile",
|
|
37
|
+
"appfile",
|
|
38
|
+
"deliverfile",
|
|
39
|
+
"matchfile",
|
|
40
|
+
"scanfile",
|
|
41
|
+
"snapfile",
|
|
42
|
+
"gymfile"
|
|
43
|
+
],
|
|
44
|
+
"firstLine": "^#!\\s*/.*\\bruby\\b",
|
|
45
|
+
"tokenize": "src/tokenizeRuby.js"
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @enum number
|
|
3
|
+
*/
|
|
4
|
+
export const State = {
|
|
5
|
+
TopLevelContent: 1,
|
|
6
|
+
InsideDoubleQuoteString: 2,
|
|
7
|
+
InsideSingleQuoteString: 3,
|
|
8
|
+
InsideBackTickQuoteString: 4,
|
|
9
|
+
InsideEof: 5,
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const StateMap = {
|
|
13
|
+
[State.TopLevelContent]: 'TopLevelContent',
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @enum number
|
|
18
|
+
*/
|
|
19
|
+
export const TokenType = {
|
|
20
|
+
None: 1,
|
|
21
|
+
Whitespace: 2,
|
|
22
|
+
PunctuationString: 3,
|
|
23
|
+
String: 4,
|
|
24
|
+
Keyword: 5,
|
|
25
|
+
Numeric: 6,
|
|
26
|
+
Punctuation: 7,
|
|
27
|
+
VariableName: 8,
|
|
28
|
+
Comment: 9,
|
|
29
|
+
KeywordControl: 10,
|
|
30
|
+
LanguageConstant: 11,
|
|
31
|
+
KeywordReturn: 12,
|
|
32
|
+
Regex: 13,
|
|
33
|
+
KeywordImport: 14,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const TokenMap = {
|
|
37
|
+
[TokenType.None]: 'None',
|
|
38
|
+
[TokenType.Whitespace]: 'Whitespace',
|
|
39
|
+
[TokenType.PunctuationString]: 'PunctuationString',
|
|
40
|
+
[TokenType.String]: 'String',
|
|
41
|
+
[TokenType.Keyword]: 'Keyword',
|
|
42
|
+
[TokenType.Numeric]: 'Numeric',
|
|
43
|
+
[TokenType.Punctuation]: 'Punctuation',
|
|
44
|
+
[TokenType.VariableName]: 'VariableName',
|
|
45
|
+
[TokenType.Comment]: 'Comment',
|
|
46
|
+
[TokenType.KeywordControl]: 'KeywordControl',
|
|
47
|
+
[TokenType.LanguageConstant]: 'LanguageConstant',
|
|
48
|
+
[TokenType.KeywordReturn]: 'KeywordReturn',
|
|
49
|
+
[TokenType.Regex]: 'Regex',
|
|
50
|
+
[TokenType.KeywordImport]: 'KeywordImport',
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const RE_SELECTOR = /^[\.a-zA-Z\d\-\:>]+/
|
|
54
|
+
const RE_WHITESPACE = /^ +/
|
|
55
|
+
const RE_CURLY_OPEN = /^\{/
|
|
56
|
+
const RE_CURLY_CLOSE = /^\}/
|
|
57
|
+
const RE_PROPERTY_NAME = /^[a-zA-Z\-]+\b/
|
|
58
|
+
const RE_COLON = /^:/
|
|
59
|
+
const RE_PROPERTY_VALUE = /^[^;\}]+/
|
|
60
|
+
const RE_SEMICOLON = /^;/
|
|
61
|
+
const RE_COMMA = /^,/
|
|
62
|
+
const RE_ANYTHING = /^.+/s
|
|
63
|
+
const RE_ANYTHING_UNTIL_CLOSE_BRACE = /^[^\}]+/
|
|
64
|
+
const RE_QUOTE_DOUBLE = /^"/
|
|
65
|
+
const RE_QUOTE_SINGLE = /^'/
|
|
66
|
+
const RE_QUOTE_BACKTICK = /^`/
|
|
67
|
+
const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"\\]+/
|
|
68
|
+
const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^'\\]+/
|
|
69
|
+
const RE_STRING_BACKTICK_QUOTE_CONTENT = /^[^`]+/
|
|
70
|
+
const RE_KEYWORD =
|
|
71
|
+
/^(?:alias|and|begin|break|case|class|def|defined\?|do|else|elsif|end|ensure|false|for|if|in|module|next|nil|not|or|redo|require|rescue|retry|return|self|super|then|true|undef|unless|until|when|while|yield)\b/
|
|
72
|
+
const RE_VARIABLE_NAME = /^[a-zA-Z\_\$]+/
|
|
73
|
+
const RE_PUNCTUATION = /^[:,;\{\}\[\]\.=\(\)<>\-\|\&\+\?\!\%\*\/\@\~]/
|
|
74
|
+
const RE_NUMERIC = /^\d+/
|
|
75
|
+
const RE_LINE_COMMENT = /^#.*/s
|
|
76
|
+
const RE_EOF_START = /^<<\-?\s*([\w\!]+)/
|
|
77
|
+
const RE_EOF_CONTENT = /.*/s
|
|
78
|
+
// const RE_REGEX = /^\/.+/
|
|
79
|
+
const RE_REGEX = /^\/.*\//
|
|
80
|
+
const RE_STRING_ESCAPE = /^\\./
|
|
81
|
+
|
|
82
|
+
export const initialLineState = {
|
|
83
|
+
state: State.TopLevelContent,
|
|
84
|
+
tokens: [],
|
|
85
|
+
stringEnd: '',
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export const isEqualLineState = (lineStateA, lineStateB) => {
|
|
89
|
+
return lineStateA.state === lineStateB.state
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export const hasArrayReturn = true
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* @param {string} line
|
|
96
|
+
*/
|
|
97
|
+
export const tokenizeLine = (line, lineState) => {
|
|
98
|
+
let next = null
|
|
99
|
+
let index = 0
|
|
100
|
+
let tokens = []
|
|
101
|
+
let token = TokenType.None
|
|
102
|
+
let state = lineState.state
|
|
103
|
+
let stringEnd = lineState.stringEnd
|
|
104
|
+
while (index < line.length) {
|
|
105
|
+
const part = line.slice(index)
|
|
106
|
+
switch (state) {
|
|
107
|
+
case State.TopLevelContent:
|
|
108
|
+
if ((next = part.match(RE_WHITESPACE))) {
|
|
109
|
+
token = TokenType.Whitespace
|
|
110
|
+
state = State.TopLevelContent
|
|
111
|
+
} else if ((next = part.match(RE_KEYWORD))) {
|
|
112
|
+
switch (next[0]) {
|
|
113
|
+
case 'break':
|
|
114
|
+
case 'case':
|
|
115
|
+
case 'do':
|
|
116
|
+
case 'elsif':
|
|
117
|
+
case 'else':
|
|
118
|
+
case 'for':
|
|
119
|
+
case 'if':
|
|
120
|
+
case 'in':
|
|
121
|
+
case 'then':
|
|
122
|
+
case 'while':
|
|
123
|
+
case 'end':
|
|
124
|
+
case 'begin':
|
|
125
|
+
case 'rescue':
|
|
126
|
+
case 'unless':
|
|
127
|
+
token = TokenType.KeywordControl
|
|
128
|
+
break
|
|
129
|
+
case 'true':
|
|
130
|
+
case 'false':
|
|
131
|
+
case 'nil':
|
|
132
|
+
token = TokenType.LanguageConstant
|
|
133
|
+
break
|
|
134
|
+
case 'return':
|
|
135
|
+
token = TokenType.KeywordReturn
|
|
136
|
+
break
|
|
137
|
+
case 'require':
|
|
138
|
+
token = TokenType.KeywordImport
|
|
139
|
+
break
|
|
140
|
+
default:
|
|
141
|
+
token = TokenType.Keyword
|
|
142
|
+
break
|
|
143
|
+
}
|
|
144
|
+
state = State.TopLevelContent
|
|
145
|
+
} else if ((next = part.match(RE_EOF_START))) {
|
|
146
|
+
token = TokenType.Punctuation
|
|
147
|
+
state = State.InsideEof
|
|
148
|
+
stringEnd = next[1]
|
|
149
|
+
} else if ((next = part.match(RE_REGEX))) {
|
|
150
|
+
token = TokenType.Regex
|
|
151
|
+
state = State.TopLevelContent
|
|
152
|
+
} else if ((next = part.match(RE_PUNCTUATION))) {
|
|
153
|
+
token = TokenType.Punctuation
|
|
154
|
+
state = State.TopLevelContent
|
|
155
|
+
} else if ((next = part.match(RE_VARIABLE_NAME))) {
|
|
156
|
+
token = TokenType.VariableName
|
|
157
|
+
state = State.TopLevelContent
|
|
158
|
+
} else if ((next = part.match(RE_NUMERIC))) {
|
|
159
|
+
token = TokenType.Numeric
|
|
160
|
+
state = State.TopLevelContent
|
|
161
|
+
} else if ((next = part.match(RE_QUOTE_DOUBLE))) {
|
|
162
|
+
token = TokenType.PunctuationString
|
|
163
|
+
state = State.InsideDoubleQuoteString
|
|
164
|
+
} else if ((next = part.match(RE_QUOTE_SINGLE))) {
|
|
165
|
+
token = TokenType.Punctuation
|
|
166
|
+
state = State.InsideSingleQuoteString
|
|
167
|
+
} else if ((next = part.match(RE_QUOTE_BACKTICK))) {
|
|
168
|
+
token = TokenType.Punctuation
|
|
169
|
+
state = State.InsideBackTickQuoteString
|
|
170
|
+
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
171
|
+
token = TokenType.Comment
|
|
172
|
+
state = State.TopLevelContent
|
|
173
|
+
} else {
|
|
174
|
+
console.log({ part })
|
|
175
|
+
part //?
|
|
176
|
+
throw new Error('no')
|
|
177
|
+
}
|
|
178
|
+
break
|
|
179
|
+
case State.InsideDoubleQuoteString:
|
|
180
|
+
if ((next = part.match(RE_QUOTE_DOUBLE))) {
|
|
181
|
+
token = TokenType.PunctuationString
|
|
182
|
+
state = State.TopLevelContent
|
|
183
|
+
} else if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
|
|
184
|
+
token = TokenType.String
|
|
185
|
+
state = State.InsideDoubleQuoteString
|
|
186
|
+
} else if ((next = part.match(RE_STRING_ESCAPE))) {
|
|
187
|
+
token = TokenType.String
|
|
188
|
+
state = State.InsideDoubleQuoteString
|
|
189
|
+
} else {
|
|
190
|
+
throw new Error('no')
|
|
191
|
+
}
|
|
192
|
+
break
|
|
193
|
+
case State.InsideSingleQuoteString:
|
|
194
|
+
if ((next = part.match(RE_QUOTE_SINGLE))) {
|
|
195
|
+
token = TokenType.PunctuationString
|
|
196
|
+
state = State.TopLevelContent
|
|
197
|
+
} else if ((next = part.match(RE_STRING_SINGLE_QUOTE_CONTENT))) {
|
|
198
|
+
token = TokenType.String
|
|
199
|
+
state = State.InsideSingleQuoteString
|
|
200
|
+
} else if ((next = part.match(RE_STRING_ESCAPE))) {
|
|
201
|
+
token = TokenType.String
|
|
202
|
+
state = State.InsideSingleQuoteString
|
|
203
|
+
} else {
|
|
204
|
+
throw new Error('no')
|
|
205
|
+
}
|
|
206
|
+
break
|
|
207
|
+
case State.InsideBackTickQuoteString:
|
|
208
|
+
if ((next = part.match(RE_QUOTE_BACKTICK))) {
|
|
209
|
+
token = TokenType.PunctuationString
|
|
210
|
+
state = State.TopLevelContent
|
|
211
|
+
} else if ((next = part.match(RE_STRING_BACKTICK_QUOTE_CONTENT))) {
|
|
212
|
+
token = TokenType.String
|
|
213
|
+
state = State.InsideBackTickQuoteString
|
|
214
|
+
} else {
|
|
215
|
+
throw new Error('no')
|
|
216
|
+
}
|
|
217
|
+
break
|
|
218
|
+
case State.InsideEof:
|
|
219
|
+
if ((next = part.match(stringEnd))) {
|
|
220
|
+
token = TokenType.Punctuation
|
|
221
|
+
state = State.TopLevelContent
|
|
222
|
+
} else if ((next = part.match(RE_EOF_CONTENT))) {
|
|
223
|
+
token = TokenType.String
|
|
224
|
+
state = State.InsideEof
|
|
225
|
+
} else {
|
|
226
|
+
throw new Error('no')
|
|
227
|
+
}
|
|
228
|
+
break
|
|
229
|
+
default:
|
|
230
|
+
throw new Error('no')
|
|
231
|
+
}
|
|
232
|
+
const tokenLength = next[0].length
|
|
233
|
+
index += tokenLength
|
|
234
|
+
tokens.push(token, tokenLength)
|
|
235
|
+
}
|
|
236
|
+
return {
|
|
237
|
+
state,
|
|
238
|
+
tokens,
|
|
239
|
+
stringEnd,
|
|
240
|
+
}
|
|
241
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Language Basics Scss
|
|
2
|
+
|
|
3
|
+
## Contributing
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
git clone git@github.com:lvce-editor/language-basics-scss.git &&
|
|
7
|
+
cd language-basics-scss &&
|
|
8
|
+
npm ci &&
|
|
9
|
+
npm test
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Gitpod
|
|
13
|
+
|
|
14
|
+
[](https://gitpod.io/#https://github.com/lvce-editor/language-basics-scss)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "builtin.language-basics-scss",
|
|
3
|
+
"name": "Language Basics Scss",
|
|
4
|
+
"description": "Provides syntax highlighting and bracket matching in Scss files.",
|
|
5
|
+
"languages": [
|
|
6
|
+
{
|
|
7
|
+
"id": "scss",
|
|
8
|
+
"extensions": [".scss"],
|
|
9
|
+
"tokenize": "src/tokenizeScss.js"
|
|
10
|
+
}
|
|
11
|
+
]
|
|
12
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @enum number
|
|
3
|
+
*/
|
|
4
|
+
export const TokenType = {
|
|
5
|
+
Text: 1,
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const TokenMap = {
|
|
9
|
+
[TokenType.Text]: 'Text',
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const initialLineState = {
|
|
13
|
+
state: 1,
|
|
14
|
+
tokens: [],
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const hasArrayReturn = true
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @param {string} line
|
|
21
|
+
*/
|
|
22
|
+
export const tokenizeLine = (line) => {
|
|
23
|
+
const tokens = [TokenType.Text, line.length]
|
|
24
|
+
return {
|
|
25
|
+
state: 1,
|
|
26
|
+
tokens,
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -46,7 +46,8 @@
|
|
|
46
46
|
"zprofile",
|
|
47
47
|
"zlogout",
|
|
48
48
|
"bashrc_Apple_Terminal",
|
|
49
|
-
"zshrc_Apple_Terminal"
|
|
49
|
+
"zshrc_Apple_Terminal",
|
|
50
|
+
"xvfb.init"
|
|
50
51
|
],
|
|
51
52
|
"firstLine": "^#!.*\\b(bash|fish|zsh|sh|ksh|dtksh|pdksh|mksh|ash|dash|yash|sh|csh|jcsh|tcsh|itcsh).*|^#\\s*-\\*-[^*]*mode:\\s*shell-script[^*]*-\\*-",
|
|
52
53
|
"tokenize": "src/tokenizeShellScript.js"
|