import { NodeSpec, NodeType } from 'prosemirror-model'; import { type CoreEditor, Node } from '@kerebron/editor'; import { getHtmlAttributes, setHtmlAttributes, } from '@kerebron/editor/utilities'; import { type InputRule, wrappingInputRule, } from '@kerebron/editor/plugins/input-rules'; import { type CommandFactories, type CommandShortcuts, } from '@kerebron/editor/commands'; import { toggleList } from './commands.js'; export class NodeOrderedList extends Node { override name = 'ordered_list'; requires = ['doc']; override attributes = { type: { default: '1', fromDom(element: HTMLElement) { return element.hasAttribute('type') ? element.getAttribute('type') : '1'; }, }, start: { default: undefined, fromDom(element: HTMLElement) { return element.hasAttribute('start') ? +element.getAttribute('start')! : undefined; }, }, id: { default: undefined, }, continue: { default: undefined, }, odtMarginLeft: { default: undefined, }, }; override getNodeSpec(): NodeSpec { return { content: 'list_item+', group: 'block list', parseDOM: [ { tag: 'ol', getAttrs: (element) => setHtmlAttributes(this, element) }, ], toDOM: (node) => ['ol', getHtmlAttributes(this, node), 0], }; } override getInputRules(type: NodeType): InputRule[] { return [ /// Given a list node type, returns an input rule that turns a number /// followed by a dot at the start of a textblock into an ordered list. wrappingInputRule( /^(\d+)\.\s$/, type, (match) => ({ order: +match[1] }), (match, node) => node.childCount + node.attrs.order == +match[1], ), ]; } override getCommandFactories( editor: CoreEditor, type: NodeType, ): Partial { const keepMarks = false; return { 'toggleOrderedList': () => { return toggleList('ordered_list', 'list_item', keepMarks); }, }; } override getKeyboardShortcuts(): Partial { return { 'Shift-Ctrl-7': 'toggleOrderedList', }; } }