@lvce-editor/shared-process 0.12.0 → 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/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 +91 -3
- package/extensions/builtin.language-basics-javascript/src/tokenizeJavaScript.js +7 -0
- package/extensions/builtin.language-basics-json/extension.json +3 -1
- 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 +82 -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 +22 -1
- 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 +128 -12
- 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 +7 -1
- package/extensions/builtin.theme-atom-one-dark/color-theme.json +4 -0
- package/extensions/builtin.theme-cobalt2/color-theme.json +4 -0
- package/extensions/builtin.theme-gruvbox/color-theme.json +4 -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 +7 -6
- 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/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
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
"editor.lineHeight": 20,
|
|
9
9
|
"editor.formatOnSave": false,
|
|
10
10
|
"editor.letterSpacing": 0.5,
|
|
11
|
+
"editor.fontLigatures": true,
|
|
12
|
+
"editor.links": true,
|
|
11
13
|
|
|
12
14
|
"extensions.autoUpdate": true,
|
|
13
15
|
|
|
@@ -19,6 +21,8 @@
|
|
|
19
21
|
"Thumbs.db": true
|
|
20
22
|
},
|
|
21
23
|
|
|
24
|
+
"languages.jsFilesAsJsx": false,
|
|
25
|
+
|
|
22
26
|
"search.threads": 1,
|
|
23
27
|
|
|
24
28
|
"sessionReplay.enabled": false,
|
|
@@ -1,28 +1,432 @@
|
|
|
1
|
+
const State = {
|
|
2
|
+
TopLevelContent: 1,
|
|
3
|
+
AfterKeywordTypeOrInputOrInterface: 2,
|
|
4
|
+
AfterTypeName: 3,
|
|
5
|
+
InsideTypeObject: 4,
|
|
6
|
+
InsideFunctionParameters: 6,
|
|
7
|
+
BeforeType: 7,
|
|
8
|
+
InsideDoubleQuoteString: 8,
|
|
9
|
+
AfterKeywordScalarOrUnion: 9,
|
|
10
|
+
AfterKeywordEnum: 10,
|
|
11
|
+
InsideEnum: 11,
|
|
12
|
+
InsideTripleDoubleQuoteString: 12,
|
|
13
|
+
}
|
|
14
|
+
|
|
1
15
|
/**
|
|
2
16
|
* @enum number
|
|
3
17
|
*/
|
|
4
18
|
export const TokenType = {
|
|
19
|
+
None: 0,
|
|
5
20
|
Text: 1,
|
|
21
|
+
Comment: 2,
|
|
22
|
+
Whitespace: 3,
|
|
23
|
+
Keyword: 4,
|
|
24
|
+
Type: 5,
|
|
25
|
+
Punctuation: 6,
|
|
26
|
+
VariableName: 7,
|
|
27
|
+
Function: 8,
|
|
28
|
+
Numeric: 9,
|
|
29
|
+
String: 10,
|
|
6
30
|
}
|
|
7
31
|
|
|
8
32
|
export const TokenMap = {
|
|
9
33
|
[TokenType.Text]: 'Text',
|
|
34
|
+
[TokenType.Comment]: 'Comment',
|
|
35
|
+
[TokenType.Whitespace]: 'Whitespace',
|
|
36
|
+
[TokenType.Keyword]: 'Keyword',
|
|
37
|
+
[TokenType.Type]: 'Type',
|
|
38
|
+
[TokenType.Punctuation]: 'Punctuation',
|
|
39
|
+
[TokenType.VariableName]: 'VariableName',
|
|
40
|
+
[TokenType.Function]: 'Function',
|
|
41
|
+
[TokenType.Numeric]: 'Numeric',
|
|
42
|
+
[TokenType.String]: 'String',
|
|
10
43
|
}
|
|
11
44
|
|
|
12
45
|
export const initialLineState = {
|
|
13
|
-
state:
|
|
46
|
+
state: State.TopLevelContent,
|
|
47
|
+
stack: [],
|
|
14
48
|
tokens: [],
|
|
15
49
|
}
|
|
16
50
|
|
|
51
|
+
const RE_LINE_COMMENT = /^#.*/s
|
|
52
|
+
const RE_ANYTHING = /^.+/s
|
|
53
|
+
const RE_KEYWORD = /^(?:type|scalar|enum|input|union|interface)\b/
|
|
54
|
+
const RE_WHITESPACE = /^\s+/
|
|
55
|
+
const RE_VARIABLE_NAME = /^[a-zA-Z\_][a-zA-Z\d\_\-]*/
|
|
56
|
+
const RE_DECORATOR = /^@\w+/
|
|
57
|
+
const RE_CURLY_OPEN = /^\{/
|
|
58
|
+
const RE_ROUND_OPEN = /^\(/
|
|
59
|
+
const RE_ROUND_CLOSE = /^\)/
|
|
60
|
+
const RE_CURLY_CLOSE = /^\}/
|
|
61
|
+
const RE_COLON = /^\:/
|
|
62
|
+
const RE_FUNCTION_CALL_NAME = /^[\w]+(?=\s*\()/
|
|
63
|
+
const RE_EXCLAMATION_MARK = /^\!/
|
|
64
|
+
const RE_SQUARE_OPEN = /^\[/
|
|
65
|
+
const RE_SQUARE_CLOSE = /^\]/
|
|
66
|
+
const RE_EQUAL_SIGN = /^=/
|
|
67
|
+
const RE_COMMA = /^,/
|
|
68
|
+
const RE_NUMERIC = /^\d+/
|
|
69
|
+
const RE_QUOTE_DOUBLE = /^"/
|
|
70
|
+
const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"\\]+/
|
|
71
|
+
const RE_STRING_ESCAPE = /^\\./
|
|
72
|
+
const RE_BACKSLASH = /^\\/
|
|
73
|
+
const RE_PIPE = /^\|/
|
|
74
|
+
const RE_DOUBLE_QUOTE = /^"/
|
|
75
|
+
const RE_TRIPLE_QUOTED_STRING_CONTENT_DOUBLE_QUOTES = /.*(?=""")/s
|
|
76
|
+
const RE_TRIPLE_QUOTED_STRING_CONTENT_COMMON = /.*/s
|
|
77
|
+
const RE_TRIPLE_DOUBLE_QUOTE = /^"{3}/
|
|
78
|
+
const RE_AMPERSAND = /^\&/
|
|
79
|
+
|
|
17
80
|
export const hasArrayReturn = true
|
|
18
81
|
|
|
19
82
|
/**
|
|
20
83
|
* @param {string} line
|
|
84
|
+
* @param {any} lineState
|
|
21
85
|
*/
|
|
22
|
-
export const tokenizeLine = (line) => {
|
|
23
|
-
|
|
86
|
+
export const tokenizeLine = (line, lineState) => {
|
|
87
|
+
let next = null
|
|
88
|
+
let index = 0
|
|
89
|
+
let tokens = []
|
|
90
|
+
let token = TokenType.None
|
|
91
|
+
let state = lineState.state
|
|
92
|
+
let stack = [...lineState.stack]
|
|
93
|
+
while (index < line.length) {
|
|
94
|
+
const part = line.slice(index)
|
|
95
|
+
switch (state) {
|
|
96
|
+
case State.TopLevelContent:
|
|
97
|
+
if ((next = part.match(RE_WHITESPACE))) {
|
|
98
|
+
token = TokenType.Whitespace
|
|
99
|
+
state = State.TopLevelContent
|
|
100
|
+
} else if ((next = part.match(RE_KEYWORD))) {
|
|
101
|
+
token = TokenType.Keyword
|
|
102
|
+
state = State.TopLevelContent
|
|
103
|
+
switch (next[0]) {
|
|
104
|
+
case 'type':
|
|
105
|
+
case 'input':
|
|
106
|
+
case 'interface':
|
|
107
|
+
state = State.AfterKeywordTypeOrInputOrInterface
|
|
108
|
+
break
|
|
109
|
+
case 'scalar':
|
|
110
|
+
case 'union':
|
|
111
|
+
state = State.AfterKeywordScalarOrUnion
|
|
112
|
+
break
|
|
113
|
+
case 'enum':
|
|
114
|
+
state = State.AfterKeywordEnum
|
|
115
|
+
break
|
|
116
|
+
default:
|
|
117
|
+
break
|
|
118
|
+
}
|
|
119
|
+
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
120
|
+
token = TokenType.Comment
|
|
121
|
+
state = State.TopLevelContent
|
|
122
|
+
} else if ((next = part.match(RE_TRIPLE_DOUBLE_QUOTE))) {
|
|
123
|
+
token = TokenType.Punctuation
|
|
124
|
+
state = State.InsideTripleDoubleQuoteString
|
|
125
|
+
stack.push(State.TopLevelContent)
|
|
126
|
+
} else if ((next = part.match(RE_ANYTHING))) {
|
|
127
|
+
token = TokenType.Text
|
|
128
|
+
state = State.TopLevelContent
|
|
129
|
+
} else {
|
|
130
|
+
part //?
|
|
131
|
+
throw new Error('no')
|
|
132
|
+
}
|
|
133
|
+
break
|
|
134
|
+
case State.AfterKeywordTypeOrInputOrInterface:
|
|
135
|
+
if ((next = part.match(RE_WHITESPACE))) {
|
|
136
|
+
token = TokenType.Whitespace
|
|
137
|
+
state = State.AfterKeywordTypeOrInputOrInterface
|
|
138
|
+
} else if ((next = part.match(RE_VARIABLE_NAME))) {
|
|
139
|
+
token = TokenType.Type
|
|
140
|
+
state = State.AfterTypeName
|
|
141
|
+
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
142
|
+
token = TokenType.Comment
|
|
143
|
+
state = State.TopLevelContent
|
|
144
|
+
} else if ((next = part.match(RE_DECORATOR))) {
|
|
145
|
+
token = TokenType.VariableName
|
|
146
|
+
state = State.AfterKeywordTypeOrInputOrInterface
|
|
147
|
+
} else if ((next = part.match(RE_CURLY_OPEN))) {
|
|
148
|
+
token = TokenType.Punctuation
|
|
149
|
+
state = State.InsideTypeObject
|
|
150
|
+
} else {
|
|
151
|
+
part
|
|
152
|
+
throw new Error('no')
|
|
153
|
+
}
|
|
154
|
+
break
|
|
155
|
+
case State.AfterTypeName:
|
|
156
|
+
if ((next = part.match(RE_WHITESPACE))) {
|
|
157
|
+
token = TokenType.Whitespace
|
|
158
|
+
state = State.AfterTypeName
|
|
159
|
+
} else if ((next = part.match(RE_CURLY_OPEN))) {
|
|
160
|
+
token = TokenType.Punctuation
|
|
161
|
+
state = State.InsideTypeObject
|
|
162
|
+
} else if ((next = part.match(RE_VARIABLE_NAME))) {
|
|
163
|
+
token = TokenType.VariableName
|
|
164
|
+
state = State.AfterTypeName
|
|
165
|
+
} else if ((next = part.match(RE_DECORATOR))) {
|
|
166
|
+
token = TokenType.VariableName
|
|
167
|
+
state = State.AfterTypeName
|
|
168
|
+
} else if ((next = part.match(RE_AMPERSAND))) {
|
|
169
|
+
token = TokenType.Punctuation
|
|
170
|
+
state = State.AfterTypeName
|
|
171
|
+
} else if ((next = part.match(RE_ROUND_OPEN))) {
|
|
172
|
+
token = TokenType.Punctuation
|
|
173
|
+
state = State.InsideFunctionParameters
|
|
174
|
+
stack.push(State.AfterTypeName)
|
|
175
|
+
} else if ((next = part.match(RE_EQUAL_SIGN))) {
|
|
176
|
+
token = TokenType.Punctuation
|
|
177
|
+
state = State.AfterTypeName
|
|
178
|
+
} else {
|
|
179
|
+
part
|
|
180
|
+
throw new Error('no')
|
|
181
|
+
}
|
|
182
|
+
break
|
|
183
|
+
case State.InsideTypeObject:
|
|
184
|
+
if ((next = part.match(RE_WHITESPACE))) {
|
|
185
|
+
token = TokenType.Whitespace
|
|
186
|
+
state = State.InsideTypeObject
|
|
187
|
+
} else if ((next = part.match(RE_FUNCTION_CALL_NAME))) {
|
|
188
|
+
token = TokenType.Function
|
|
189
|
+
state = State.InsideTypeObject
|
|
190
|
+
} else if ((next = part.match(RE_VARIABLE_NAME))) {
|
|
191
|
+
token = TokenType.VariableName
|
|
192
|
+
state = State.InsideTypeObject
|
|
193
|
+
} else if ((next = part.match(RE_COLON))) {
|
|
194
|
+
token = TokenType.Punctuation
|
|
195
|
+
state = State.BeforeType
|
|
196
|
+
} else if ((next = part.match(RE_ROUND_OPEN))) {
|
|
197
|
+
token = TokenType.Punctuation
|
|
198
|
+
stack.push(State.InsideTypeObject)
|
|
199
|
+
state = State.InsideFunctionParameters
|
|
200
|
+
} else if ((next = part.match(RE_CURLY_CLOSE))) {
|
|
201
|
+
stack.pop()
|
|
202
|
+
token = TokenType.Punctuation
|
|
203
|
+
state = State.TopLevelContent
|
|
204
|
+
} else if ((next = part.match(RE_TRIPLE_DOUBLE_QUOTE))) {
|
|
205
|
+
token = TokenType.Punctuation
|
|
206
|
+
state = State.InsideTripleDoubleQuoteString
|
|
207
|
+
stack.push(State.InsideTypeObject)
|
|
208
|
+
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
209
|
+
token = TokenType.Comment
|
|
210
|
+
state = State.InsideTypeObject
|
|
211
|
+
} else if ((next = part.match(RE_ROUND_CLOSE))) {
|
|
212
|
+
token = TokenType.Punctuation
|
|
213
|
+
state = State.InsideTypeObject
|
|
214
|
+
} else if ((next = part.match(RE_CURLY_OPEN))) {
|
|
215
|
+
token = TokenType.Punctuation
|
|
216
|
+
state = State.InsideTypeObject
|
|
217
|
+
stack.push(State.InsideTypeObject)
|
|
218
|
+
} else if ((next = part.match(RE_COMMA))) {
|
|
219
|
+
token = TokenType.Punctuation
|
|
220
|
+
state = State.BeforeType
|
|
221
|
+
} else {
|
|
222
|
+
part
|
|
223
|
+
throw new Error('no')
|
|
224
|
+
}
|
|
225
|
+
break
|
|
226
|
+
case State.InsideFunctionParameters:
|
|
227
|
+
if ((next = part.match(RE_WHITESPACE))) {
|
|
228
|
+
token = TokenType.Whitespace
|
|
229
|
+
state = State.InsideFunctionParameters
|
|
230
|
+
} else if ((next = part.match(RE_VARIABLE_NAME))) {
|
|
231
|
+
token = TokenType.VariableName
|
|
232
|
+
state = State.InsideFunctionParameters
|
|
233
|
+
} else if ((next = part.match(RE_COLON))) {
|
|
234
|
+
token = TokenType.Punctuation
|
|
235
|
+
state = State.BeforeType
|
|
236
|
+
stack.push(State.InsideFunctionParameters)
|
|
237
|
+
} else if ((next = part.match(RE_ROUND_CLOSE))) {
|
|
238
|
+
token = TokenType.Punctuation
|
|
239
|
+
state = stack.pop() || State.TopLevelContent
|
|
240
|
+
} else if ((next = part.match(RE_CURLY_CLOSE))) {
|
|
241
|
+
token = TokenType.Punctuation
|
|
242
|
+
state = stack.pop() || State.TopLevelContent
|
|
243
|
+
} else if ((next = part.match(RE_TRIPLE_DOUBLE_QUOTE))) {
|
|
244
|
+
token = TokenType.Punctuation
|
|
245
|
+
state = State.InsideTripleDoubleQuoteString
|
|
246
|
+
stack.push(State.InsideTypeObject)
|
|
247
|
+
} else if ((next = part.match(RE_COMMA))) {
|
|
248
|
+
token = TokenType.Punctuation
|
|
249
|
+
state = State.InsideFunctionParameters
|
|
250
|
+
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
251
|
+
token = TokenType.Comment
|
|
252
|
+
state = State.InsideFunctionParameters
|
|
253
|
+
} else if ((next = part.match(RE_SQUARE_CLOSE))) {
|
|
254
|
+
token = TokenType.Punctuation
|
|
255
|
+
state = State.InsideFunctionParameters
|
|
256
|
+
} else if ((next = part.match(RE_DOUBLE_QUOTE))) {
|
|
257
|
+
token = TokenType.Punctuation
|
|
258
|
+
state = State.InsideDoubleQuoteString
|
|
259
|
+
stack.push(State.InsideFunctionParameters)
|
|
260
|
+
} else {
|
|
261
|
+
part
|
|
262
|
+
throw new Error('no')
|
|
263
|
+
}
|
|
264
|
+
break
|
|
265
|
+
case State.BeforeType:
|
|
266
|
+
if ((next = part.match(RE_WHITESPACE))) {
|
|
267
|
+
token = TokenType.Whitespace
|
|
268
|
+
state = State.BeforeType
|
|
269
|
+
} else if ((next = part.match(RE_VARIABLE_NAME))) {
|
|
270
|
+
token = TokenType.Type
|
|
271
|
+
state = State.BeforeType
|
|
272
|
+
} else if ((next = part.match(RE_ROUND_CLOSE))) {
|
|
273
|
+
token = TokenType.Punctuation
|
|
274
|
+
state = stack.pop() || State.TopLevelContent
|
|
275
|
+
} else if ((next = part.match(RE_EXCLAMATION_MARK))) {
|
|
276
|
+
token = TokenType.Punctuation
|
|
277
|
+
state = State.BeforeType
|
|
278
|
+
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
279
|
+
token = TokenType.Comment
|
|
280
|
+
state = State.BeforeType
|
|
281
|
+
} else if ((next = part.match(RE_SQUARE_OPEN))) {
|
|
282
|
+
token = TokenType.Punctuation
|
|
283
|
+
state = State.BeforeType
|
|
284
|
+
} else if ((next = part.match(RE_SQUARE_CLOSE))) {
|
|
285
|
+
token = TokenType.Punctuation
|
|
286
|
+
state = State.BeforeType
|
|
287
|
+
} else if ((next = part.match(RE_EQUAL_SIGN))) {
|
|
288
|
+
token = TokenType.Punctuation
|
|
289
|
+
state = State.BeforeType
|
|
290
|
+
} else if ((next = part.match(RE_COMMA))) {
|
|
291
|
+
token = TokenType.Punctuation
|
|
292
|
+
state = State.BeforeType
|
|
293
|
+
} else if ((next = part.match(RE_COLON))) {
|
|
294
|
+
token = TokenType.Punctuation
|
|
295
|
+
state = State.BeforeType
|
|
296
|
+
} else if ((next = part.match(RE_NUMERIC))) {
|
|
297
|
+
token = TokenType.Numeric
|
|
298
|
+
state = State.BeforeType
|
|
299
|
+
} else if ((next = part.match(RE_QUOTE_DOUBLE))) {
|
|
300
|
+
token = TokenType.Punctuation
|
|
301
|
+
state = State.InsideDoubleQuoteString
|
|
302
|
+
} else if ((next = part.match(RE_DECORATOR))) {
|
|
303
|
+
token = TokenType.VariableName
|
|
304
|
+
state = State.BeforeType
|
|
305
|
+
} else if ((next = part.match(RE_ROUND_OPEN))) {
|
|
306
|
+
token = TokenType.Punctuation
|
|
307
|
+
state = State.InsideFunctionParameters
|
|
308
|
+
stack.push(State.BeforeType)
|
|
309
|
+
} else {
|
|
310
|
+
part
|
|
311
|
+
throw new Error('no')
|
|
312
|
+
}
|
|
313
|
+
break
|
|
314
|
+
case State.InsideDoubleQuoteString:
|
|
315
|
+
if ((next = part.match(RE_QUOTE_DOUBLE))) {
|
|
316
|
+
token = TokenType.Punctuation
|
|
317
|
+
state = stack.pop() || State.TopLevelContent
|
|
318
|
+
} else if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
|
|
319
|
+
token = TokenType.String
|
|
320
|
+
state = State.InsideDoubleQuoteString
|
|
321
|
+
} else if ((next = part.match(RE_STRING_ESCAPE))) {
|
|
322
|
+
token = TokenType.String
|
|
323
|
+
state = State.InsideDoubleQuoteString
|
|
324
|
+
} else if ((next = part.match(RE_BACKSLASH))) {
|
|
325
|
+
token = TokenType.String
|
|
326
|
+
state = State.InsideDoubleQuoteString
|
|
327
|
+
} else {
|
|
328
|
+
throw new Error('no')
|
|
329
|
+
}
|
|
330
|
+
break
|
|
331
|
+
case State.AfterKeywordScalarOrUnion:
|
|
332
|
+
if ((next = part.match(RE_WHITESPACE))) {
|
|
333
|
+
token = TokenType.Whitespace
|
|
334
|
+
state = State.AfterKeywordScalarOrUnion
|
|
335
|
+
} else if ((next = part.match(RE_VARIABLE_NAME))) {
|
|
336
|
+
token = TokenType.Type
|
|
337
|
+
state = State.AfterKeywordScalarOrUnion
|
|
338
|
+
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
339
|
+
token = TokenType.Comment
|
|
340
|
+
state = State.TopLevelContent
|
|
341
|
+
} else if ((next = part.match(RE_EQUAL_SIGN))) {
|
|
342
|
+
token = TokenType.Punctuation
|
|
343
|
+
state = State.AfterKeywordScalarOrUnion
|
|
344
|
+
} else if ((next = part.match(RE_PIPE))) {
|
|
345
|
+
token = TokenType.Punctuation
|
|
346
|
+
state = State.AfterKeywordScalarOrUnion
|
|
347
|
+
} else if ((next = part.match(RE_DECORATOR))) {
|
|
348
|
+
token = TokenType.VariableName
|
|
349
|
+
state = State.AfterKeywordScalarOrUnion
|
|
350
|
+
} else if ((next = part.match(RE_ROUND_OPEN))) {
|
|
351
|
+
token = TokenType.Punctuation
|
|
352
|
+
state = State.InsideFunctionParameters
|
|
353
|
+
stack.push(State.AfterKeywordScalarOrUnion)
|
|
354
|
+
} else if ((next = part.match(RE_ROUND_CLOSE))) {
|
|
355
|
+
token = TokenType.Punctuation
|
|
356
|
+
state = State.AfterKeywordScalarOrUnion
|
|
357
|
+
} else {
|
|
358
|
+
part
|
|
359
|
+
throw new Error('no')
|
|
360
|
+
}
|
|
361
|
+
break
|
|
362
|
+
case State.AfterKeywordEnum:
|
|
363
|
+
if ((next = part.match(RE_WHITESPACE))) {
|
|
364
|
+
token = TokenType.Whitespace
|
|
365
|
+
state = State.AfterKeywordEnum
|
|
366
|
+
} else if ((next = part.match(RE_VARIABLE_NAME))) {
|
|
367
|
+
token = TokenType.Type
|
|
368
|
+
state = State.AfterKeywordEnum
|
|
369
|
+
} else if ((next = part.match(RE_CURLY_OPEN))) {
|
|
370
|
+
token = TokenType.Punctuation
|
|
371
|
+
state = State.InsideEnum
|
|
372
|
+
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
373
|
+
token = TokenType.Comment
|
|
374
|
+
state = State.AfterKeywordEnum
|
|
375
|
+
} else {
|
|
376
|
+
throw new Error('no')
|
|
377
|
+
}
|
|
378
|
+
break
|
|
379
|
+
case State.InsideEnum:
|
|
380
|
+
if ((next = part.match(RE_WHITESPACE))) {
|
|
381
|
+
token = TokenType.Whitespace
|
|
382
|
+
state = State.InsideEnum
|
|
383
|
+
} else if ((next = part.match(RE_VARIABLE_NAME))) {
|
|
384
|
+
token = TokenType.VariableName
|
|
385
|
+
state = State.InsideEnum
|
|
386
|
+
} else if ((next = part.match(RE_CURLY_CLOSE))) {
|
|
387
|
+
token = TokenType.Punctuation
|
|
388
|
+
state = State.TopLevelContent
|
|
389
|
+
} else if ((next = part.match(RE_LINE_COMMENT))) {
|
|
390
|
+
token = TokenType.Comment
|
|
391
|
+
state = State.InsideEnum
|
|
392
|
+
} else {
|
|
393
|
+
throw new Error('no')
|
|
394
|
+
}
|
|
395
|
+
break
|
|
396
|
+
case State.InsideTripleDoubleQuoteString:
|
|
397
|
+
if ((next = part.match(RE_TRIPLE_DOUBLE_QUOTE))) {
|
|
398
|
+
token = TokenType.Punctuation
|
|
399
|
+
state = stack.pop() || State.TopLevelContent
|
|
400
|
+
} else if (
|
|
401
|
+
(next = part.match(RE_TRIPLE_QUOTED_STRING_CONTENT_DOUBLE_QUOTES))
|
|
402
|
+
) {
|
|
403
|
+
token = TokenType.String
|
|
404
|
+
state = State.InsideTripleDoubleQuoteString
|
|
405
|
+
} else if (
|
|
406
|
+
(next = part.match(RE_TRIPLE_QUOTED_STRING_CONTENT_COMMON))
|
|
407
|
+
) {
|
|
408
|
+
token = TokenType.String
|
|
409
|
+
state = State.InsideTripleDoubleQuoteString
|
|
410
|
+
} else {
|
|
411
|
+
throw new Error('no')
|
|
412
|
+
}
|
|
413
|
+
break
|
|
414
|
+
default:
|
|
415
|
+
throw new Error('no')
|
|
416
|
+
}
|
|
417
|
+
const tokenLength = next[0].length
|
|
418
|
+
index += tokenLength
|
|
419
|
+
tokens.push(token, tokenLength)
|
|
420
|
+
}
|
|
421
|
+
if (state === State.BeforeType) {
|
|
422
|
+
state = State.InsideTypeObject
|
|
423
|
+
}
|
|
424
|
+
if (state === State.AfterKeywordScalarOrUnion) {
|
|
425
|
+
state = State.TopLevelContent
|
|
426
|
+
}
|
|
24
427
|
return {
|
|
25
|
-
state
|
|
428
|
+
state,
|
|
429
|
+
stack,
|
|
26
430
|
tokens,
|
|
27
431
|
}
|
|
28
432
|
}
|
|
@@ -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,12 +54,13 @@ 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 = /^<(?![\s
|
|
63
|
+
const RE_ANGLE_BRACKET_OPEN_TAG = /^<(?![\s!\%])/
|
|
60
64
|
const RE_ANY_TEXT = /^[^\n]+/
|
|
61
65
|
const RE_ATTRIBUTE_NAME = /^[a-zA-Z\d\-\:]+/
|
|
62
66
|
const RE_BLOCK_COMMENT_CONTENT_1 = /^.+?(?=-->)/s
|
|
@@ -81,14 +85,24 @@ const RE_SLASH = /^\//
|
|
|
81
85
|
const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"]+/
|
|
82
86
|
const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
|
|
83
87
|
const RE_TAG_TEXT = /^[^\s>]+/
|
|
84
|
-
const RE_TAGNAME = /^[!\w]+/
|
|
88
|
+
const RE_TAGNAME = /^[!\w\:]+/
|
|
85
89
|
const RE_TEXT = /^[^<>\n]+/
|
|
86
90
|
const RE_WHITESPACE = /^\s+/
|
|
87
91
|
const RE_WORD = /^[^\s]+/
|
|
88
|
-
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/
|
|
89
97
|
|
|
90
98
|
export const initialLineState = {
|
|
91
99
|
state: State.TopLevelContent,
|
|
100
|
+
tag: '',
|
|
101
|
+
stack: [],
|
|
102
|
+
embeddedLanguage: '',
|
|
103
|
+
embeddedLanguageStart: 0,
|
|
104
|
+
embeddedLanguageEnd: 0,
|
|
105
|
+
embeddedState: undefined,
|
|
92
106
|
}
|
|
93
107
|
|
|
94
108
|
/**
|
|
@@ -103,6 +117,14 @@ export const isLineStateEqual = (lineStateA, lineStateB) => {
|
|
|
103
117
|
|
|
104
118
|
export const hasArrayReturn = true
|
|
105
119
|
|
|
120
|
+
const getEmbeddedScriptLanguageId = () => {
|
|
121
|
+
return 'javascript'
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const getEmbeddedStyleLanguageId = () => {
|
|
125
|
+
return 'css'
|
|
126
|
+
}
|
|
127
|
+
|
|
106
128
|
/**
|
|
107
129
|
*
|
|
108
130
|
* @param {string} line
|
|
@@ -115,6 +137,10 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
115
137
|
let tokens = []
|
|
116
138
|
let token = TokenType.None
|
|
117
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
|
|
118
144
|
while (index < line.length) {
|
|
119
145
|
const part = line.slice(index)
|
|
120
146
|
switch (state) {
|
|
@@ -146,6 +172,7 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
146
172
|
if ((next = part.match(RE_TAGNAME))) {
|
|
147
173
|
token = TokenType.TagName
|
|
148
174
|
state = State.InsideOpeningTag
|
|
175
|
+
tag = next[0]
|
|
149
176
|
} else if ((next = part.match(RE_SLASH))) {
|
|
150
177
|
token = TokenType.PunctuationTag
|
|
151
178
|
state = State.AfterClosingTagAngleBrackets
|
|
@@ -167,6 +194,19 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
167
194
|
if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
|
|
168
195
|
token = TokenType.PunctuationTag
|
|
169
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
|
+
}
|
|
170
210
|
} else if ((next = part.match(RE_EXCLAMATION_MARK))) {
|
|
171
211
|
token = TokenType.PunctuationTag
|
|
172
212
|
state = State.InsideOpeningTag
|
|
@@ -176,6 +216,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
176
216
|
} else if ((next = part.match(RE_DASH_DASH))) {
|
|
177
217
|
token = TokenType.Comment
|
|
178
218
|
state = State.InsideBlockComment
|
|
219
|
+
} else if ((next = part.match(RE_PUNCTUATION_SELF_CLOSING))) {
|
|
220
|
+
token = TokenType.PunctuationTag
|
|
221
|
+
state = State.TopLevelContent
|
|
179
222
|
} else if ((next = part.match(RE_TAG_TEXT))) {
|
|
180
223
|
token = TokenType.Text
|
|
181
224
|
state = State.InsideOpeningTag
|
|
@@ -220,6 +263,10 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
220
263
|
} else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
|
|
221
264
|
token = TokenType.PunctuationTag
|
|
222
265
|
state = State.TopLevelContent
|
|
266
|
+
if (tag === 'script') {
|
|
267
|
+
state = State.InsideScriptContent
|
|
268
|
+
embeddedLanguage = 'javascript'
|
|
269
|
+
}
|
|
223
270
|
} else if ((next = part.match(RE_TAG_TEXT))) {
|
|
224
271
|
token = TokenType.Text
|
|
225
272
|
state = State.TopLevelContent
|
|
@@ -308,6 +355,43 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
308
355
|
throw new Error('no')
|
|
309
356
|
}
|
|
310
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
|
|
311
395
|
default:
|
|
312
396
|
state
|
|
313
397
|
throw new Error('no')
|
|
@@ -323,5 +407,9 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
323
407
|
return {
|
|
324
408
|
state,
|
|
325
409
|
tokens,
|
|
410
|
+
tag,
|
|
411
|
+
embeddedLanguage,
|
|
412
|
+
embeddedLanguageStart,
|
|
413
|
+
embeddedLanguageEnd,
|
|
326
414
|
}
|
|
327
415
|
}
|
|
@@ -238,6 +238,13 @@ export const tokenizeLine = (line, lineState) => {
|
|
|
238
238
|
} else if ((next = part.match(RE_NUMERIC))) {
|
|
239
239
|
token = TokenType.Numeric
|
|
240
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
|
|
241
248
|
} else if ((next = part.match(RE_PUNCTUATION))) {
|
|
242
249
|
token = TokenType.Punctuation
|
|
243
250
|
if (next[0] === '.') {
|
|
@@ -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)
|