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 export default { em, strong, fontsize, fontname, code, forecolor, backcolor, subscript, superscript, strikethrough, underline, link, mark, }