@jupyterlab/codemirror 4.0.0-alpha.11 → 4.0.0-alpha.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/mode.js CHANGED
@@ -2,149 +2,1515 @@
2
2
  // Distributed under the terms of the Modified BSD License.
3
3
  import { IEditorMimeTypeService } from '@jupyterlab/codeeditor';
4
4
  import { PathExt } from '@jupyterlab/coreutils';
5
- import { ArrayExt } from '@lumino/algorithm';
6
- import CodeMirror from 'codemirror';
7
- import 'codemirror/addon/runmode/runmode';
8
- import 'codemirror/mode/clike/clike';
9
- import 'codemirror/mode/css/css';
10
- // Bundle other common modes
11
- import 'codemirror/mode/javascript/javascript';
12
- import 'codemirror/mode/jsx/jsx';
13
- import 'codemirror/mode/julia/julia';
14
- import 'codemirror/mode/markdown/markdown';
15
- import 'codemirror/mode/meta';
16
- import 'codemirror/mode/r/r';
17
- import 'codemirror/mode/shell/shell';
18
- import 'codemirror/mode/sql/sql';
19
- import './codemirror-ipython';
20
- import './codemirror-ipythongfm';
21
- /**
22
- * The namespace for CodeMirror Mode functionality.
23
- */
5
+ import { LanguageDescription, LanguageSupport, StreamLanguage } from '@codemirror/language';
6
+ import { highlightTree } from '@lezer/highlight';
7
+ // This ensures the language spec for python will be loaded when
8
+ // we instantiate a new editor instance, which is required since
9
+ // python is the default language and we don't want to split
10
+ // the editor constructor because of asynchronous loading.
11
+ import { python } from '@codemirror/lang-python';
12
+ import { jupyterHighlightStyle } from './editortheme';
24
13
  export var Mode;
25
14
  (function (Mode) {
26
- const specLoaders = [
27
- {
28
- // Simplest, cheapest check by mode name.
29
- loader: async (spec) => CodeMirror.modes.hasOwnProperty(spec.mode),
30
- rank: 0
31
- },
32
- {
33
- // Fetch the mode asynchronously.
34
- loader: function (spec) {
35
- return new Promise((resolve, reject) => {
36
- // An arrow function below seems to miscompile in our current webpack to
37
- // invalid js.
38
- require([
39
- `codemirror/mode/${spec.mode}/${spec.mode}.js`
40
- ], function () {
41
- resolve(true);
42
- });
43
- });
44
- },
45
- rank: 99
46
- }
15
+ function legacy(parser) {
16
+ return new LanguageSupport(StreamLanguage.define(parser));
17
+ }
18
+ Mode.legacy = legacy;
19
+ async function sql(dialectName) {
20
+ const m = await import('@codemirror/lang-sql');
21
+ return m.sql({ dialect: m[dialectName] });
22
+ }
23
+ // Code mirror uses two similar structures, a plain object with optional fields,
24
+ // and a class with the same fields but all mandatory. Maybe adopting the same
25
+ // pattern would be less confusing (although far more verbose)
26
+ function makeSpec(spec) {
27
+ let res = LanguageDescription.of(spec);
28
+ res.mime = spec.mime;
29
+ return res;
30
+ }
31
+ const modeList = [
32
+ makeSpec({
33
+ name: 'C',
34
+ mime: 'text/x-csrc',
35
+ extensions: ['c', 'h', 'ino'],
36
+ async load() {
37
+ const m = await import('@codemirror/lang-cpp');
38
+ return m.cpp();
39
+ }
40
+ }),
41
+ makeSpec({
42
+ name: 'C++',
43
+ mime: 'text/x-c++src',
44
+ extensions: ['cpp', 'c++', 'cc', 'cxx', 'hpp', 'h++', 'hh', 'hxx'],
45
+ async load() {
46
+ const m = await import('@codemirror/lang-cpp');
47
+ return m.cpp();
48
+ }
49
+ }),
50
+ makeSpec({
51
+ name: 'CQL',
52
+ mime: 'text/x-cassandra',
53
+ extensions: ['cql'],
54
+ load() {
55
+ return sql('Cassandra');
56
+ }
57
+ }),
58
+ makeSpec({
59
+ name: 'CSS',
60
+ mime: 'text/css',
61
+ extensions: ['css'],
62
+ async load() {
63
+ const m = await import('@codemirror/lang-css');
64
+ return m.css();
65
+ }
66
+ }),
67
+ makeSpec({
68
+ name: 'HTML',
69
+ alias: ['xhtml'],
70
+ mime: 'text/html',
71
+ extensions: ['html', 'htm', 'handlebars', 'hbs'],
72
+ async load() {
73
+ const m = await import('@codemirror/lang-html');
74
+ return m.html();
75
+ }
76
+ }),
77
+ makeSpec({
78
+ name: 'Java',
79
+ mime: 'text/x-java',
80
+ extensions: ['java'],
81
+ async load() {
82
+ const m = await import('@codemirror/lang-java');
83
+ return m.java();
84
+ }
85
+ }),
86
+ makeSpec({
87
+ name: 'Javascript',
88
+ alias: ['ecmascript', 'js', 'node'],
89
+ mime: [
90
+ 'text/javascript',
91
+ 'text/ecmascript',
92
+ 'application/javascript',
93
+ 'application/x-javascript',
94
+ 'application/ecmascript'
95
+ ],
96
+ extensions: ['js', 'mjs', 'cjs'],
97
+ async load() {
98
+ const m = await import('@codemirror/lang-javascript');
99
+ return m.javascript();
100
+ }
101
+ }),
102
+ makeSpec({
103
+ name: 'JSON',
104
+ alias: ['json5'],
105
+ mime: ['application/json', 'application/x-json'],
106
+ extensions: ['json', 'map'],
107
+ async load() {
108
+ const m = await import('@codemirror/lang-json');
109
+ return m.json();
110
+ }
111
+ }),
112
+ makeSpec({
113
+ name: 'JSX',
114
+ mime: 'text/jsx',
115
+ extensions: ['jsx'],
116
+ async load() {
117
+ const m = await import('@codemirror/lang-javascript');
118
+ return m.javascript({ jsx: true });
119
+ }
120
+ }),
121
+ makeSpec({
122
+ name: 'MariaDB SQL',
123
+ mime: 'text/x-mariadb',
124
+ load() {
125
+ return sql('MariaSQL');
126
+ }
127
+ }),
128
+ makeSpec({
129
+ name: 'Markdown',
130
+ mime: 'text/x-markdown',
131
+ extensions: ['md', 'markdown', 'mkd'],
132
+ async load() {
133
+ const m = await import('@codemirror/lang-markdown');
134
+ return m.markdown({ codeLanguages: modeList });
135
+ }
136
+ }),
137
+ makeSpec({
138
+ name: 'MS SQL',
139
+ mime: 'text/x-mssql',
140
+ load() {
141
+ return sql('MSSQL');
142
+ }
143
+ }),
144
+ makeSpec({
145
+ name: 'MySQL',
146
+ mime: 'text/x-mysql',
147
+ load() {
148
+ return sql('MySQL');
149
+ }
150
+ }),
151
+ makeSpec({
152
+ name: 'PHP',
153
+ mime: [
154
+ 'text/x-php',
155
+ 'application/x-httpd-php',
156
+ 'application/x-httpd-php-open'
157
+ ],
158
+ extensions: ['php', 'php3', 'php4', 'php5', 'php7', 'phtml'],
159
+ async load() {
160
+ const m = await import('@codemirror/lang-php');
161
+ return m.php();
162
+ }
163
+ }),
164
+ makeSpec({
165
+ name: 'PLSQL',
166
+ mime: 'text/x-plsql',
167
+ extensions: ['pls'],
168
+ load() {
169
+ return sql('PLSQL');
170
+ }
171
+ }),
172
+ makeSpec({
173
+ name: 'PostgreSQL',
174
+ mime: 'text/x-pgsql',
175
+ load() {
176
+ return sql('PostgreSQL');
177
+ }
178
+ }),
179
+ makeSpec({
180
+ name: 'Python',
181
+ mime: 'text/x-python',
182
+ extensions: ['BUILD', 'bzl', 'py', 'pyw'],
183
+ filename: /^(BUCK|BUILD)$/,
184
+ load() {
185
+ return Promise.resolve(python());
186
+ }
187
+ }),
188
+ makeSpec({
189
+ name: 'Rust',
190
+ mime: 'text/x-rustsrc',
191
+ extensions: ['rs'],
192
+ async load() {
193
+ const m = await import('@codemirror/lang-rust');
194
+ return m.rust();
195
+ }
196
+ }),
197
+ makeSpec({
198
+ name: 'SQL',
199
+ mime: 'text/x-sql',
200
+ extensions: ['sql'],
201
+ load() {
202
+ return sql('StandardSQL');
203
+ }
204
+ }),
205
+ makeSpec({
206
+ name: 'SQLite',
207
+ mime: 'text/x-sqlite',
208
+ load() {
209
+ return sql('SQLite');
210
+ }
211
+ }),
212
+ makeSpec({
213
+ name: 'TSX',
214
+ alias: ['TypeScript-JSX'],
215
+ mime: 'text/typescript-jsx',
216
+ extensions: ['tsx'],
217
+ async load() {
218
+ const m = await import('@codemirror/lang-javascript');
219
+ return m.javascript({ jsx: true, typescript: true });
220
+ }
221
+ }),
222
+ makeSpec({
223
+ name: 'TypeScript',
224
+ alias: ['ts'],
225
+ mime: 'application/typescript',
226
+ extensions: ['ts'],
227
+ async load() {
228
+ const m = await import('@codemirror/lang-javascript');
229
+ return m.javascript({ typescript: true });
230
+ }
231
+ }),
232
+ makeSpec({
233
+ name: 'WebAssembly',
234
+ mime: 'text/webassembly',
235
+ extensions: ['wat', 'wast'],
236
+ async load() {
237
+ const m = await import('@codemirror/lang-wast');
238
+ return m.wast();
239
+ }
240
+ }),
241
+ makeSpec({
242
+ name: 'XML',
243
+ alias: ['rss', 'wsdl', 'xsd'],
244
+ mime: ['application/xml', 'text/xml'],
245
+ extensions: ['xml', 'xsl', 'xsd', 'svg'],
246
+ async load() {
247
+ const m = await import('@codemirror/lang-xml');
248
+ return m.xml();
249
+ }
250
+ }),
251
+ // Legacy modes ported from CodeMirror 5
252
+ makeSpec({
253
+ name: 'APL',
254
+ mime: 'text/apl',
255
+ extensions: ['dyalog', 'apl'],
256
+ async load() {
257
+ const m = await import('@codemirror/legacy-modes/mode/apl');
258
+ return legacy(m.apl);
259
+ }
260
+ }),
261
+ makeSpec({
262
+ name: 'PGP',
263
+ alias: ['asciiarmor'],
264
+ mime: [
265
+ 'application/pgp',
266
+ 'application/pgp-encrypted',
267
+ 'application/pgp-keys',
268
+ 'application/pgp-signature'
269
+ ],
270
+ extensions: ['asc', 'pgp', 'sig'],
271
+ async load() {
272
+ const m = await import('@codemirror/legacy-modes/mode/asciiarmor');
273
+ return legacy(m.asciiArmor);
274
+ }
275
+ }),
276
+ makeSpec({
277
+ name: 'ASN.1',
278
+ mime: 'text/x-ttcn-asn',
279
+ extensions: ['asn', 'asn1'],
280
+ async load() {
281
+ const m = await import('@codemirror/legacy-modes/mode/asn1');
282
+ return legacy(m.asn1({}));
283
+ }
284
+ }),
285
+ makeSpec({
286
+ name: 'Asterisk',
287
+ mime: 'text/x-asterisk',
288
+ filename: /^extensions\.conf$/i,
289
+ async load() {
290
+ const m = await import('@codemirror/legacy-modes/mode/asterisk');
291
+ return legacy(m.asterisk);
292
+ }
293
+ }),
294
+ makeSpec({
295
+ name: 'Brainfuck',
296
+ mime: 'text/x-brainfuck',
297
+ extensions: ['b', 'bf'],
298
+ async load() {
299
+ const m = await import('@codemirror/legacy-modes/mode/brainfuck');
300
+ return legacy(m.brainfuck);
301
+ }
302
+ }),
303
+ makeSpec({
304
+ name: 'Cobol',
305
+ mime: 'text/x-cobol',
306
+ extensions: ['cob', 'cpy'],
307
+ async load() {
308
+ const m = await import('@codemirror/legacy-modes/mode/cobol');
309
+ return legacy(m.cobol);
310
+ }
311
+ }),
312
+ makeSpec({
313
+ name: 'C#',
314
+ alias: ['csharp', 'cs'],
315
+ mime: 'text/x-csharp',
316
+ extensions: ['cs'],
317
+ async load() {
318
+ const m = await import('@codemirror/legacy-modes/mode/clike');
319
+ return legacy(m.csharp);
320
+ }
321
+ }),
322
+ makeSpec({
323
+ name: 'Clojure',
324
+ mime: 'text/x-clojure',
325
+ extensions: ['clj', 'cljc', 'cljx'],
326
+ async load() {
327
+ const m = await import('@codemirror/legacy-modes/mode/clojure');
328
+ return legacy(m.clojure);
329
+ }
330
+ }),
331
+ makeSpec({
332
+ name: 'ClojureScript',
333
+ mime: 'text/x-clojurescript',
334
+ extensions: ['cljs'],
335
+ async load() {
336
+ const m = await import('@codemirror/legacy-modes/mode/clojure');
337
+ return legacy(m.clojure);
338
+ }
339
+ }),
340
+ makeSpec({
341
+ name: 'Closure Stylesheets (GSS)',
342
+ mime: 'text/x-gss',
343
+ extensions: ['gss'],
344
+ async load() {
345
+ const m = await import('@codemirror/legacy-modes/mode/css');
346
+ return legacy(m.gss);
347
+ }
348
+ }),
349
+ makeSpec({
350
+ name: 'CMake',
351
+ mime: 'text/x-cmake',
352
+ extensions: ['cmake', 'cmake.in'],
353
+ filename: /^CMakeLists\.txt$/,
354
+ async load() {
355
+ const m = await import('@codemirror/legacy-modes/mode/cmake');
356
+ return legacy(m.cmake);
357
+ }
358
+ }),
359
+ makeSpec({
360
+ name: 'CoffeeScript',
361
+ alias: ['coffee', 'coffee-script'],
362
+ mime: [
363
+ 'application/vnd.coffeescript',
364
+ 'text/coffeescript',
365
+ 'text/x-coffeescript'
366
+ ],
367
+ extensions: ['coffee'],
368
+ async load() {
369
+ const m = await import('@codemirror/legacy-modes/mode/coffeescript');
370
+ return legacy(m.coffeeScript);
371
+ }
372
+ }),
373
+ makeSpec({
374
+ name: 'Common Lisp',
375
+ alias: ['lisp'],
376
+ mime: 'text/x-common-lisp',
377
+ extensions: ['cl', 'lisp', 'el'],
378
+ async load() {
379
+ const m = await import('@codemirror/legacy-modes/mode/commonlisp');
380
+ return legacy(m.commonLisp);
381
+ }
382
+ }),
383
+ makeSpec({
384
+ name: 'Cypher',
385
+ mime: 'application/x-cypher-query',
386
+ extensions: ['cyp', 'cypher'],
387
+ async load() {
388
+ const m = await import('@codemirror/legacy-modes/mode/cypher');
389
+ return legacy(m.cypher);
390
+ }
391
+ }),
392
+ makeSpec({
393
+ name: 'Cython',
394
+ mime: 'text/x-cython',
395
+ extensions: ['pyx', 'pxd', 'pxi'],
396
+ async load() {
397
+ const m = await import('@codemirror/legacy-modes/mode/python');
398
+ return legacy(m.cython);
399
+ }
400
+ }),
401
+ makeSpec({
402
+ name: 'Crystal',
403
+ mime: 'text/x-crystal',
404
+ extensions: ['cr'],
405
+ async load() {
406
+ const m = await import('@codemirror/legacy-modes/mode/crystal');
407
+ return legacy(m.crystal);
408
+ }
409
+ }),
410
+ makeSpec({
411
+ name: 'D',
412
+ mime: 'text/x-d',
413
+ extensions: ['d'],
414
+ async load() {
415
+ const m = await import('@codemirror/legacy-modes/mode/d');
416
+ return legacy(m.d);
417
+ }
418
+ }),
419
+ makeSpec({
420
+ name: 'Dart',
421
+ mime: ['application/dart', 'text/x-dart'],
422
+ extensions: ['dart'],
423
+ async load() {
424
+ const m = await import('@codemirror/legacy-modes/mode/clike');
425
+ return legacy(m.dart);
426
+ }
427
+ }),
428
+ makeSpec({
429
+ name: 'diff',
430
+ mime: 'text/x-diff',
431
+ extensions: ['diff', 'patch'],
432
+ async load() {
433
+ const m = await import('@codemirror/legacy-modes/mode/diff');
434
+ return legacy(m.diff);
435
+ }
436
+ }),
437
+ makeSpec({
438
+ name: 'Dockerfile',
439
+ mime: 'text/x-dockerfile',
440
+ filename: /^Dockerfile$/,
441
+ async load() {
442
+ const m = await import('@codemirror/legacy-modes/mode/dockerfile');
443
+ return legacy(m.dockerFile);
444
+ }
445
+ }),
446
+ makeSpec({
447
+ name: 'DTD',
448
+ mime: 'application/xml-dtd',
449
+ extensions: ['dtd'],
450
+ async load() {
451
+ const m = await import('@codemirror/legacy-modes/mode/dtd');
452
+ return legacy(m.dtd);
453
+ }
454
+ }),
455
+ makeSpec({
456
+ name: 'Dylan',
457
+ mime: 'text/x-dylan',
458
+ extensions: ['dylan', 'dyl', 'intr'],
459
+ async load() {
460
+ const m = await import('@codemirror/legacy-modes/mode/dylan');
461
+ return legacy(m.dylan);
462
+ }
463
+ }),
464
+ makeSpec({
465
+ name: 'EBNF',
466
+ mime: 'text/x-ebnf',
467
+ async load() {
468
+ const m = await import('@codemirror/legacy-modes/mode/ebnf');
469
+ return legacy(m.ebnf);
470
+ }
471
+ }),
472
+ makeSpec({
473
+ name: 'ECL',
474
+ mime: 'text/x-ecl',
475
+ extensions: ['ecl'],
476
+ async load() {
477
+ const m = await import('@codemirror/legacy-modes/mode/ecl');
478
+ return legacy(m.ecl);
479
+ }
480
+ }),
481
+ makeSpec({
482
+ name: 'edn',
483
+ mime: 'application/edn',
484
+ extensions: ['edn'],
485
+ async load() {
486
+ const m = await import('@codemirror/legacy-modes/mode/clojure');
487
+ return legacy(m.clojure);
488
+ }
489
+ }),
490
+ makeSpec({
491
+ name: 'Eiffel',
492
+ mime: 'text/x-eiffel',
493
+ extensions: ['e'],
494
+ async load() {
495
+ const m = await import('@codemirror/legacy-modes/mode/eiffel');
496
+ return legacy(m.eiffel);
497
+ }
498
+ }),
499
+ makeSpec({
500
+ name: 'Elm',
501
+ mime: 'text/x-elm',
502
+ extensions: ['elm'],
503
+ async load() {
504
+ const m = await import('@codemirror/legacy-modes/mode/elm');
505
+ return legacy(m.elm);
506
+ }
507
+ }),
508
+ makeSpec({
509
+ name: 'Erlang',
510
+ mime: 'text/x-erlang',
511
+ extensions: ['erl'],
512
+ async load() {
513
+ const m = await import('@codemirror/legacy-modes/mode/erlang');
514
+ return legacy(m.erlang);
515
+ }
516
+ }),
517
+ makeSpec({
518
+ name: 'Esper',
519
+ mime: 'text/x-esper',
520
+ async load() {
521
+ const m = await import('@codemirror/legacy-modes/mode/sql');
522
+ return legacy(m.esper);
523
+ }
524
+ }),
525
+ makeSpec({
526
+ name: 'Factor',
527
+ mime: 'text/x-factor',
528
+ extensions: ['factor'],
529
+ async load() {
530
+ const m = await import('@codemirror/legacy-modes/mode/factor');
531
+ return legacy(m.factor);
532
+ }
533
+ }),
534
+ makeSpec({
535
+ name: 'FCL',
536
+ mime: 'text/x-fcl',
537
+ async load() {
538
+ const m = await import('@codemirror/legacy-modes/mode/fcl');
539
+ return legacy(m.fcl);
540
+ }
541
+ }),
542
+ makeSpec({
543
+ name: 'Forth',
544
+ mime: 'text/x-forth',
545
+ extensions: ['forth', 'fth', '4th'],
546
+ async load() {
547
+ const m = await import('@codemirror/legacy-modes/mode/forth');
548
+ return legacy(m.forth);
549
+ }
550
+ }),
551
+ makeSpec({
552
+ name: 'Fortran',
553
+ mime: 'text/x-fortran',
554
+ extensions: ['f', 'for', 'f77', 'f90', 'f95'],
555
+ async load() {
556
+ const m = await import('@codemirror/legacy-modes/mode/fortran');
557
+ return legacy(m.fortran);
558
+ }
559
+ }),
560
+ makeSpec({
561
+ name: 'F#',
562
+ alias: ['fsharp'],
563
+ mime: 'text/x-fsharp',
564
+ extensions: ['fs'],
565
+ async load() {
566
+ const m = await import('@codemirror/legacy-modes/mode/mllike');
567
+ return legacy(m.fSharp);
568
+ }
569
+ }),
570
+ makeSpec({
571
+ name: 'Gas',
572
+ mime: 'text/x-gas',
573
+ extensions: ['s'],
574
+ async load() {
575
+ const m = await import('@codemirror/legacy-modes/mode/gas');
576
+ return legacy(m.gas);
577
+ }
578
+ }),
579
+ makeSpec({
580
+ name: 'Gherkin',
581
+ mime: 'text/x-feature',
582
+ extensions: ['feature'],
583
+ async load() {
584
+ const m = await import('@codemirror/legacy-modes/mode/gherkin');
585
+ return legacy(m.gherkin);
586
+ }
587
+ }),
588
+ makeSpec({
589
+ name: 'Go',
590
+ mime: 'text/x-go',
591
+ extensions: ['go'],
592
+ async load() {
593
+ const m = await import('@codemirror/legacy-modes/mode/go');
594
+ return legacy(m.go);
595
+ }
596
+ }),
597
+ makeSpec({
598
+ name: 'Groovy',
599
+ mime: 'text/x-groovy',
600
+ extensions: ['groovy', 'gradle'],
601
+ filename: /^Jenkinsfile$/,
602
+ async load() {
603
+ const m = await import('@codemirror/legacy-modes/mode/groovy');
604
+ return legacy(m.groovy);
605
+ }
606
+ }),
607
+ makeSpec({
608
+ name: 'Haskell',
609
+ mime: 'text/x-haskell',
610
+ extensions: ['hs'],
611
+ async load() {
612
+ const m = await import('@codemirror/legacy-modes/mode/haskell');
613
+ return legacy(m.haskell);
614
+ }
615
+ }),
616
+ makeSpec({
617
+ name: 'Haxe',
618
+ mime: 'text/x-haxe',
619
+ extensions: ['hx'],
620
+ async load() {
621
+ const m = await import('@codemirror/legacy-modes/mode/haxe');
622
+ return legacy(m.haxe);
623
+ }
624
+ }),
625
+ makeSpec({
626
+ name: 'HXML',
627
+ mime: 'text/x-hxml',
628
+ extensions: ['hxml'],
629
+ async load() {
630
+ const m = await import('@codemirror/legacy-modes/mode/haxe');
631
+ return legacy(m.hxml);
632
+ }
633
+ }),
634
+ makeSpec({
635
+ name: 'HTTP',
636
+ mime: 'message/http',
637
+ async load() {
638
+ const m = await import('@codemirror/legacy-modes/mode/http');
639
+ return legacy(m.http);
640
+ }
641
+ }),
642
+ makeSpec({
643
+ name: 'IDL',
644
+ mime: 'text/x-idl',
645
+ extensions: ['pro'],
646
+ async load() {
647
+ const m = await import('@codemirror/legacy-modes/mode/idl');
648
+ return legacy(m.idl);
649
+ }
650
+ }),
651
+ makeSpec({
652
+ name: 'JSON-LD',
653
+ alias: ['jsonld'],
654
+ mime: 'application/ld+json',
655
+ extensions: ['jsonld'],
656
+ async load() {
657
+ const m = await import('@codemirror/legacy-modes/mode/javascript');
658
+ return legacy(m.jsonld);
659
+ }
660
+ }),
661
+ makeSpec({
662
+ name: 'Jinja2',
663
+ mime: 'text/jinja2',
664
+ extensions: ['j2', 'jinja', 'jinja2'],
665
+ async load() {
666
+ const m = await import('@codemirror/legacy-modes/mode/jinja2');
667
+ return legacy(m.jinja2);
668
+ }
669
+ }),
670
+ makeSpec({
671
+ name: 'Julia',
672
+ mime: 'text/x-julia',
673
+ extensions: ['jl'],
674
+ async load() {
675
+ const m = await import('@codemirror/legacy-modes/mode/julia');
676
+ return legacy(m.julia);
677
+ }
678
+ }),
679
+ makeSpec({
680
+ name: 'Kotlin',
681
+ mime: 'text/x-kotlin',
682
+ extensions: ['kt'],
683
+ async load() {
684
+ const m = await import('@codemirror/legacy-modes/mode/clike');
685
+ return legacy(m.kotlin);
686
+ }
687
+ }),
688
+ makeSpec({
689
+ name: 'LESS',
690
+ mime: 'text/x-less',
691
+ extensions: ['less'],
692
+ async load() {
693
+ const m = await import('@codemirror/legacy-modes/mode/css');
694
+ return legacy(m.less);
695
+ }
696
+ }),
697
+ makeSpec({
698
+ name: 'LiveScript',
699
+ alias: ['ls'],
700
+ mime: 'text/x-livescript',
701
+ extensions: ['ls'],
702
+ async load() {
703
+ const m = await import('@codemirror/legacy-modes/mode/livescript');
704
+ return legacy(m.liveScript);
705
+ }
706
+ }),
707
+ makeSpec({
708
+ name: 'Lua',
709
+ mime: 'text/x-lua',
710
+ extensions: ['lua'],
711
+ async load() {
712
+ const m = await import('@codemirror/legacy-modes/mode/lua');
713
+ return legacy(m.lua);
714
+ }
715
+ }),
716
+ makeSpec({
717
+ name: 'mIRC',
718
+ mime: 'text/mirc',
719
+ async load() {
720
+ const m = await import('@codemirror/legacy-modes/mode/mirc');
721
+ return legacy(m.mirc);
722
+ }
723
+ }),
724
+ makeSpec({
725
+ name: 'Mathematica',
726
+ mime: 'text/x-mathematica',
727
+ extensions: ['m', 'nb', 'wl', 'wls'],
728
+ async load() {
729
+ const m = await import('@codemirror/legacy-modes/mode/mathematica');
730
+ return legacy(m.mathematica);
731
+ }
732
+ }),
733
+ makeSpec({
734
+ name: 'Modelica',
735
+ mime: 'text/x-modelica',
736
+ extensions: ['mo'],
737
+ async load() {
738
+ const m = await import('@codemirror/legacy-modes/mode/modelica');
739
+ return legacy(m.modelica);
740
+ }
741
+ }),
742
+ makeSpec({
743
+ name: 'MUMPS',
744
+ mime: 'text/x-mumps',
745
+ extensions: ['mps'],
746
+ async load() {
747
+ const m = await import('@codemirror/legacy-modes/mode/mumps');
748
+ return legacy(m.mumps);
749
+ }
750
+ }),
751
+ makeSpec({
752
+ name: 'mbox',
753
+ mime: 'application/mbox',
754
+ extensions: ['mbox'],
755
+ async load() {
756
+ const m = await import('@codemirror/legacy-modes/mode/mbox');
757
+ return legacy(m.mbox);
758
+ }
759
+ }),
760
+ makeSpec({
761
+ name: 'Nginx',
762
+ mime: 'text/x-nginx-conf',
763
+ filename: /nginx.*\.conf$/i,
764
+ async load() {
765
+ const m = await import('@codemirror/legacy-modes/mode/nginx');
766
+ return legacy(m.nginx);
767
+ }
768
+ }),
769
+ makeSpec({
770
+ name: 'NSIS',
771
+ mime: 'text/x-nsis',
772
+ extensions: ['nsh', 'nsi'],
773
+ async load() {
774
+ const m = await import('@codemirror/legacy-modes/mode/nsis');
775
+ return legacy(m.nsis);
776
+ }
777
+ }),
778
+ makeSpec({
779
+ name: 'NTriples',
780
+ mime: ['application/n-triples', 'application/n-quads', 'text/n-triples'],
781
+ extensions: ['nt', 'nq'],
782
+ async load() {
783
+ const m = await import('@codemirror/legacy-modes/mode/ntriples');
784
+ return legacy(m.ntriples);
785
+ }
786
+ }),
787
+ makeSpec({
788
+ name: 'Objective-C',
789
+ alias: ['objective-c', 'objc'],
790
+ mime: 'text/x-objectivec',
791
+ extensions: ['m'],
792
+ async load() {
793
+ const m = await import('@codemirror/legacy-modes/mode/clike');
794
+ return legacy(m.objectiveC);
795
+ }
796
+ }),
797
+ makeSpec({
798
+ name: 'Objective-C++',
799
+ alias: ['objective-c++', 'objc++'],
800
+ mime: 'text/x-objectivec++',
801
+ extensions: ['mm'],
802
+ async load() {
803
+ const m = await import('@codemirror/legacy-modes/mode/clike');
804
+ return legacy(m.objectiveCpp);
805
+ }
806
+ }),
807
+ makeSpec({
808
+ name: 'OCaml',
809
+ mime: 'text/x-ocaml',
810
+ extensions: ['ml', 'mli', 'mll', 'mly'],
811
+ async load() {
812
+ const m = await import('@codemirror/legacy-modes/mode/mllike');
813
+ return legacy(m.oCaml);
814
+ }
815
+ }),
816
+ makeSpec({
817
+ name: 'Octave',
818
+ mime: 'text/x-octave',
819
+ extensions: ['m'],
820
+ async load() {
821
+ const m = await import('@codemirror/legacy-modes/mode/octave');
822
+ return legacy(m.octave);
823
+ }
824
+ }),
825
+ makeSpec({
826
+ name: 'Oz',
827
+ mime: 'text/x-oz',
828
+ extensions: ['oz'],
829
+ async load() {
830
+ const m = await import('@codemirror/legacy-modes/mode/oz');
831
+ return legacy(m.oz);
832
+ }
833
+ }),
834
+ makeSpec({
835
+ name: 'Pascal',
836
+ mime: 'text/x-pascal',
837
+ extensions: ['p', 'pas'],
838
+ async load() {
839
+ const m = await import('@codemirror/legacy-modes/mode/pascal');
840
+ return legacy(m.pascal);
841
+ }
842
+ }),
843
+ makeSpec({
844
+ name: 'Perl',
845
+ mime: 'text/x-perl',
846
+ extensions: ['pl', 'pm'],
847
+ async load() {
848
+ const m = await import('@codemirror/legacy-modes/mode/perl');
849
+ return legacy(m.perl);
850
+ }
851
+ }),
852
+ makeSpec({
853
+ name: 'Pig',
854
+ mime: 'text/x-pig',
855
+ extensions: ['pig'],
856
+ async load() {
857
+ const m = await import('@codemirror/legacy-modes/mode/pig');
858
+ return legacy(m.pig);
859
+ }
860
+ }),
861
+ makeSpec({
862
+ name: 'PowerShell',
863
+ mime: 'application/x-powershell',
864
+ extensions: ['ps1', 'psd1', 'psm1'],
865
+ async load() {
866
+ const m = await import('@codemirror/legacy-modes/mode/powershell');
867
+ return legacy(m.powerShell);
868
+ }
869
+ }),
870
+ makeSpec({
871
+ name: 'Properties files',
872
+ alias: ['ini', 'properties'],
873
+ mime: 'text/x-properties',
874
+ extensions: ['properties', 'ini', 'in'],
875
+ async load() {
876
+ const m = await import('@codemirror/legacy-modes/mode/properties');
877
+ return legacy(m.properties);
878
+ }
879
+ }),
880
+ makeSpec({
881
+ name: 'ProtoBuf',
882
+ mime: 'text/x-protobuf',
883
+ extensions: ['proto'],
884
+ async load() {
885
+ const m = await import('@codemirror/legacy-modes/mode/protobuf');
886
+ return legacy(m.protobuf);
887
+ }
888
+ }),
889
+ makeSpec({
890
+ name: 'Puppet',
891
+ mime: 'text/x-puppet',
892
+ extensions: ['pp'],
893
+ async load() {
894
+ const m = await import('@codemirror/legacy-modes/mode/puppet');
895
+ return legacy(m.puppet);
896
+ }
897
+ }),
898
+ makeSpec({
899
+ name: 'Q',
900
+ mime: 'text/x-q',
901
+ extensions: ['q'],
902
+ async load() {
903
+ const m = await import('@codemirror/legacy-modes/mode/q');
904
+ return legacy(m.q);
905
+ }
906
+ }),
907
+ makeSpec({
908
+ name: 'R',
909
+ alias: ['rscript'],
910
+ mime: 'text/x-rsrc',
911
+ extensions: ['r', 'R'],
912
+ async load() {
913
+ const m = await import('@codemirror/legacy-modes/mode/r');
914
+ return legacy(m.r);
915
+ }
916
+ }),
917
+ makeSpec({
918
+ name: 'RPM Changes',
919
+ mime: 'text/x-rpm-changes',
920
+ async load() {
921
+ const m = await import('@codemirror/legacy-modes/mode/rpm');
922
+ return legacy(m.rpmChanges);
923
+ }
924
+ }),
925
+ makeSpec({
926
+ name: 'RPM Spec',
927
+ mime: 'text/x-rpm-spec',
928
+ extensions: ['spec'],
929
+ async load() {
930
+ const m = await import('@codemirror/legacy-modes/mode/rpm');
931
+ return legacy(m.rpmSpec);
932
+ }
933
+ }),
934
+ makeSpec({
935
+ name: 'Ruby',
936
+ alias: ['jruby', 'macruby', 'rake', 'rb', 'rbx'],
937
+ mime: 'text/x-ruby',
938
+ extensions: ['rb'],
939
+ async load() {
940
+ const m = await import('@codemirror/legacy-modes/mode/ruby');
941
+ return legacy(m.ruby);
942
+ }
943
+ }),
944
+ makeSpec({
945
+ name: 'SAS',
946
+ mime: 'text/x-sas',
947
+ extensions: ['sas'],
948
+ async load() {
949
+ const m = await import('@codemirror/legacy-modes/mode/sas');
950
+ return legacy(m.sas);
951
+ }
952
+ }),
953
+ makeSpec({
954
+ name: 'Scala',
955
+ mime: 'text/x-scala',
956
+ extensions: ['scala'],
957
+ async load() {
958
+ const m = await import('@codemirror/legacy-modes/mode/clike');
959
+ return legacy(m.scala);
960
+ }
961
+ }),
962
+ makeSpec({
963
+ name: 'Scheme',
964
+ mime: 'text/x-scheme',
965
+ extensions: ['scm', 'ss'],
966
+ async load() {
967
+ const m = await import('@codemirror/legacy-modes/mode/scheme');
968
+ return legacy(m.scheme);
969
+ }
970
+ }),
971
+ makeSpec({
972
+ name: 'SCSS',
973
+ mime: 'text/x-scss',
974
+ extensions: ['scss'],
975
+ async load() {
976
+ const m = await import('@codemirror/legacy-modes/mode/css');
977
+ return legacy(m.sCSS);
978
+ }
979
+ }),
980
+ makeSpec({
981
+ name: 'Shell',
982
+ alias: ['bash', 'sh', 'zsh'],
983
+ mime: ['text/x-sh', 'application/x-sh'],
984
+ extensions: ['sh', 'ksh', 'bash'],
985
+ filename: /^PKGBUILD$/,
986
+ async load() {
987
+ const m = await import('@codemirror/legacy-modes/mode/shell');
988
+ return legacy(m.shell);
989
+ }
990
+ }),
991
+ makeSpec({
992
+ name: 'Sieve',
993
+ mime: 'application/sieve',
994
+ extensions: ['siv', 'sieve'],
995
+ async load() {
996
+ const m = await import('@codemirror/legacy-modes/mode/sieve');
997
+ return legacy(m.sieve);
998
+ }
999
+ }),
1000
+ makeSpec({
1001
+ name: 'Smalltalk',
1002
+ mime: 'text/x-stsrc',
1003
+ extensions: ['st'],
1004
+ async load() {
1005
+ const m = await import('@codemirror/legacy-modes/mode/smalltalk');
1006
+ return legacy(m.smalltalk);
1007
+ }
1008
+ }),
1009
+ makeSpec({
1010
+ name: 'Solr',
1011
+ mime: 'text/x-solr',
1012
+ async load() {
1013
+ const m = await import('@codemirror/legacy-modes/mode/solr');
1014
+ return legacy(m.solr);
1015
+ }
1016
+ }),
1017
+ makeSpec({
1018
+ name: 'SML',
1019
+ mime: 'text/x-sml',
1020
+ extensions: ['sml', 'sig', 'fun', 'smackspec'],
1021
+ async load() {
1022
+ const m = await import('@codemirror/legacy-modes/mode/mllike');
1023
+ return legacy(m.sml);
1024
+ }
1025
+ }),
1026
+ makeSpec({
1027
+ name: 'SPARQL',
1028
+ alias: ['sparul'],
1029
+ mime: 'application/sparql-query',
1030
+ extensions: ['rq', 'sparql'],
1031
+ async load() {
1032
+ const m = await import('@codemirror/legacy-modes/mode/sparql');
1033
+ return legacy(m.sparql);
1034
+ }
1035
+ }),
1036
+ makeSpec({
1037
+ name: 'Spreadsheet',
1038
+ alias: ['excel', 'formula'],
1039
+ mime: 'text/x-spreadsheet',
1040
+ async load() {
1041
+ const m = await import('@codemirror/legacy-modes/mode/spreadsheet');
1042
+ return legacy(m.spreadsheet);
1043
+ }
1044
+ }),
1045
+ makeSpec({
1046
+ name: 'SQL',
1047
+ mime: 'text/x-sql',
1048
+ extensions: ['sql'],
1049
+ async load() {
1050
+ const m = await import('@codemirror/legacy-modes/mode/sql');
1051
+ return legacy(m.standardSQL);
1052
+ }
1053
+ }),
1054
+ makeSpec({
1055
+ name: 'SQLite',
1056
+ mime: 'text/x-sqlite',
1057
+ async load() {
1058
+ const m = await import('@codemirror/legacy-modes/mode/sql');
1059
+ return legacy(m.sqlite);
1060
+ }
1061
+ }),
1062
+ makeSpec({
1063
+ name: 'Squirrel',
1064
+ mime: 'text/x-squirrel',
1065
+ extensions: ['nut'],
1066
+ async load() {
1067
+ const m = await import('@codemirror/legacy-modes/mode/clike');
1068
+ return legacy(m.squirrel);
1069
+ }
1070
+ }),
1071
+ makeSpec({
1072
+ name: 'Stylus',
1073
+ mime: 'text/x-styl',
1074
+ extensions: ['styl'],
1075
+ async load() {
1076
+ const m = await import('@codemirror/legacy-modes/mode/stylus');
1077
+ return legacy(m.stylus);
1078
+ }
1079
+ }),
1080
+ makeSpec({
1081
+ name: 'Swift',
1082
+ mime: 'text/x-swift',
1083
+ extensions: ['swift'],
1084
+ async load() {
1085
+ const m = await import('@codemirror/legacy-modes/mode/swift');
1086
+ return legacy(m.swift);
1087
+ }
1088
+ }),
1089
+ makeSpec({
1090
+ name: 'sTeX',
1091
+ mime: 'text/x-stex',
1092
+ async load() {
1093
+ const m = await import('@codemirror/legacy-modes/mode/stex');
1094
+ return legacy(m.stex);
1095
+ }
1096
+ }),
1097
+ makeSpec({
1098
+ name: 'LaTeX',
1099
+ alias: ['tex'],
1100
+ mime: 'text/x-latex',
1101
+ extensions: ['text', 'ltx', 'tex'],
1102
+ async load() {
1103
+ const m = await import('@codemirror/legacy-modes/mode/stex');
1104
+ return legacy(m.stex);
1105
+ }
1106
+ }),
1107
+ makeSpec({
1108
+ name: 'SystemVerilog',
1109
+ mime: 'text/x-systemverilog',
1110
+ extensions: ['v', 'sv', 'svh'],
1111
+ async load() {
1112
+ const m = await import('@codemirror/legacy-modes/mode/verilog');
1113
+ return legacy(m.verilog);
1114
+ }
1115
+ }),
1116
+ makeSpec({
1117
+ name: 'Tcl',
1118
+ mime: 'text/x-tcl',
1119
+ extensions: ['tcl'],
1120
+ async load() {
1121
+ const m = await import('@codemirror/legacy-modes/mode/tcl');
1122
+ return legacy(m.tcl);
1123
+ }
1124
+ }),
1125
+ makeSpec({
1126
+ name: 'Textile',
1127
+ mime: 'text/x-textile',
1128
+ extensions: ['textile'],
1129
+ async load() {
1130
+ const m = await import('@codemirror/legacy-modes/mode/textile');
1131
+ return legacy(m.textile);
1132
+ }
1133
+ }),
1134
+ makeSpec({
1135
+ name: 'TiddlyWiki',
1136
+ mime: 'text/x-tiddlywiki',
1137
+ async load() {
1138
+ const m = await import('@codemirror/legacy-modes/mode/tiddlywiki');
1139
+ return legacy(m.tiddlyWiki);
1140
+ }
1141
+ }),
1142
+ makeSpec({
1143
+ name: 'Tiki wiki',
1144
+ mime: 'text/tiki',
1145
+ async load() {
1146
+ const m = await import('@codemirror/legacy-modes/mode/tiki');
1147
+ return legacy(m.tiki);
1148
+ }
1149
+ }),
1150
+ makeSpec({
1151
+ name: 'TOML',
1152
+ mime: 'text/x-toml',
1153
+ extensions: ['toml'],
1154
+ async load() {
1155
+ const m = await import('@codemirror/legacy-modes/mode/toml');
1156
+ return legacy(m.toml);
1157
+ }
1158
+ }),
1159
+ makeSpec({
1160
+ name: 'troff',
1161
+ mime: 'text/troff',
1162
+ extensions: ['1', '2', '3', '4', '5', '6', '7', '8', '9'],
1163
+ async load() {
1164
+ const m = await import('@codemirror/legacy-modes/mode/troff');
1165
+ return legacy(m.troff);
1166
+ }
1167
+ }),
1168
+ makeSpec({
1169
+ name: 'TTCN',
1170
+ mime: 'text/x-ttcn',
1171
+ extensions: ['ttcn', 'ttcn3', 'ttcnpp'],
1172
+ async load() {
1173
+ const m = await import('@codemirror/legacy-modes/mode/ttcn');
1174
+ return legacy(m.ttcn);
1175
+ }
1176
+ }),
1177
+ makeSpec({
1178
+ name: 'TTCN_CFG',
1179
+ mime: 'text/x-ttcn-cfg',
1180
+ extensions: ['cfg'],
1181
+ async load() {
1182
+ const m = await import('@codemirror/legacy-modes/mode/ttcn-cfg');
1183
+ return legacy(m.ttcnCfg);
1184
+ }
1185
+ }),
1186
+ makeSpec({
1187
+ name: 'Turtle',
1188
+ mime: 'text/turtle',
1189
+ extensions: ['ttl'],
1190
+ async load() {
1191
+ const m = await import('@codemirror/legacy-modes/mode/turtle');
1192
+ return legacy(m.turtle);
1193
+ }
1194
+ }),
1195
+ makeSpec({
1196
+ name: 'Web IDL',
1197
+ mime: 'text/x-webidl',
1198
+ extensions: ['webidl'],
1199
+ async load() {
1200
+ const m = await import('@codemirror/legacy-modes/mode/webidl');
1201
+ return legacy(m.webIDL);
1202
+ }
1203
+ }),
1204
+ makeSpec({
1205
+ name: 'VB.NET',
1206
+ mime: 'text/x-vb',
1207
+ extensions: ['vb'],
1208
+ async load() {
1209
+ const m = await import('@codemirror/legacy-modes/mode/vb');
1210
+ return legacy(m.vb);
1211
+ }
1212
+ }),
1213
+ makeSpec({
1214
+ name: 'VBScript',
1215
+ mime: 'text/vbscript',
1216
+ extensions: ['vbs'],
1217
+ async load() {
1218
+ const m = await import('@codemirror/legacy-modes/mode/vbscript');
1219
+ return legacy(m.vbScript);
1220
+ }
1221
+ }),
1222
+ makeSpec({
1223
+ name: 'Velocity',
1224
+ mime: 'text/velocity',
1225
+ extensions: ['vtl'],
1226
+ async load() {
1227
+ const m = await import('@codemirror/legacy-modes/mode/velocity');
1228
+ return legacy(m.velocity);
1229
+ }
1230
+ }),
1231
+ makeSpec({
1232
+ name: 'Verilog',
1233
+ mime: 'text/x-verilog',
1234
+ extensions: ['v'],
1235
+ async load() {
1236
+ const m = await import('@codemirror/legacy-modes/mode/verilog');
1237
+ return legacy(m.verilog);
1238
+ }
1239
+ }),
1240
+ makeSpec({
1241
+ name: 'VHDL',
1242
+ mime: 'text/x-vhdl',
1243
+ extensions: ['vhd', 'vhdl'],
1244
+ async load() {
1245
+ const m = await import('@codemirror/legacy-modes/mode/vhdl');
1246
+ return legacy(m.vhdl);
1247
+ }
1248
+ }),
1249
+ makeSpec({
1250
+ name: 'XQuery',
1251
+ mime: 'application/xquery',
1252
+ extensions: ['xy', 'xquery'],
1253
+ async load() {
1254
+ const m = await import('@codemirror/legacy-modes/mode/xquery');
1255
+ return legacy(m.xQuery);
1256
+ }
1257
+ }),
1258
+ makeSpec({
1259
+ name: 'Yacas',
1260
+ mime: 'text/x-yacas',
1261
+ extensions: ['ys'],
1262
+ async load() {
1263
+ const m = await import('@codemirror/legacy-modes/mode/yacas');
1264
+ return legacy(m.yacas);
1265
+ }
1266
+ }),
1267
+ makeSpec({
1268
+ name: 'YAML',
1269
+ alias: ['yml'],
1270
+ mime: ['text/x-yaml', 'text/yaml'],
1271
+ extensions: ['yaml', 'yml'],
1272
+ async load() {
1273
+ const m = await import('@codemirror/legacy-modes/mode/yaml');
1274
+ return legacy(m.yaml);
1275
+ }
1276
+ }),
1277
+ makeSpec({
1278
+ name: 'Z80',
1279
+ mime: 'text/x-z80',
1280
+ extensions: ['z80'],
1281
+ async load() {
1282
+ const m = await import('@codemirror/legacy-modes/mode/z80');
1283
+ return legacy(m.z80);
1284
+ }
1285
+ }),
1286
+ makeSpec({
1287
+ name: 'mscgen',
1288
+ mime: 'text/x-mscgen',
1289
+ extensions: ['mscgen', 'mscin', 'msc'],
1290
+ async load() {
1291
+ const m = await import('@codemirror/legacy-modes/mode/mscgen');
1292
+ return legacy(m.mscgen);
1293
+ }
1294
+ }),
1295
+ makeSpec({
1296
+ name: 'xu',
1297
+ mime: 'text/x-xu',
1298
+ extensions: ['xu'],
1299
+ async load() {
1300
+ const m = await import('@codemirror/legacy-modes/mode/mscgen');
1301
+ return legacy(m.xu);
1302
+ }
1303
+ }),
1304
+ makeSpec({
1305
+ name: 'msgenny',
1306
+ mime: 'text/x-msgenny',
1307
+ extensions: ['msgenny'],
1308
+ async load() {
1309
+ const m = await import('@codemirror/legacy-modes/mode/mscgen');
1310
+ return legacy(m.msgenny);
1311
+ }
1312
+ })
47
1313
  ];
48
1314
  /**
49
1315
  * Get the raw list of available modes specs.
1316
+ *
1317
+ * @alpha
1318
+ * @returns The available modes
50
1319
  */
51
1320
  function getModeInfo() {
52
- return CodeMirror.modeInfo;
1321
+ return modeList;
53
1322
  }
54
1323
  Mode.getModeInfo = getModeInfo;
55
1324
  /**
56
- * Running a CodeMirror mode outside of an editor.
1325
+ * Find a codemirror mode by MIME.
1326
+ *
1327
+ * @alpha
1328
+ * @param mime Mime type to look for
1329
+ * @returns The mode or null
57
1330
  */
58
- function run(code, mode, el) {
59
- CodeMirror.runMode(code, mode, el);
1331
+ function findByMIME(mime) {
1332
+ if (Array.isArray(mime)) {
1333
+ for (let i = 0; i < mime.length; i++) {
1334
+ const spec = findByMIME(mime[i]);
1335
+ if (spec)
1336
+ return spec;
1337
+ }
1338
+ return null;
1339
+ }
1340
+ mime = mime.toLowerCase();
1341
+ for (let i = 0; i < modeList.length; i++) {
1342
+ let info = modeList[i];
1343
+ if (Array.isArray(info.mime)) {
1344
+ for (let j = 0; j < info.mime.length; j++) {
1345
+ if (info.mime[j] == mime) {
1346
+ return info;
1347
+ }
1348
+ }
1349
+ }
1350
+ else if (info.mime == mime) {
1351
+ return info;
1352
+ }
1353
+ }
1354
+ if (/\+xml$/.test(mime))
1355
+ return findByMIME('application/xml');
1356
+ if (/\+json$/.test(mime))
1357
+ return findByMIME('application/json');
1358
+ return null;
60
1359
  }
61
- Mode.run = run;
1360
+ Mode.findByMIME = findByMIME;
62
1361
  /**
63
- * Ensure a codemirror mode is available by name or Codemirror spec.
1362
+ * Find a codemirror mode by name.
64
1363
  *
65
- * @param mode - The mode to ensure. If it is a string, uses [findBest]
66
- * to get the appropriate spec.
1364
+ * @alpha
1365
+ * @param name The mode name
1366
+ * @returns The mode or null
1367
+ */
1368
+ function findByName(name) {
1369
+ name = name.toLowerCase();
1370
+ for (let i = 0; i < modeList.length; i++) {
1371
+ let info = modeList[i];
1372
+ if (info.name.toLowerCase() == name)
1373
+ return info;
1374
+ if (info.alias) {
1375
+ for (let j = 0; j < info.alias.length; j++) {
1376
+ if (info.alias[j].toLowerCase() == name) {
1377
+ return info;
1378
+ }
1379
+ }
1380
+ }
1381
+ }
1382
+ return null;
1383
+ }
1384
+ Mode.findByName = findByName;
1385
+ /**
1386
+ * Find a codemirror mode by extension.
67
1387
  *
68
- * @returns A promise that resolves when the mode is available.
1388
+ * @alpha
1389
+ * @param ext The extension name
1390
+ * @returns The mode or null
69
1391
  */
70
- async function ensure(mode) {
71
- const spec = findBest(mode);
72
- for (const specLoader of specLoaders) {
73
- if (await specLoader.loader(spec)) {
74
- return spec;
1392
+ function findByExtension(ext) {
1393
+ if (Array.isArray(ext)) {
1394
+ for (let i = 0; i < ext.length; i++) {
1395
+ const spec = findByExtension(ext[i]);
1396
+ if (spec)
1397
+ return spec;
1398
+ }
1399
+ return null;
1400
+ }
1401
+ ext = ext.toLowerCase();
1402
+ for (let i = 0; i < modeList.length; i++) {
1403
+ let info = modeList[i];
1404
+ for (let j = 0; j < info.extensions.length; j++) {
1405
+ if (info.extensions[j].toLowerCase() == ext) {
1406
+ return info;
1407
+ }
75
1408
  }
76
1409
  }
77
1410
  return null;
78
1411
  }
79
- Mode.ensure = ensure;
80
- function addSpecLoader(loader, rank) {
81
- const item = { loader, rank };
82
- const index = ArrayExt.upperBound(specLoaders, item, Private.itemCmp);
83
- ArrayExt.insert(specLoaders, index, item);
1412
+ Mode.findByExtension = findByExtension;
1413
+ /**
1414
+ * Find a codemirror mode by filename.
1415
+ *
1416
+ * @param name File name
1417
+ * @returns The mode or null
1418
+ */
1419
+ function findByFileName(name) {
1420
+ const basename = PathExt.basename(name);
1421
+ for (let i = 0; i < modeList.length; i++) {
1422
+ let info = modeList[i];
1423
+ if (info.filename && info.filename.test(basename)) {
1424
+ return info;
1425
+ }
1426
+ }
1427
+ let dot = basename.lastIndexOf('.');
1428
+ let ext = dot > -1 && basename.substring(dot + 1, basename.length);
1429
+ if (ext) {
1430
+ return findByExtension(ext);
1431
+ }
1432
+ return null;
84
1433
  }
85
- Mode.addSpecLoader = addSpecLoader;
1434
+ Mode.findByFileName = findByFileName;
86
1435
  /**
87
1436
  * Find a codemirror mode by name or CodeMirror spec.
1437
+ *
1438
+ * @alpha
1439
+ * @param mode The CodeMirror mode
1440
+ * @param fallback Whether to fallback to default mimetype spec or not
1441
+ * @returns The mode or null
88
1442
  */
89
- function findBest(mode) {
90
- var _a;
91
- const modename = typeof mode === 'string' ? mode : mode.mode || mode.name;
1443
+ function findBest(mode, fallback = true) {
1444
+ var _a, _b, _c, _d;
1445
+ const modename = typeof mode === 'string' ? mode : mode.name;
92
1446
  const mimetype = typeof mode !== 'string' ? mode.mime : modename;
93
- const ext = typeof mode !== 'string' ? (_a = mode.ext) !== null && _a !== void 0 ? _a : [] : [];
94
- return (CodeMirror.findModeByName(modename || '') ||
95
- CodeMirror.findModeByMIME(mimetype || '') ||
96
- findByExtension(ext) ||
97
- CodeMirror.findModeByMIME(IEditorMimeTypeService.defaultMimeType) ||
98
- CodeMirror.findModeByMIME('text/plain'));
1447
+ const ext = typeof mode !== 'string' ? (_a = mode.extensions) !== null && _a !== void 0 ? _a : [] : [];
1448
+ return ((_d = (_c = (_b = (modename ? findByName(modename) : null)) !== null && _b !== void 0 ? _b : (mimetype ? findByMIME(mimetype) : null)) !== null && _c !== void 0 ? _c : findByExtension(ext)) !== null && _d !== void 0 ? _d : (fallback ? findByMIME(IEditorMimeTypeService.defaultMimeType) : null));
99
1449
  }
100
1450
  Mode.findBest = findBest;
101
1451
  /**
102
- * Find a codemirror mode by MIME.
103
- */
104
- function findByMIME(mime) {
105
- return CodeMirror.findModeByMIME(mime);
106
- }
107
- Mode.findByMIME = findByMIME;
108
- /**
109
- * Find a codemirror mode by name.
1452
+ * Ensure a codemirror mode is available by name or Codemirror spec.
1453
+ *
1454
+ * @param mode - The mode to ensure. If it is a string, uses [findBest]
1455
+ * to get the appropriate spec.
1456
+ *
1457
+ * @returns A promise that resolves when the mode is available.
110
1458
  */
111
- function findByName(name) {
112
- return CodeMirror.findModeByName(name);
1459
+ async function ensure(mode) {
1460
+ const spec = findBest(mode);
1461
+ if (spec) {
1462
+ spec.support = await spec.load();
1463
+ return spec;
1464
+ }
1465
+ return null;
113
1466
  }
114
- Mode.findByName = findByName;
1467
+ Mode.ensure = ensure;
115
1468
  /**
116
- * Find a codemirror mode by filename.
1469
+ * Register a new mode for CodeMirror
1470
+ *
1471
+ * @alpha
1472
+ * @param mode Mode to register
117
1473
  */
118
- function findByFileName(name) {
119
- const basename = PathExt.basename(name);
120
- return CodeMirror.findModeByFileName(basename);
1474
+ function registerModeInfo(mode) {
1475
+ const info = findBest(mode, false);
1476
+ if (info) {
1477
+ throw new Error(`${mode.mime} already registered`);
1478
+ }
1479
+ modeList.push(makeSpec(mode));
121
1480
  }
122
- Mode.findByFileName = findByFileName;
1481
+ Mode.registerModeInfo = registerModeInfo;
123
1482
  /**
124
- * Find a codemirror mode by extension.
1483
+ * Parse and style a string.
1484
+ *
1485
+ * @alpha
1486
+ * @param code Code to highlight
1487
+ * @param mode Code mode
1488
+ * @param el HTML element into which the highlighted code will be inserted
125
1489
  */
126
- function findByExtension(ext) {
127
- if (typeof ext === 'string') {
128
- return CodeMirror.findModeByExtension(ext);
129
- }
130
- for (let i = 0; i < ext.length; i++) {
131
- const mode = CodeMirror.findModeByExtension(ext[i]);
132
- if (mode) {
133
- return mode;
1490
+ function run(code, mode, el) {
1491
+ var _a;
1492
+ const language = (_a = mode.support) === null || _a === void 0 ? void 0 : _a.language;
1493
+ if (!language)
1494
+ return;
1495
+ const tree = language.parser.parse(code);
1496
+ // position state required because unstyled tokens are not emitted
1497
+ // in highlightTree
1498
+ let pos = 0;
1499
+ highlightTree(tree, jupyterHighlightStyle, (from, to, classes) => {
1500
+ if (from > pos) {
1501
+ // No style applied to the token between pos and from
1502
+ el.appendChild(document.createTextNode(code.slice(pos, from)));
134
1503
  }
1504
+ const sp = el.appendChild(document.createElement('span'));
1505
+ sp.className = classes;
1506
+ sp.appendChild(document.createTextNode(code.slice(from, to)));
1507
+ pos = to;
1508
+ });
1509
+ if (pos < tree.length - 1) {
1510
+ // No style applied on the trailing text
1511
+ el.appendChild(document.createTextNode(code.slice(pos, tree.length)));
135
1512
  }
136
- return null;
137
1513
  }
138
- Mode.findByExtension = findByExtension;
1514
+ Mode.run = run;
139
1515
  })(Mode || (Mode = {}));
140
- var Private;
141
- (function (Private) {
142
- /**
143
- * A less-than comparison function for the loader rank
144
- */
145
- function itemCmp(first, second) {
146
- return first.rank - second.rank;
147
- }
148
- Private.itemCmp = itemCmp;
149
- })(Private || (Private = {}));
150
1516
  //# sourceMappingURL=mode.js.map