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