@lvce-editor/shared-process 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/config/defaultKeyBindings.json +5 -0
  2. package/config/defaultSettings.json +4 -0
  3. package/extensions/builtin.language-basics-graphql/extension.json +1 -1
  4. package/extensions/builtin.language-basics-graphql/src/tokenizeGraphql.js +408 -4
  5. package/extensions/builtin.language-basics-html/src/tokenizeHtml.js +91 -3
  6. package/extensions/builtin.language-basics-javascript/src/tokenizeJavaScript.js +7 -0
  7. package/extensions/builtin.language-basics-json/extension.json +3 -1
  8. package/extensions/builtin.language-basics-jsx/README.md +14 -0
  9. package/extensions/builtin.language-basics-jsx/extension.json +13 -0
  10. package/extensions/builtin.language-basics-jsx/src/tokenizeJsx.js +648 -0
  11. package/extensions/builtin.language-basics-julia/src/tokenizeJulia.js +52 -1
  12. package/extensions/builtin.language-basics-markdown/src/tokenizeMarkdown.js +82 -2
  13. package/extensions/builtin.language-basics-mdx/README.md +14 -0
  14. package/extensions/builtin.language-basics-mdx/extension.json +12 -0
  15. package/extensions/builtin.language-basics-mdx/src/tokenizeMdx.js +395 -0
  16. package/extensions/builtin.language-basics-shellscript/src/tokenizeShellScript.js +22 -1
  17. package/extensions/builtin.language-basics-toml/src/tokenizeToml.js +29 -1
  18. package/extensions/builtin.language-basics-typescript/extension.json +1 -1
  19. package/extensions/builtin.language-basics-typescript/src/tokenizeTypeScript.js +128 -12
  20. package/extensions/builtin.language-basics-xml/extension.json +3 -2
  21. package/extensions/builtin.language-basics-xml/src/tokenizeXml.js +26 -3
  22. package/extensions/builtin.language-basics-yaml/src/tokenizeYaml.js +7 -1
  23. package/extensions/builtin.theme-atom-one-dark/color-theme.json +4 -0
  24. package/extensions/builtin.theme-cobalt2/color-theme.json +4 -0
  25. package/extensions/builtin.theme-gruvbox/color-theme.json +4 -0
  26. package/extensions/builtin.vscode-icons/icon-theme.json +40 -2
  27. package/extensions/builtin.vscode-icons/icons/file_type_bazel_ignore.svg +1 -0
  28. package/extensions/builtin.vscode-icons/icons/file_type_bazel_version.svg +1 -0
  29. package/extensions/builtin.vscode-icons/icons/file_type_eleventy.svg +1 -0
  30. package/extensions/builtin.vscode-icons/icons/file_type_eleventy2.svg +1 -0
  31. package/extensions/builtin.vscode-icons/icons/file_type_light_eleventy.svg +1 -0
  32. package/extensions/builtin.vscode-icons/icons/file_type_light_eleventy2.svg +1 -0
  33. package/extensions/builtin.vscode-icons/icons/file_type_light_rome.svg +1 -0
  34. package/extensions/builtin.vscode-icons/icons/file_type_light_tree.svg +1 -0
  35. package/extensions/builtin.vscode-icons/icons/file_type_mondoo.svg +1 -0
  36. package/extensions/builtin.vscode-icons/icons/file_type_nuxt.svg +1 -1
  37. package/extensions/builtin.vscode-icons/icons/file_type_rome.svg +1 -0
  38. package/extensions/builtin.vscode-icons/icons/file_type_sapphire_framework_cli.svg +1 -0
  39. package/extensions/builtin.vscode-icons/icons/file_type_shellcheck.svg +91 -0
  40. package/extensions/builtin.vscode-icons/icons/file_type_shuttle.svg +1 -0
  41. package/extensions/builtin.vscode-icons/icons/file_type_tree.svg +1 -0
  42. package/extensions/builtin.vscode-icons/icons/folder_type_nuxt.svg +1 -1
  43. package/extensions/builtin.vscode-icons/icons/folder_type_nuxt_opened.svg +1 -1
  44. package/package.json +7 -6
  45. package/src/parts/CleanStack/CleanStack.js +5 -0
  46. package/src/parts/Cli/Cli.js +5 -4
  47. package/src/parts/CliCommandType/CliCommandType.js +10 -0
  48. package/src/parts/CliInstall/CliInstall.js +3 -2
  49. package/src/parts/CliLink/CliLink.js +3 -2
  50. package/src/parts/CliList/CliList.js +3 -1
  51. package/src/parts/ClipBoard/ClipBoard.js +3 -2
  52. package/src/parts/ClipBoard/ClipBoardGnome.js +15 -31
  53. package/src/parts/CommandNotFoundError/CommandNotFoundError.js +9 -0
  54. package/src/parts/DesktopType/DesktopType.js +3 -0
  55. package/src/parts/Download/Download.js +1 -1
  56. package/src/parts/DownloadAndExtract/DownloadAndExtract.js +2 -2
  57. package/src/parts/Error/FileSystemError.js +1 -1
  58. package/src/parts/ErrorCodes/ErrorCodes.js +2 -0
  59. package/src/parts/ErrorHandling/ErrorHandling.js +4 -3
  60. package/src/parts/ExecCommand/ExecCommand.js +25 -0
  61. package/src/parts/ExecPromise/ExecPromise.js +4 -0
  62. package/src/parts/ExitCode/ExitCode.js +5 -0
  63. package/src/parts/ExportStatic/ExportStatic.js +2 -2
  64. package/src/parts/ExtensionHost/ExtensionHost.ipc.js +0 -1
  65. package/src/parts/ExtensionHost/ExtensionHost.js +1 -1
  66. package/src/parts/ExtensionHostIpc/ExtensionHostIpcWithChildProcess.js +3 -8
  67. package/src/parts/ExtensionHostIpc/ExtensionHostIpcWithWorker.js +3 -7
  68. package/src/parts/ExtensionInstallFromFile/ExtensionInstallFromFile.js +2 -5
  69. package/src/parts/ExtensionInstallFromGitHub/ExtensionInstallFromGitHub.js +1 -1
  70. package/src/parts/ExtensionInstallFromUrl/ExtensionInstallFromUrl.js +3 -3
  71. package/src/parts/ExtensionLink/ExtensionLink.js +19 -0
  72. package/src/parts/ExtensionManagement/ExtensionManagement.ipc.js +1 -1
  73. package/src/parts/ExtensionManagement/ExtensionManagementColorTheme.js +3 -2
  74. package/src/parts/ExtensionManagement/ExtensionManagementLanguages.js +7 -14
  75. package/src/parts/ExtensionManifest/ExtensionManifest.js +14 -4
  76. package/src/parts/ExtractZip/ExtractZip.js +1 -1
  77. package/src/parts/GetResponse/GetResponse.js +2 -1
  78. package/src/parts/GitLsFiles/GitLsFiles.ipc.js +2 -0
  79. package/src/parts/GitLsFiles/GitLsFiles.js +21 -5
  80. package/src/parts/Hash/Hash.js +7 -0
  81. package/src/parts/IpcChild/IpcChild.js +6 -0
  82. package/src/parts/IpcChildModule/IpcChildModule.js +12 -0
  83. package/src/parts/IpcChildType/IpcChildType.js +13 -0
  84. package/src/parts/IpcChildWithNodeForkedProcess/IpcChildWithNodeForkedProcess.js +19 -0
  85. package/src/parts/IpcChildWithNodeWorker/IpcChildWithNodeWorker.js +27 -0
  86. package/src/parts/MergeStacks/MergeStacks.js +19 -0
  87. package/src/parts/ModuleMap/ModuleMap.js +4 -1
  88. package/src/parts/NormalizeErrorLine/NormalizeErrorLine.js +9 -0
  89. package/src/parts/OutputChannel/OutputChannel.ipc.js +1 -1
  90. package/src/parts/ParentIpc/ParentIpc.js +6 -10
  91. package/src/parts/ParseInt/ParseInt.js +3 -0
  92. package/src/parts/Platform/Platform.js +16 -21
  93. package/src/parts/Preferences/Preferences.js +2 -1
  94. package/src/parts/PrettyError/PrettyError.js +12 -23
  95. package/src/parts/PrintPrettyError/PrintPrettyError.js +3 -0
  96. package/src/parts/Process/Process.js +2 -2
  97. package/src/parts/ProtocolType/ProtocolType.js +3 -0
  98. package/src/parts/RecentlyOpened/RecentlyOpened.js +1 -1
  99. package/src/parts/Stats/Stats.js +8 -11
  100. package/src/parts/SymLink/SymLink.js +2 -14
  101. package/src/parts/TextDocument/TextDocument.js +3 -1
  102. package/src/parts/VError/VError.js +5 -22
@@ -775,5 +775,10 @@
775
775
  "key": "ArrowDown",
776
776
  "command": "EditorImage.moveDown",
777
777
  "when": "focus.EditorImage"
778
+ },
779
+ {
780
+ "key": "ctrl+j",
781
+ "command": "Viewlet.openWidget",
782
+ "args": ["ColorPicker"]
778
783
  }
779
784
  ]
@@ -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,
@@ -5,7 +5,7 @@
5
5
  "languages": [
6
6
  {
7
7
  "id": "graphql",
8
- "extensions": [".gql"],
8
+ "extensions": [".gql", ".graphql", ".graphqls"],
9
9
  "tokenize": "src/tokenizeGraphql.js"
10
10
  }
11
11
  ]
@@ -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: 1,
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
- const tokens = [TokenType.Text, line.length]
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: 1,
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] === '.') {
@@ -46,7 +46,9 @@
46
46
  "pdfjs.config",
47
47
  "tsconfig.tsbuildinfo",
48
48
  ".gdntsa",
49
- ".nycrc"
49
+ ".nycrc",
50
+ "manifest.webapp",
51
+ ".alexrc"
50
52
  ],
51
53
  "tokenize": "src/tokenizeJson.js"
52
54
  }
@@ -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
+ [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/lvce-editor/language-basics-jsx)