1
0
mirror of https://github.com/BookStackApp/BookStack.git synced 2025-06-13 00:41:59 +03:00

Added cm6 strategy for splitting and dyn. loading langs

Split out legacy modes to their own dynamically imported bundle to
reduce main code bundle size.
This commit is contained in:
Dan Brown
2023-04-14 18:08:57 +01:00
parent 257a703878
commit 9874a53206
8 changed files with 144 additions and 114 deletions

View File

@ -1,119 +1,97 @@
import {StreamLanguage} from "@codemirror/language"
import {css} from '@codemirror/legacy-modes/mode/css';
import {c, cpp, csharp, java, kotlin, scala, dart} from '@codemirror/legacy-modes/mode/clike';
import {diff} from '@codemirror/legacy-modes/mode/diff';
import {fortran} from '@codemirror/legacy-modes/mode/fortran';
import {go} from '@codemirror/legacy-modes/mode/go';
import {haskell} from '@codemirror/legacy-modes/mode/haskell';
import {javascript, json, typescript} from '@codemirror/legacy-modes/mode/javascript';
import {julia} from '@codemirror/legacy-modes/mode/julia';
import {lua} from '@codemirror/legacy-modes/mode/lua';
import {css} from '@codemirror/lang-css';
import {json} from '@codemirror/lang-json';
import {javascript} from '@codemirror/lang-javascript';
import {markdown} from '@codemirror/lang-markdown';
import {oCaml, fSharp, sml} from '@codemirror/legacy-modes/mode/mllike';
import {nginx} from '@codemirror/legacy-modes/mode/nginx';
import {octave} from '@codemirror/legacy-modes/mode/octave';
import {perl} from '@codemirror/legacy-modes/mode/perl';
import {pascal} from '@codemirror/legacy-modes/mode/pascal';
import {php} from '@codemirror/lang-php';
import {powerShell} from '@codemirror/legacy-modes/mode/powershell';
import {properties} from '@codemirror/legacy-modes/mode/properties';
import {python} from '@codemirror/legacy-modes/mode/python';
import {ruby} from '@codemirror/legacy-modes/mode/ruby';
import {rust} from '@codemirror/legacy-modes/mode/rust';
import {scheme} from '@codemirror/legacy-modes/mode/scheme';
import {shell} from '@codemirror/legacy-modes/mode/shell';
import {smarty} from "@ssddanbrown/codemirror-lang-smarty";
import {standardSQL, pgSQL, msSQL, mySQL, sqlite, plSQL} from '@codemirror/legacy-modes/mode/sql';
import {stex} from '@codemirror/legacy-modes/mode/stex';
import {swift} from "@codemirror/legacy-modes/mode/swift";
import {toml} from '@codemirror/legacy-modes/mode/toml';
import {twig} from "@ssddanbrown/codemirror-lang-twig";
import {vb} from '@codemirror/legacy-modes/mode/vb';
import {vbScript} from '@codemirror/legacy-modes/mode/vbscript';
import {xml, html} from '@codemirror/legacy-modes/mode/xml';
import {yaml} from '@codemirror/legacy-modes/mode/yaml';
export {twig} from "@ssddanbrown/codemirror-lang-twig";
const legacyLoad = async (mode) => {
const modes = await window.importVersioned('legacy-modes');
return StreamLanguage.define(modes[mode]);
};
// Mapping of possible languages or formats from user input to their codemirror modes.
// Value can be a mode string or a function that will receive the code content & return the mode string.
// The function option is used in the event the exact mode could be dynamic depending on the code.
const modeMap = {
bash: () => StreamLanguage.define(shell),
c: () => StreamLanguage.define(c),
css: () => StreamLanguage.define(css),
'c++': () => StreamLanguage.define(cpp),
'c#': () => StreamLanguage.define(csharp),
csharp: () => StreamLanguage.define(csharp),
dart: () => StreamLanguage.define(dart),
diff: () => StreamLanguage.define(diff),
for: () => StreamLanguage.define(fortran),
fortran: () => StreamLanguage.define(fortran),
'f#': () => StreamLanguage.define(fSharp),
fsharp: () => StreamLanguage.define(fSharp),
go: () => StreamLanguage.define(go),
haskell: () => StreamLanguage.define(haskell),
hs: () => StreamLanguage.define(haskell),
html: () => StreamLanguage.define(html),
ini: () => StreamLanguage.define(properties),
java: () => StreamLanguage.define(java),
javascript: () => StreamLanguage.define(javascript),
json: () => StreamLanguage.define(json),
js: () => StreamLanguage.define(javascript),
jl: () => StreamLanguage.define(julia),
julia: () => StreamLanguage.define(julia),
kotlin: () => StreamLanguage.define(kotlin),
latex: () => StreamLanguage.define(stex),
lua: () => StreamLanguage.define(lua),
markdown: () => markdown(),
matlab: () => StreamLanguage.define(octave),
md: () => markdown(),
mdown: () => markdown(),
ml: () => StreamLanguage.define(sml),
mssql: () => StreamLanguage.define(msSQL),
mysql: () => StreamLanguage.define(mySQL),
nginx: () => StreamLanguage.define(nginx),
octave: () => StreamLanguage.define(octave),
pas: () => StreamLanguage.define(pascal),
pascal: () => StreamLanguage.define(pascal),
perl: () => StreamLanguage.define(perl),
pgsql: () => StreamLanguage.define(pgSQL),
php: (code) => {
bash: () => legacyLoad('shell'),
c: () => legacyLoad('c'),
css: async () => css(),
'c++': () => legacyLoad('cpp'),
'c#': () => legacyLoad('csharp'),
csharp: () => legacyLoad('csharp'),
dart: () => legacyLoad('dart'),
diff: () => legacyLoad('diff'),
for: () => legacyLoad('fortran'),
fortran: () => legacyLoad('fortran'),
'f#': () => legacyLoad('fSharp'),
fsharp: () => legacyLoad('fSharp'),
go: () => legacyLoad('go'),
haskell: () => legacyLoad('haskell'),
hs: () => legacyLoad('haskell'),
html: () => legacyLoad('html'),
ini: () => legacyLoad('properties'),
java: () => legacyLoad('java'),
javascript: async () => javascript(),
json: async () => json(),
js: async () => javascript(),
jl: () => legacyLoad('julia'),
julia: () => legacyLoad('julia'),
kotlin: () => legacyLoad('kotlin'),
latex: () => legacyLoad('stex'),
lua: () => legacyLoad('lua'),
markdown: async () => markdown(),
matlab: () => legacyLoad('octave'),
md: async () => markdown(),
mdown: async () => markdown(),
ml: () => legacyLoad('sml'),
mssql: () => legacyLoad('msSQL'),
mysql: () => legacyLoad('mySQL'),
nginx: () => legacyLoad('nginx'),
octave: () => legacyLoad('octave'),
pas: () => legacyLoad('pascal'),
pascal: () => legacyLoad('pascal'),
perl: () => legacyLoad('perl'),
pgsql: () => legacyLoad('pgSQL'),
php: async (code) => {
const hasTags = code.includes('<?php');
return php({plain: !hasTags});
},
pl: () => StreamLanguage.define(perl),
'pl/sql': () => StreamLanguage.define(plSQL),
postgresql: () => StreamLanguage.define(pgSQL),
powershell: () => StreamLanguage.define(powerShell),
properties: () => StreamLanguage.define(properties),
ocaml: () => StreamLanguage.define(oCaml),
py: () => StreamLanguage.define(python),
python: () => StreamLanguage.define(python),
rb: () => StreamLanguage.define(ruby),
rs: () => StreamLanguage.define(rust),
ruby: () => StreamLanguage.define(ruby),
rust: () => StreamLanguage.define(rust),
scala: () => StreamLanguage.define(scala),
scheme: () => StreamLanguage.define(scheme),
shell: () => StreamLanguage.define(shell),
sh: () => StreamLanguage.define(shell),
smarty: () => StreamLanguage.define(smarty),
stext: () => StreamLanguage.define(stex),
swift: () => StreamLanguage.define(swift),
toml: () => StreamLanguage.define(toml),
ts: () => StreamLanguage.define(typescript),
twig: () => twig(),
typescript: () => StreamLanguage.define(typescript),
sql: () => StreamLanguage.define(standardSQL),
sqlite: () => StreamLanguage.define(sqlite),
vbs: () => StreamLanguage.define(vbScript),
vbscript: () => StreamLanguage.define(vbScript),
'vb.net': () => StreamLanguage.define(vb),
vbnet: () => StreamLanguage.define(vb),
xml: () => StreamLanguage.define(xml),
yaml: () => StreamLanguage.define(yaml),
yml: () => StreamLanguage.define(yaml),
pl: () => legacyLoad('perl'),
'pl/sql': () => legacyLoad('plSQL'),
postgresql: () => legacyLoad('pgSQL'),
powershell: () => legacyLoad('powerShell'),
properties: () => legacyLoad('properties'),
ocaml: () => legacyLoad('oCaml'),
py: () => legacyLoad('python'),
python: () => legacyLoad('python'),
rb: () => legacyLoad('ruby'),
rs: () => legacyLoad('rust'),
ruby: () => legacyLoad('ruby'),
rust: () => legacyLoad('rust'),
scala: () => legacyLoad('scala'),
scheme: () => legacyLoad('scheme'),
shell: () => legacyLoad('shell'),
sh: () => legacyLoad('shell'),
smarty: () => legacyLoad('smarty'),
stext: () => legacyLoad('stex'),
swift: () => legacyLoad('swift'),
toml: () => legacyLoad('toml'),
ts: async () => javascript({typescript: true}),
twig: async () => twig(),
typescript: async () => javascript({typescript: true}),
sql: () => legacyLoad('standardSQL'),
sqlite: () => legacyLoad('sqlite'),
vbs: () => legacyLoad('vbScript'),
vbscript: () => legacyLoad('vbScript'),
'vb.net': () => legacyLoad('vb'),
vbnet: () => legacyLoad('vb'),
xml: () => legacyLoad('xml'),
yaml: () => legacyLoad('yaml'),
yml: () => legacyLoad('yaml'),
};
/**
@ -121,7 +99,7 @@ const modeMap = {
* suggestion and content.
* @param {String} langSuggestion
* @param {String} content
* @returns {StreamLanguage}
* @returns {Promise<StreamLanguage|LanguageSupport>}
*/
export function getLanguageExtension(langSuggestion, content) {
const suggestion = langSuggestion.trim().replace(/^\./g, '').toLowerCase();