|
|
- 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();
- })
- });
|