import { marks } from 'prosemirror-schema-basic'; import type { MarkSpec } from 'prosemirror-model'; const subscript: MarkSpec = { excludes: 'subscript', parseDOM: [ { tag: 'sub' }, { style: 'vertical-align', getAttrs: (value) => value === 'sub' && null, }, ], toDOM: () => ['sub', 0], }; const superscript: MarkSpec = { excludes: 'superscript', parseDOM: [ { tag: 'sup' }, { style: 'vertical-align', getAttrs: (value) => value === 'super' && null, }, ], toDOM: () => ['sup', 0], }; const strikethrough: MarkSpec = { parseDOM: [ { tag: 'strike' }, { style: 'text-decoration', getAttrs: (value) => value === 'line-through' && null, }, { style: 'text-decoration-line', getAttrs: (value) => value === 'line-through' && null, }, ], toDOM: () => ['span', { style: 'text-decoration-line: line-through;' }, 0], }; const underline: MarkSpec = { parseDOM: [ { tag: 'u' }, { style: 'text-decoration', getAttrs: (value) => value === 'underline' && null, }, { style: 'text-decoration-line', getAttrs: (value) => value === 'underline' && null, }, ], toDOM: () => ['span', { style: 'text-decoration: underline;' }, 0], }; const forecolor: MarkSpec = { attrs: { color: {}, }, inline: true, group: 'inline', parseDOM: [ { style: 'color', getAttrs: (color) => (color ? { color } : {}), }, ], toDOM: (mark) => { const { color } = mark.attrs; let style = ''; if (color) style += `color: ${color};`; return ['span', { style }, 0]; }, }; const backcolor: MarkSpec = { attrs: { backcolor: {}, }, inline: true, group: 'inline', parseDOM: [ { style: 'background-color', getAttrs: (backcolor) => (backcolor ? { backcolor } : {}), }, ], toDOM: (mark) => { const { backcolor } = mark.attrs; let style = ''; if (backcolor) style += `background-color: ${backcolor};`; return ['span', { style }, 0]; }, }; const fontsize: MarkSpec = { attrs: { fontsize: {}, }, inline: true, group: 'inline', parseDOM: [ { style: 'font-size', getAttrs: (fontsize) => (fontsize ? { fontsize } : {}), }, ], toDOM: (mark) => { const { fontsize } = mark.attrs; let style = ''; if (fontsize) style += `font-size: ${fontsize};`; return ['span', { style }, 0]; }, }; const fontname: MarkSpec = { attrs: { fontname: {}, }, inline: true, group: 'inline', parseDOM: [ { style: 'font-family', getAttrs: (fontname) => { return { fontname: fontname && typeof fontname === 'string' ? fontname.replace(/[\"\']/g, '') : '', }; }, }, ], toDOM: (mark) => { const { fontname } = mark.attrs; let style = ''; if (fontname) style += `font-family: ${fontname};`; return ['span', { style }, 0]; }, }; const link: MarkSpec = { attrs: { href: {}, title: { default: null }, target: { default: '_blank' }, }, inclusive: false, parseDOM: [ { tag: 'a[href]', getAttrs: (dom) => { const href = (dom as HTMLElement).getAttribute('href'); const title = (dom as HTMLElement).getAttribute('title'); return { href, title }; }, }, ], toDOM: (node) => ['a', node.attrs, 0], }; const mark: MarkSpec = { attrs: { index: { default: null }, }, parseDOM: [ { tag: 'mark', getAttrs: (dom) => { const index = (dom as HTMLElement).dataset.index; return { index }; }, }, ], toDOM: (node) => ['mark', { 'data-index': node.attrs.index }, 0], }; const { em, strong, code } = marks; const schemaMarks = { em, strong, fontsize, fontname, code, forecolor, backcolor, subscript, superscript, strikethrough, underline, link, mark, }; export default schemaMarks;