54 lines
1.1 KiB
JavaScript
54 lines
1.1 KiB
JavaScript
|
/* eslint-disable class-methods-use-this */
|
||
|
|
||
|
import { Node } from 'tiptap';
|
||
|
import { defaultMarkdownSerializer } from 'prosemirror-markdown';
|
||
|
|
||
|
// Transforms generated HTML back to GFM for Banzai::Filter::AudioLinkFilter
|
||
|
export default class Audio extends Node {
|
||
|
get name() {
|
||
|
return 'audio';
|
||
|
}
|
||
|
|
||
|
get schema() {
|
||
|
return {
|
||
|
attrs: {
|
||
|
src: {},
|
||
|
alt: {
|
||
|
default: null,
|
||
|
},
|
||
|
},
|
||
|
group: 'block',
|
||
|
draggable: true,
|
||
|
parseDOM: [
|
||
|
{
|
||
|
tag: '.audio-container',
|
||
|
skip: true,
|
||
|
},
|
||
|
{
|
||
|
tag: '.audio-container p',
|
||
|
priority: 51,
|
||
|
ignore: true,
|
||
|
},
|
||
|
{
|
||
|
tag: 'audio[src]',
|
||
|
getAttrs: el => ({ src: el.getAttribute('src'), alt: el.dataset.title }),
|
||
|
},
|
||
|
],
|
||
|
toDOM: node => [
|
||
|
'audio',
|
||
|
{
|
||
|
src: node.attrs.src,
|
||
|
controls: true,
|
||
|
'data-setup': '{}',
|
||
|
'data-title': node.attrs.alt,
|
||
|
},
|
||
|
],
|
||
|
};
|
||
|
}
|
||
|
|
||
|
toMarkdown(state, node) {
|
||
|
defaultMarkdownSerializer.nodes.image(state, node);
|
||
|
state.closeBlock(node);
|
||
|
}
|
||
|
}
|