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