Skip to content

Commit 1ecb6cc

Browse files
committed
fix: handle keywords and values with colons and simplify
1 parent 06912c2 commit 1ecb6cc

File tree

1 file changed

+91
-61
lines changed
  • src/plugins/editor-monaco-language-apidom/language

1 file changed

+91
-61
lines changed

src/plugins/editor-monaco-language-apidom/language/apidom.js

Lines changed: 91 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -143,50 +143,74 @@ export const monarchLanguageDefYAML = {
143143
// the main tokenizer for our languages
144144
tokenizer: {
145145
root: [
146+
[/^#.*$/, 'value'],
147+
146148
// specification extensions
147-
[/x-[^:\s]+(?=:)/, 'keyword'],
149+
[/^(x-[^:\s]+)(: )/, ['keyword', { token: 'value', next: '@values' }]],
150+
[/^(x-[^:\s]+)(:)$/, ['keyword', 'value']],
148151

149152
// keywords
150-
[/^[a-zA-Z_$][\w$]*/, 'keyword'],
153+
[/^([a-zA-Z_$][\w$]*)(: )/, ['keyword', { token: 'value', next: '@values' }]],
154+
[/^([a-zA-Z_$][\w$]*)(:)$/, ['keyword', 'value']],
151155

152156
// single-quoted keywords
153-
[/^\s*'([^']*)'(?=:)/, 'keyword'],
157+
[
158+
/^(\s*')([^']*)(')(: )/,
159+
['keyword', 'keyword', 'keyword', { token: 'value', next: '@values' }],
160+
],
161+
[/^(\s*')([^']*)(')(:)$/, ['keyword', 'keyword', 'keyword', 'value']],
154162

155163
// double-quoted keywords
156-
[/^\s*"([^"]*)"(?=:)/, 'keyword'],
157-
158-
// keywords catch-all
159-
[/^\s*([^\s:]+)(?=:)/, 'keyword'],
164+
[
165+
/^(\s*")([^"]*)(")(: )/,
166+
['keyword', 'keyword', 'keyword', { token: 'value', next: '@values' }],
167+
],
168+
[/^(\s*")([^"]*)(")(:)$/, ['keyword', 'keyword', 'keyword', 'value']],
160169

161170
// arrays
162171
[/^\s*-\s/, 'value', '@arrays'],
163172

164173
// nested keywords
165174
[/^\s{1,}/, '', '@nestedKeywords'],
166175

176+
// keywords catch-all
177+
[/^(\s*[^\s]+)(: )/, ['keyword', { token: 'value', next: '@values' }]],
178+
[/^(\s*[^\s]+)(:)$/, ['keyword', 'value']],
179+
180+
// whitespace
181+
{ include: '@whitespace' },
182+
183+
// strings for todos
184+
[/"([^"\\]|\\.)*$/, 'string.invalid'], // non-terminated string
185+
[/"/, 'value.string', '@stringDoubleQuoted'],
186+
[/'/, 'value.string', '@stringSingleQuoted'],
187+
],
188+
189+
values: [
167190
// numbers
168-
[/(:)( )([0-9]+)\b$/, ['value', '', 'value.number']],
169-
[/(:)( )([0-9]+\.[0-9]+)\s*$/, ['value', '', 'value.number']],
191+
[/\s*[0-9]+\s*$/, 'value.number'],
192+
[/\s*[0-9]+(\.[0-9]+)?\s*$/, 'value.number'],
170193

171194
// booleans
172-
[/(:)( )(true|false)\b$/, ['value', '', 'value.boolean']],
195+
[/\s*(true|false)\s*$/, 'value.boolean'],
173196

174-
// unquoted values - catch-all
175-
[/(:)( )([^\n'"]+)\s*$/, ['value', '', 'value']],
197+
// pop state when getting to a new line
198+
[/^/, '', '@pop'],
176199

177200
// quoted values
178-
[/(:)( )(")/, ['value', '', { token: 'value.string', next: '@stringDoubleQuoted' }]],
179-
[/(:)( )(')/, ['value', '', { token: 'value.string', next: '@stringSingleQuoted' }]],
201+
[/\s*"/, { token: 'value.string', next: '@stringDoubleQuoted' }],
202+
[/\s*'/, { token: 'value.string', next: '@stringSingleQuoted' }],
180203

181-
[/:/, 'value'],
204+
// unquoted values - catch-all
205+
[/[^\n]+$/, 'value'],
182206

183-
// whitespace
184-
{ include: '@whitespace' },
207+
// pop state when getting to a new line
208+
[/^/, '', '@pop'],
185209

186-
// strings for todos
187-
[/"([^"\\]|\\.)*$/, 'string.invalid'], // non-terminated string
188-
[/"/, 'value.string', '@stringDoubleQuoted'],
189-
[/'/, 'value.string', '@stringSingleQuoted'],
210+
[/:/, 'value', '@pop'],
211+
212+
[/.+$/, '', '@pop'],
213+
[/.*$/, '', '@pop'],
190214
],
191215

192216
whitespace: [[/[ \t\r\n]+/, '']],
@@ -211,75 +235,81 @@ export const monarchLanguageDefYAML = {
211235

212236
nestedKeywords: [
213237
// specification extensions
214-
[/(x-[^:\s]+)(?=: )/, 'keyword'],
238+
[/(x-[^:\s]+)(: )/, ['keyword', { token: 'value', next: '@values' }]],
239+
[/(x-[^:\s]+)(:)$/, ['keyword', 'value']],
215240

216241
// keywords
217-
[/([a-zA-Z_$][\w$]*)\s*(?=: )/, 'keyword'],
242+
[/([a-zA-Z_$][\w$]*)(: )/, ['keyword', { token: 'value', next: '@values' }]],
243+
[/([a-zA-Z_$][\w$]*)(:)$/, ['keyword', 'value']],
218244

219245
// single-quoted keywords
220-
[/^\s*'([^']*)'(?=: )/, 'keyword'],
246+
[
247+
/(\s*')([^']*)(')(: )/,
248+
['keyword', 'keyword', 'keyword', { token: 'value', next: '@values' }],
249+
],
250+
[/(\s*')([^']*)(')(:)$/, ['keyword', 'keyword', 'keyword', 'value']],
221251

222252
// double-quoted keywords
223-
[/^\s*"([^"]*)"(?=: )/, 'keyword'],
224-
225-
// numbers
226-
[/(:)( )([0-9]+)\b$/, ['value', '', 'value.number'], '@pop'],
227-
[/(:)( )([0-9]+\.[0-9]+)\s*\b$/, ['value', '', 'value.number'], '@pop'],
228-
229-
// booleans
230-
[/(:)( )(true|false)\b$/, ['value', '', 'value.boolean'], '@pop'],
231-
232-
// unquoted values - catch-all
233-
[/(:)( )([^\n'"]+)\s*$/, ['value', '', 'value'], '@pop'],
253+
[
254+
/(\s*")([^"]*)(")(: )/,
255+
['keyword', 'keyword', 'keyword', { token: 'value', next: '@values' }],
256+
],
257+
[/(\s*")([^"]*)(")(:)$/, ['keyword', 'keyword', 'keyword', 'value']],
234258

235-
// quoted values
236-
[/"/, 'value.string', '@stringDoubleQuoted'],
237-
[/'/, 'value.string', '@stringSingleQuoted'],
259+
// keywords catch-all
260+
[/(\s*[^\s]+)(: )/, ['keyword', { token: 'value', next: '@values' }]],
261+
[/(\s*[^\s]+)(:)$/, ['keyword', 'value']],
238262

239263
// pop state when getting to a new line
240264
[/^/, '', '@pop'],
241-
242-
[/:/, 'value', '@pop'],
243-
244265
[/.+$/, 'value', '@pop'],
245266
],
246267

247268
arrays: [
248-
/**
249-
* TODO: handle cases where element of an array is a string with colon, e.g. - write:pets
250-
* currently `write:` will be tokenized as keyword, which is not correct
251-
* note that we still need to handle objects in arrays,
252-
* so we cannot change (?=:) to (?=: ), e.g.
253-
* - some_keyword:
254-
* another_keyword: value
255-
*/
256-
257269
// specification extensions
258-
[/x-[^:\s]+(?=:)/, 'keyword'],
270+
[/(x-[^:\s]+)(: )/, ['keyword', { token: 'value', next: '@values' }]],
271+
[/(x-[^:\s]+)(:)$/, ['keyword', 'value']],
259272

260273
// keywords
261-
[/([a-zA-Z_$][\w$]*)\s*(?=:)/, 'keyword'],
274+
[/([a-zA-Z_$][\w$]*)(: )/, ['keyword', { token: 'value', next: '@values' }]],
275+
[/([a-zA-Z_$][\w$]*)(:)$/, ['keyword', 'value']],
276+
277+
// single-quoted keywords
278+
[
279+
/(\s*')([^']*)(')(: )/,
280+
['keyword', 'keyword', 'keyword', { token: 'value', next: '@values' }],
281+
],
282+
[/(\s*')([^']*)(')(:)$/, ['keyword', 'keyword', 'keyword', 'value']],
283+
284+
// double-quoted keywords
285+
[
286+
/(\s*")([^"]*)(")(: )/,
287+
['keyword', 'keyword', 'keyword', { token: 'value', next: '@values' }],
288+
],
289+
[/(\s*")([^"]*)(")(:)$/, ['keyword', 'keyword', 'keyword', 'value']],
290+
291+
// keywords catch-all
292+
[/(\s*[^\s]+)(: )/, ['keyword', { token: 'value', next: '@values' }]],
293+
[/(\s*[^\s]+)(:)$/, ['keyword', 'value']],
294+
295+
[/^/, '', '@pop'],
262296

263297
// numbers
264-
[/(:)( )([0-9]+)\b$/, ['value', '', 'value.number']],
265-
[/(:)( )([0-9]+\.[0-9]+)\s*\b$/, ['value', '', 'value.number']],
266-
[/([0-9]+)\b$/, 'value.number'],
267-
[/([0-9]+\.[0-9]+)\s*\b$/, 'value.number'],
298+
[/\s*([0-9]+)\s*$/, 'value.number'],
299+
[/\s*([0-9]+\.[0-9]+)\s*$/, 'value.number'],
268300

269301
// booleans
270-
[/(:)( )(true|false)\b$/, ['value', '', 'value.boolean']],
271-
[/(true|false)\b$/, 'value.boolean'],
302+
[/\s*(true|false)\s*$/, 'value.boolean'],
272303

273304
// pop state when getting to a new line
274305
[/^/, '', '@pop'],
275306

276307
// unquoted values - catch-all
277-
[/(:)( )([^\n'"]+)\s*\b$/, ['value', '', 'value']],
278308
[/([^\n'"]+)\s*$/, 'value'],
279309

280310
// quoted values
281-
[/"/, 'value.string', '@stringDoubleQuoted'],
282-
[/'/, 'value.string', '@stringSingleQuoted'],
311+
[/\s*"/, 'value.string', '@stringDoubleQuoted'],
312+
[/\s*'/, 'value.string', '@stringSingleQuoted'],
283313

284314
// pop state when getting to a new line
285315
[/^/, '', '@pop'],

0 commit comments

Comments
 (0)