muthuk1's picture
Convert OpenMAIC from Next.js to React (Vite)
f56a29b verified
raw
history blame
3.95 kB
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;