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' })
|
|
|
|
]
|
|
|
|
})
|