import { run_snippet, format } from './pkg';
import * as monaco from 'monaco-editor';
monaco.languages.register({ id: "petr" });
monaco.languages.setMonarchTokensProvider("petr", {
keywords: [ 'fn', 'returns', 'in', 'type', 'export' ],
tokenizer: {
root: [
[/\~([a-zA-Z][a-zA-Z0-9]+)(\.[a-zA-Z]([a-zA-Z0-9])+)*/, "function-call"],
[/\@[a-zA-Z]+/, "intrinsic"],
[/[0-9]+/, "integer-literal"],
[/\".*\"/, "string-literal"],
],
},
});
monaco.languages.setLanguageConfiguration("petr", {
brackets: [
['[', ']'],
['(', ')']
],
autoClosingPairs: [
{ open: '[', close: ']' },
{ open: '(', close: ')' },
{ open: '"', close: '"' }
],
surroundingPairs: [
{ open: '{', close: '}' },
{ open: '[', close: ']' },
{ open: '(', close: ')' },
{ open: '"', close: '"' }
]
})
const literalColor = "ff0000";
monaco.editor.defineTheme("petr-theme", {
base: "vs-dark",
inherit: true,
rules: [
{ token: "intrinsic", foreground: "808080", fontStyle: "bold" },
{ token: "function-call", foreground: "808080", fontStyle: "bold" },
{ token: "string-literal", foreground: literalColor },
{ token: "integer-literal", foreground: literalColor },
{ token: "keyword", foreground: literalColor },
],
colors: {
"editor.foreground": "#ffffff",
},
});
monaco.editor.create(document.getElementById('monaco-editor'), {
value: "fn main() returns 'unit \n ~std.io.print \"Hello, World!\"",
language: 'petr',
theme: "petr-theme",
});
export function setOutputContent(content) {
document.getElementById('output').innerHTML = content;
}
window.setOutputContent = setOutputContent;
export function setCodeEditorContent(content) {
monaco.editor.getModels()[0].setValue(content);
}
window.setCodeEditorContent= setCodeEditorContent;
document.getElementById('run').onclick = function() {
let code = monaco.editor.getModels()[0].getValue();
let result = "";
try { result = run_snippet(code); } catch (e) {
result.replace("\n", "<br>");
document.getElementById('output').innerHTML = e;
return;
};
}
document.getElementById('format').onclick = function() {
let code = monaco.editor.getModels()[0].getValue();
try { format(code); } catch (e) {
document.getElementById('output').innerHTML = e;
return;
};
}