1import { Controller } from "@hotwired/stimulus"; 2 3import {basicSetup} from "codemirror"; 4import {EditorView, keymap} from "@codemirror/view" 5import {defaultKeymap} from "@codemirror/commands" 6import {html} from "@codemirror/lang-html" 7 8export default class extends Controller { 9 10 editorFromTextArea(textarea, extensions) { 11 let view = new EditorView({ 12 doc: textarea.value, 13 extensions: [ 14 ...extensions, 15 EditorView.updateListener.of((update) => { 16 if (update.docChanged) { 17 // Dispatch custom event when content changes 18 textarea.dispatchEvent(new CustomEvent('codemirror:change', { 19 bubbles: true, 20 detail: { content: view.state.doc.toString() } 21 })) 22 } 23 }) 24 ] 25 }) 26 27 textarea.parentNode.insertBefore(view.dom, textarea); 28 textarea.style.display = "none" 29 30 // Store view on element for external access 31 textarea.codeMirrorView = view 32 33 if (textarea.form) textarea.form.addEventListener("submit", () => { 34 textarea.value = view.state.doc.toString() 35 }) 36 } 37 38 connect() { 39 this.editorFromTextArea(this.element, [html(), basicSetup, keymap.of(defaultKeymap)]) 40 } 41 42 disconnect() { 43 } 44};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.