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