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 rb: () => legacyLoad('ruby'),
75 rs: () => legacyLoad('rust'),
76 ruby: () => legacyLoad('ruby'),
77 rust: () => legacyLoad('rust'),
78 scala: () => legacyLoad('scala'),
79 scheme: () => legacyLoad('scheme'),
80 shell: () => legacyLoad('shell'),
81 sh: () => legacyLoad('shell'),
82 smarty: () => legacyLoad('smarty'),
83 stext: () => legacyLoad('stex'),
84 swift: () => legacyLoad('swift'),
85 toml: () => legacyLoad('toml'),
86 ts: async () => javascript({typescript: true}),
87 twig: async () => twig(),
88 typescript: async () => javascript({typescript: true}),
89 sql: () => legacyLoad('standardSQL'),
90 sqlite: () => legacyLoad('sqlite'),
91 vbs: () => legacyLoad('vbScript'),
92 vbscript: () => legacyLoad('vbScript'),
93 'vb.net': () => legacyLoad('vb'),
94 vbnet: () => legacyLoad('vb'),
95 xml: async () => xml(),
96 yaml: () => legacyLoad('yaml'),
97 yml: () => legacyLoad('yaml'),
101 * Get the relevant codemirror language extension based upon the given language
102 * suggestion and content.
103 * @param {String} langSuggestion
104 * @param {String} content
105 * @returns {Promise<StreamLanguage|LanguageSupport>}
107 export function getLanguageExtension(langSuggestion, content) {
108 const suggestion = langSuggestion.trim().replace(/^\./g, '').toLowerCase();
110 const language = modeMap[suggestion];
112 if (typeof language === 'undefined') {
116 return language(content);