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