57 lines
1.1 KiB
TypeScript
57 lines
1.1 KiB
TypeScript
import { Node, mergeAttributes } from '@tiptap/core'
|
|
import { Plugin } from 'prosemirror-state'
|
|
|
|
export const Figure = Node.create({
|
|
name: 'figure',
|
|
|
|
defaultOptions: {
|
|
HTMLAttributes: {},
|
|
},
|
|
|
|
group: 'block',
|
|
|
|
content: 'block figcaption',
|
|
|
|
draggable: true,
|
|
|
|
isolating: true,
|
|
|
|
parseHTML() {
|
|
return [
|
|
{
|
|
tag: `figure[data-type="${this.name}"]`,
|
|
},
|
|
]
|
|
},
|
|
|
|
renderHTML({ HTMLAttributes }) {
|
|
return ['figure', mergeAttributes(HTMLAttributes, { 'data-type': this.name }), 0]
|
|
},
|
|
|
|
addProseMirrorPlugins() {
|
|
return [
|
|
new Plugin({
|
|
props: {
|
|
handleDOMEvents: {
|
|
// prevent dragging nodes out of the figure
|
|
dragstart: (view, event) => {
|
|
if (!event.target) {
|
|
return false
|
|
}
|
|
|
|
const pos = view.posAtDOM(event.target as HTMLElement, 0)
|
|
const $pos = view.state.doc.resolve(pos)
|
|
|
|
if ($pos.parent.type === this.type) {
|
|
event.preventDefault()
|
|
}
|
|
|
|
return false
|
|
},
|
|
},
|
|
},
|
|
}),
|
|
]
|
|
},
|
|
})
|