mirror of
https://github.com/IT4Change/Ocelot-Social.git
synced 2025-12-13 07:45:56 +00:00
50 lines
1.3 KiB
JavaScript
50 lines
1.3 KiB
JavaScript
import { Plugin } from 'prosemirror-state'
|
|
import { Slice, Fragment } from 'prosemirror-model'
|
|
|
|
export default function (regexp, type, getAttrs) {
|
|
const handler = (fragment) => {
|
|
const nodes = []
|
|
|
|
fragment.forEach((child) => {
|
|
if (child.isText) {
|
|
const { text } = child
|
|
let pos = 0
|
|
let match
|
|
|
|
do {
|
|
match = regexp.exec(text)
|
|
if (match) {
|
|
const start = match.index
|
|
const end = start + match[0].length
|
|
const attrs = getAttrs instanceof Function ? getAttrs(match[0]) : getAttrs
|
|
|
|
if (start > 0) {
|
|
nodes.push(child.cut(pos, start))
|
|
}
|
|
|
|
// only difference to `pasteRule` of `tiptap-commands`:
|
|
// we replace the node instead of adding markup
|
|
nodes.push(type.create(attrs, child.cut(start, end)))
|
|
|
|
pos = end
|
|
}
|
|
} while (match)
|
|
|
|
if (pos < text.length) {
|
|
nodes.push(child.cut(pos))
|
|
}
|
|
} else {
|
|
nodes.push(child.copy(handler(child.content)))
|
|
}
|
|
})
|
|
|
|
return Fragment.fromArray(nodes)
|
|
}
|
|
|
|
return new Plugin({
|
|
props: {
|
|
transformPasted: (slice) => new Slice(handler(slice.content), slice.openStart, slice.openEnd),
|
|
},
|
|
})
|
|
}
|