|
import * as monaco from 'monaco-editor';
|
|
import { CubicalT, Environment, Value } from '../typings/cubical';
|
|
import * as haskell from '../typings/cubical';
|
|
import language from './language';
|
|
import toast from './toast';
|
|
import { CubicalEditor, MODEL_ENVS } from './editor';
|
|
|
|
let initCode: string[] = [
|
|
"{-# PRIMITIVE Type #-}",
|
|
"",
|
|
"data Nat : Type where",
|
|
" zero : Nat",
|
|
" succ : Nat -> Nat",
|
|
"",
|
|
"test : Nat",
|
|
"test = succ zero"
|
|
]
|
|
|
|
declare const cubical: CubicalT;
|
|
|
|
const LANGUAGE: string = "cubical";
|
|
|
|
monaco.languages.register({
|
|
id: LANGUAGE
|
|
});
|
|
|
|
monaco.languages.registerHoverProvider(LANGUAGE, {
|
|
provideHover: async (model: monaco.editor.ITextModel, position: monaco.Position, token: monaco.CancellationToken) => {
|
|
const word = model.getWordAtPosition(position);
|
|
if (!word) return;
|
|
try {
|
|
const env: Environment | null = MODEL_ENVS[model.id];
|
|
if (!env) return null;
|
|
|
|
const ty: Value = await cubical.exports.getTypeByNameJs(word.word, env);
|
|
return {
|
|
contents: [{
|
|
value: await cubical.exports.zonkAndShowTypeJs(ty)
|
|
}]
|
|
}
|
|
} catch (e) {
|
|
return null;
|
|
}
|
|
}
|
|
});
|
|
|
|
monaco.languages.registerDefinitionProvider(LANGUAGE, {
|
|
provideDefinition: async (model: monaco.editor.ITextModel, position: monaco.Position, token: monaco.CancellationToken) => {
|
|
const word = model.getWordAtPosition(position);
|
|
if (!word) return [];
|
|
|
|
try {
|
|
const env: Environment | null = MODEL_ENVS[model.id];
|
|
if (!env) return [];
|
|
|
|
const range: haskell.Range | null = await cubical.exports.findDefinitionJs(word.word, env);
|
|
if (range) {
|
|
return [{
|
|
range: {
|
|
startColumn: range[0].posnColm,
|
|
endColumn: range[1].posnColm,
|
|
startLineNumber: range[0].posnLine,
|
|
endLineNumber: range[1].posnLine,
|
|
},
|
|
uri: model.uri,
|
|
}];
|
|
} else {
|
|
return [];
|
|
}
|
|
} catch (e) {
|
|
console.log(e);
|
|
return [];
|
|
}
|
|
}
|
|
})
|
|
|
|
monaco.languages.setMonarchTokensProvider(LANGUAGE, language);
|
|
|
|
document.addEventListener('DOMContentLoaded', async () => {
|
|
let editors: CubicalEditor[] = [];
|
|
let n = 0;
|
|
document.querySelectorAll("pre.editor-container").forEach(async (theEl) => {
|
|
let el = theEl as HTMLPreElement;
|
|
let attr = el.getAttribute("src");
|
|
|
|
let text : string;
|
|
if (attr) {
|
|
text = await fetch(attr).then(x => x.text());
|
|
} else {
|
|
text = el.innerText;
|
|
}
|
|
|
|
el.innerText = '';
|
|
|
|
let editor = new CubicalEditor(el, text, monaco.Uri.parse(attr ?? `editor://${n++}`));
|
|
await editor.load();
|
|
})
|
|
});
|