webapp/src/components/Editor/prosemirror/extension/base.ts

62 lines
1.6 KiB
TypeScript
Raw Normal View History

2022-09-09 11:53:35 +00:00
import { schema as markdownSchema } from 'prosemirror-markdown'
2022-10-09 08:33:28 +00:00
import type OrderedMap from 'orderedmap'
import { NodeSpec, Schema } from 'prosemirror-model'
2022-09-09 11:53:35 +00:00
import { baseKeymap } from 'prosemirror-commands'
import { sinkListItem, liftListItem } from 'prosemirror-schema-list'
import { history } from 'prosemirror-history'
import { dropCursor } from 'prosemirror-dropcursor'
import { buildKeymap } from 'prosemirror-example-setup'
import { keymap } from 'prosemirror-keymap'
2022-10-09 00:00:13 +00:00
import type { ProseMirrorExtension } from '../helpers'
2022-09-09 11:53:35 +00:00
const plainSchema = new Schema({
nodes: {
doc: {
content: 'block+'
},
paragraph: {
content: 'inline*',
group: 'block',
parseDOM: [{ tag: 'p' }],
toDOM: () => ['p', 0]
},
text: {
group: 'inline'
}
}
})
const blockquoteSchema = {
content: 'block+',
group: 'block',
toDOM: () => ['div', ['blockquote', 0]]
}
export default (plain = false): ProseMirrorExtension => ({
schema: () =>
plain
? {
nodes: plainSchema.spec.nodes,
marks: plainSchema.spec.marks
}
: {
2022-10-09 08:33:28 +00:00
nodes: (markdownSchema.spec.nodes as OrderedMap<NodeSpec>).update(
'blockquote',
blockquoteSchema as unknown as NodeSpec
),
2022-09-09 11:53:35 +00:00
marks: markdownSchema.spec.marks
},
plugins: (prev, schema) => [
...prev,
keymap({
Tab: sinkListItem(schema.nodes.list_item),
'Shift-Tab': liftListItem(schema.nodes.list_item)
}),
keymap({ Tab: () => true }),
keymap(buildKeymap(schema)),
keymap(baseKeymap),
history(),
dropCursor({ class: 'drop-cursor' })
]
})