44 lines
1.0 KiB
TypeScript
44 lines
1.0 KiB
TypeScript
import { Editor } from '@tiptap/core'
|
|
import { MarkType } from '@tiptap/pm/model'
|
|
import { Plugin, PluginKey } from '@tiptap/pm/state'
|
|
import { find } from 'linkifyjs'
|
|
|
|
type PasteHandlerOptions = {
|
|
editor: Editor
|
|
defaultProtocol: string
|
|
type: MarkType
|
|
}
|
|
|
|
export function pasteHandler(options: PasteHandlerOptions): Plugin {
|
|
return new Plugin({
|
|
key: new PluginKey('handlePasteLink'),
|
|
props: {
|
|
handlePaste: (view, event, slice) => {
|
|
const { state } = view
|
|
const { selection } = state
|
|
const { empty } = selection
|
|
|
|
if (empty) {
|
|
return false
|
|
}
|
|
|
|
let textContent = ''
|
|
|
|
slice.content.forEach(node => {
|
|
textContent += node.textContent
|
|
})
|
|
|
|
const link = find(textContent, { defaultProtocol: options.defaultProtocol }).find(item => item.isLink && item.value === textContent)
|
|
|
|
if (!textContent || !link) {
|
|
return false
|
|
}
|
|
|
|
return options.editor.commands.setMark(options.type, {
|
|
href: link.href,
|
|
})
|
|
},
|
|
},
|
|
})
|
|
}
|