1 import {StreamLanguage} from '@codemirror/language';
3 import {css} from '@codemirror/lang-css';
4 import {json} from '@codemirror/lang-json';
5 import {javascript} from '@codemirror/lang-javascript';
6 import {html} from '@codemirror/lang-html';
7 import {markdown} from '@codemirror/lang-markdown';
8 import {php} from '@codemirror/lang-php';
9 import {twig} from '@ssddanbrown/codemirror-lang-twig';
10 import {xml} from '@codemirror/lang-xml';
12 const legacyLoad = async mode => {
13 const modes = await window.importVersioned('legacy-modes');
14 return StreamLanguage.define(modes[mode]);
17 // Mapping of possible languages or formats from user input to their codemirror modes.
18 // Value can be a mode string or a function that will receive the code content & return the mode string.
19 // The function option is used in the event the exact mode could be dynamic depending on the code.
21 bash: () => legacyLoad('shell'),
22 c: () => legacyLoad('c'),
23 css: async () => css(),
24 'c++': () => legacyLoad('cpp'),
25 'c#': () => legacyLoad('csharp'),
26 clj: () => legacyLoad('clojure'),
27 clojure: () => legacyLoad('clojure'),
28 csharp: () => legacyLoad('csharp'),
29 dart: () => legacyLoad('dart'),
30 diff: () => legacyLoad('diff'),
31 for: () => legacyLoad('fortran'),
32 fortran: () => legacyLoad('fortran'),
33 'f#': () => legacyLoad('fSharp'),
34 fsharp: () => legacyLoad('fSharp'),
35 go: () => legacyLoad('go'),
36 haskell: () => legacyLoad('haskell'),
37 hs: () => legacyLoad('haskell'),
38 html: async () => html({selfClosingTags: true}),
39 ini: () => legacyLoad('properties'),
40 java: () => legacyLoad('java'),
41 javascript: async () => javascript(),
42 json: async () => json(),
43 js: async () => javascript(),
44 jl: () => legacyLoad('julia'),
45 julia: () => legacyLoad('julia'),
46 kotlin: () => legacyLoad('kotlin'),
47 latex: () => legacyLoad('stex'),
48 lua: () => legacyLoad('lua'),
49 markdown: async () => markdown(),
50 matlab: () => legacyLoad('octave'),
51 md: async () => markdown(),
52 mdown: async () => markdown(),
53 ml: () => legacyLoad('sml'),
54 mssql: () => legacyLoad('msSQL'),
55 mysql: () => legacyLoad('mySQL'),
56 nginx: () => legacyLoad('nginx'),
57 octave: () => legacyLoad('octave'),
58 pas: () => legacyLoad('pascal'),
59 pascal: () => legacyLoad('pascal'),
60 perl: () => legacyLoad('perl'),
61 pgsql: () => legacyLoad('pgSQL'),
63 const hasTags = code.includes('<?php');
64 return php({plain: !hasTags});
66 pl: () => legacyLoad('perl'),
67 'pl/sql': () => legacyLoad('plSQL'),
68 postgresql: () => legacyLoad('pgSQL'),
69 powershell: () => legacyLoad('powerShell'),
70 properties: () => legacyLoad('properties'),
71 ocaml: () => legacyLoad('oCaml'),
72 py: () => legacyLoad('python'),
73 python: () => legacyLoad('python'),
74 r: () => legacyLoad('r'),
75 rb: () => legacyLoad('ruby'),
76 rs: () => legacyLoad('rust'),
77 ruby: () => legacyLoad('ruby'),
78 rust: () => legacyLoad('rust'),
79 sas: () => legacyLoad('sas'),
80 scala: () => legacyLoad('scala'),
81 scheme: () => legacyLoad('scheme'),
82 shell: () => legacyLoad('shell'),
83 sh: () => legacyLoad('shell'),
84 smarty: () => legacyLoad('smarty'),
85 stext: () => legacyLoad('stex'),
86 swift: () => legacyLoad('swift'),
87 toml: () => legacyLoad('toml'),
88 ts: async () => javascript({typescript: true}),
89 twig: async () => twig(),
90 typescript: async () => javascript({typescript: true}),
91 sql: () => legacyLoad('standardSQL'),
92 sqlite: () => legacyLoad('sqlite'),
93 vbs: () => legacyLoad('vbScript'),
94 vbscript: () => legacyLoad('vbScript'),
95 'vb.net': () => legacyLoad('vb'),
96 vbnet: () => legacyLoad('vb'),
97 xml: async () => xml(),
98 yaml: () => legacyLoad('yaml'),
99 yml: () => legacyLoad('yaml'),
103 * Get the relevant codemirror language extension based upon the given language
104 * suggestion and content.
105 * @param {String} langSuggestion
106 * @param {String} content
107 * @returns {Promise<StreamLanguage|LanguageSupport>}
109 export function getLanguageExtension(langSuggestion, content) {
110 const suggestion = langSuggestion.trim().replace(/^\./g, '').toLowerCase();
112 const language = modeMap[suggestion];
114 if (typeof language === 'undefined') {
118 return language(content);