76 lines
1.4 KiB
TypeScript
76 lines
1.4 KiB
TypeScript
import { Node } from '@tiptap/core'
|
|
|
|
export interface IframeOptions {
|
|
allowFullscreen: boolean
|
|
HTMLAttributes: {
|
|
[key: string]: string | number
|
|
}
|
|
}
|
|
|
|
declare module '@tiptap/core' {
|
|
interface Commands<ReturnType> {
|
|
iframe: {
|
|
setIframe: (options: { src: string }) => ReturnType
|
|
}
|
|
}
|
|
}
|
|
|
|
export const Iframe = Node.create<IframeOptions>({
|
|
name: 'iframe',
|
|
group: 'block',
|
|
atom: true,
|
|
|
|
addOptions() {
|
|
return {
|
|
allowFullscreen: true,
|
|
HTMLAttributes: {
|
|
class: 'iframe-wrapper',
|
|
},
|
|
}
|
|
},
|
|
|
|
addAttributes() {
|
|
return {
|
|
src: {
|
|
default: null,
|
|
},
|
|
frameborder: {
|
|
default: 0,
|
|
},
|
|
allowfullscreen: {
|
|
default: this.options.allowFullscreen,
|
|
parseHTML: () => this.options.allowFullscreen,
|
|
},
|
|
width: { default: null },
|
|
height: { default: null },
|
|
}
|
|
},
|
|
|
|
parseHTML() {
|
|
return [
|
|
{
|
|
tag: 'iframe',
|
|
},
|
|
]
|
|
},
|
|
|
|
renderHTML({ HTMLAttributes }) {
|
|
return ['div', this.options.HTMLAttributes, ['iframe', HTMLAttributes]]
|
|
},
|
|
|
|
addCommands() {
|
|
return {
|
|
setIframe:
|
|
(options: { src: string }) =>
|
|
({ tr, dispatch }) => {
|
|
const { selection } = tr
|
|
const node = this.type.create(options)
|
|
if (dispatch) {
|
|
tr.replaceRangeWith(selection.from, selection.to, node)
|
|
}
|
|
return true
|
|
},
|
|
}
|
|
},
|
|
})
|