]> BookStack Code Mirror - bookstack/blob - resources/js/code/languages.js
CM6: Aligned styling with existing, improved theme handling
[bookstack] / resources / js / code / languages.js
1 import {StreamLanguage} from "@codemirror/language"
2
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";
11
12 const legacyLoad = async (mode) => {
13     const modes = await window.importVersioned('legacy-modes');
14     return StreamLanguage.define(modes[mode]);
15 };
16
17
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.
21 const modeMap = {
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});
64     },
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'),
97 };
98
99 /**
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>}
105  */
106 export function getLanguageExtension(langSuggestion, content) {
107     const suggestion = langSuggestion.trim().replace(/^\./g, '').toLowerCase();
108
109     const language = modeMap[suggestion];
110
111     if (typeof language === 'undefined') {
112         return undefined;
113     }
114
115     return language(content);
116 }