|
import { splitListItem, liftListItem, sinkListItem } from 'prosemirror-schema-list' |
|
import type { Schema } from 'prosemirror-model' |
|
import { undo, redo } from 'prosemirror-history' |
|
import { undoInputRule } from 'prosemirror-inputrules' |
|
import type { Command } from 'prosemirror-state' |
|
import { |
|
toggleMark, |
|
selectParentNode, |
|
joinUp, |
|
joinDown, |
|
chainCommands, |
|
newlineInCode, |
|
createParagraphNear, |
|
liftEmptyBlock, |
|
splitBlockKeepMarks, |
|
} from 'prosemirror-commands' |
|
|
|
interface Keys { |
|
[key: string]: Command |
|
} |
|
|
|
export const buildKeymap = (schema: Schema) => { |
|
const keys: Keys = {} |
|
const bind = (key: string, cmd: Command) => keys[key] = cmd |
|
|
|
bind('Alt-ArrowUp', joinUp) |
|
bind('Alt-ArrowDown', joinDown) |
|
bind('Mod-z', undo) |
|
bind('Mod-y', redo) |
|
bind('Backspace', undoInputRule) |
|
bind('Escape', selectParentNode) |
|
bind('Mod-b', toggleMark(schema.marks.strong)) |
|
bind('Mod-i', toggleMark(schema.marks.em)) |
|
bind('Mod-u', toggleMark(schema.marks.underline)) |
|
bind('Mod-d', toggleMark(schema.marks.strikethrough)) |
|
bind('Mod-e', toggleMark(schema.marks.code)) |
|
bind('Mod-;', toggleMark(schema.marks.superscript)) |
|
bind(`Mod-'`, toggleMark(schema.marks.subscript)) |
|
bind('Enter', chainCommands( |
|
splitListItem(schema.nodes.list_item), |
|
newlineInCode, |
|
createParagraphNear, |
|
liftEmptyBlock, |
|
splitBlockKeepMarks, |
|
)) |
|
bind('Mod-[', liftListItem(schema.nodes.list_item)) |
|
bind('Mod-]', sinkListItem(schema.nodes.list_item)) |
|
bind('Tab', sinkListItem(schema.nodes.list_item)) |
|
|
|
return keys |
|
} |