qwe/src/editor.js
2024-12-11 19:21:57 -07:00

81 lines
1.8 KiB
JavaScript

const app = window.app
import cm from '/lib/codemirror.js'
import * as view from './view.js'
import * as note from './note.js'
export function Init() {
app.editor = new cm.EditorView({
state: createState(),
parent: app.main
// parent: view.editorContainer
})
app.editor.dom.tabindex = 0
}
function extensions() {
return [
cm.markdownLanguage.extension,
cm.syntaxHighlighting(cm.defaultHighlightStyle, { fallback: true }),
cm.history(),
cm.dropCursor(),
cm.EditorView.lineWrapping,
cm.ViewPlugin.fromClass(class {
update(event) {
if(event.focusChanged && !app.editor.hasFocus) {
app.editor.focus()
}
if(event.docChanged) {
SaveTimeout()
}
}
}),
cm.keymap.of(keymap())
]
}
function keymap() {
return [
...cm.closeBracketsKeymap,
...cm.defaultKeymap,
...cm.searchKeymap,
...cm.foldKeymap,
...cm.lintKeymap,
...cm.historyKeymap,
{ key: "Tab", run: cm.indentMore, shift: cm.indentLess },
{ key: "Ctrl-h", run: note.Prev },
{ key: "Ctrl-j", run: note.Prev },
{ key: "Ctrl-k", run: note.Next },
{ key: "Ctrl-l", run: note.Next },
]
}
function SaveTimeout() {
if(app.saveTimeout != null) {
return
}
app.saveTimeout = setTimeout(async () => {
await note.Save()
app.saveTimeout = null
}, 1000)
}
export function Load() {
app.editor.setState(createState())
app.editor.focus()
}
function createState() {
return cm.EditorState.create({
extensions: extensions(),
doc: app.disk
})
}
export function Content() {
return app.editor.state.doc.toString()
}