import { type NodeSpec, type NodeType } from 'prosemirror-model'; import { type CoreEditor, Node } from '@kerebron/editor'; import { type CommandFactories, type CommandShortcuts, } from '@kerebron/editor/commands'; export type TextAlign = 'left' | 'center' | 'right' | 'justify' | undefined; export class NodeParagraph extends Node { override name = 'paragraph'; requires = ['doc']; override getNodeSpec(): NodeSpec { return { content: 'inline*', group: 'block', attrs: { textAlign: { default: undefined }, }, parseDOM: [ { tag: 'p', getAttrs(dom) { const element = dom as HTMLElement; const style = element.style.textAlign; if ( style === 'center' || style === 'right' || style === 'justify' ) { return { textAlign: style }; } return false; }, }, ], toDOM(node) { const align = node.attrs.textAlign || 'left'; if (['center', 'right', 'justify'].includes(align)) { return ['p', { style: `text-align: ${align}` }, 0]; } return ['p', 0]; }, }; } override getCommandFactories( editor: CoreEditor, type: NodeType, ): Partial { return { 'setParagraph': () => editor.commandFactories.setBlockType(type), }; } override getKeyboardShortcuts(): Partial { return { 'Shift-Ctrl-0': 'setParagraph', }; } }