Здесь под документом понимается DOM-дерево, возможно как документ, открытый в iframe, а возможно - фрагмент документа.
- DocumentCursor - указатель на конкретное место в документе.
- DocumentRange - по факту два курсора - "от" и "до", задающие диапазон. Буду ли реализовывать как класс, включающий два курсора или как частный случай DocumentCursor - не думал пока.
- DocumentCursorPickle - сохранённое состояние курсора, независимое от документа - документ сохранён, после загружен, а курсор на то же месте. Вот для этого и нужен DocumentCursorPickle. Может выродится в строку, кстати, но пока это массив.
- DocumentManipulator - класс, меняющий документ; сам по себе никакого документа не содержит и может работать то с одним, то с другим документом - что на вход подали, то и обрабатывается. Подаётся как правило DocumentCursor.
- DocumentEditor - редактор конкретного документа, сам по себе содержит документ и курсор(ы). Неинтерактивен, но пригоден для автоматизации вида найти/заменить.
- DocumentManualEditor - то же, но изменение курсора и редактирование может происходить и "извне" кода, пользователем - путём нажатия кнопок, тыкания мышью/пальцем и т.д... Эти действия могут перехватываться и как-то дообрабатываться. Нажатия экранных кнопок, события от меню и прочие ненепосредственные действия - вызывают обычные методы DocumentEditor. В принципе можно явно затребовать все действия выполнимыми неинтерактивно - легче будет обрабатывать историю - и так их сначала перехватывать и блокировать, а потом вызывать, но это не обязательно.
Интересно, что немалая часть реализована давным-давно и работает начиная с 6-го IE (гыыы!)
Не пишу про историю и отмену, пока обдумываю как лучше реализовать, чтоб с одной стороны не прибивать гвоздями к редактору (для автоматизации оно не нужно), а с другой - не затачивать только под него (штука полезная сама по себе); где-то тут же нужна связь истории с командами и событиями, порождаемыми UI. Не пишу про работу со списками, таблицам и прочим - она архитектурно тривиальна, хотя те же списки в execCommand намертво связаны с blockquote и их пришлось писать почти с нуля.