Error rendering
Auto Sync
This commit is contained in:
Vendored
+3
-1
@@ -18,6 +18,8 @@ interface Tab {
|
|||||||
|
|
||||||
interface State {
|
interface State {
|
||||||
code: string;
|
code: string;
|
||||||
mermaid: any;
|
mermaid: string;
|
||||||
updateEditor: boolean;
|
updateEditor: boolean;
|
||||||
|
updateDiagram: boolean;
|
||||||
|
autoSync: boolean;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,9 +18,13 @@
|
|||||||
value: text,
|
value: text,
|
||||||
language: language
|
language: language
|
||||||
};
|
};
|
||||||
|
export let errorMarkers: monaco.editor.IMarkerData[] = [];
|
||||||
$: Monaco?.editor.setModelLanguage(editor.getModel(), language);
|
$: Monaco?.editor.setModelLanguage(editor.getModel(), language);
|
||||||
$: editor?.setValue(text);
|
$: editor?.setValue(text);
|
||||||
|
$: {
|
||||||
|
Monaco?.editor.setModelMarkers(editor.getModel(), 'test', errorMarkers);
|
||||||
|
console.log(errorMarkers);
|
||||||
|
}
|
||||||
|
|
||||||
const dispatch = createEventDispatcher<EditorEvents>();
|
const dispatch = createEventDispatcher<EditorEvents>();
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,8 @@ const defaultState: State = {
|
|||||||
mermaid: JSON.stringify({
|
mermaid: JSON.stringify({
|
||||||
theme: 'default'
|
theme: 'default'
|
||||||
}),
|
}),
|
||||||
updateEditor: false
|
updateEditor: false,
|
||||||
|
autoSync: true
|
||||||
};
|
};
|
||||||
|
|
||||||
export const codeStore = writable(defaultState);
|
export const codeStore = writable(defaultState);
|
||||||
@@ -49,6 +50,8 @@ export const updateConfig = (config: string, updateEditor: boolean): void => {
|
|||||||
|
|
||||||
export const initURLSubscription = (): void => {
|
export const initURLSubscription = (): void => {
|
||||||
codeStore.subscribe((state: State) => {
|
codeStore.subscribe((state: State) => {
|
||||||
|
console.log(state);
|
||||||
|
|
||||||
window.location.hash = encode(JSON.stringify(state), true);
|
window.location.hash = encode(JSON.stringify(state), true);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -12,13 +12,16 @@
|
|||||||
const mermaid = await getMermaid();
|
const mermaid = await getMermaid();
|
||||||
codeStore.subscribe((state) => {
|
codeStore.subscribe((state) => {
|
||||||
try {
|
try {
|
||||||
if (container && state) {
|
if (container && state && (state.updateDiagram || state.autoSync)) {
|
||||||
|
if (!state.autoSync) {
|
||||||
|
$codeStore.updateDiagram = false;
|
||||||
|
}
|
||||||
// Replacing special characters '<' and '>' with encoded '<' and '>'
|
// Replacing special characters '<' and '>' with encoded '<' and '>'
|
||||||
code = state.code; //.replace(/</g, '<').replace(/>/g, '>');
|
code = state.code; //.replace(/</g, '<').replace(/>/g, '>');
|
||||||
|
|
||||||
container.innerHTML = code;
|
container.innerHTML = code;
|
||||||
delete container.dataset.processed;
|
delete container.dataset.processed;
|
||||||
mermaid.initialize(Object.assign({}, state.mermaid));
|
mermaid.initialize(Object.assign({}, JSON.parse(state.mermaid)));
|
||||||
mermaid.init(undefined, container);
|
mermaid.init(undefined, container);
|
||||||
mermaid.render('graph-div', code, insertSvg);
|
mermaid.render('graph-div', code, insertSvg);
|
||||||
}
|
}
|
||||||
|
|||||||
+47
-23
@@ -11,15 +11,18 @@
|
|||||||
import { initURLSubscription, updateCode, updateConfig, codeStore } from '$lib/Util/state';
|
import { initURLSubscription, updateCode, updateConfig, codeStore } from '$lib/Util/state';
|
||||||
import { loadStateFromURL } from '$lib/Util/util';
|
import { loadStateFromURL } from '$lib/Util/util';
|
||||||
import { errorStore } from '$lib/Util/error';
|
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 selectedMode = 'code';
|
||||||
let autoSync = true;
|
|
||||||
const languageMap = {
|
const languageMap = {
|
||||||
code: 'mermaid',
|
code: 'mermaid',
|
||||||
config: 'json'
|
config: 'json'
|
||||||
};
|
};
|
||||||
let text: string = '';
|
let text: string = '';
|
||||||
let language: 'mermaid' | 'json' = 'mermaid';
|
let language: 'mermaid' | 'json' = 'mermaid';
|
||||||
|
let errorMarkers: monaco.editor.IMarkerData[] = [];
|
||||||
$: language = languageMap[selectedMode];
|
$: language = languageMap[selectedMode];
|
||||||
$: {
|
$: {
|
||||||
if ($codeStore.updateEditor) {
|
if ($codeStore.updateEditor) {
|
||||||
@@ -45,35 +48,56 @@
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
const handleCodeUpdate = (code: string): void => {
|
const handleCodeUpdate = async (code: string): Promise<void> => {
|
||||||
|
const mermaid = await getMermaid();
|
||||||
|
mermaid.parse(code);
|
||||||
updateCode(code, false);
|
updateCode(code, false);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleConfigUpdate = (config: string): void => {
|
const handleConfigUpdate = (config: string): void => {
|
||||||
|
JSON.parse(config);
|
||||||
updateConfig(config, false);
|
updateConfig(config, false);
|
||||||
};
|
};
|
||||||
|
|
||||||
let editorText: string = '';
|
|
||||||
const syncDiagram = () => {
|
const syncDiagram = () => {
|
||||||
try {
|
$codeStore.updateDiagram = true;
|
||||||
if (selectedMode === 'code') {
|
|
||||||
handleCodeUpdate(editorText);
|
|
||||||
} else {
|
|
||||||
handleConfigUpdate(editorText);
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
errorStore.set(e);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const updateHandler = (message: CustomEvent<EditorUpdateEvent>) => {
|
const updateHandler = async (message: CustomEvent<EditorUpdateEvent>) => {
|
||||||
editorText = message.detail.text;
|
try {
|
||||||
if (autoSync) {
|
if (selectedMode === 'code') {
|
||||||
syncDiagram();
|
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();
|
loadStateFromURL();
|
||||||
initURLSubscription();
|
|
||||||
|
onMount(() => {
|
||||||
|
syncDiagram();
|
||||||
|
initURLSubscription();
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:head>
|
<svelte:head>
|
||||||
@@ -88,25 +112,25 @@
|
|||||||
<div class="flex"><Tabs on:select={tabSelectHandler} {tabs} /></div>
|
<div class="flex"><Tabs on:select={tabSelectHandler} {tabs} /></div>
|
||||||
<div class="flex-grow" />
|
<div class="flex-grow" />
|
||||||
<div class="flex gap-x-4 text-white">
|
<div class="flex gap-x-4 text-white">
|
||||||
{#if !autoSync}
|
{#if !$codeStore.autoSync}
|
||||||
<button on:click={syncDiagram}>↻ Sync</button>
|
<button on:click={syncDiagram}>↻ Sync</button>
|
||||||
{/if}
|
{/if}
|
||||||
<label for="autoSync">
|
<label for="autoSync">
|
||||||
<input type="checkbox" name="autoSync" bind:checked={autoSync} />
|
<input type="checkbox" name="autoSync" bind:checked={$codeStore.autoSync} />
|
||||||
Auto
|
Auto
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Editor on:update={updateHandler} {language} {text} />
|
<Editor on:update={updateHandler} {language} {text} {errorMarkers} />
|
||||||
</Card>
|
</Card>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="w-3/5 h-screen">
|
<div class="w-3/5 h-3/5">
|
||||||
<Card class="h-full">
|
<Card class="h-full">
|
||||||
<div slot="title" class="text-white">Diagram</div>
|
<div slot="title" class="text-white">Diagram</div>
|
||||||
<View /></Card
|
<View />
|
||||||
>
|
</Card>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user