X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/74b4751a1c110b4c824b14369d3a5eea3ad5816a..refs/pull/4921/head:/resources/js/code/setups.js diff --git a/resources/js/code/setups.js b/resources/js/code/setups.js index 842917285..270d58274 100644 --- a/resources/js/code/setups.js +++ b/resources/js/code/setups.js @@ -1,9 +1,13 @@ -import {EditorView, keymap, drawSelection, highlightActiveLine, dropCursor, - rectangularSelection, lineNumbers, highlightActiveLineGutter} from "@codemirror/view" -import {bracketMatching} from "@codemirror/language" -import {defaultKeymap, history, historyKeymap} from "@codemirror/commands" -import {EditorState} from "@codemirror/state" -import {getTheme} from "./themes"; +import { + EditorView, keymap, drawSelection, highlightActiveLine, dropCursor, + rectangularSelection, lineNumbers, highlightActiveLineGutter, +} from '@codemirror/view'; +import {bracketMatching} from '@codemirror/language'; +import { + defaultKeymap, history, historyKeymap, indentWithTab, +} from '@codemirror/commands'; +import {Compartment, EditorState} from '@codemirror/state'; +import {getTheme} from './themes'; /** * @param {Element} parentEl @@ -13,12 +17,37 @@ function common(parentEl) { return [ getTheme(parentEl), lineNumbers(), - highlightActiveLineGutter(), drawSelection(), dropCursor(), bracketMatching(), rectangularSelection(), - highlightActiveLine(), + ]; +} + +/** + * @returns {({extension: Extension}|readonly Extension[])[]} + */ +function getDynamicActiveLineHighlighter() { + const highlightingCompartment = new Compartment(); + const domEvents = { + focus(event, view) { + view.dispatch({ + effects: highlightingCompartment.reconfigure([ + highlightActiveLineGutter(), + highlightActiveLine(), + ]), + }); + }, + blur(event, view) { + view.dispatch({ + effects: highlightingCompartment.reconfigure([]), + }); + }, + }; + + return [ + highlightingCompartment.of([]), + EditorView.domEventHandlers(domEvents), ]; } @@ -26,9 +55,10 @@ function common(parentEl) { * @param {Element} parentEl * @return {*[]} */ -export function viewer(parentEl) { +export function viewerExtensions(parentEl) { return [ ...common(parentEl), + getDynamicActiveLineHighlighter(), keymap.of([ ...defaultKeymap, ]), @@ -40,14 +70,17 @@ export function viewer(parentEl) { * @param {Element} parentEl * @return {*[]} */ -export function editor(parentEl) { +export function editorExtensions(parentEl) { return [ ...common(parentEl), + highlightActiveLineGutter(), + highlightActiveLine(), history(), keymap.of([ ...defaultKeymap, ...historyKeymap, + indentWithTab, ]), EditorView.lineWrapping, ]; -} \ No newline at end of file +}