UNPKG

@dodona/papyros

Version:

Scratchpad for multiple programming languages in the browser.

64 lines 2.26 kB
import { Decoration, EditorView, gutterLineClass, GutterMarker } from "@codemirror/view"; import { LineEffectExtension } from "./LineEffectExtension"; import { DebugLineGutter } from "./Gutters"; import { RangeSet, StateEffect, StateField } from "@codemirror/state"; import { BackendManager } from "../BackendManager"; import { BackendEventType } from "../BackendEvent"; const activeLineDecoration = Decoration.line({ class: "cm-activeLine" }); const activeLineGutterMarker = new class extends GutterMarker { constructor() { super(...arguments); this.elementClass = "cm-activeLineGutter"; } }; const markLine = StateEffect.define(); const markedLine = StateField.define({ create: () => undefined, update(value, tr) { for (const effect of tr.effects) { if (effect.is(markLine)) { return effect.value; } } return value; } }); const markedLineGutterHighlighter = gutterLineClass.compute([markedLine], state => { if (state.field(markedLine) === undefined) { return RangeSet.empty; } const linePos = state.doc.line(state.field(markedLine)).from; return RangeSet.of([activeLineGutterMarker.range(linePos)]); }); export class DebugExtension { constructor(view) { this.view = view; this.gutter = new DebugLineGutter(); this.lineEffect = new LineEffectExtension(view); BackendManager.subscribe(BackendEventType.FrameChange, e => { const line = e.data.line; this.markLine(line); }); } reset() { this.markLine(1); } markLine(lineNr) { this.gutter.markLine(this.view, lineNr); this.lineEffect.set([activeLineDecoration.range(this.view.state.doc.line(lineNr).from)]); this.view.dispatch({ effects: [ markLine.of(lineNr), EditorView.scrollIntoView(this.view.state.doc.line(lineNr).from) ] }); } toExtension() { return [ this.lineEffect.toExtension(), this.gutter.toExtension(), markedLine, markedLineGutterHighlighter, EditorView.editable.of(false) ]; } } //# sourceMappingURL=DebugExtension.js.map