rkgk/static/brush-editor.js

76 lines
2.4 KiB
JavaScript
Raw Normal View History

import { CodeEditor } from "rkgk/code-editor.js";
2024-08-10 23:13:20 +02:00
const defaultBrush = `
-- This is your brush.
-- Try playing around with the numbers,
-- and see what happens!
2024-09-01 18:54:38 +02:00
stroke 8 #000 (vec 0 0)
2024-08-10 23:13:20 +02:00
`.trim();
export class BrushEditor extends HTMLElement {
constructor() {
super();
}
connectedCallback() {
this.classList.add("rkgk-panel");
this.codeEditor = this.appendChild(new CodeEditor());
this.codeEditor.setCode(localStorage.getItem("rkgk.brushEditor.code") ?? defaultBrush);
this.codeEditor.addEventListener(".codeChanged", (event) => {
2024-09-05 22:05:15 +02:00
localStorage.setItem("rkgk.brushEditor.code", event.newCode);
2024-08-10 23:13:20 +02:00
this.dispatchEvent(
Object.assign(new Event(".codeChanged"), {
newCode: event.newCode,
2024-08-10 23:13:20 +02:00
}),
);
});
2024-08-19 23:56:11 +02:00
this.errorHeader = this.appendChild(document.createElement("h1"));
this.errorHeader.classList.add("error-header");
this.errorArea = this.appendChild(document.createElement("pre"));
this.errorArea.classList.add("errors");
2024-08-10 23:13:20 +02:00
}
get code() {
return this.codeEditor.code;
2024-08-10 23:13:20 +02:00
}
2024-08-19 23:56:11 +02:00
resetErrors() {
this.errorHeader.textContent = "";
this.errorArea.textContent = "";
}
renderHakuResult(phase, result) {
this.resetErrors();
if (result.status != "error") return;
this.errorHeader.textContent = `${phase} failed`;
if (result.errorKind == "diagnostics") {
// This is kind of wooden; I'd prefer if the error spans were rendered inline in text,
// but I haven't integrated anything for syntax highlighting yet that would let me
// do that.
this.errorArea.textContent = result.diagnostics
.map(
(diagnostic) => `${diagnostic.start}..${diagnostic.end}: ${diagnostic.message}`,
)
.join("\n");
} else if (result.errorKind == "plain") {
this.errorHeader.textContent = result.message;
} else if (result.errorKind == "exception") {
// TODO: This should show a stack trace.
this.errorArea.textContent = `an exception occurred: ${result.message}`;
} else {
console.warn(`unknown error kind: ${result.errorKind}`);
this.errorHeader.textContent = "(unknown error kind)";
}
}
2024-08-10 23:13:20 +02:00
}
customElements.define("rkgk-brush-editor", BrushEditor);