@lvce-editor/shared-process 0.11.11 → 0.12.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 (25) hide show
  1. package/config/fileMap.json +1 -2
  2. package/extensions/builtin.language-basics-css/README.md +2 -0
  3. package/extensions/builtin.language-basics-css/src/tokenizeCss.js +7 -0
  4. package/extensions/builtin.language-basics-dotenv/extension.json +7 -1
  5. package/extensions/builtin.language-basics-html/src/tokenizeHtml.js +9 -2
  6. package/extensions/builtin.language-basics-javascript/src/tokenizeJavaScript.js +54 -2
  7. package/extensions/builtin.language-basics-json/extension.json +4 -1
  8. package/extensions/builtin.language-basics-json/src/tokenizeJson.js +27 -0
  9. package/extensions/builtin.language-basics-markdown/src/tokenizeMarkdown.js +25 -2
  10. package/extensions/builtin.language-basics-shellscript/src/tokenizeShellScript.js +17 -15
  11. package/extensions/builtin.language-basics-typescript/src/tokenizeTypeScript.js +55 -5
  12. package/extensions/builtin.language-basics-vue/README.md +14 -0
  13. package/extensions/builtin.language-basics-vue/extension.json +13 -0
  14. package/extensions/builtin.language-basics-vue/src/tokenizeVue.js +327 -0
  15. package/extensions/builtin.language-basics-yaml/src/tokenizeYaml.js +2 -1
  16. package/extensions/builtin.theme-atom-one-dark/color-theme.json +16 -0
  17. package/extensions/builtin.theme-ayu/color-theme.json +10 -1
  18. package/extensions/builtin.theme-cobalt2/color-theme.json +16 -0
  19. package/extensions/builtin.theme-gruvbox/color-theme.json +16 -0
  20. package/extensions/builtin.theme-noctis-uva/color-theme.json +20 -0
  21. package/extensions/builtin.theme-palenight/color-theme.json +8 -0
  22. package/extensions/builtin.theme-slime/color-theme.json +16 -0
  23. package/package.json +6 -6
  24. package/src/parts/ExportStatic/ExportStatic.js +14 -8
  25. package/src/parts/FileSystem/FileSystem.js +0 -1
@@ -12,6 +12,5 @@
12
12
  "/playground/languages/index.pl",
13
13
  "/playground/languages/index.py",
14
14
  "/playground/languages/index.ts",
15
- "/playground/languages/scrolling.txt",
16
- "/playground/.gitkeep"
15
+ "/playground/languages/scrolling.txt"
17
16
  ]
@@ -1,5 +1,7 @@
1
1
  # Language Basics Css
2
2
 
3
+ Css syntax highlighting for Lvce Editor.
4
+
3
5
  ## Contributing
4
6
 
5
7
  ```sh
@@ -257,6 +257,13 @@ export const tokenizeLine = (line, lineState) => {
257
257
  } else if ((next = part.match(RE_COMMA))) {
258
258
  token = TokenType.Punctuation
259
259
  state = State.AfterQuery
260
+ } else if ((next = part.match(RE_DOUBLE_QUOTE))) {
261
+ token = TokenType.Punctuation
262
+ state = State.InsideDoubleQuoteString
263
+ stack.push(State.AfterQuery)
264
+ } else if ((next = part.match(RE_SEMICOLON))) {
265
+ token = TokenType.Punctuation
266
+ state = stack.pop() || State.TopLevelContent
260
267
  } else {
261
268
  part
262
269
  throw new Error('no')
@@ -6,7 +6,13 @@
6
6
  {
7
7
  "id": "dotenv",
8
8
  "extensions": [".env"],
9
- "fileNames": ["sampledotenv", ".env.local", ".env.example"],
9
+ "fileNames": [
10
+ "sampledotenv",
11
+ ".env.local",
12
+ ".env.example",
13
+ ".env.development.example",
14
+ ".env.production.example"
15
+ ],
10
16
  "configuration": "./languageConfiguration.json",
11
17
  "tokenize": "src/tokenizeDotenv.js"
12
18
  }
@@ -56,13 +56,14 @@ export const TokenMap = {
56
56
  const RE_ANGLE_BRACKET_CLOSE = /^>/
57
57
  const RE_ANGLE_BRACKET_ONLY = /^</
58
58
  const RE_ANGLE_BRACKET_OPEN = /^</
59
- const RE_ANGLE_BRACKET_OPEN_TAG = /^<(?!\s)/
59
+ const RE_ANGLE_BRACKET_OPEN_TAG = /^<(?![\s!])/
60
60
  const RE_ANY_TEXT = /^[^\n]+/
61
- const RE_ATTRIBUTE_NAME = /^[a-zA-Z\d\-]+/
61
+ const RE_ATTRIBUTE_NAME = /^[a-zA-Z\d\-\:]+/
62
62
  const RE_BLOCK_COMMENT_CONTENT_1 = /^.+?(?=-->)/s
63
63
  const RE_BLOCK_COMMENT_CONTENT_2 = /^.+$/s
64
64
  const RE_BLOCK_COMMENT_END = /^-->/
65
65
  const RE_BLOCK_COMMENT_START = /^<!--/
66
+ const RE_DOCTYPE = /^<!(?=\w)/
66
67
  const RE_DASH_DASH = /^\-\-/
67
68
  const RE_DOUBLE_QUOTE = /^"/
68
69
  const RE_EQUAL_SIGN = /^=/
@@ -124,9 +125,15 @@ export const tokenizeLine = (line, lineState) => {
124
125
  } else if ((next = part.match(RE_TEXT))) {
125
126
  token = TokenType.Text
126
127
  state = State.TopLevelContent
128
+ } else if ((next = part.match(RE_BLOCK_COMMENT_START))) {
129
+ token = TokenType.Comment
130
+ state = State.InsideBlockComment
127
131
  } else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
128
132
  token = TokenType.Text
129
133
  state = State.TopLevelContent
134
+ } else if ((next = part.match(RE_DOCTYPE))) {
135
+ token = TokenType.PunctuationTag
136
+ state = State.AfterOpeningAngleBracket
130
137
  } else if ((next = part.match(RE_ANGLE_BRACKET_OPEN))) {
131
138
  token = TokenType.Text
132
139
  state = State.TopLevelContent
@@ -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
@@ -219,6 +242,8 @@ export const tokenizeLine = (line, lineState) => {
219
242
  token = TokenType.Punctuation
220
243
  if (next[0] === '.') {
221
244
  state = State.AfterPropertyDot
245
+ } else if (next[0] === '}') {
246
+ state = stack.pop() || State.TopLevelContent
222
247
  } else {
223
248
  state = State.TopLevelContent
224
249
  }
@@ -258,6 +283,9 @@ export const tokenizeLine = (line, lineState) => {
258
283
  } else if ((next = part.match(RE_VARIABLE_NAME_SPECIAL))) {
259
284
  token = TokenType.VariableName
260
285
  state = State.TopLevelContent
286
+ } else if ((next = part.match(RE_ANYTHING))) {
287
+ token = TokenType.Text
288
+ state = State.TopLevelContent
261
289
  } else {
262
290
  throw new Error('no')
263
291
  }
@@ -306,7 +334,11 @@ export const tokenizeLine = (line, lineState) => {
306
334
  } else if ((next = part.match(RE_STRING_ESCAPE))) {
307
335
  token = TokenType.String
308
336
  state = State.InsideSingleQuoteString
337
+ } else if ((next = part.match(RE_BACKSLASH))) {
338
+ token = TokenType.String
339
+ state = State.InsideSingleQuoteString
309
340
  } else {
341
+ part
310
342
  throw new Error('no')
311
343
  }
312
344
  break
@@ -320,6 +352,9 @@ export const tokenizeLine = (line, lineState) => {
320
352
  } else if ((next = part.match(RE_STRING_ESCAPE))) {
321
353
  token = TokenType.String
322
354
  state = State.InsideDoubleQuoteString
355
+ } else if ((next = part.match(RE_BACKSLASH))) {
356
+ token = TokenType.String
357
+ state = State.InsideDoubleQuoteString
323
358
  } else {
324
359
  throw new Error('no')
325
360
  }
@@ -331,9 +366,19 @@ export const tokenizeLine = (line, lineState) => {
331
366
  } else if ((next = part.match(RE_STRING_BACKTICK_QUOTE_CONTENT))) {
332
367
  token = TokenType.String
333
368
  state = State.InsideBacktickString
369
+ } else if ((next = part.match(RE_DOLLAR_CURLY_OPEN))) {
370
+ token = TokenType.Punctuation
371
+ state = State.TopLevelContent
372
+ stack.push(State.InsideBacktickString)
334
373
  } else if ((next = part.match(RE_STRING_ESCAPE))) {
335
374
  token = TokenType.String
336
375
  state = State.InsideBacktickString
376
+ } else if ((next = part.match(RE_BACKSLASH))) {
377
+ token = TokenType.String
378
+ state = State.InsideDoubleQuoteString
379
+ } else if ((next = part.match(RE_DOLLAR))) {
380
+ token = TokenType.String
381
+ state = State.InsideBacktickString
337
382
  } else {
338
383
  throw new Error('no')
339
384
  }
@@ -357,6 +402,9 @@ export const tokenizeLine = (line, lineState) => {
357
402
  } else if ((next = part.match(RE_PUNCTUATION))) {
358
403
  token = TokenType.Punctuation
359
404
  state = State.TopLevelContent
405
+ } else if ((next = part.match(RE_VARIABLE_NAME_SPECIAL_2))) {
406
+ token = TokenType.VariableName
407
+ state = State.TopLevelContent
360
408
  } else {
361
409
  throw new Error('no')
362
410
  }
@@ -372,8 +420,12 @@ export const tokenizeLine = (line, lineState) => {
372
420
  if (state === State.InsideLineComment) {
373
421
  state = State.TopLevelContent
374
422
  }
423
+ if (state === State.InsideSingleQuoteString && !line.endsWith('\\')) {
424
+ state = State.TopLevelContent
425
+ }
375
426
  return {
376
427
  state,
377
428
  tokens,
429
+ stack,
378
430
  }
379
431
  }
@@ -43,7 +43,10 @@
43
43
  ".publishrc",
44
44
  ".whitesource",
45
45
  ".mention-bot",
46
- "pdfjs.config"
46
+ "pdfjs.config",
47
+ "tsconfig.tsbuildinfo",
48
+ ".gdntsa",
49
+ ".nycrc"
47
50
  ],
48
51
  "tokenize": "src/tokenizeJson.js"
49
52
  }
@@ -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')
@@ -17,6 +17,7 @@ const State = {
17
17
  InsideSingleQuoteString: 13,
18
18
  AfterTripleBackTick: 14,
19
19
  AfterTripleBackTickAfterLanguageId: 15,
20
+ InsideBackTickString: 16,
20
21
  }
21
22
 
22
23
  export const StateMap = {}
@@ -39,6 +40,7 @@ export const TokenType = {
39
40
  PunctuationString: 11,
40
41
  NewLine: 891,
41
42
  Heading: 13,
43
+ MarkdownString: 18,
42
44
  }
43
45
 
44
46
  export const TokenMap = {
@@ -55,6 +57,7 @@ export const TokenMap = {
55
57
  [TokenType.Error]: 'Error',
56
58
  [TokenType.PunctuationString]: 'PunctuationString',
57
59
  [TokenType.Heading]: 'Heading',
60
+ [TokenType.MarkdownString]: 'MarkdownString',
58
61
  }
59
62
 
60
63
  const RE_ANGLE_BRACKET_CLOSE = /^>/
@@ -79,17 +82,20 @@ const RE_PUNCTUATION = /^[<;'".,]/
79
82
  const RE_PUNCTUATION_SELF_CLOSING = /^\/>/
80
83
  const RE_SELF_CLOSING = /^\/>/
81
84
  const RE_SINGLE_QUOTE = /^'/
85
+ const RE_QUOTE_BACKTICK = /^`/
82
86
  const RE_SLASH = /^\//
87
+ const RE_STRING_BACKTICK_QUOTE_CONTENT = /^[^`]+/
83
88
  const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"]+/
84
89
  const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
85
90
  const RE_TAG_TEXT = /^[^\s>]+/
86
91
  const RE_TAGNAME = /^[!\w]+/
87
- const RE_TEXT = /^[^<>\n]+/
92
+ const RE_TEXT = /^[^<>\n\`]+/
88
93
  const RE_WHITESPACE = /^\s+/
89
94
  const RE_WORD = /^[^\s]+/
90
95
  const RE_HEADING = /^\#.*/s
91
96
  const RE_TRIPLE_BACKTICK = /^`{3,}/
92
- const RE_TRIPLE_QUOTED_STRING_CONTENT = /.*/s
97
+ const RE_TRIPLE_QUOTED_STRING_CONTENT = /[^`]/s
98
+ const RE_STRING_ESCAPE = /^\\./
93
99
 
94
100
  export const initialLineState = {
95
101
  state: State.TopLevelContent,
@@ -137,6 +143,9 @@ export const tokenizeLine = (line, lineState) => {
137
143
  } else if ((next = part.match(RE_TEXT))) {
138
144
  token = TokenType.Text
139
145
  state = State.TopLevelContent
146
+ } else if ((next = part.match(RE_QUOTE_BACKTICK))) {
147
+ token = TokenType.Punctuation
148
+ state = State.InsideBackTickString
140
149
  } else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
141
150
  token = TokenType.Text
142
151
  state = State.TopLevelContent
@@ -323,6 +332,20 @@ export const tokenizeLine = (line, lineState) => {
323
332
  throw new Error('no')
324
333
  }
325
334
  break
335
+ case State.InsideBackTickString:
336
+ if ((next = part.match(RE_QUOTE_BACKTICK))) {
337
+ token = TokenType.Punctuation
338
+ state = State.TopLevelContent
339
+ } else if ((next = part.match(RE_STRING_BACKTICK_QUOTE_CONTENT))) {
340
+ token = TokenType.MarkdownString
341
+ state = State.InsideBackTickString
342
+ } else if ((next = part.match(RE_STRING_ESCAPE))) {
343
+ token = TokenType.String
344
+ state = State.InsideBackTickString
345
+ } else {
346
+ throw new Error('no')
347
+ }
348
+ break
326
349
  default:
327
350
  state
328
351
  throw new Error('no')
@@ -72,7 +72,7 @@ const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"\\]+/
72
72
  const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
73
73
  const RE_STRING_BACKTICK_QUOTE_CONTENT = /^[^`]+/
74
74
  const RE_KEYWORD =
75
- /^(?:7z|7za|7zr|alias|apk|apt-get|ar|asciidoctor|awk|basename|bash|bg|bind|blkid|break|brew|brotli|builtin|bunzip|bunzip2|caller|cargo|case|cat|catdoc|cd|chmod|chown|cmp|command|compgen|complete|continue|cp|cryptsetup|curl|curl|cut|cygstart|dde-open|defaults|diff|dirname|dirs|disown|do|docker|done|done|dpkg|du|echo|elif|else|emulate|enable|enlightenment_open|esac|eval|eval_gettext|exec|exit|expr|false|fc|fg|fi|find|for|free|function|fzf|g\+\+|gcc|gcloud|gdbus|getopts|gio|git|gnome-open|grep|grub-mount|gs|gulp|gvfs-open|gzip|hash|head|help|hexdump|history|identity|if|in|install|ip|jobs|kde-open|kfmclient|kill|killall|less|let|lha|local|logout|ls|ls|lunzip|lzip|lzma|makepkg|miniunz|miniunzip|mkdir|mktemp|mount|mpicc|mv|node|npm|npx|open|pacman|pcmanfm|pdftotext|pkg|plutil|popd|prezip-bin|printf|println|ps|pushd|pwd|python3|rar|read|readlink|readonly|return|rm|rpm|rsync|sed|set|sha256sum|shift|shopt|sleep|snap|sort|source|stty|sudo|suspend|tail|tar|tee|test|texi2dvi|then|times|touch|trap|true|tty|tune2fs|type|ulimit|umask|umask|unalias|unarj|unmkinitramfs|unmount|unrar|unset|unwrapdiff|unzip|unzoo|vim|wait|wc|wget|which|while|xargs|xprop|xz|yarn|yum|zip|zoo|zsh|zstd)\b/
75
+ /^(?:7z|7za|7zr|alias|apk|apt-get|ar|asciidoctor|awk|basename|bash|bg|bind|blkid|break|brew|brotli|builtin|bunzip|bunzip2|caller|cargo|case|cat|catdoc|cd|chmod|chown|cmp|command|compgen|complete|continue|cp|cryptsetup|curl|curl|cut|cygstart|dde-open|defaults|diff|dirname|dirs|disown|do|docker|done|done|dpkg|du|echo|elif|else|emulate|enable|enlightenment_open|esac|eval|eval_gettext|exec|exit|expr|false|fc|fg|fi|find|for|free|function|fzf|g\+\+|gcc|gcloud|gdbus|getopts|gio|git|gnome-open|grep|grub-mount|gs|gulp|gvfs-open|gzip|hash|head|help|hexdump|history|identity|if|in|install|ip|jobs|kde-open|kfmclient|kill|killall|less|let|lha|ln|local|logout|ls|ls|lunzip|lzip|lzma|makepkg|miniunz|miniunzip|mkdir|mktemp|mount|mpicc|mv|node|npm|npx|open|pacman|pcmanfm|pdftotext|pkg|plutil|popd|prezip-bin|printf|println|ps|pushd|pwd|python3|rar|read|readlink|readonly|return|rm|rpm|rsync|sed|set|sha256sum|shift|shopt|sleep|snap|sort|source|stty|sudo|suspend|tail|tar|tee|test|texi2dvi|then|times|touch|trap|true|tty|tune2fs|type|ulimit|umask|umask|unalias|unarj|unmkinitramfs|unmount|unrar|unset|unwrapdiff|unzip|unzoo|update-alternatives|vim|wait|wc|wget|which|while|xargs|xprop|xz|yarn|yum|zip|zoo|zsh|zstd)\b/
76
76
  const RE_VARIABLE_NAME = /^[a-zA-Z\_\/\-\$][a-zA-Z\_\/\-\$#\d\-]*/
77
77
  const RE_PUNCTUATION = /^[:,;\{\}\[\]\.=\(\)<>\!\|\+\&\>\)]/
78
78
  const RE_NUMERIC = /^\d+(?=\s|$)/
@@ -147,10 +147,15 @@ export const tokenizeLine = (line, lineState) => {
147
147
  case 'apk':
148
148
  case 'apt-get':
149
149
  case 'ar':
150
+ case 'asciidoctor':
150
151
  case 'awk':
152
+ case 'basename':
153
+ case 'bash':
151
154
  case 'bg':
152
155
  case 'bind':
153
156
  case 'blkid':
157
+ case 'brew':
158
+ case 'brotli':
154
159
  case 'builtin':
155
160
  case 'bunzip':
156
161
  case 'bunzip2':
@@ -172,10 +177,12 @@ export const tokenizeLine = (line, lineState) => {
172
177
  case 'cut':
173
178
  case 'cygstart':
174
179
  case 'dde-open':
180
+ case 'defaults':
175
181
  case 'diff':
176
182
  case 'dirname':
177
183
  case 'dirs':
178
184
  case 'disown':
185
+ case 'docker':
179
186
  case 'dpkg':
180
187
  case 'du':
181
188
  case 'echo':
@@ -194,6 +201,7 @@ export const tokenizeLine = (line, lineState) => {
194
201
  case 'fzf':
195
202
  case 'g++':
196
203
  case 'gcc':
204
+ case 'gcloud':
197
205
  case 'gdbus':
198
206
  case 'getopts':
199
207
  case 'gio':
@@ -220,6 +228,7 @@ export const tokenizeLine = (line, lineState) => {
220
228
  case 'killall':
221
229
  case 'less':
222
230
  case 'lha':
231
+ case 'ln':
223
232
  case 'logout':
224
233
  case 'ls':
225
234
  case 'ls':
@@ -236,17 +245,21 @@ export const tokenizeLine = (line, lineState) => {
236
245
  case 'mv':
237
246
  case 'node':
238
247
  case 'npm':
248
+ case 'npx':
239
249
  case 'open':
240
250
  case 'pacman':
241
251
  case 'pcmanfm':
242
252
  case 'pdftotext':
243
253
  case 'pkg':
254
+ case 'plutil':
244
255
  case 'popd':
245
256
  case 'prezip-bin':
246
257
  case 'printf':
258
+ case 'println':
247
259
  case 'ps':
248
260
  case 'pushd':
249
261
  case 'pwd':
262
+ case 'python3':
250
263
  case 'rar':
251
264
  case 'read':
252
265
  case 'readlink':
@@ -255,6 +268,7 @@ export const tokenizeLine = (line, lineState) => {
255
268
  case 'rsync':
256
269
  case 'sed':
257
270
  case 'set':
271
+ case 'sha256sum':
258
272
  case 'shift':
259
273
  case 'shopt':
260
274
  case 'sleep':
@@ -287,6 +301,7 @@ export const tokenizeLine = (line, lineState) => {
287
301
  case 'unwrapdiff':
288
302
  case 'unzip':
289
303
  case 'unzoo':
304
+ case 'update-alternatives':
290
305
  case 'vim':
291
306
  case 'wait':
292
307
  case 'wc':
@@ -299,21 +314,8 @@ export const tokenizeLine = (line, lineState) => {
299
314
  case 'yum':
300
315
  case 'zip':
301
316
  case 'zoo':
302
- case 'zstd':
303
- case 'basename':
304
- case 'brew':
305
- case 'sha256sum':
306
- case 'brotli':
307
317
  case 'zsh':
308
- case 'asciidoctor':
309
- case 'docker':
310
- case 'python3':
311
- case 'bash':
312
- case 'npx':
313
- case 'gcloud':
314
- case 'println':
315
- case 'plutil':
316
- case 'defaults':
318
+ case 'zstd':
317
319
  token = TokenType.Function
318
320
  break
319
321
  case 'true':
@@ -33,6 +33,7 @@ const State = {
33
33
  InsideMethodParameters: 30,
34
34
  InsideMethodParametersAfterVariableName: 31,
35
35
  AfterMethodParameters: 32,
36
+ AfterPropertyDot: 33,
36
37
  // AfterKeywordImport: 27,
37
38
  }
38
39
 
@@ -63,6 +64,7 @@ export const TokenType = {
63
64
  StorageModifier: 18,
64
65
  KeywordVoid: 19,
65
66
  Function: 20,
67
+ FunctionName: 21,
66
68
  }
67
69
 
68
70
  export const TokenMap = {
@@ -89,6 +91,7 @@ export const TokenMap = {
89
91
  [TokenType.StorageModifier]: 'StorageModifier',
90
92
  [TokenType.KeywordVoid]: 'KeywordVoid',
91
93
  [TokenType.Function]: 'Function',
94
+ [TokenType.FunctionName]: 'Function',
92
95
  }
93
96
 
94
97
  export const initialLineState = {
@@ -99,8 +102,9 @@ export const initialLineState = {
99
102
  stack: [],
100
103
  }
101
104
 
105
+ const RE_LINE_COMMENT = /^\/\/[^\n]*/
102
106
  const RE_KEYWORD =
103
- /^(?:yield|with|while|void|var|typeof|type|true|try|throw|this|static|switch|super|return|public|protected|private|package|null|new|let|interface|instanceof|in|import|implements|if|function|for|finally|from|false|extends|export|enum|else|do|delete|default|debugger|declare|continue|const|class|catch|case|break|await|async)\b/
107
+ /^(?:yield|with|while|void|var|typeof|type|true|try|throw|this|static|switch|super|readonly|return|public|protected|private|package|null|new|let|interface|instanceof|in|import|implements|if|function|for|finally|from|false|extends|export|enum|else|do|delete|default|debugger|declare|continue|const|constructor|class|catch|case|break|await|async|abstract)\b/
104
108
  const RE_WHITESPACE = /^\s+/
105
109
  const RE_VARIABLE_NAME = /^[\$a-zA-Z\_][\$a-zA-Z\_\d]*/
106
110
  const RE_PUNCTUATION = /^[:,;\{\}\[\]\.=\(\)>\+]/
@@ -151,6 +155,12 @@ const RE_ANGLE_OPEN = /^</
151
155
  const RE_ANGLE_CLOSE = /^>/
152
156
  const RE_OPERATOR = /^[!\*\?\.\:\|\%\&\^@]/
153
157
  const RE_METHOD_NAME = /^[\w\d]+(?=\s*(\(|\:\s*function|\:\s*\())/
158
+ const RE_FUNCTION_CALL_NAME = /^[\w]+(?=\s*(\(|\=\s*function|\=\s*\())/
159
+ const RE_NUMERIC_2 =
160
+ /^(?:(?:[0-9][0-9_]*(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)|(?:[0-9][0-9_]*(\.)[eE][+-]?[0-9][0-9_]*(n)?\b)|(?:(\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)|(?:[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\b)|(?:[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)|(?:[0-9][0-9_]*(\.)[0-9][0-9_]*(n)?\b)|(?:[0-9][0-9_]*(\.)(n)?\B)|(?:(\.)[0-9][0-9_]*(n)?\b)|(?:[0-9][0-9_]*(n)?\b(?!\.))|(?:0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b)|(?:0(?:b|B)[01][01_]*(n)?\b)|(?:0(?:o|O)?[0-7][0-7_]*(n)?\b))/ // 1.1E+3
161
+ const RE_NUMERIC_HEX = /0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\b/
162
+ const RE_NUMERIC_BINARY = /0(?:b|B)[01][01_]*(n)?\b/
163
+ const RE_NUMERIC_OCTAL = /0(?:o|O)?[0-7][0-7_]*(n)?\b/
154
164
 
155
165
  export const hasArrayReturn = true
156
166
 
@@ -237,6 +247,15 @@ export const tokenizeLine = (line, lineState) => {
237
247
  token = TokenType.Keyword
238
248
  state = State.AfterKeywordInterface
239
249
  break
250
+ case 'private':
251
+ case 'protected':
252
+ case 'readonly':
253
+ case 'public':
254
+ case 'override':
255
+ case 'abstract':
256
+ token = TokenType.KeywordModifier
257
+ state = State.TopLevelContent
258
+ break
240
259
  default:
241
260
  token = TokenType.Keyword
242
261
  state = State.TopLevelContent
@@ -245,9 +264,6 @@ export const tokenizeLine = (line, lineState) => {
245
264
  } else if ((next = part.match(RE_VARIABLE_NAME))) {
246
265
  token = TokenType.VariableName
247
266
  state = State.TopLevelContent
248
- } else if ((next = part.match(RE_PUNCTUATION))) {
249
- token = TokenType.Punctuation
250
- state = State.TopLevelContent
251
267
  } else if ((next = part.match(RE_SLASH))) {
252
268
  if ((next = part.match(RE_BLOCK_COMMENT_START))) {
253
269
  token = TokenType.Comment
@@ -263,9 +279,20 @@ export const tokenizeLine = (line, lineState) => {
263
279
  token = TokenType.Punctuation
264
280
  state = State.TopLevelContent
265
281
  }
266
- } else if ((next = part.match(RE_NUMERIC))) {
282
+ }
283
+ // else if ((next = part.match(RE_NUMERIC))) {
284
+ // token = TokenType.Numeric
285
+ // state = State.TopLevelContent
286
+ // }
287
+ else if ((next = part.match(RE_NUMERIC_2))) {
267
288
  token = TokenType.Numeric
268
289
  state = State.TopLevelContent
290
+ } else if ((next = part.match(RE_PUNCTUATION))) {
291
+ token = TokenType.Punctuation
292
+ state = State.TopLevelContent
293
+ if (next[0] === '.') {
294
+ state = State.AfterPropertyDot
295
+ }
269
296
  } else if ((next = part.match(RE_QUOTE_SINGLE))) {
270
297
  token = TokenType.Punctuation
271
298
  state = State.InsideSingleQuoteString
@@ -767,6 +794,29 @@ export const tokenizeLine = (line, lineState) => {
767
794
  throw new Error('no')
768
795
  }
769
796
  break
797
+ case State.AfterPropertyDot:
798
+ if ((next = part.match(RE_WHITESPACE))) {
799
+ token = TokenType.Whitespace
800
+ state = State.AfterPropertyDot
801
+ } else if ((next = part.match(RE_FUNCTION_CALL_NAME))) {
802
+ token = TokenType.FunctionName
803
+ state = State.TopLevelContent
804
+ } else if ((next = part.match(RE_VARIABLE_NAME))) {
805
+ token = TokenType.VariableName
806
+ state = State.TopLevelContent
807
+ } else if ((next = part.match(RE_LINE_COMMENT))) {
808
+ token = TokenType.Comment
809
+ state = State.InsideLineComment
810
+ } else if ((next = part.match(RE_BLOCK_COMMENT_START))) {
811
+ token = TokenType.Comment
812
+ state = State.InsideBlockComment
813
+ } else if ((next = part.match(RE_PUNCTUATION))) {
814
+ token = TokenType.Punctuation
815
+ state = State.TopLevelContent
816
+ } else {
817
+ throw new Error('no')
818
+ }
819
+ break
770
820
  default:
771
821
  state
772
822
  throw new Error('no')
@@ -0,0 +1,14 @@
1
+ # Language Basics Vue
2
+
3
+ ## Contributing
4
+
5
+ ```sh
6
+ git clone git@github.com:lvce-editor/language-basics-vue.git &&
7
+ cd language-basics-vue &&
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-vue)
@@ -0,0 +1,13 @@
1
+ {
2
+ "id": "builtin.language-basics-vue",
3
+ "name": "Language Basics Vue",
4
+ "description": "Provides syntax highlighting and bracket matching in Vue files.",
5
+ "languages": [
6
+ {
7
+ "id": "vue",
8
+ "extensions": [".vue"],
9
+ "tokenize": "src/tokenizeVue.js",
10
+ "configuration": "./languageConfiguration.json"
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,327 @@
1
+ /**
2
+ * @enum number
3
+ */
4
+ const State = {
5
+ TopLevelContent: 1,
6
+ AfterOpeningAngleBracket: 2,
7
+ InsideOpeningTag: 3,
8
+ InsideOpeningTagAndHasSeenWhitespace: 4,
9
+ AfterClosingTagAngleBrackets: 5,
10
+ AfterClosingTagName: 6,
11
+ AfterAttributeName: 7,
12
+ AfterAttributeEqualSign: 8,
13
+ InsideAttributeDoubleQuote: 9,
14
+ InsideBlockComment: 10,
15
+ None: 11,
16
+ InsideDoubleQuoteString: 12,
17
+ InsideSingleQuoteString: 13,
18
+ }
19
+
20
+ export const StateMap = {}
21
+
22
+ /**
23
+ * @enum number
24
+ */
25
+ export const TokenType = {
26
+ None: 99999999,
27
+ Numeric: 30,
28
+ String: 50,
29
+ Whitespace: 0,
30
+ Comment: 60,
31
+ Text: 117,
32
+ PunctuationTag: 228,
33
+ TagName: 118,
34
+ AttributeName: 119,
35
+ Punctuation: 10,
36
+ Error: 141,
37
+ PunctuationString: 11,
38
+ NewLine: 891,
39
+ }
40
+
41
+ export const TokenMap = {
42
+ [TokenType.None]: 'None',
43
+ [TokenType.Numeric]: 'Numeric',
44
+ [TokenType.String]: 'String',
45
+ [TokenType.Whitespace]: 'Whitespace',
46
+ [TokenType.Comment]: 'Comment',
47
+ [TokenType.Text]: 'Text',
48
+ [TokenType.PunctuationTag]: 'PunctuationTag',
49
+ [TokenType.TagName]: 'TagName',
50
+ [TokenType.AttributeName]: 'AttributeName',
51
+ [TokenType.Punctuation]: 'Punctuation',
52
+ [TokenType.Error]: 'Error',
53
+ [TokenType.PunctuationString]: 'PunctuationString',
54
+ }
55
+
56
+ const RE_ANGLE_BRACKET_CLOSE = /^>/
57
+ const RE_ANGLE_BRACKET_ONLY = /^</
58
+ const RE_ANGLE_BRACKET_OPEN = /^</
59
+ const RE_ANGLE_BRACKET_OPEN_TAG = /^<(?![\s!])/
60
+ const RE_ANY_TEXT = /^[^\n]+/
61
+ const RE_ATTRIBUTE_NAME = /^[a-zA-Z\d\-\:]+/
62
+ const RE_BLOCK_COMMENT_CONTENT_1 = /^.+?(?=-->)/s
63
+ const RE_BLOCK_COMMENT_CONTENT_2 = /^.+$/s
64
+ const RE_BLOCK_COMMENT_END = /^-->/
65
+ const RE_BLOCK_COMMENT_START = /^<!--/
66
+ const RE_DOCTYPE = /^<!(?=\w)/
67
+ const RE_DASH_DASH = /^\-\-/
68
+ const RE_DOUBLE_QUOTE = /^"/
69
+ const RE_EQUAL_SIGN = /^=/
70
+ const RE_EXCLAMATION_MARK = /^!/
71
+ const RE_INVALID_INSIDE_ClOSING_TAG = /^[^a-zA-Z>]/
72
+ const RE_INVALID_INSIDE_OPENING_TAG = /^[^a-zA-Z>]/
73
+ const RE_NEWLINE = /^\n/
74
+ const RE_NEWLINE_WHITESPACE = /^\n\s*/
75
+ const RE_NOT_TAGNAME = /^[^a-zA-Z\d]+/
76
+ const RE_PUNCTUATION = /^[<;'".,]/
77
+ const RE_PUNCTUATION_SELF_CLOSING = /^\/>/
78
+ const RE_SELF_CLOSING = /^\/>/
79
+ const RE_SINGLE_QUOTE = /^'/
80
+ const RE_SLASH = /^\//
81
+ const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"]+/
82
+ const RE_STRING_SINGLE_QUOTE_CONTENT = /^[^']+/
83
+ const RE_TAG_TEXT = /^[^\s>]+/
84
+ const RE_TAGNAME = /^[!\w]+/
85
+ const RE_TEXT = /^[^<>\n]+/
86
+ const RE_WHITESPACE = /^\s+/
87
+ const RE_WORD = /^[^\s]+/
88
+ const RE_ATTRIBUTE_VALUE_UNQUOTED = /^[^<>]+/
89
+
90
+ export const initialLineState = {
91
+ state: State.TopLevelContent,
92
+ }
93
+
94
+ /**
95
+ *
96
+ * @param {any} lineStateA
97
+ * @param {any} lineStateB
98
+ * @returns
99
+ */
100
+ export const isLineStateEqual = (lineStateA, lineStateB) => {
101
+ return lineStateA.state === lineStateB.state
102
+ }
103
+
104
+ export const hasArrayReturn = true
105
+
106
+ /**
107
+ *
108
+ * @param {string} line
109
+ * @param {any} lineState
110
+ * @returns
111
+ */
112
+ export const tokenizeLine = (line, lineState) => {
113
+ let next = null
114
+ let index = 0
115
+ let tokens = []
116
+ let token = TokenType.None
117
+ let state = lineState.state
118
+ while (index < line.length) {
119
+ const part = line.slice(index)
120
+ switch (state) {
121
+ case State.TopLevelContent:
122
+ if ((next = part.match(RE_ANGLE_BRACKET_OPEN_TAG))) {
123
+ token = TokenType.PunctuationTag
124
+ state = State.AfterOpeningAngleBracket
125
+ } else if ((next = part.match(RE_TEXT))) {
126
+ token = TokenType.Text
127
+ state = State.TopLevelContent
128
+ } else if ((next = part.match(RE_BLOCK_COMMENT_START))) {
129
+ token = TokenType.Comment
130
+ state = State.InsideBlockComment
131
+ } else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
132
+ token = TokenType.Text
133
+ state = State.TopLevelContent
134
+ } else if ((next = part.match(RE_DOCTYPE))) {
135
+ token = TokenType.PunctuationTag
136
+ state = State.AfterOpeningAngleBracket
137
+ } else if ((next = part.match(RE_ANGLE_BRACKET_OPEN))) {
138
+ token = TokenType.Text
139
+ state = State.TopLevelContent
140
+ } else {
141
+ part //?
142
+ throw new Error('no')
143
+ }
144
+ break
145
+ case State.AfterOpeningAngleBracket:
146
+ if ((next = part.match(RE_TAGNAME))) {
147
+ token = TokenType.TagName
148
+ state = State.InsideOpeningTag
149
+ } else if ((next = part.match(RE_SLASH))) {
150
+ token = TokenType.PunctuationTag
151
+ state = State.AfterClosingTagAngleBrackets
152
+ } else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
153
+ token = TokenType.PunctuationTag
154
+ state = State.TopLevelContent
155
+ } else if ((next = part.match(RE_ANGLE_BRACKET_OPEN))) {
156
+ token = TokenType.PunctuationTag
157
+ state = State.AfterOpeningAngleBracket
158
+ } else if ((next = part.match(RE_ANY_TEXT))) {
159
+ token = TokenType.Text
160
+ state = State.TopLevelContent
161
+ } else {
162
+ part //?
163
+ throw new Error('no')
164
+ }
165
+ break
166
+ case State.InsideOpeningTag:
167
+ if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
168
+ token = TokenType.PunctuationTag
169
+ state = State.TopLevelContent
170
+ } else if ((next = part.match(RE_EXCLAMATION_MARK))) {
171
+ token = TokenType.PunctuationTag
172
+ state = State.InsideOpeningTag
173
+ } else if ((next = part.match(RE_WHITESPACE))) {
174
+ token = TokenType.Whitespace
175
+ state = State.InsideOpeningTagAndHasSeenWhitespace
176
+ } else if ((next = part.match(RE_DASH_DASH))) {
177
+ token = TokenType.Comment
178
+ state = State.InsideBlockComment
179
+ } else if ((next = part.match(RE_TAG_TEXT))) {
180
+ token = TokenType.Text
181
+ state = State.InsideOpeningTag
182
+ } else {
183
+ part //?
184
+ throw new Error('no')
185
+ }
186
+ break
187
+ case State.AfterClosingTagAngleBrackets:
188
+ if ((next = part.match(RE_TAGNAME))) {
189
+ token = TokenType.TagName
190
+ state = State.AfterClosingTagName
191
+ } else if ((next = part.match(RE_WHITESPACE))) {
192
+ token = TokenType.Whitespace
193
+ state = State.TopLevelContent
194
+ } else if ((next = part.match(RE_ANY_TEXT))) {
195
+ token = TokenType.Text
196
+ state = State.TopLevelContent
197
+ } else {
198
+ part //?
199
+ throw new Error('no')
200
+ }
201
+ break
202
+ case State.AfterClosingTagName:
203
+ if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
204
+ token = TokenType.PunctuationTag
205
+ state = State.TopLevelContent
206
+ } else if ((next = part.match(RE_TEXT))) {
207
+ token = TokenType.Text
208
+ state = State.TopLevelContent
209
+ } else {
210
+ throw new Error('no')
211
+ }
212
+ break
213
+ case State.InsideOpeningTagAndHasSeenWhitespace:
214
+ if ((next = part.match(RE_ATTRIBUTE_NAME))) {
215
+ token = TokenType.AttributeName
216
+ state = State.AfterAttributeName
217
+ } else if ((next = part.match(RE_SELF_CLOSING))) {
218
+ token = TokenType.PunctuationTag
219
+ state = State.TopLevelContent
220
+ } else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
221
+ token = TokenType.PunctuationTag
222
+ state = State.TopLevelContent
223
+ } else if ((next = part.match(RE_TAG_TEXT))) {
224
+ token = TokenType.Text
225
+ state = State.TopLevelContent
226
+ } else {
227
+ part //?
228
+ throw new Error('no')
229
+ }
230
+ break
231
+ case State.AfterAttributeName:
232
+ if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
233
+ token = TokenType.PunctuationTag
234
+ state = State.TopLevelContent
235
+ } else if ((next = part.match(RE_EQUAL_SIGN))) {
236
+ token = TokenType.Punctuation
237
+ state = State.AfterAttributeEqualSign
238
+ } else if ((next = part.match(RE_DOUBLE_QUOTE))) {
239
+ token = TokenType.PunctuationString
240
+ state = State.InsideDoubleQuoteString
241
+ } else if ((next = part.match(RE_SINGLE_QUOTE))) {
242
+ token = TokenType.PunctuationString
243
+ state = State.InsideSingleQuoteString
244
+ } else if ((next = part.match(RE_TAG_TEXT))) {
245
+ token = TokenType.Text
246
+ state = State.InsideOpeningTag
247
+ } else if ((next = part.match(RE_WHITESPACE))) {
248
+ token = TokenType.Whitespace
249
+ state = State.InsideOpeningTagAndHasSeenWhitespace
250
+ } else {
251
+ // TODO check quotation mark
252
+ part //?
253
+ throw new Error('no')
254
+ }
255
+ break
256
+ case State.AfterAttributeEqualSign:
257
+ if ((next = part.match(RE_DOUBLE_QUOTE))) {
258
+ token = TokenType.PunctuationString
259
+ state = State.InsideDoubleQuoteString
260
+ } else if ((next = part.match(RE_SINGLE_QUOTE))) {
261
+ token = TokenType.PunctuationString
262
+ state = State.InsideSingleQuoteString
263
+ } else if ((next = part.match(RE_ANGLE_BRACKET_CLOSE))) {
264
+ token = TokenType.PunctuationTag
265
+ state = State.TopLevelContent
266
+ } else if ((next = part.match(RE_ATTRIBUTE_VALUE_UNQUOTED))) {
267
+ token = TokenType.String
268
+ state = State.InsideOpeningTag
269
+ } else {
270
+ part
271
+ throw new Error('no')
272
+ }
273
+ break
274
+ case State.InsideDoubleQuoteString:
275
+ if ((next = part.match(RE_DOUBLE_QUOTE))) {
276
+ token = TokenType.PunctuationString
277
+ state = State.InsideOpeningTag
278
+ } else if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
279
+ token = TokenType.String
280
+ state = State.InsideDoubleQuoteString
281
+ } else {
282
+ throw new Error('no')
283
+ }
284
+ break
285
+ case State.InsideSingleQuoteString:
286
+ if ((next = part.match(RE_SINGLE_QUOTE))) {
287
+ token = TokenType.PunctuationString
288
+ state = State.InsideOpeningTag
289
+ } else if ((next = part.match(RE_STRING_SINGLE_QUOTE_CONTENT))) {
290
+ token = TokenType.String
291
+ state = State.InsideSingleQuoteString
292
+ } else {
293
+ throw new Error('no')
294
+ }
295
+ break
296
+ case State.InsideBlockComment:
297
+ part
298
+ if ((next = part.match(RE_BLOCK_COMMENT_CONTENT_1))) {
299
+ token = TokenType.Comment
300
+ state = State.InsideBlockComment
301
+ } else if ((next = part.match(RE_BLOCK_COMMENT_END))) {
302
+ token = TokenType.Comment
303
+ state = State.TopLevelContent
304
+ } else if ((next = part.match(RE_BLOCK_COMMENT_CONTENT_2))) {
305
+ token = TokenType.Comment
306
+ state = State.InsideBlockComment
307
+ } else {
308
+ throw new Error('no')
309
+ }
310
+ break
311
+ default:
312
+ state
313
+ throw new Error('no')
314
+ }
315
+
316
+ const tokenLength = next[0].length
317
+ index += tokenLength
318
+ tokens.push(token, tokenLength)
319
+ }
320
+ if (state === State.AfterClosingTagAngleBrackets) {
321
+ state = State.TopLevelContent
322
+ }
323
+ return {
324
+ state,
325
+ tokens,
326
+ }
327
+ }
@@ -74,7 +74,8 @@ const RE_SEMICOLON = /^;/
74
74
  const RE_COMMA = /^,/
75
75
  const RE_ANYTHING = /^.+/s
76
76
  const RE_ANYTHING_BUT_COMMENT = /^[^#]+/
77
- const RE_NUMERIC = /^(([0-9]+\.?[0-9]*)|(\.[0-9]+))(?=\s*$|\s+#|\s*[\[\]\{\}])/
77
+ const RE_NUMERIC =
78
+ /^\-?(([0-9]+\.?[0-9]*)|(\.[0-9]+))(?=\s*$|\s+#|\s*[\[\]\{\}])/
78
79
  const RE_ANYTHING_UNTIL_CLOSE_BRACE = /^[^\}]+/
79
80
  const RE_BLOCK_COMMENT_START = /^\/\*/
80
81
  const RE_BLOCK_COMMENT_END = /^\*\//
@@ -172,6 +172,22 @@
172
172
  {
173
173
  "name": "KeywordThis",
174
174
  "foreground": "#E06C75"
175
+ },
176
+ {
177
+ "name": "KeywordFunction",
178
+ "foreground": "#C678DD"
179
+ },
180
+ {
181
+ "name": "MarkdownLinkName",
182
+ "foreground": "#61AFEF"
183
+ },
184
+ {
185
+ "name": "MarkdownLinkUrl",
186
+ "foreground": "#C678DD"
187
+ },
188
+ {
189
+ "name": "MarkdownString",
190
+ "foreground": "#ABB2BF"
175
191
  }
176
192
  ]
177
193
  }
@@ -65,7 +65,8 @@
65
65
  "TitleBarColorInactive": "",
66
66
  "TitleBarItemHoverForeground": "rgba(0, 0, 0, 0.1)",
67
67
 
68
- "TreeItemForeground": "#8a9199"
68
+ "TreeItemForeground": "#8a9199",
69
+ "TreeItemActiveBackground": "rgba(86, 114, 143, 0.12)"
69
70
  },
70
71
  "tokenColors": [
71
72
  {
@@ -183,6 +184,14 @@
183
184
  {
184
185
  "name": "KeywordThis",
185
186
  "foreground": "#55B4D4"
187
+ },
188
+ {
189
+ "name": "MarkdownLinkName",
190
+ "foreground": "#55B4D4"
191
+ },
192
+ {
193
+ "name": "MarkdownLinkUrl",
194
+ "foreground": "#55B4D4"
186
195
  }
187
196
  ]
188
197
  }
@@ -155,6 +155,22 @@
155
155
  {
156
156
  "name": "KeywordOperator",
157
157
  "foreground": "#FF9D00"
158
+ },
159
+ {
160
+ "name": "KeywordFunction",
161
+ "foreground": "#FB94FF"
162
+ },
163
+ {
164
+ "name": "MarkdownLinkName",
165
+ "foreground": "#A5FF90"
166
+ },
167
+ {
168
+ "name": "MarkdownLinkUrl",
169
+ "foreground": "#9EFFFF"
170
+ },
171
+ {
172
+ "name": "Heading",
173
+ "foreground": "#FFC600"
158
174
  }
159
175
  ]
160
176
  }
@@ -192,6 +192,22 @@
192
192
  {
193
193
  "name": "KeywordThis",
194
194
  "foreground": "#D3869B"
195
+ },
196
+ {
197
+ "name": "KeywordFunction",
198
+ "foreground": "#EA6962"
199
+ },
200
+ {
201
+ "name": "MarkdownLinkName",
202
+ "foreground": "#D3869B"
203
+ },
204
+ {
205
+ "name": "MarkdownLinkUrl",
206
+ "foreground": "#A9B665"
207
+ },
208
+ {
209
+ "name": "MarkdownString",
210
+ "foreground": "#A9B665"
195
211
  }
196
212
  ]
197
213
  }
@@ -179,6 +179,26 @@
179
179
  {
180
180
  "name": "KeywordThis",
181
181
  "foreground": "#E66533"
182
+ },
183
+ {
184
+ "name": "KeywordFunction",
185
+ "foreground": "#E66533"
186
+ },
187
+ {
188
+ "name": "MarkdownLinkName",
189
+ "foreground": "#16A3B6"
190
+ },
191
+ {
192
+ "name": "MarkdownLinkUrl",
193
+ "foreground": "#49D6E9"
194
+ },
195
+ {
196
+ "name": "Heading",
197
+ "foreground": "#DF769B"
198
+ },
199
+ {
200
+ "name": "KeywordImport",
201
+ "foreground": "#DF769B"
182
202
  }
183
203
  ]
184
204
  }
@@ -196,6 +196,14 @@
196
196
  {
197
197
  "name": "KeywordOperator",
198
198
  "foreground": "#89DDFF"
199
+ },
200
+ {
201
+ "name": "KeywordFunction",
202
+ "foreground": "#C792EA"
203
+ },
204
+ {
205
+ "name": "Regex",
206
+ "foreground": "#80CBC4"
199
207
  }
200
208
  ]
201
209
  }
@@ -238,6 +238,22 @@
238
238
  {
239
239
  "name": "KeywordOperator",
240
240
  "foreground": "#B4B4B4"
241
+ },
242
+ {
243
+ "name": "MarkdownString",
244
+ "foreground": "#C6DD88"
245
+ },
246
+ {
247
+ "name": "KeywordFunction",
248
+ "foreground": "#D88F56"
249
+ },
250
+ {
251
+ "name": "MarkdownLinkName",
252
+ "foreground": "#BF616A"
253
+ },
254
+ {
255
+ "name": "MarkdownLinkUrl",
256
+ "foreground": "#B2885F"
241
257
  }
242
258
  ]
243
259
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/shared-process",
3
- "version": "0.11.11",
3
+ "version": "0.12.0",
4
4
  "description": "Utility package for @lvce-editor/server",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -17,19 +17,19 @@
17
17
  },
18
18
  "dependencies": {
19
19
  "@babel/code-frame": "^7.18.6",
20
- "@lvce-editor/extension-host": "0.11.11",
21
- "@lvce-editor/extension-host-helper-process": "0.11.11",
22
- "@lvce-editor/pty-host": "0.11.11",
20
+ "@lvce-editor/extension-host": "0.12.0",
21
+ "@lvce-editor/extension-host-helper-process": "0.12.0",
22
+ "@lvce-editor/pty-host": "0.12.0",
23
23
  "debug": "^4.3.4",
24
24
  "execa": "^6.1.0",
25
- "exit-hook": "^3.1.4",
25
+ "exit-hook": "^3.2.0",
26
26
  "got": "^12.5.3",
27
27
  "is-object": "^1.0.2",
28
28
  "lines-and-columns": "^2.0.3",
29
29
  "open": "^8.4.0",
30
30
  "p-queue": "^7.3.0",
31
31
  "parse-json": "^6.0.2",
32
- "tail": "^2.2.5",
32
+ "tail": "^2.2.6",
33
33
  "tar-fs": "^2.1.1",
34
34
  "tmp-promise": "^3.0.3",
35
35
  "trash": "^8.1.0",
@@ -208,18 +208,24 @@ const applyOverrides = async ({ root, commitHash, pathPrefix }) => {
208
208
  Path.join(root, 'dist', commitHash, 'file-icons')
209
209
  )
210
210
  }
211
- if (pathPrefix) {
212
- await replace(Path.join(root, 'dist', 'index.html'), `favicon.ico`, `${pathPrefix}/favicon.ico`)
213
- }
214
211
  await replace(Path.join(root, 'dist', 'index.html'), `/${commitHash}`, `${pathPrefix}/${commitHash}`)
215
212
  await replace(Path.join(root, 'dist', 'index.html'), `/manifest.json`, `${pathPrefix}/manifest.json`)
216
213
 
217
- await replace(
218
- Path.join(root, 'dist', 'index.html'),
219
- '</title>',
220
- `</title>
214
+ if (pathPrefix) {
215
+ await replace(
216
+ Path.join(root, 'dist', 'index.html'),
217
+ '</title>',
218
+ `</title>
219
+ <link rel="shortcut icon" type="image/x-icon" href="${pathPrefix}/favicon.ico">`
220
+ )
221
+ } else {
222
+ await replace(
223
+ Path.join(root, 'dist', 'index.html'),
224
+ '</title>',
225
+ `</title>
221
226
  <link rel="shortcut icon" type="image/x-icon" href="favicon.ico">`
222
- )
227
+ )
228
+ }
223
229
  await replace(Path.join(root, 'dist', 'manifest.json'), `/${commitHash}`, `${pathPrefix}/${commitHash}`)
224
230
  await replace(Path.join(root, 'dist', commitHash, 'css', 'parts', 'ViewletTitleBarButtons.css'), `/${commitHash}`, `${pathPrefix}/${commitHash}`)
225
231
  }
@@ -171,7 +171,6 @@ const toPrettyDirent = (dirent) => {
171
171
  export const readDirWithFileTypes = async (path) => {
172
172
  try {
173
173
  const dirents = await fs.readdir(path, { withFileTypes: true })
174
- console.log({ dirents: dirents.filter((x) => getType(x) === DirentType.Unknown) })
175
174
  const prettyDirents = dirents.map(toPrettyDirent)
176
175
  return prettyDirents
177
176
  } catch (error) {