diff --git a/src/global.d.ts b/src/global.d.ts index 1e5eeed4..b6d747a6 100644 --- a/src/global.d.ts +++ b/src/global.d.ts @@ -18,6 +18,8 @@ interface Tab { interface State { code: string; - mermaid: any; + mermaid: string; updateEditor: boolean; + updateDiagram: boolean; + autoSync: boolean; } diff --git a/src/lib/Editor/index.svelte b/src/lib/Editor/index.svelte index 2e6a287a..261cbd28 100644 --- a/src/lib/Editor/index.svelte +++ b/src/lib/Editor/index.svelte @@ -18,9 +18,13 @@ value: text, language: language }; - + export let errorMarkers: monaco.editor.IMarkerData[] = []; $: Monaco?.editor.setModelLanguage(editor.getModel(), language); $: editor?.setValue(text); + $: { + Monaco?.editor.setModelMarkers(editor.getModel(), 'test', errorMarkers); + console.log(errorMarkers); + } const dispatch = createEventDispatcher(); diff --git a/src/lib/Util/state.ts b/src/lib/Util/state.ts index 6990b82c..0a357ea4 100644 --- a/src/lib/Util/state.ts +++ b/src/lib/Util/state.ts @@ -12,7 +12,8 @@ const defaultState: State = { mermaid: JSON.stringify({ theme: 'default' }), - updateEditor: false + updateEditor: false, + autoSync: true }; export const codeStore = writable(defaultState); @@ -49,6 +50,8 @@ export const updateConfig = (config: string, updateEditor: boolean): void => { export const initURLSubscription = (): void => { codeStore.subscribe((state: State) => { + console.log(state); + window.location.hash = encode(JSON.stringify(state), true); }); }; diff --git a/src/lib/View/index.svelte b/src/lib/View/index.svelte index 86526515..3d2b9ea2 100644 --- a/src/lib/View/index.svelte +++ b/src/lib/View/index.svelte @@ -12,13 +12,16 @@ const mermaid = await getMermaid(); codeStore.subscribe((state) => { try { - if (container && state) { + if (container && state && (state.updateDiagram || state.autoSync)) { + if (!state.autoSync) { + $codeStore.updateDiagram = false; + } // Replacing special characters '<' and '>' with encoded '<' and '>' code = state.code; //.replace(//g, '>'); container.innerHTML = code; delete container.dataset.processed; - mermaid.initialize(Object.assign({}, state.mermaid)); + mermaid.initialize(Object.assign({}, JSON.parse(state.mermaid))); mermaid.init(undefined, container); mermaid.render('graph-div', code, insertSvg); } diff --git a/src/routes/edit.svelte b/src/routes/edit.svelte index b915fdf1..7b2e018c 100644 --- a/src/routes/edit.svelte +++ b/src/routes/edit.svelte @@ -11,15 +11,18 @@ import { initURLSubscription, updateCode, updateConfig, codeStore } from '$lib/Util/state'; import { loadStateFromURL } from '$lib/Util/util'; import { errorStore } from '$lib/Util/error'; + import { getMermaid } from '$lib/Util/mermaid'; + import { onMount } from 'svelte'; + import type monaco from 'monaco-editor'; let selectedMode = 'code'; - let autoSync = true; const languageMap = { code: 'mermaid', config: 'json' }; let text: string = ''; let language: 'mermaid' | 'json' = 'mermaid'; + let errorMarkers: monaco.editor.IMarkerData[] = []; $: language = languageMap[selectedMode]; $: { if ($codeStore.updateEditor) { @@ -45,35 +48,56 @@ } ]; - const handleCodeUpdate = (code: string): void => { + const handleCodeUpdate = async (code: string): Promise => { + const mermaid = await getMermaid(); + mermaid.parse(code); updateCode(code, false); }; const handleConfigUpdate = (config: string): void => { + JSON.parse(config); updateConfig(config, false); }; - let editorText: string = ''; const syncDiagram = () => { - try { - if (selectedMode === 'code') { - handleCodeUpdate(editorText); - } else { - handleConfigUpdate(editorText); - } - } catch (e) { - errorStore.set(e); - } + $codeStore.updateDiagram = true; }; - const updateHandler = (message: CustomEvent) => { - editorText = message.detail.text; - if (autoSync) { - syncDiagram(); + const updateHandler = async (message: CustomEvent) => { + try { + if (selectedMode === 'code') { + await handleCodeUpdate(message.detail.text); + } else { + handleConfigUpdate(message.detail.text); + } + errorStore.set(undefined); + errorMarkers = []; + } catch (e) { + errorStore.set(e); + if (e.hash) { + const marker: monaco.editor.IMarkerData = { + severity: 8, //Error + startLineNumber: e.hash.loc.first_line, + startColumn: e.hash.loc.first_column, + endLineNumber: e.hash.loc.last_line, + endColumn: e.hash.loc.last_column + 1, + message: e.str + }; + errorMarkers.push(marker); + // Clear all previous errors before this error. + errorMarkers = errorMarkers.filter( + (m) => m.startLineNumber >= marker.startLineNumber && m.startColumn >= marker.startColumn + ); + } + console.error(e); } }; loadStateFromURL(); - initURLSubscription(); + + onMount(() => { + syncDiagram(); + initURLSubscription(); + }); @@ -88,25 +112,25 @@
- {#if !autoSync} + {#if !$codeStore.autoSync} {/if}
- + -
+
Diagram
-
+ +