@lvce-editor/shared-process 0.0.16 → 0.0.17

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.
@@ -0,0 +1,14 @@
1
+ # Language Basics JSON
2
+
3
+ ## Contributing
4
+
5
+ ```sh
6
+ git clone git@github.com:lvce-editor/language-basics-json.git &&
7
+ cd language-basics-json &&
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-json)
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "builtin.language-basics-json",
3
+ "name": "Language Basics JSON",
4
+ "description": "Provides syntax highlighting and bracket matching in JSON files.",
5
+ "languages": [
6
+ {
7
+ "id": "json",
8
+ "extensions": [".json"],
9
+ "tokenize": "src/tokenizeJson.js"
10
+ }
11
+ ]
12
+ }
@@ -0,0 +1,323 @@
1
+ /**
2
+ * @enum number
3
+ */
4
+ export const State = {
5
+ TopLevelContent: 1,
6
+ AfterCurlyOpen: 2,
7
+ InsideString: 3,
8
+ AfterPropertyName: 4,
9
+ AfterPropertyNameAfterColon: 5,
10
+ AfterPropertyValue: 6,
11
+ JsonPropertyKey: 7,
12
+ InsideLineComment: 8,
13
+ InsidePropertyNameString: 9,
14
+ }
15
+
16
+ export const StateMap = {
17
+ [State.TopLevelContent]: 'TopLevelContent',
18
+ [State.AfterCurlyOpen]: 'AfterCurlyOpen',
19
+ [State.InsideString]: 'InsideString',
20
+ [State.AfterPropertyName]: 'AfterPropertyName',
21
+ [State.AfterPropertyNameAfterColon]: 'AfterPropertyNameAfterColon',
22
+ [State.AfterPropertyValue]: 'AfterPropertyValue',
23
+ [State.JsonPropertyKey]: 'JsonPropertyKey',
24
+ }
25
+
26
+ /**
27
+ * @enum number
28
+ */
29
+ export const TokenType = {
30
+ CssSelector: 1,
31
+ Whitespace: 2,
32
+ Punctuation: 3,
33
+ PropertyName: 4,
34
+ PropertyValue: 5,
35
+ CurlyOpen: 6,
36
+ CurlyClose: 7,
37
+ PropertyColon: 8,
38
+ PropertySemicolon: 9,
39
+ String: 10,
40
+ LanguageConstant: 11,
41
+ NewLine: 12,
42
+ JsonPropertyName: 13,
43
+ PropertyValueString: 14,
44
+ Numeric: 15,
45
+ LanguageConstantBoolean: 16,
46
+ Comment: 17,
47
+ Error: 18,
48
+ Unknown: 19,
49
+ Text: 20,
50
+ }
51
+
52
+ export const TokenMap = {
53
+ [TokenType.CssSelector]: 'CssSelector',
54
+ [TokenType.Whitespace]: 'Whitespace',
55
+ [TokenType.Punctuation]: 'Punctuation',
56
+ [TokenType.PropertyName]: 'PropertyName',
57
+ [TokenType.PropertyValue]: 'PropertyValue',
58
+ [TokenType.CurlyOpen]: 'CurlyOpen',
59
+ [TokenType.CurlyClose]: 'CurlyClose',
60
+ [TokenType.PropertyColon]: 'PropertyColon',
61
+ [TokenType.PropertySemicolon]: 'PropertySemicolon',
62
+ [TokenType.String]: 'String',
63
+ [TokenType.LanguageConstant]: 'LanguageConstant',
64
+ [TokenType.LanguageConstantBoolean]: 'LanguageConstantBoolean',
65
+ [TokenType.JsonPropertyName]: 'JsonPropertyName',
66
+ [TokenType.PropertyValueString]: 'PropertyValueString',
67
+ [TokenType.Comment]: 'Comment',
68
+ [TokenType.Error]: 'Error',
69
+ [TokenType.Unknown]: 'Unknown',
70
+ [TokenType.NewLine]: 'NewLine',
71
+ [TokenType.Text]: 'Text',
72
+ [TokenType.Numeric]: 'Numeric',
73
+ }
74
+
75
+ const RE_SELECTOR = /^[\.a-zA-Z\d\-\:>]+/
76
+ const RE_WHITESPACE = /^\s+/
77
+ const RE_CURLY_OPEN = /^\{/
78
+ const RE_CURLY_CLOSE = /^\}/
79
+ const RE_PROPERTY_NAME = /^[a-zA-Z\-]+/
80
+ const RE_COLON = /^:/
81
+ const RE_PROPERTY_VALUE = /^[^\n;]+/
82
+ const RE_SEMICOLON = /^;/
83
+ const RE_COMMA = /^,/
84
+ const RE_DOUBLE_QUOTE = /^"/
85
+ const RE_STRING_DOUBLE_QUOTE_CONTENT = /^[^"\\]+/
86
+ const RE_LANGUAGE_CONSTANT = /^(?:true|false|null)/
87
+ const RE_SQUARE_OPEN = /^\[/
88
+ const RE_SQUARE_CLOSE = /^\]/
89
+ const RE_LINE_COMMENT = /^\/\/.*/
90
+ const RE_ANYTHING = /^.+/s
91
+ const RE_NUMERIC =
92
+ /^((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b/
93
+ const RE_TEXT = /^[^\s\{\}\[\]]+/
94
+ const RE_ESCAPED_QUOTE = /^\\"/
95
+ const RE_BACK_SLASH = /^\\/
96
+
97
+ export const initialLineState = {
98
+ state: State.TopLevelContent,
99
+ stack: [],
100
+ }
101
+
102
+ /**
103
+ * @param {string} line
104
+ */
105
+ export const tokenizeLine = (line, lineState) => {
106
+ let next
107
+ let index = 0
108
+ let token
109
+ let state = lineState.state
110
+ let __r = 0
111
+ const tokens = []
112
+ const stack = lineState.stack
113
+ while (index < line.length) {
114
+ if (__r++ > 100_000_000_000) {
115
+ throw new Error('endless loop')
116
+ }
117
+ const part = line.slice(index)
118
+ switch (state) {
119
+ case State.TopLevelContent:
120
+ if ((next = part.match(RE_CURLY_OPEN))) {
121
+ token = TokenType.Punctuation
122
+ state = State.AfterCurlyOpen
123
+ stack.push(State.TopLevelContent)
124
+ } else if ((next = part.match(RE_SQUARE_OPEN))) {
125
+ token = TokenType.Punctuation
126
+ state = State.TopLevelContent
127
+ stack.push(State.TopLevelContent)
128
+ } else if ((next = part.match(RE_WHITESPACE))) {
129
+ token = TokenType.Whitespace
130
+ state = State.TopLevelContent
131
+ } else if ((next = part.match(RE_SQUARE_CLOSE))) {
132
+ token = TokenType.Punctuation
133
+ state = stack.pop()
134
+ } else if ((next = part.match(RE_COMMA))) {
135
+ token = TokenType.Punctuation
136
+ state = State.TopLevelContent
137
+ } else if ((next = part.match(RE_NUMERIC))) {
138
+ token = TokenType.Numeric
139
+ state = State.TopLevelContent
140
+ } else if ((next = part.match(RE_LANGUAGE_CONSTANT))) {
141
+ token = TokenType.LanguageConstant
142
+ state = State.TopLevelContent
143
+ } else if ((next = part.match(RE_DOUBLE_QUOTE))) {
144
+ token = TokenType.Punctuation
145
+ state = State.InsideString
146
+ stack.push(State.TopLevelContent)
147
+ } else if ((next = part.match(RE_LINE_COMMENT))) {
148
+ token = TokenType.Comment
149
+ state = State.InsideLineComment
150
+ } else if ((next = part.match(RE_CURLY_CLOSE))) {
151
+ token = TokenType.CurlyClose
152
+ state = stack.pop()
153
+ } else if ((next = part.match(RE_ANYTHING))) {
154
+ token = TokenType.Text
155
+ state = State.TopLevelContent
156
+ } else {
157
+ part //?
158
+ throw new Error('no')
159
+ }
160
+ break
161
+ case State.AfterCurlyOpen:
162
+ if ((next = part.match(RE_WHITESPACE))) {
163
+ token = TokenType.Whitespace
164
+ state = State.AfterCurlyOpen
165
+ } else if ((next = part.match(RE_DOUBLE_QUOTE))) {
166
+ token = TokenType.Punctuation
167
+ state = State.InsidePropertyNameString
168
+ stack.push(State.AfterPropertyName)
169
+ } else if ((next = part.match(RE_CURLY_CLOSE))) {
170
+ token = TokenType.Punctuation
171
+ state = stack.pop()
172
+ if (!state) {
173
+ throw new Error('imbalanced json')
174
+ }
175
+ } else if ((next = part.match(RE_LINE_COMMENT))) {
176
+ token = TokenType.Comment
177
+ state = State.AfterCurlyOpen
178
+ } else {
179
+ part //?
180
+ throw new Error('no')
181
+ }
182
+ break
183
+ case State.InsidePropertyNameString:
184
+ if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
185
+ token = TokenType.JsonPropertyName
186
+ state = State.InsidePropertyNameString
187
+ } else if ((next = part.match(RE_DOUBLE_QUOTE))) {
188
+ token = TokenType.Punctuation
189
+ state = stack.pop()
190
+ } else if ((next = part.match(RE_ESCAPED_QUOTE))) {
191
+ token = TokenType.JsonPropertyName
192
+ state = State.InsidePropertyNameString
193
+ } else if ((next = part.match(RE_BACK_SLASH))) {
194
+ token = TokenType.JsonPropertyName
195
+ state = State.InsidePropertyNameString
196
+ } else {
197
+ throw new Error('no')
198
+ }
199
+ break
200
+ case State.InsideString:
201
+ if ((next = part.match(RE_STRING_DOUBLE_QUOTE_CONTENT))) {
202
+ token = TokenType.String
203
+ state = State.InsideString
204
+ } else if ((next = part.match(RE_DOUBLE_QUOTE))) {
205
+ token = TokenType.Punctuation
206
+ state = stack.pop()
207
+ } else if ((next = part.match(RE_ESCAPED_QUOTE))) {
208
+ token = TokenType.String
209
+ state = State.InsideString
210
+ } else if ((next = part.match(RE_BACK_SLASH))) {
211
+ token = TokenType.String
212
+ state = State.InsideString
213
+ } else {
214
+ line.slice(0, index) //?
215
+ part //?
216
+ throw new Error('no')
217
+ }
218
+ break
219
+ case State.AfterPropertyName:
220
+ if ((next = part.match(RE_COLON))) {
221
+ token = TokenType.Punctuation
222
+ state = State.AfterPropertyNameAfterColon
223
+ } else {
224
+ throw new Error('no')
225
+ }
226
+ break
227
+ case State.AfterPropertyNameAfterColon:
228
+ if ((next = part.match(RE_WHITESPACE))) {
229
+ token = TokenType.Whitespace
230
+ state = State.AfterPropertyNameAfterColon
231
+ } else if ((next = part.match(RE_DOUBLE_QUOTE))) {
232
+ line.slice(0, index) //?
233
+ token = TokenType.Punctuation
234
+ state = State.InsideString
235
+ stack.push(State.AfterPropertyValue)
236
+ } else if ((next = part.match(RE_LANGUAGE_CONSTANT))) {
237
+ token = TokenType.LanguageConstant
238
+ state = State.AfterPropertyValue
239
+ } else if ((next = part.match(RE_NUMERIC))) {
240
+ token = TokenType.Numeric
241
+ state = State.AfterPropertyValue
242
+ } else if ((next = part.match(RE_TEXT))) {
243
+ token = TokenType.Text
244
+ state = State.TopLevelContent
245
+ } else if ((next = part.match(RE_CURLY_OPEN))) {
246
+ token = TokenType.Punctuation
247
+ state = State.AfterCurlyOpen
248
+ stack.push(State.AfterPropertyValue)
249
+ } else if ((next = part.match(RE_SQUARE_OPEN))) {
250
+ token = TokenType.Punctuation
251
+ state = State.TopLevelContent
252
+ stack.push(State.AfterPropertyValue)
253
+ } else {
254
+ line.slice(0, index) //?
255
+ throw new Error('no')
256
+ }
257
+ break
258
+ case State.AfterPropertyValue:
259
+ if ((next = part.match(RE_CURLY_CLOSE))) {
260
+ token = TokenType.Punctuation
261
+ state = stack.pop()
262
+ if (!state) {
263
+ throw new Error('inbalanced json')
264
+ }
265
+ } else if ((next = part.match(RE_WHITESPACE))) {
266
+ token = TokenType.Whitespace
267
+ state = State.AfterPropertyValue
268
+ } else if ((next = part.match(RE_COMMA))) {
269
+ token = TokenType.Punctuation
270
+ state = State.AfterCurlyOpen
271
+ } else {
272
+ part //?
273
+ throw new Error('no')
274
+ }
275
+ break
276
+ case State.InsideLineComment:
277
+ if ((next = part.match(RE_ANYTHING))) {
278
+ token = TokenType.Comment
279
+ state = State.TopLevelContent
280
+ } else {
281
+ throw new Error('no')
282
+ }
283
+ break
284
+ default:
285
+ state
286
+ throw new Error('no')
287
+ }
288
+
289
+ const currentTokenText = next[0]
290
+ const currentTokenLength = currentTokenText.length
291
+ index += currentTokenLength
292
+ tokens.push({
293
+ type: token,
294
+ length: currentTokenLength,
295
+ })
296
+ }
297
+ if (state === State.InsideLineComment) {
298
+ state = State.TopLevelContent
299
+ }
300
+ return {
301
+ state,
302
+ stack,
303
+ tokens,
304
+ }
305
+ }
306
+
307
+ // const result = tokenizeLine(` "a": "b",`, {
308
+ // state: State.AfterCurlyOpen,
309
+ // }) //?
310
+
311
+ const result = tokenizeLine(
312
+ `{ "testRegex": "/scripts/jest/dont-run-jest-directly\\.js$"`,
313
+ {
314
+ state: State.TopLevelContent,
315
+ stack: [],
316
+ }
317
+ ) //?
318
+
319
+ result.tokens.map((t) => TokenMap[t.type]) //?
320
+
321
+ // tokenizeLine(`{
322
+ // "a": "b"
323
+ // }`) //?
@@ -1,6 +1,5 @@
1
1
  # Language Basics Shell Script
2
2
 
3
-
4
3
  ## Contributing
5
4
 
6
5
  ```sh
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/shared-process",
3
- "version": "0.0.16",
3
+ "version": "0.0.17",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -32,8 +32,8 @@
32
32
  "verror": "^1.10.1",
33
33
  "ws": "^8.8.0",
34
34
  "xdg-basedir": "^5.1.0",
35
- "@lvce-editor/pty-host": "0.0.16",
36
- "@lvce-editor/extension-host": "0.0.16"
35
+ "@lvce-editor/pty-host": "0.0.17",
36
+ "@lvce-editor/extension-host": "0.0.17"
37
37
  },
38
38
  "optionalDependencies": {
39
39
  "electron-clipboard-ex": "^1.3.3",