@lvce-editor/shared-process 0.11.9 → 0.11.11
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-python/src/tokenizePython.js +1 -1
- 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 +75 -23
- 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/index.js +4 -5
- package/package.json +6 -6
- 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/ErrorHandling/ErrorHandling.js +4 -9
- package/src/parts/ExportStatic/ExportStatic.js +58 -331
- 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
|
@@ -750,5 +750,30 @@
|
|
|
750
750
|
{
|
|
751
751
|
"key": "ctrl+\\",
|
|
752
752
|
"command": "Run And Debug.togglePause"
|
|
753
|
+
},
|
|
754
|
+
{
|
|
755
|
+
"key": "Enter",
|
|
756
|
+
"command": "Run And Debug.handleEvaluate",
|
|
757
|
+
"when": "focus.DebugInput"
|
|
758
|
+
},
|
|
759
|
+
{
|
|
760
|
+
"key": "ArrowLeft",
|
|
761
|
+
"command": "EditorImage.moveLeft",
|
|
762
|
+
"when": "focus.EditorImage"
|
|
763
|
+
},
|
|
764
|
+
{
|
|
765
|
+
"key": "ArrowRight",
|
|
766
|
+
"command": "EditorImage.moveRight",
|
|
767
|
+
"when": "focus.EditorImage"
|
|
768
|
+
},
|
|
769
|
+
{
|
|
770
|
+
"key": "ArrowUp",
|
|
771
|
+
"command": "EditorImage.moveUp",
|
|
772
|
+
"when": "focus.EditorImage"
|
|
773
|
+
},
|
|
774
|
+
{
|
|
775
|
+
"key": "ArrowDown",
|
|
776
|
+
"command": "EditorImage.moveDown",
|
|
777
|
+
"when": "focus.EditorImage"
|
|
753
778
|
}
|
|
754
779
|
]
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
"editor.fontFamily": "'Fira Code'",
|
|
8
8
|
"editor.lineHeight": 20,
|
|
9
9
|
"editor.formatOnSave": false,
|
|
10
|
+
"editor.letterSpacing": 0.5,
|
|
10
11
|
|
|
11
12
|
"extensions.autoUpdate": true,
|
|
12
13
|
|
|
@@ -37,11 +38,5 @@
|
|
|
37
38
|
|
|
38
39
|
"workspace.defaultWorkspace": "fetch:///playground",
|
|
39
40
|
|
|
40
|
-
"keyBindings.fallTroughBrowserView": [
|
|
41
|
-
"ctrl+p",
|
|
42
|
-
"ctrl+shift+p",
|
|
43
|
-
"ctrl+b",
|
|
44
|
-
"ctrl+m",
|
|
45
|
-
"ctrl+Tab"
|
|
46
|
-
]
|
|
41
|
+
"keyBindings.fallTroughBrowserView": ["ctrl+p", "ctrl+shift+p", "ctrl+b", "ctrl+m", "ctrl+Tab"]
|
|
47
42
|
}
|
|
@@ -1,14 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @enum number
|
|
3
|
+
*/
|
|
4
|
+
export const State = {
|
|
5
|
+
TopLevelContent: 1,
|
|
6
|
+
InsideDoubleQuoteString: 2,
|
|
7
|
+
InsideSingleQuoteString: 3,
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const StateMap = {
|
|
11
|
+
[State.TopLevelContent]: 'TopLevelContent',
|
|
12
|
+
}
|
|
13
|
+
|
|
1
14
|
/**
|
|
2
15
|
* @enum number
|
|
3
16
|
*/
|
|
4
17
|
export const TokenType = {
|
|
18
|
+
None: 0,
|
|
5
19
|
Text: 1,
|
|
20
|
+
Comment: 2,
|
|
21
|
+
Whitespace: 3,
|
|
22
|
+
VariableName: 4,
|
|
23
|
+
Punctuation: 5,
|
|
24
|
+
Numeric: 6,
|
|
25
|
+
String: 7,
|
|
26
|
+
LanguageConstant: 8,
|
|
27
|
+
Keyword: 9,
|
|
28
|
+
KeywordImport: 215,
|
|
29
|
+
KeywordControl: 881,
|
|
30
|
+
KeywordModifier: 882,
|
|
31
|
+
KeywordReturn: 883,
|
|
32
|
+
KeywordNew: 884,
|
|
33
|
+
FunctionName: 885,
|
|
34
|
+
KeywordThis: 886,
|
|
35
|
+
KeywordOperator: 887,
|
|
36
|
+
Regex: 888,
|
|
6
37
|
}
|
|
7
38
|
|
|
8
39
|
export const TokenMap = {
|
|
9
40
|
[TokenType.Text]: 'Text',
|
|
41
|
+
[TokenType.Comment]: 'Comment',
|
|
42
|
+
[TokenType.Whitespace]: 'Whitespace',
|
|
43
|
+
[TokenType.VariableName]: 'VariableName',
|
|
44
|
+
[TokenType.Punctuation]: 'Punctuation',
|
|
45
|
+
[TokenType.Numeric]: 'Numeric',
|
|
46
|
+
[TokenType.String]: 'String',
|
|
47
|
+
[TokenType.KeywordImport]: 'KeywordImport',
|
|
48
|
+
[TokenType.KeywordControl]: 'KeywordControl',
|
|
49
|
+
[TokenType.KeywordModifier]: 'KeywordModifier',
|
|
50
|
+
[TokenType.KeywordReturn]: 'KeywordReturn',
|
|
51
|
+
[TokenType.KeywordNew]: 'KeywordNew',
|
|
52
|
+
[TokenType.FunctionName]: 'Function',
|
|
53
|
+
[TokenType.KeywordThis]: 'KeywordThis',
|
|
54
|
+
[TokenType.KeywordOperator]: 'KeywordOperator',
|
|
55
|
+
[TokenType.LanguageConstant]: 'LanguageConstant',
|
|
56
|
+
[TokenType.Keyword]: 'Keyword',
|
|
57
|
+
[TokenType.Regex]: 'Regex',
|
|
10
58
|
}
|
|
11
59
|
|
|
60
|
+
const RE_LINE_COMMENT = /^#[^\n]*/
|
|
61
|
+
const RE_WHITESPACE = /^\s+/
|
|
62
|
+
const RE_VARIABLE_NAME = /^[\@a-zA-Z\_\$][a-zA-Z\_\/\-\$#\d\-]*/
|
|
63
|
+
const RE_PUNCTUATION = /^[:,;\{\}\[\]\.=\(\)<>\!\|\+\&\>\)\?]/
|
|
64
|
+
const RE_NUMERIC =
|
|
65
|
+
/^((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b/
|
|
66
|
+
const RE_STRING_ESCAPE = /^\\./
|
|
67
|
+
const RE_BACKSLASH_AT_END = /^\\$/
|
|
68
|
+
const RE_ANYTHING = /^.+/s
|
|
69
|
+
const RE_QUOTE_DOUBLE = /^"/
|
|
70
|
+
const RE_QUOTE_SINGLE = /^'/
|
|
71
|
+
const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"\\]+/
|
|
72
|
+
const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^'\\]+/
|
|
73
|
+
const RE_KEYWORD =
|
|
74
|
+
/^(?:and|arguments|async|await|break|by|case|catch|class|const|debugger|default|delete|do|else|enum|export|extends|false|finally|for|function|if|implements|import|in|Infinity|instanceof|interface|is|isnt|let|loop|NaN|native|new|no|not|null|of|off|on|or|package|private|protected|public|return|static|super|switch|then|this|throw|try|true|typeof|undefined|unless|var|void|when|while|with|yes)\b/
|
|
75
|
+
// copied from https://github.com/PrismJS/prism/blob/master/components/prism-javascript.js#L57
|
|
76
|
+
const RE_REGEX =
|
|
77
|
+
/^((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/
|
|
78
|
+
const RE_SLASH = /^\//
|
|
79
|
+
const RE_ANYTHING_UNTIL_END = /^.+/s
|
|
80
|
+
const RE_FUNCTION_CALL_NAME = /^[\@\w]+(?=\s*('|\=\s*function|\=\s*\(|\?\(|\())/
|
|
81
|
+
|
|
12
82
|
export const initialLineState = {
|
|
13
83
|
state: 1,
|
|
14
84
|
tokens: [],
|
|
@@ -18,11 +88,170 @@ export const hasArrayReturn = true
|
|
|
18
88
|
|
|
19
89
|
/**
|
|
20
90
|
* @param {string} line
|
|
91
|
+
* @param {any} lineState
|
|
21
92
|
*/
|
|
22
|
-
export const tokenizeLine = (line) => {
|
|
23
|
-
|
|
93
|
+
export const tokenizeLine = (line, lineState) => {
|
|
94
|
+
let next = null
|
|
95
|
+
let index = 0
|
|
96
|
+
let tokens = []
|
|
97
|
+
let token = TokenType.None
|
|
98
|
+
let state = lineState.state
|
|
99
|
+
while (index < line.length) {
|
|
100
|
+
const part = line.slice(index)
|
|
101
|
+
switch (state) {
|
|
102
|
+
case State.TopLevelContent:
|
|
103
|
+
if ((next = part.match(RE_WHITESPACE))) {
|
|
104
|
+
token = TokenType.Whitespace
|
|
105
|
+
state = State.TopLevelContent
|
|
106
|
+
} else if ((next = part.match(RE_KEYWORD))) {
|
|
107
|
+
switch (next[0]) {
|
|
108
|
+
case 'true':
|
|
109
|
+
case 'false':
|
|
110
|
+
case 'null':
|
|
111
|
+
case 'on':
|
|
112
|
+
case 'off':
|
|
113
|
+
case 'yes':
|
|
114
|
+
case 'no':
|
|
115
|
+
case 'undefined':
|
|
116
|
+
token = TokenType.LanguageConstant
|
|
117
|
+
break
|
|
118
|
+
case 'import':
|
|
119
|
+
case 'export':
|
|
120
|
+
case 'from':
|
|
121
|
+
token = TokenType.KeywordImport
|
|
122
|
+
break
|
|
123
|
+
case 'as':
|
|
124
|
+
case 'switch':
|
|
125
|
+
case 'default':
|
|
126
|
+
case 'case':
|
|
127
|
+
case 'else':
|
|
128
|
+
case 'then':
|
|
129
|
+
case 'if':
|
|
130
|
+
case 'break':
|
|
131
|
+
case 'throw':
|
|
132
|
+
case 'for':
|
|
133
|
+
case 'try':
|
|
134
|
+
case 'catch':
|
|
135
|
+
case 'finally':
|
|
136
|
+
case 'while':
|
|
137
|
+
case 'when':
|
|
138
|
+
case 'unless':
|
|
139
|
+
token = TokenType.KeywordControl
|
|
140
|
+
break
|
|
141
|
+
case 'async':
|
|
142
|
+
case 'await':
|
|
143
|
+
token = TokenType.KeywordModifier
|
|
144
|
+
break
|
|
145
|
+
case 'return':
|
|
146
|
+
token = TokenType.KeywordReturn
|
|
147
|
+
break
|
|
148
|
+
case 'new':
|
|
149
|
+
token = TokenType.KeywordNew
|
|
150
|
+
break
|
|
151
|
+
case 'this':
|
|
152
|
+
token = TokenType.KeywordThis
|
|
153
|
+
break
|
|
154
|
+
case 'delete':
|
|
155
|
+
case 'typeof':
|
|
156
|
+
case 'in':
|
|
157
|
+
case 'instanceof':
|
|
158
|
+
case 'and':
|
|
159
|
+
case 'is':
|
|
160
|
+
case 'isnt':
|
|
161
|
+
token = TokenType.KeywordOperator
|
|
162
|
+
break
|
|
163
|
+
case 'Infinity':
|
|
164
|
+
token = TokenType.Numeric
|
|
165
|
+
break
|
|
166
|
+
default:
|
|
167
|
+
token = TokenType.Keyword
|
|
168
|
+
break
|
|
169
|
+
}
|
|
170
|
+
state = State.TopLevelContent
|
|
171
|
+
} else if ((next = part.match(RE_PUNCTUATION))) {
|
|
172
|
+
token = TokenType.Punctuation
|
|
173
|
+
state = State.TopLevelContent
|
|
174
|
+
} else if ((next = part.match(RE_FUNCTION_CALL_NAME))) {
|
|
175
|
+
token = TokenType.FunctionName
|
|
176
|
+
state = State.TopLevelContent
|
|
177
|
+
} else if ((next = part.match(RE_VARIABLE_NAME))) {
|
|
178
|
+
token = TokenType.VariableName
|
|
179
|
+
state = State.TopLevelContent
|
|
180
|
+
} else if ((next = part.match(RE_NUMERIC))) {
|
|
181
|
+
token = TokenType.Numeric
|
|
182
|
+
state = State.TopLevelContent
|
|
183
|
+
} else if ((next = part.match(RE_SLASH))) {
|
|
184
|
+
if ((next = part.match(RE_REGEX))) {
|
|
185
|
+
token = TokenType.Regex
|
|
186
|
+
state = State.TopLevelContent
|
|
187
|
+
} else {
|
|
188
|
+
next = part.match(RE_SLASH)
|
|
189
|
+
token = TokenType.Punctuation
|
|
190
|
+
state = State.TopLevelContent
|
|
191
|
+
}
|
|
192
|
+
} else if ((next = part.match(RE_QUOTE_DOUBLE))) {
|
|
193
|
+
token = TokenType.Punctuation
|
|
194
|
+
state = State.InsideDoubleQuoteString
|
|
195
|
+
} else if ((next = part.match(RE_QUOTE_SINGLE))) {
|
|
196
|
+
token = TokenType.Punctuation
|
|
197
|
+
state = State.InsideSingleQuoteString
|
|
198
|
+
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
199
|
+
token = TokenType.Comment
|
|
200
|
+
state = State.TopLevelContent
|
|
201
|
+
} else if ((next = part.match(RE_NUMERIC))) {
|
|
202
|
+
token = TokenType.Numeric
|
|
203
|
+
state = State.TopLevelContent
|
|
204
|
+
} else if ((next = part.match(RE_ANYTHING))) {
|
|
205
|
+
token = TokenType.Text
|
|
206
|
+
state = State.TopLevelContent
|
|
207
|
+
} else {
|
|
208
|
+
part //?
|
|
209
|
+
throw new Error('no')
|
|
210
|
+
}
|
|
211
|
+
break
|
|
212
|
+
case State.InsideDoubleQuoteString:
|
|
213
|
+
if ((next = part.match(RE_QUOTE_DOUBLE))) {
|
|
214
|
+
token = TokenType.Punctuation
|
|
215
|
+
state = State.TopLevelContent
|
|
216
|
+
} else if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
|
|
217
|
+
token = TokenType.String
|
|
218
|
+
state = State.InsideDoubleQuoteString
|
|
219
|
+
} else if ((next = part.match(RE_STRING_ESCAPE))) {
|
|
220
|
+
token = TokenType.String
|
|
221
|
+
state = State.InsideDoubleQuoteString
|
|
222
|
+
} else if ((next = part.match(RE_BACKSLASH_AT_END))) {
|
|
223
|
+
token = TokenType.String
|
|
224
|
+
state = State.InsideDoubleQuoteString
|
|
225
|
+
} else {
|
|
226
|
+
throw new Error('no')
|
|
227
|
+
}
|
|
228
|
+
break
|
|
229
|
+
case State.InsideSingleQuoteString:
|
|
230
|
+
if ((next = part.match(RE_QUOTE_SINGLE))) {
|
|
231
|
+
token = TokenType.Punctuation
|
|
232
|
+
state = State.TopLevelContent
|
|
233
|
+
} else if ((next = part.match(RE_STRING_SINGLE_QUOTE_CONTENT))) {
|
|
234
|
+
token = TokenType.String
|
|
235
|
+
state = State.InsideSingleQuoteString
|
|
236
|
+
} else if ((next = part.match(RE_STRING_ESCAPE))) {
|
|
237
|
+
token = TokenType.String
|
|
238
|
+
state = State.InsideSingleQuoteString
|
|
239
|
+
} else if ((next = part.match(RE_BACKSLASH_AT_END))) {
|
|
240
|
+
token = TokenType.String
|
|
241
|
+
state = State.InsideSingleQuoteString
|
|
242
|
+
} else {
|
|
243
|
+
throw new Error('no')
|
|
244
|
+
}
|
|
245
|
+
break
|
|
246
|
+
default:
|
|
247
|
+
throw new Error('no')
|
|
248
|
+
}
|
|
249
|
+
const tokenLength = next[0].length
|
|
250
|
+
index += tokenLength
|
|
251
|
+
tokens.push(token, tokenLength)
|
|
252
|
+
}
|
|
24
253
|
return {
|
|
25
|
-
state
|
|
254
|
+
state,
|
|
26
255
|
tokens,
|
|
27
256
|
}
|
|
28
257
|
}
|
|
@@ -161,6 +161,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
161
161
|
} else if ((next = part.match(RE_PUNCTUATION))) {
|
|
162
162
|
token = TokenType.Punctuation
|
|
163
163
|
state = State.TopLevelContent
|
|
164
|
+
} else if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
165
|
+
token = TokenType.Punctuation
|
|
166
|
+
state = State.InsideDoubleQuoteString
|
|
164
167
|
} else if ((next = part.match(RE_TEXT))) {
|
|
165
168
|
token = TokenType.Text
|
|
166
169
|
state = State.TopLevelContent
|
|
@@ -230,6 +233,17 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
230
233
|
throw new Error('no')
|
|
231
234
|
}
|
|
232
235
|
break
|
|
236
|
+
case State.InsideDoubleQuoteString:
|
|
237
|
+
if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
|
|
238
|
+
token = TokenType.String
|
|
239
|
+
state = State.InsideDoubleQuoteString
|
|
240
|
+
} else if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
241
|
+
token = TokenType.Punctuation
|
|
242
|
+
state = State.TopLevelContent
|
|
243
|
+
} else {
|
|
244
|
+
throw new Error('no')
|
|
245
|
+
}
|
|
246
|
+
break
|
|
233
247
|
default:
|
|
234
248
|
state
|
|
235
249
|
throw new Error('no')
|
|
@@ -341,6 +341,14 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
341
341
|
} else if ((next = part.match(RE_FUNCTION))) {
|
|
342
342
|
token = TokenType.FuntionName
|
|
343
343
|
state = State.AfterFunctionName
|
|
344
|
+
} else if ((next = part.match(RE_SINGLE_QUOTE))) {
|
|
345
|
+
token = TokenType.Punctuation
|
|
346
|
+
state = State.InsideSingleQuoteString
|
|
347
|
+
stack.push(State.AfterPropertyNameAfterColon)
|
|
348
|
+
} else if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
349
|
+
token = TokenType.Punctuation
|
|
350
|
+
state = State.InsideDoubleQuoteString
|
|
351
|
+
stack.push(State.AfterPropertyNameAfterColon)
|
|
344
352
|
} else if ((next = part.match(RE_PROPERTY_VALUE_SHORT))) {
|
|
345
353
|
token = TokenType.CssPropertyValue
|
|
346
354
|
state = State.AfterPropertyNameAfterColon
|
|
@@ -20,6 +20,7 @@ const State = {
|
|
|
20
20
|
InsideSingleQuoteString: 15,
|
|
21
21
|
InsideDoubleQuoteString: 16,
|
|
22
22
|
InsideBacktickString: 17,
|
|
23
|
+
AfterPropertyDot: 18,
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
/**
|
|
@@ -50,6 +51,7 @@ export const TokenType = {
|
|
|
50
51
|
KeywordNew: 884,
|
|
51
52
|
FunctionName: 885,
|
|
52
53
|
KeywordThis: 886,
|
|
54
|
+
KeywordOperator: 887,
|
|
53
55
|
}
|
|
54
56
|
|
|
55
57
|
export const TokenMap = {
|
|
@@ -77,6 +79,7 @@ export const TokenMap = {
|
|
|
77
79
|
[TokenType.KeywordNew]: 'KeywordNew',
|
|
78
80
|
[TokenType.FunctionName]: 'Function',
|
|
79
81
|
[TokenType.KeywordThis]: 'KeywordThis',
|
|
82
|
+
[TokenType.KeywordOperator]: 'KeywordOperator',
|
|
80
83
|
}
|
|
81
84
|
|
|
82
85
|
const RE_KEYWORD =
|
|
@@ -119,11 +122,14 @@ const RE_STRING_BACKTICK_QUOTE_CONTENT = /^[^`\\]+/
|
|
|
119
122
|
const RE_STRING_ESCAPE = /^\\./
|
|
120
123
|
const RE_SHEBANG = /^#!.*/
|
|
121
124
|
const RE_FUNCTION_CALL_NAME = /^[\w]+(?=\s*(\(|\=\s*function|\=\s*\())/
|
|
125
|
+
const RE_DECORATOR = /^@\w+/
|
|
122
126
|
|
|
123
127
|
// copied from https://github.com/PrismJS/prism/blob/master/components/prism-javascript.js#L57
|
|
124
128
|
const RE_REGEX =
|
|
125
129
|
/^((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/
|
|
126
130
|
|
|
131
|
+
const RE_VARIABLE_NAME_SPECIAL = /\p{L}/u
|
|
132
|
+
|
|
127
133
|
export const initialLineState = {
|
|
128
134
|
state: State.TopLevelContent,
|
|
129
135
|
}
|
|
@@ -174,6 +180,7 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
174
180
|
case 'catch':
|
|
175
181
|
case 'finally':
|
|
176
182
|
case 'continue':
|
|
183
|
+
case 'while':
|
|
177
184
|
token = TokenType.KeywordControl
|
|
178
185
|
break
|
|
179
186
|
case 'async':
|
|
@@ -189,6 +196,11 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
189
196
|
case 'this':
|
|
190
197
|
token = TokenType.KeywordThis
|
|
191
198
|
break
|
|
199
|
+
case 'delete':
|
|
200
|
+
case 'typeof':
|
|
201
|
+
case 'in':
|
|
202
|
+
token = TokenType.KeywordOperator
|
|
203
|
+
break
|
|
192
204
|
default:
|
|
193
205
|
token = TokenType.Keyword
|
|
194
206
|
break
|
|
@@ -205,17 +217,21 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
205
217
|
state = State.TopLevelContent
|
|
206
218
|
} else if ((next = part.match(RE_PUNCTUATION))) {
|
|
207
219
|
token = TokenType.Punctuation
|
|
208
|
-
|
|
220
|
+
if (next[0] === '.') {
|
|
221
|
+
state = State.AfterPropertyDot
|
|
222
|
+
} else {
|
|
223
|
+
state = State.TopLevelContent
|
|
224
|
+
}
|
|
209
225
|
} else if ((next = part.match(RE_SLASH))) {
|
|
210
226
|
if ((next = part.match(RE_BLOCK_COMMENT_START))) {
|
|
211
227
|
token = TokenType.Comment
|
|
212
228
|
state = State.InsideBlockComment
|
|
213
|
-
} else if ((next = part.match(RE_REGEX))) {
|
|
214
|
-
token = TokenType.Regex
|
|
215
|
-
state = State.TopLevelContent
|
|
216
229
|
} else if ((next = part.match(RE_LINE_COMMENT_START))) {
|
|
217
230
|
token = TokenType.Comment
|
|
218
231
|
state = State.InsideLineComment
|
|
232
|
+
} else if ((next = part.match(RE_REGEX))) {
|
|
233
|
+
token = TokenType.Regex
|
|
234
|
+
state = State.TopLevelContent
|
|
219
235
|
} else {
|
|
220
236
|
next = part.match(RE_SLASH)
|
|
221
237
|
token = TokenType.Punctuation
|
|
@@ -236,6 +252,12 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
236
252
|
} else if ((next = part.match(RE_SHEBANG))) {
|
|
237
253
|
token = TokenType.Comment
|
|
238
254
|
state = State.TopLevelContent
|
|
255
|
+
} else if ((next = part.match(RE_DECORATOR))) {
|
|
256
|
+
token = TokenType.VariableName
|
|
257
|
+
state = State.TopLevelContent
|
|
258
|
+
} else if ((next = part.match(RE_VARIABLE_NAME_SPECIAL))) {
|
|
259
|
+
token = TokenType.VariableName
|
|
260
|
+
state = State.TopLevelContent
|
|
239
261
|
} else {
|
|
240
262
|
throw new Error('no')
|
|
241
263
|
}
|
|
@@ -316,6 +338,29 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
316
338
|
throw new Error('no')
|
|
317
339
|
}
|
|
318
340
|
break
|
|
341
|
+
case State.AfterPropertyDot:
|
|
342
|
+
if ((next = part.match(RE_WHITESPACE))) {
|
|
343
|
+
token = TokenType.Whitespace
|
|
344
|
+
state = State.AfterPropertyDot
|
|
345
|
+
} else if ((next = part.match(RE_FUNCTION_CALL_NAME))) {
|
|
346
|
+
token = TokenType.FunctionName
|
|
347
|
+
state = State.TopLevelContent
|
|
348
|
+
} else if ((next = part.match(RE_VARIABLE_NAME))) {
|
|
349
|
+
token = TokenType.VariableName
|
|
350
|
+
state = State.TopLevelContent
|
|
351
|
+
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
352
|
+
token = TokenType.Comment
|
|
353
|
+
state = State.InsideLineComment
|
|
354
|
+
} else if ((next = part.match(RE_BLOCK_COMMENT_START))) {
|
|
355
|
+
token = TokenType.Comment
|
|
356
|
+
state = State.InsideBlockComment
|
|
357
|
+
} else if ((next = part.match(RE_PUNCTUATION))) {
|
|
358
|
+
token = TokenType.Punctuation
|
|
359
|
+
state = State.TopLevelContent
|
|
360
|
+
} else {
|
|
361
|
+
throw new Error('no')
|
|
362
|
+
}
|
|
363
|
+
break
|
|
319
364
|
default:
|
|
320
365
|
state
|
|
321
366
|
throw new Error('no')
|
|
@@ -324,6 +369,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
324
369
|
index += tokenLength
|
|
325
370
|
tokens.push(token, tokenLength)
|
|
326
371
|
}
|
|
372
|
+
if (state === State.InsideLineComment) {
|
|
373
|
+
state = State.TopLevelContent
|
|
374
|
+
}
|
|
327
375
|
return {
|
|
328
376
|
state,
|
|
329
377
|
tokens,
|
|
@@ -84,7 +84,7 @@ const RE_KEYWORD =
|
|
|
84
84
|
const RE_VARIABLE_NAME = /^[_a-zA-Z][a-zA-Z\d_]*/
|
|
85
85
|
const RE_NUMERIC =
|
|
86
86
|
/^((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b/
|
|
87
|
-
const RE_PUNCTUATION = /^[\(\)\{\}:,\+\-\*&=\/\\\[\]
|
|
87
|
+
const RE_PUNCTUATION = /^[\(\)\{\}:,\+\-\*&=\/\\\[\]!\.<>%\|\~]+/
|
|
88
88
|
const RE_FUNCTION_CALL_NAME = /^[\w]+(?=\s*\()/
|
|
89
89
|
const RE_DECORATOR = /^@[\w]+/
|
|
90
90
|
const RE_TRIPLE_QUOTED_STRING_CONTENT_DOUBLE_QUOTES = /.*(?=""")/s
|
|
@@ -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
|
+
}
|