Per-language syntax highlighting

This commit is contained in:
Radon Rosborough 2020-06-06 15:23:21 -06:00
parent 27ab1f7b6a
commit 10c868fbd3
4 changed files with 38 additions and 1 deletions

View File

@ -13,6 +13,12 @@ export class Session {
this.ws = ws; this.ws = ws;
this.config = langs[lang]; this.config = langs[lang];
this.term = null; this.term = null;
this.ws.send(
JSON.stringify({
event: "setMonacoLanguage",
monacoLanguage: this.config.monacoLang,
})
);
this.run(); this.run();
ws.on("message", this.handleClientMessage); ws.on("message", this.handleClientMessage);
} }

View File

@ -1,5 +1,6 @@
export interface LangConfig { export interface LangConfig {
cmdline: string[]; cmdline: string[];
monacoLang: string;
name: string; name: string;
} }
@ -7,69 +8,86 @@ export const langs = {
bash: { bash: {
cmdline: ["bash"], cmdline: ["bash"],
name: "Bash", name: "Bash",
monacoLang: "shell",
}, },
c: { c: {
cmdline: ["echo", "not implemented"], cmdline: ["echo", "not implemented"],
name: "C", name: "C",
monacoLang: "c",
}, },
"c++": { "c++": {
cmdline: ["echo", "not implemented"], cmdline: ["echo", "not implemented"],
name: "C++", name: "C++",
monacoLang: "cpp",
}, },
clojure: { clojure: {
cmdline: ["clojure"], cmdline: ["clojure"],
name: "Clojure", name: "Clojure",
monacoLang: "clojure",
}, },
emacs: { emacs: {
cmdline: ["emacs"], cmdline: ["emacs"],
name: "Emacs Lisp", name: "Emacs Lisp",
monacoLang: "plaintext",
}, },
fish: { fish: {
cmdline: ["env", "SHELL=/usr/bin/fish", "fish"], cmdline: ["env", "SHELL=/usr/bin/fish", "fish"],
name: "Fish", name: "Fish",
monacoLang: "plaintext",
}, },
go: { go: {
cmdline: ["echo", "not implemented"], cmdline: ["echo", "not implemented"],
name: "Go", name: "Go",
monacoLang: "go",
}, },
haskell: { haskell: {
cmdline: ["ghci"], cmdline: ["ghci"],
name: "Haskell", name: "Haskell",
monacoLang: "plaintext",
}, },
java: { java: {
cmdline: ["echo", "not implemented"], cmdline: ["echo", "not implemented"],
name: "Java", name: "Java",
monacoLang: "java",
}, },
julia: { julia: {
cmdline: ["julia"], cmdline: ["julia"],
name: "Julia", name: "Julia",
monacoLang: "plaintext",
}, },
lua: { lua: {
cmdline: ["lua"], cmdline: ["lua"],
name: "Lua", name: "Lua",
monacoLang: "lua",
}, },
nodejs: { nodejs: {
cmdline: ["node"], cmdline: ["node"],
name: "Node.js", name: "Node.js",
monacoLang: "javascript",
}, },
python: { python: {
cmdline: ["python3"], cmdline: ["python3"],
name: "Python", name: "Python",
monacoLang: "python",
}, },
ruby: { ruby: {
cmdline: ["irb"], cmdline: ["irb"],
name: "Ruby", name: "Ruby",
monacoLang: "ruby",
}, },
rust: { rust: {
cmdline: ["echo", "not implemented"], cmdline: ["echo", "not implemented"],
name: "Rust", name: "Rust",
monacoLang: "rust",
}, },
vim: { vim: {
cmdline: ["vim"], cmdline: ["vim"],
name: "Vimscript", name: "Vimscript",
monacoLang: "plaintext",
}, },
zsh: { zsh: {
cmdline: ["env", "SHELL=/usr/bin/zsh", "zsh"], cmdline: ["env", "SHELL=/usr/bin/zsh", "zsh"],
name: "Zsh", name: "Zsh",
monacoLang: "shell",
}, },
}; };

View File

@ -39,6 +39,13 @@ socket.addEventListener("message", (event) => {
} }
term.write(message.output); term.write(message.output);
return; return;
case "setMonacoLanguage":
if (typeof message.monacoLanguage !== "string") {
console.error("Unexpected message from server:", message);
return;
}
monaco.editor.setModelLanguage(editor.getModel(), message.monacoLanguage);
return;
default: default:
console.error("Unexpected message from server:", message); console.error("Unexpected message from server:", message);
return; return;
@ -59,4 +66,9 @@ term.onData((data) =>
socket.send(JSON.stringify({ event: "terminalInput", input: data })) socket.send(JSON.stringify({ event: "terminalInput", input: data }))
); );
monaco.editor.create(document.getElementById("editor")); const editor = monaco.editor.create(document.getElementById("editor"));
window.addEventListener("resize", () => editor.layout());
document.getElementById("runButton").addEventListener("click", () => {
socket.send(JSON.stringify({ event: "runCode", code: editor.getValue() }));
});

View File

@ -30,6 +30,7 @@ module.exports = (_, argv) => ({
}, },
output: { output: {
path: path.resolve(__dirname, "frontend/out"), path: path.resolve(__dirname, "frontend/out"),
publicPath: "/js/",
filename: "app.js", filename: "app.js",
}, },
performance: { performance: {