import { textblockTypeInputRule } from 'prosemirror-inputrules'; import { Schema } from 'prosemirror-model'; import { schema } from 'prosemirror-schema-basic'; import { addListNodes } from 'prosemirror-schema-list'; import type { Transaction } from 'prosemirror-state'; import type { EditorView } from 'prosemirror-view'; import type { MutableRefObject } from 'react'; import { buildContentFromDocument } from './functions'; export const documentSchema = new Schema({ nodes: addListNodes(schema.spec.nodes, 'paragraph block*', 'block'), marks: schema.spec.marks, }); export function headingRule(level: number) { return textblockTypeInputRule( new RegExp(`^(#{1,${level}})\\s$`), documentSchema.nodes.heading, () => ({ level }), ); } export const handleTransaction = ({ transaction, editorRef, onSaveContent, }: { transaction: Transaction; editorRef: MutableRefObject; onSaveContent: (updatedContent: string, debounce: boolean) => void; }) => { if (!editorRef || !editorRef.current) return; const newState = editorRef.current.state.apply(transaction); editorRef.current.updateState(newState); if (transaction.docChanged && !transaction.getMeta('no-save')) { const updatedContent = buildContentFromDocument(newState.doc); if (transaction.getMeta('no-debounce')) { onSaveContent(updatedContent, false); } else { onSaveContent(updatedContent, true); } } };