@lvce-editor/shared-process 0.11.12 → 0.12.1
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 +5 -0
- package/config/defaultSettings.json +4 -0
- package/config/fileMap.json +1 -2
- package/extensions/builtin.language-basics-css/README.md +2 -0
- package/extensions/builtin.language-basics-css/src/tokenizeCss.js +7 -0
- package/extensions/builtin.language-basics-dotenv/extension.json +7 -1
- package/extensions/builtin.language-basics-graphql/extension.json +1 -1
- package/extensions/builtin.language-basics-graphql/src/tokenizeGraphql.js +408 -4
- package/extensions/builtin.language-basics-html/src/tokenizeHtml.js +99 -4
- package/extensions/builtin.language-basics-javascript/src/tokenizeJavaScript.js +61 -2
- package/extensions/builtin.language-basics-json/extension.json +6 -1
- package/extensions/builtin.language-basics-json/src/tokenizeJson.js +27 -0
- package/extensions/builtin.language-basics-jsx/README.md +14 -0
- package/extensions/builtin.language-basics-jsx/extension.json +13 -0
- package/extensions/builtin.language-basics-jsx/src/tokenizeJsx.js +648 -0
- package/extensions/builtin.language-basics-julia/src/tokenizeJulia.js +52 -1
- package/extensions/builtin.language-basics-markdown/src/tokenizeMarkdown.js +105 -2
- package/extensions/builtin.language-basics-mdx/README.md +14 -0
- package/extensions/builtin.language-basics-mdx/extension.json +12 -0
- package/extensions/builtin.language-basics-mdx/src/tokenizeMdx.js +395 -0
- package/extensions/builtin.language-basics-shellscript/src/tokenizeShellScript.js +38 -15
- package/extensions/builtin.language-basics-toml/src/tokenizeToml.js +29 -1
- package/extensions/builtin.language-basics-typescript/extension.json +1 -1
- package/extensions/builtin.language-basics-typescript/src/tokenizeTypeScript.js +177 -11
- package/extensions/builtin.language-basics-vue/README.md +14 -0
- package/extensions/builtin.language-basics-vue/extension.json +13 -0
- package/extensions/builtin.language-basics-vue/src/tokenizeVue.js +327 -0
- package/extensions/builtin.language-basics-xml/extension.json +3 -2
- package/extensions/builtin.language-basics-xml/src/tokenizeXml.js +26 -3
- package/extensions/builtin.language-basics-yaml/src/tokenizeYaml.js +9 -2
- package/extensions/builtin.theme-atom-one-dark/color-theme.json +20 -0
- package/extensions/builtin.theme-ayu/color-theme.json +10 -1
- package/extensions/builtin.theme-cobalt2/color-theme.json +20 -0
- package/extensions/builtin.theme-gruvbox/color-theme.json +20 -0
- package/extensions/builtin.theme-noctis-uva/color-theme.json +20 -0
- package/extensions/builtin.theme-palenight/color-theme.json +8 -0
- package/extensions/builtin.theme-slime/color-theme.json +16 -0
- package/extensions/builtin.vscode-icons/icon-theme.json +40 -2
- package/extensions/builtin.vscode-icons/icons/file_type_bazel_ignore.svg +1 -0
- package/extensions/builtin.vscode-icons/icons/file_type_bazel_version.svg +1 -0
- package/extensions/builtin.vscode-icons/icons/file_type_eleventy.svg +1 -0
- package/extensions/builtin.vscode-icons/icons/file_type_eleventy2.svg +1 -0
- package/extensions/builtin.vscode-icons/icons/file_type_light_eleventy.svg +1 -0
- package/extensions/builtin.vscode-icons/icons/file_type_light_eleventy2.svg +1 -0
- package/extensions/builtin.vscode-icons/icons/file_type_light_rome.svg +1 -0
- package/extensions/builtin.vscode-icons/icons/file_type_light_tree.svg +1 -0
- package/extensions/builtin.vscode-icons/icons/file_type_mondoo.svg +1 -0
- package/extensions/builtin.vscode-icons/icons/file_type_nuxt.svg +1 -1
- package/extensions/builtin.vscode-icons/icons/file_type_rome.svg +1 -0
- package/extensions/builtin.vscode-icons/icons/file_type_sapphire_framework_cli.svg +1 -0
- package/extensions/builtin.vscode-icons/icons/file_type_shellcheck.svg +91 -0
- package/extensions/builtin.vscode-icons/icons/file_type_shuttle.svg +1 -0
- package/extensions/builtin.vscode-icons/icons/file_type_tree.svg +1 -0
- package/extensions/builtin.vscode-icons/icons/folder_type_nuxt.svg +1 -1
- package/extensions/builtin.vscode-icons/icons/folder_type_nuxt_opened.svg +1 -1
- package/package.json +9 -8
- package/src/parts/CleanStack/CleanStack.js +5 -0
- package/src/parts/Cli/Cli.js +5 -4
- package/src/parts/CliCommandType/CliCommandType.js +10 -0
- package/src/parts/CliInstall/CliInstall.js +3 -2
- package/src/parts/CliLink/CliLink.js +3 -2
- package/src/parts/CliList/CliList.js +3 -1
- package/src/parts/ClipBoard/ClipBoard.js +3 -2
- package/src/parts/ClipBoard/ClipBoardGnome.js +15 -31
- package/src/parts/CommandNotFoundError/CommandNotFoundError.js +9 -0
- package/src/parts/DesktopType/DesktopType.js +3 -0
- package/src/parts/Download/Download.js +1 -1
- package/src/parts/DownloadAndExtract/DownloadAndExtract.js +2 -2
- package/src/parts/Error/FileSystemError.js +1 -1
- package/src/parts/ErrorCodes/ErrorCodes.js +2 -0
- package/src/parts/ErrorHandling/ErrorHandling.js +4 -3
- package/src/parts/ExecCommand/ExecCommand.js +25 -0
- package/src/parts/ExecPromise/ExecPromise.js +4 -0
- package/src/parts/ExitCode/ExitCode.js +5 -0
- package/src/parts/ExportStatic/ExportStatic.js +2 -2
- package/src/parts/ExtensionHost/ExtensionHost.ipc.js +0 -1
- package/src/parts/ExtensionHost/ExtensionHost.js +1 -1
- package/src/parts/ExtensionHostIpc/ExtensionHostIpcWithChildProcess.js +3 -8
- package/src/parts/ExtensionHostIpc/ExtensionHostIpcWithWorker.js +3 -7
- package/src/parts/ExtensionInstallFromFile/ExtensionInstallFromFile.js +2 -5
- package/src/parts/ExtensionInstallFromGitHub/ExtensionInstallFromGitHub.js +1 -1
- package/src/parts/ExtensionInstallFromUrl/ExtensionInstallFromUrl.js +3 -3
- package/src/parts/ExtensionLink/ExtensionLink.js +19 -0
- package/src/parts/ExtensionManagement/ExtensionManagement.ipc.js +1 -1
- package/src/parts/ExtensionManagement/ExtensionManagementColorTheme.js +3 -2
- package/src/parts/ExtensionManagement/ExtensionManagementLanguages.js +7 -14
- package/src/parts/ExtensionManifest/ExtensionManifest.js +14 -4
- package/src/parts/ExtractZip/ExtractZip.js +1 -1
- package/src/parts/FileSystem/FileSystem.js +0 -1
- package/src/parts/GetResponse/GetResponse.js +2 -1
- package/src/parts/GitLsFiles/GitLsFiles.ipc.js +2 -0
- package/src/parts/GitLsFiles/GitLsFiles.js +21 -5
- package/src/parts/Hash/Hash.js +7 -0
- package/src/parts/IpcChild/IpcChild.js +6 -0
- package/src/parts/IpcChildModule/IpcChildModule.js +12 -0
- package/src/parts/IpcChildType/IpcChildType.js +13 -0
- package/src/parts/IpcChildWithNodeForkedProcess/IpcChildWithNodeForkedProcess.js +19 -0
- package/src/parts/IpcChildWithNodeWorker/IpcChildWithNodeWorker.js +27 -0
- package/src/parts/MergeStacks/MergeStacks.js +19 -0
- package/src/parts/ModuleMap/ModuleMap.js +4 -1
- package/src/parts/NormalizeErrorLine/NormalizeErrorLine.js +9 -0
- package/src/parts/OutputChannel/OutputChannel.ipc.js +1 -1
- package/src/parts/ParentIpc/ParentIpc.js +6 -10
- package/src/parts/ParseInt/ParseInt.js +3 -0
- package/src/parts/Platform/Platform.js +16 -21
- package/src/parts/Preferences/Preferences.js +2 -1
- package/src/parts/PrettyError/PrettyError.js +12 -23
- package/src/parts/PrintPrettyError/PrintPrettyError.js +3 -0
- package/src/parts/Process/Process.js +2 -2
- package/src/parts/ProtocolType/ProtocolType.js +3 -0
- package/src/parts/RecentlyOpened/RecentlyOpened.js +1 -1
- package/src/parts/Stats/Stats.js +8 -11
- package/src/parts/SymLink/SymLink.js +2 -14
- package/src/parts/TextDocument/TextDocument.js +3 -1
- package/src/parts/VError/VError.js +5 -22
|
@@ -15,6 +15,8 @@ const State = {
|
|
|
15
15
|
None: 11,
|
|
16
16
|
InsideDoubleQuoteString: 12,
|
|
17
17
|
InsideSingleQuoteString: 13,
|
|
18
|
+
InsideScriptContent: 14,
|
|
19
|
+
InsideStyleContent: 15,
|
|
18
20
|
}
|
|
19
21
|
|
|
20
22
|
export const StateMap = {}
|
|
@@ -36,6 +38,7 @@ export const TokenType = {
|
|
|
36
38
|
Error: 141,
|
|
37
39
|
PunctuationString: 11,
|
|
38
40
|
NewLine: 891,
|
|
41
|
+
Embedded: 999,
|
|
39
42
|
}
|
|
40
43
|
|
|
41
44
|
export const TokenMap = {
|
|
@@ -51,18 +54,20 @@ export const TokenMap = {
|
|
|
51
54
|
[TokenType.Punctuation]: 'Punctuation',
|
|
52
55
|
[TokenType.Error]: 'Error',
|
|
53
56
|
[TokenType.PunctuationString]: 'PunctuationString',
|
|
57
|
+
[TokenType.Embedded]: 'Embedded',
|
|
54
58
|
}
|
|
55
59
|
|
|
56
60
|
const RE_ANGLE_BRACKET_CLOSE = /^>/
|
|
57
61
|
const RE_ANGLE_BRACKET_ONLY = /^</
|
|
58
62
|
const RE_ANGLE_BRACKET_OPEN = /^</
|
|
59
|
-
const RE_ANGLE_BRACKET_OPEN_TAG = /^<(
|
|
63
|
+
const RE_ANGLE_BRACKET_OPEN_TAG = /^<(?![\s!\%])/
|
|
60
64
|
const RE_ANY_TEXT = /^[^\n]+/
|
|
61
|
-
const RE_ATTRIBUTE_NAME = /^[a-zA-Z\d
|
|
65
|
+
const RE_ATTRIBUTE_NAME = /^[a-zA-Z\d\-\:]+/
|
|
62
66
|
const RE_BLOCK_COMMENT_CONTENT_1 = /^.+?(?=-->)/s
|
|
63
67
|
const RE_BLOCK_COMMENT_CONTENT_2 = /^.+$/s
|
|
64
68
|
const RE_BLOCK_COMMENT_END = /^-->/
|
|
65
69
|
const RE_BLOCK_COMMENT_START = /^<!--/
|
|
70
|
+
const RE_DOCTYPE = /^<!(?=\w)/
|
|
66
71
|
const RE_DASH_DASH = /^\-\-/
|
|
67
72
|
const RE_DOUBLE_QUOTE = /^"/
|
|
68
73
|
const RE_EQUAL_SIGN = /^=/
|
|
@@ -80,14 +85,24 @@ const RE_SLASH = /^\//
|
|
|
80
85
|
const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"]+/
|
|
81
86
|
const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
|
|
82
87
|
const RE_TAG_TEXT = /^[^\s>]+/
|
|
83
|
-
const RE_TAGNAME = /^[!\w]+/
|
|
88
|
+
const RE_TAGNAME = /^[!\w\:]+/
|
|
84
89
|
const RE_TEXT = /^[^<>\n]+/
|
|
85
90
|
const RE_WHITESPACE = /^\s+/
|
|
86
91
|
const RE_WORD = /^[^\s]+/
|
|
87
|
-
const RE_ATTRIBUTE_VALUE_UNQUOTED = /^[
|
|
92
|
+
const RE_ATTRIBUTE_VALUE_UNQUOTED = /^[^<>\s]+/
|
|
93
|
+
const RE_SCRIPT_CONTENT = /^..*?(?=(?:<\/script)|$)/s
|
|
94
|
+
const RE_SCRIPT_CONTENT_END = /^<\/script/
|
|
95
|
+
const RE_STYLE_CONTENT = /^..*?(?=(?:<\/style)|$)/s
|
|
96
|
+
const RE_STYLE_CONTENT_END = /^<\/style/
|
|
88
97
|
|
|
89
98
|
export const initialLineState = {
|
|
90
99
|
state: State.TopLevelContent,
|
|
100
|
+
tag: '',
|
|
101
|
+
stack: [],
|
|
102
|
+
embeddedLanguage: '',
|
|
103
|
+
embeddedLanguageStart: 0,
|
|
104
|
+
embeddedLanguageEnd: 0,
|
|
105
|
+
embeddedState: undefined,
|
|
91
106
|
}
|
|
92
107
|
|
|
93
108
|
/**
|
|
@@ -102,6 +117,14 @@ export const isLineStateEqual = (lineStateA, lineStateB) => {
|
|
|
102
117
|
|
|
103
118
|
export const hasArrayReturn = true
|
|
104
119
|
|
|
120
|
+
const getEmbeddedScriptLanguageId = () => {
|
|
121
|
+
return 'javascript'
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const getEmbeddedStyleLanguageId = () => {
|
|
125
|
+
return 'css'
|
|
126
|
+
}
|
|
127
|
+
|
|
105
128
|
/**
|
|
106
129
|
*
|
|
107
130
|
* @param {string} line
|
|
@@ -114,6 +137,10 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
114
137
|
let tokens = []
|
|
115
138
|
let token = TokenType.None
|
|
116
139
|
let state = lineState.state
|
|
140
|
+
let tag = lineState.tag
|
|
141
|
+
let embeddedLanguage = lineState.embeddedLanguage
|
|
142
|
+
let embeddedLanguageStart = lineState.embeddedLanguageStart
|
|
143
|
+
let embeddedLanguageEnd = lineState.embeddedLanguageEnd
|
|
117
144
|
while (index < line.length) {
|
|
118
145
|
const part = line.slice(index)
|
|
119
146
|
switch (state) {
|
|
@@ -124,9 +151,15 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
124
151
|
} else if ((next = part.match(RE_TEXT))) {
|
|
125
152
|
token = TokenType.Text
|
|
126
153
|
state = State.TopLevelContent
|
|
154
|
+
} else if ((next = part.match(RE_BLOCK_COMMENT_START))) {
|
|
155
|
+
token = TokenType.Comment
|
|
156
|
+
state = State.InsideBlockComment
|
|
127
157
|
} else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
|
|
128
158
|
token = TokenType.Text
|
|
129
159
|
state = State.TopLevelContent
|
|
160
|
+
} else if ((next = part.match(RE_DOCTYPE))) {
|
|
161
|
+
token = TokenType.PunctuationTag
|
|
162
|
+
state = State.AfterOpeningAngleBracket
|
|
130
163
|
} else if ((next = part.match(RE_ANGLE_BRACKET_OPEN))) {
|
|
131
164
|
token = TokenType.Text
|
|
132
165
|
state = State.TopLevelContent
|
|
@@ -139,6 +172,7 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
139
172
|
if ((next = part.match(RE_TAGNAME))) {
|
|
140
173
|
token = TokenType.TagName
|
|
141
174
|
state = State.InsideOpeningTag
|
|
175
|
+
tag = next[0]
|
|
142
176
|
} else if ((next = part.match(RE_SLASH))) {
|
|
143
177
|
token = TokenType.PunctuationTag
|
|
144
178
|
state = State.AfterClosingTagAngleBrackets
|
|
@@ -160,6 +194,19 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
160
194
|
if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
|
|
161
195
|
token = TokenType.PunctuationTag
|
|
162
196
|
state = State.TopLevelContent
|
|
197
|
+
switch (tag) {
|
|
198
|
+
case 'script':
|
|
199
|
+
state = State.InsideScriptContent
|
|
200
|
+
embeddedLanguage = getEmbeddedScriptLanguageId()
|
|
201
|
+
embeddedLanguageStart = index + next[0].length
|
|
202
|
+
break
|
|
203
|
+
case 'style':
|
|
204
|
+
state = State.InsideStyleContent
|
|
205
|
+
embeddedLanguage = getEmbeddedStyleLanguageId()
|
|
206
|
+
embeddedLanguageStart = index + next[0].length
|
|
207
|
+
default:
|
|
208
|
+
break
|
|
209
|
+
}
|
|
163
210
|
} else if ((next = part.match(RE_EXCLAMATION_MARK))) {
|
|
164
211
|
token = TokenType.PunctuationTag
|
|
165
212
|
state = State.InsideOpeningTag
|
|
@@ -169,6 +216,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
169
216
|
} else if ((next = part.match(RE_DASH_DASH))) {
|
|
170
217
|
token = TokenType.Comment
|
|
171
218
|
state = State.InsideBlockComment
|
|
219
|
+
} else if ((next = part.match(RE_PUNCTUATION_SELF_CLOSING))) {
|
|
220
|
+
token = TokenType.PunctuationTag
|
|
221
|
+
state = State.TopLevelContent
|
|
172
222
|
} else if ((next = part.match(RE_TAG_TEXT))) {
|
|
173
223
|
token = TokenType.Text
|
|
174
224
|
state = State.InsideOpeningTag
|
|
@@ -213,6 +263,10 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
213
263
|
} else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
|
|
214
264
|
token = TokenType.PunctuationTag
|
|
215
265
|
state = State.TopLevelContent
|
|
266
|
+
if (tag === 'script') {
|
|
267
|
+
state = State.InsideScriptContent
|
|
268
|
+
embeddedLanguage = 'javascript'
|
|
269
|
+
}
|
|
216
270
|
} else if ((next = part.match(RE_TAG_TEXT))) {
|
|
217
271
|
token = TokenType.Text
|
|
218
272
|
state = State.TopLevelContent
|
|
@@ -301,6 +355,43 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
301
355
|
throw new Error('no')
|
|
302
356
|
}
|
|
303
357
|
break
|
|
358
|
+
case State.InsideScriptContent:
|
|
359
|
+
if ((next = part.match(RE_SCRIPT_CONTENT_END))) {
|
|
360
|
+
token = TokenType.TagName
|
|
361
|
+
state = State.AfterClosingTagName
|
|
362
|
+
tokens.push(TokenType.PunctuationTag, 2, TokenType.TagName, 6)
|
|
363
|
+
index += next[0].length
|
|
364
|
+
embeddedLanguage = ''
|
|
365
|
+
continue
|
|
366
|
+
} else if ((next = part.match(RE_SCRIPT_CONTENT))) {
|
|
367
|
+
token = TokenType.Embedded
|
|
368
|
+
state = State.InsideScriptContent
|
|
369
|
+
embeddedLanguageStart = index
|
|
370
|
+
embeddedLanguageEnd = index + next[0].length
|
|
371
|
+
} else {
|
|
372
|
+
part
|
|
373
|
+
throw new Error('no')
|
|
374
|
+
}
|
|
375
|
+
break
|
|
376
|
+
case State.InsideStyleContent:
|
|
377
|
+
if ((next = part.match(RE_STYLE_CONTENT_END))) {
|
|
378
|
+
token = TokenType.TagName
|
|
379
|
+
state = State.AfterClosingTagName
|
|
380
|
+
tokens.push(TokenType.PunctuationTag, 2, TokenType.TagName, 6)
|
|
381
|
+
embeddedLanguageEnd = index
|
|
382
|
+
index += next[0].length
|
|
383
|
+
embeddedLanguage = ''
|
|
384
|
+
continue
|
|
385
|
+
} else if ((next = part.match(RE_STYLE_CONTENT))) {
|
|
386
|
+
token = TokenType.Embedded
|
|
387
|
+
state = State.InsideStyleContent
|
|
388
|
+
embeddedLanguageStart = index
|
|
389
|
+
embeddedLanguageEnd = index + next[0].length
|
|
390
|
+
} else {
|
|
391
|
+
part
|
|
392
|
+
throw new Error('no')
|
|
393
|
+
}
|
|
394
|
+
break
|
|
304
395
|
default:
|
|
305
396
|
state
|
|
306
397
|
throw new Error('no')
|
|
@@ -316,5 +407,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
316
407
|
return {
|
|
317
408
|
state,
|
|
318
409
|
tokens,
|
|
410
|
+
tag,
|
|
411
|
+
embeddedLanguage,
|
|
412
|
+
embeddedLanguageStart,
|
|
413
|
+
embeddedLanguageEnd,
|
|
319
414
|
}
|
|
320
415
|
}
|
|
@@ -52,6 +52,7 @@ export const TokenType = {
|
|
|
52
52
|
FunctionName: 885,
|
|
53
53
|
KeywordThis: 886,
|
|
54
54
|
KeywordOperator: 887,
|
|
55
|
+
KeywordFunction: 889,
|
|
55
56
|
}
|
|
56
57
|
|
|
57
58
|
export const TokenMap = {
|
|
@@ -80,10 +81,11 @@ export const TokenMap = {
|
|
|
80
81
|
[TokenType.FunctionName]: 'Function',
|
|
81
82
|
[TokenType.KeywordThis]: 'KeywordThis',
|
|
82
83
|
[TokenType.KeywordOperator]: 'KeywordOperator',
|
|
84
|
+
[TokenType.KeywordFunction]: 'KeywordFunction',
|
|
83
85
|
}
|
|
84
86
|
|
|
85
87
|
const RE_KEYWORD =
|
|
86
|
-
/^(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|if|implements|import|in|instanceof|interface|let|new|null|package|private|protected|public|return|super|switch|static|this|throw|try|true|typeof|var|void|while|with|yield)\b/
|
|
88
|
+
/^(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|if|implements|import|in|Infinity|instanceof|interface|let|new|null|of|package|private|protected|public|return|super|switch|static|this|throw|try|true|typeof|undefined|var|void|while|with|yield)\b/
|
|
87
89
|
const RE_CURLY_OPEN = /^\{/
|
|
88
90
|
const RE_CURLY_CLOSE = /^\}/
|
|
89
91
|
const RE_SQUARE_OPEN = /^\[/
|
|
@@ -118,20 +120,29 @@ const RE_QUOTE_DOUBLE = /^"/
|
|
|
118
120
|
const RE_QUOTE_BACKTICK = /^`/
|
|
119
121
|
const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^'\\]+/
|
|
120
122
|
const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"\\]+/
|
|
121
|
-
const RE_STRING_BACKTICK_QUOTE_CONTENT = /^[
|
|
123
|
+
const RE_STRING_BACKTICK_QUOTE_CONTENT = /^[^`\\\$]+/
|
|
122
124
|
const RE_STRING_ESCAPE = /^\\./
|
|
123
125
|
const RE_SHEBANG = /^#!.*/
|
|
124
126
|
const RE_FUNCTION_CALL_NAME = /^[\w]+(?=\s*(\(|\=\s*function|\=\s*\())/
|
|
125
127
|
const RE_DECORATOR = /^@\w+/
|
|
128
|
+
const RE_BACKSLASH = /^\\/
|
|
129
|
+
const RE_DOLLAR_CURLY_OPEN = /^\$\{/
|
|
130
|
+
const RE_DOLLAR = /^\$/
|
|
131
|
+
const RE_ANYTHING = /^.+/u
|
|
126
132
|
|
|
127
133
|
// copied from https://github.com/PrismJS/prism/blob/master/components/prism-javascript.js#L57
|
|
128
134
|
const RE_REGEX =
|
|
129
135
|
/^((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/
|
|
130
136
|
|
|
131
137
|
const RE_VARIABLE_NAME_SPECIAL = /\p{L}/u
|
|
138
|
+
const RE_VARIABLE_NAME_SPECIAL_2 = /./u
|
|
132
139
|
|
|
133
140
|
export const initialLineState = {
|
|
134
141
|
state: State.TopLevelContent,
|
|
142
|
+
/**
|
|
143
|
+
* @type {any[]}
|
|
144
|
+
*/
|
|
145
|
+
stack: [],
|
|
135
146
|
}
|
|
136
147
|
|
|
137
148
|
export const hasArrayReturn = true
|
|
@@ -148,6 +159,7 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
148
159
|
let tokens = []
|
|
149
160
|
let token = TokenType.None
|
|
150
161
|
let state = lineState.state
|
|
162
|
+
let stack = [...lineState.stack]
|
|
151
163
|
while (index < line.length) {
|
|
152
164
|
const part = line.slice(index)
|
|
153
165
|
switch (state) {
|
|
@@ -160,6 +172,7 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
160
172
|
case 'true':
|
|
161
173
|
case 'false':
|
|
162
174
|
case 'null':
|
|
175
|
+
case 'undefined':
|
|
163
176
|
token = TokenType.LanguageConstant
|
|
164
177
|
break
|
|
165
178
|
case 'import':
|
|
@@ -201,6 +214,16 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
201
214
|
case 'in':
|
|
202
215
|
token = TokenType.KeywordOperator
|
|
203
216
|
break
|
|
217
|
+
case 'function':
|
|
218
|
+
token = TokenType.KeywordFunction
|
|
219
|
+
break
|
|
220
|
+
case 'Infinity':
|
|
221
|
+
token = TokenType.Numeric
|
|
222
|
+
state = State.TopLevelContent
|
|
223
|
+
break
|
|
224
|
+
case 'of':
|
|
225
|
+
token = TokenType.KeywordOperator
|
|
226
|
+
break
|
|
204
227
|
default:
|
|
205
228
|
token = TokenType.Keyword
|
|
206
229
|
break
|
|
@@ -215,10 +238,19 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
215
238
|
} else if ((next = part.match(RE_NUMERIC))) {
|
|
216
239
|
token = TokenType.Numeric
|
|
217
240
|
state = State.TopLevelContent
|
|
241
|
+
} else if ((next = part.match(RE_CURLY_CLOSE))) {
|
|
242
|
+
token = TokenType.Punctuation
|
|
243
|
+
state = stack.pop() || State.TopLevelContent
|
|
244
|
+
} else if ((next = part.match(RE_CURLY_OPEN))) {
|
|
245
|
+
token = TokenType.Punctuation
|
|
246
|
+
stack.push(State.TopLevelContent)
|
|
247
|
+
state = State.TopLevelContent
|
|
218
248
|
} else if ((next = part.match(RE_PUNCTUATION))) {
|
|
219
249
|
token = TokenType.Punctuation
|
|
220
250
|
if (next[0] === '.') {
|
|
221
251
|
state = State.AfterPropertyDot
|
|
252
|
+
} else if (next[0] === '}') {
|
|
253
|
+
state = stack.pop() || State.TopLevelContent
|
|
222
254
|
} else {
|
|
223
255
|
state = State.TopLevelContent
|
|
224
256
|
}
|
|
@@ -258,6 +290,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
258
290
|
} else if ((next = part.match(RE_VARIABLE_NAME_SPECIAL))) {
|
|
259
291
|
token = TokenType.VariableName
|
|
260
292
|
state = State.TopLevelContent
|
|
293
|
+
} else if ((next = part.match(RE_ANYTHING))) {
|
|
294
|
+
token = TokenType.Text
|
|
295
|
+
state = State.TopLevelContent
|
|
261
296
|
} else {
|
|
262
297
|
throw new Error('no')
|
|
263
298
|
}
|
|
@@ -306,7 +341,11 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
306
341
|
} else if ((next = part.match(RE_STRING_ESCAPE))) {
|
|
307
342
|
token = TokenType.String
|
|
308
343
|
state = State.InsideSingleQuoteString
|
|
344
|
+
} else if ((next = part.match(RE_BACKSLASH))) {
|
|
345
|
+
token = TokenType.String
|
|
346
|
+
state = State.InsideSingleQuoteString
|
|
309
347
|
} else {
|
|
348
|
+
part
|
|
310
349
|
throw new Error('no')
|
|
311
350
|
}
|
|
312
351
|
break
|
|
@@ -320,6 +359,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
320
359
|
} else if ((next = part.match(RE_STRING_ESCAPE))) {
|
|
321
360
|
token = TokenType.String
|
|
322
361
|
state = State.InsideDoubleQuoteString
|
|
362
|
+
} else if ((next = part.match(RE_BACKSLASH))) {
|
|
363
|
+
token = TokenType.String
|
|
364
|
+
state = State.InsideDoubleQuoteString
|
|
323
365
|
} else {
|
|
324
366
|
throw new Error('no')
|
|
325
367
|
}
|
|
@@ -331,9 +373,19 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
331
373
|
} else if ((next = part.match(RE_STRING_BACKTICK_QUOTE_CONTENT))) {
|
|
332
374
|
token = TokenType.String
|
|
333
375
|
state = State.InsideBacktickString
|
|
376
|
+
} else if ((next = part.match(RE_DOLLAR_CURLY_OPEN))) {
|
|
377
|
+
token = TokenType.Punctuation
|
|
378
|
+
state = State.TopLevelContent
|
|
379
|
+
stack.push(State.InsideBacktickString)
|
|
334
380
|
} else if ((next = part.match(RE_STRING_ESCAPE))) {
|
|
335
381
|
token = TokenType.String
|
|
336
382
|
state = State.InsideBacktickString
|
|
383
|
+
} else if ((next = part.match(RE_BACKSLASH))) {
|
|
384
|
+
token = TokenType.String
|
|
385
|
+
state = State.InsideDoubleQuoteString
|
|
386
|
+
} else if ((next = part.match(RE_DOLLAR))) {
|
|
387
|
+
token = TokenType.String
|
|
388
|
+
state = State.InsideBacktickString
|
|
337
389
|
} else {
|
|
338
390
|
throw new Error('no')
|
|
339
391
|
}
|
|
@@ -357,6 +409,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
357
409
|
} else if ((next = part.match(RE_PUNCTUATION))) {
|
|
358
410
|
token = TokenType.Punctuation
|
|
359
411
|
state = State.TopLevelContent
|
|
412
|
+
} else if ((next = part.match(RE_VARIABLE_NAME_SPECIAL_2))) {
|
|
413
|
+
token = TokenType.VariableName
|
|
414
|
+
state = State.TopLevelContent
|
|
360
415
|
} else {
|
|
361
416
|
throw new Error('no')
|
|
362
417
|
}
|
|
@@ -372,8 +427,12 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
372
427
|
if (state === State.InsideLineComment) {
|
|
373
428
|
state = State.TopLevelContent
|
|
374
429
|
}
|
|
430
|
+
if (state === State.InsideSingleQuoteString && !line.endsWith('\\')) {
|
|
431
|
+
state = State.TopLevelContent
|
|
432
|
+
}
|
|
375
433
|
return {
|
|
376
434
|
state,
|
|
377
435
|
tokens,
|
|
436
|
+
stack,
|
|
378
437
|
}
|
|
379
438
|
}
|
|
@@ -11,6 +11,7 @@ export const State = {
|
|
|
11
11
|
JsonPropertyKey: 7,
|
|
12
12
|
InsideLineComment: 8,
|
|
13
13
|
InsidePropertyNameString: 9,
|
|
14
|
+
InsideBlockComment: 10,
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
export const StateMap = {
|
|
@@ -97,6 +98,10 @@ const RE_TEXT = /^[^\s\{\}\[\]]+/
|
|
|
97
98
|
// const RE_BACK_SLASH = /^\\/
|
|
98
99
|
const RE_STRING_ESCAPE = /^\\.?/
|
|
99
100
|
const RE_WORD = /^\w+/
|
|
101
|
+
const RE_BLOCK_COMMENT_START = /^\/\*/
|
|
102
|
+
const RE_BLOCK_COMMENT_CONTENT = /^.+?(?=\*\/)/
|
|
103
|
+
const RE_BLOCK_COMMENT_END = /^\*\//
|
|
104
|
+
const RE_ANYTHING_UNTIL_END = /^.+/s
|
|
100
105
|
|
|
101
106
|
export const initialLineState = {
|
|
102
107
|
state: State.TopLevelContent,
|
|
@@ -158,6 +163,10 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
158
163
|
} else if ((next = part.match(RE_CURLY_CLOSE))) {
|
|
159
164
|
token = TokenType.CurlyClose
|
|
160
165
|
state = stack.pop()
|
|
166
|
+
} else if ((next = part.match(RE_BLOCK_COMMENT_START))) {
|
|
167
|
+
token = TokenType.Comment
|
|
168
|
+
state = State.InsideBlockComment
|
|
169
|
+
stack.push(State.TopLevelContent)
|
|
161
170
|
} else if ((next = part.match(RE_ANYTHING))) {
|
|
162
171
|
token = TokenType.Text
|
|
163
172
|
state = State.TopLevelContent
|
|
@@ -186,6 +195,10 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
186
195
|
} else if ((next = part.match(RE_WORD))) {
|
|
187
196
|
token = TokenType.Text
|
|
188
197
|
state = State.AfterPropertyName
|
|
198
|
+
} else if ((next = part.match(RE_BLOCK_COMMENT_START))) {
|
|
199
|
+
token = TokenType.Comment
|
|
200
|
+
state = State.InsideBlockComment
|
|
201
|
+
stack.push(State.AfterCurlyOpen)
|
|
189
202
|
} else if ((next = part.match(RE_ANYTHING))) {
|
|
190
203
|
token = TokenType.Text
|
|
191
204
|
state = State.AfterCurlyOpen
|
|
@@ -298,6 +311,20 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
298
311
|
throw new Error('no')
|
|
299
312
|
}
|
|
300
313
|
break
|
|
314
|
+
case State.InsideBlockComment:
|
|
315
|
+
if ((next = part.match(RE_BLOCK_COMMENT_END))) {
|
|
316
|
+
token = TokenType.Comment
|
|
317
|
+
state = stack.pop() || State.TopLevelContent
|
|
318
|
+
} else if ((next = part.match(RE_BLOCK_COMMENT_CONTENT))) {
|
|
319
|
+
token = TokenType.Comment
|
|
320
|
+
state = State.InsideBlockComment
|
|
321
|
+
} else if ((next = part.match(RE_ANYTHING_UNTIL_END))) {
|
|
322
|
+
token = TokenType.Comment
|
|
323
|
+
state = State.InsideBlockComment
|
|
324
|
+
} else {
|
|
325
|
+
throw new Error('no')
|
|
326
|
+
}
|
|
327
|
+
break
|
|
301
328
|
default:
|
|
302
329
|
state
|
|
303
330
|
throw new Error('no')
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Language Basics Jsx
|
|
2
|
+
|
|
3
|
+
## Contributing
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
git clone git@github.com:lvce-editor/language-basics-jsx.git &&
|
|
7
|
+
cd language-basics-jsx &&
|
|
8
|
+
npm ci &&
|
|
9
|
+
npm test
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Gitpod
|
|
13
|
+
|
|
14
|
+
[](https://gitpod.io/#https://github.com/lvce-editor/language-basics-jsx)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "builtin.language-basics-jsx",
|
|
3
|
+
"name": "Language Basics Jsx",
|
|
4
|
+
"description": "Provides syntax highlighting and bracket matching in Jsx files.",
|
|
5
|
+
"languages": [
|
|
6
|
+
{
|
|
7
|
+
"id": "jsx",
|
|
8
|
+
"extensions": [".jsx"],
|
|
9
|
+
"tokenize": "src/tokenizeJsx.js",
|
|
10
|
+
"configuration": "./languageConfiguration.json"
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
}
|