Форматы
Источник истины — структурный документ схемы ProseMirror. HTML нормализуется: побайтовое сохранение произвольной разметки не обещано. CSS передаётся отдельно. Текст не содержит HTML/CSS; границы блоков учитываются.
interface DocumentNode {
type: string;
attrs?: Record<string, unknown>;
content?: DocumentNode[];
marks?: { type: string; attrs?: Record<string, unknown> }[];
text?: string;
}
interface SelectionInfo { from: number; to: number; text: string; revision: number }
interface TextEdit { from: number; to: number; text: string }
interface ImageAttributes { src: string; alt?: string; title?: string; width?: number; height?: number }
Поддерживаются doc, paragraph, heading, text, hardBreak, horizontalRule, списки/listItem, blockquote, codeBlock, table/tableRow/tableCell/tableHeader и image; marks — базовое форматирование/ссылка/код. Публичный импорт проверяет схему/атрибуты: не добавляйте произвольные type.
Снимки
getJSON() — независимая копия. Примените изменённый снимок через setContent(json), а не мутируйте private-поля. Храните JSON/CSS совместно и предусматривайте версию схемы приложения.
Позиции
from/to — позиции схемы, а не смещение строки HTML или getText. Документ включает структурные границы/inline-атомы. Используйте getSelection(), не вычисляйте диапазон по длине HTML. DocumentRange = from/to/revision; старая revision блокирует replaceRange/replaceText.