Files
lucent-laravel/front/js/svelte/libs/CodemirrorMarkdown.svelte
T

79 lines
2.6 KiB
Svelte
Raw Normal View History

2023-10-23 18:05:06 +03:00
<script>
// https://codesandbox.io/s/codemirror-remark-editor-4m4z9?file=/src/CodeEditor.js:374-387
2026-05-06 18:11:42 +03:00
import { onDestroy, onMount } from "svelte";
import { basicSetup, EditorView } from "codemirror";
import { autocompletion, completionKeymap } from "@codemirror/autocomplete";
import { Compartment, EditorState } from "@codemirror/state";
import { keymap } from "@codemirror/view";
import { indentWithTab } from "@codemirror/commands";
import { markdown } from "@codemirror/lang-markdown";
import { lintKeymap } from "@codemirror/lint";
2023-10-23 18:05:06 +03:00
let parentElement;
let codeMirrorView;
export let value;
export let editable = true;
2024-09-07 15:31:56 +03:00
export function insertMedia(info) {
let insertText = "";
2026-05-06 18:11:42 +03:00
if (info.file.width > 0) {
insertText = `![${info.file.filename}](${info.url})`;
2024-09-07 15:31:56 +03:00
} else {
2026-05-06 18:11:42 +03:00
insertText = `[${info.file.filename}](${info.originalUrl})`;
2024-09-07 15:31:56 +03:00
}
const cursor = codeMirrorView.state.selection.main.head;
const transaction = codeMirrorView.state.update({
changes: {
from: cursor,
insert: insertText,
},
// the next 2 lines will set the appropriate cursor position after inserting the new text.
2026-05-06 18:11:42 +03:00
selection: { anchor: cursor + 1 },
2024-09-07 15:31:56 +03:00
scrollIntoView: true,
});
if (transaction) {
codeMirrorView.dispatch(transaction);
}
}
2023-10-23 18:05:06 +03:00
onMount(() => {
let language = new Compartment();
let tabSize = new Compartment();
let state = EditorState.create({
doc: value,
extensions: [
basicSetup,
2026-05-06 18:11:42 +03:00
keymap.of([indentWithTab, ...lintKeymap, ...completionKeymap]),
2023-10-23 18:05:06 +03:00
language.of(markdown()),
markdown(),
autocompletion(),
tabSize.of(EditorState.tabSize.of(4)),
basicSetup,
EditorView.editable.of(editable),
EditorView.updateListener.of(function (e) {
if (e.docChanged) {
value = e.state.doc.toString();
}
}),
2023-10-23 22:12:17 +03:00
EditorView.lineWrapping,
2026-05-06 18:11:42 +03:00
EditorView.contentAttributes.of({ spellcheck: "true" }),
2023-10-23 18:05:06 +03:00
],
});
codeMirrorView = new EditorView({
state,
parent: parentElement,
});
});
onDestroy(() => {
if (codeMirrorView) {
codeMirrorView.destroy();
}
});
</script>
2026-05-06 18:11:42 +03:00
<div class="is-editable-{editable}" bind:this={parentElement} />