fix(editor): не подставлять типографику повторно после её отмены (Ctrl+Z)
После срабатывания авто-подстановки Typography (например «1/2 » → «½») и её отмены через Ctrl+Z повторное нажатие пробела снова триггерило то же input-rule и подставляло символ заново. Добавлено клиентское расширение CustomTypography (обёртка над @tiptap/extension-typography) с ProseMirror-плагином «undo guard»: - запоминает диапазон текста, восстановленный отменой (undo/redo), и подавляет typography input-rules, чьё совпадение пересекается с этим диапазоном, пока восстановленный текст не отредактируют; - поддерживает обе системы истории: prosemirror-history (шаблонные редакторы) и yjs UndoManager (основной collab-редактор). Undo в yjs приходит как замена всего документа, поэтому регион вычисляется диффом документов (findDiffStart/findDiffEnd), а не по step-map; - детекция yjs-транзакций — через импортированный ySyncPluginKey и канонический isChangeOrigin, без хрупких строковых ключей. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -6,7 +6,7 @@ import { TaskList, TaskItem } from "@tiptap/extension-list";
|
||||
import { Placeholder, CharacterCount, UndoRedo } from "@tiptap/extensions";
|
||||
import { Superscript } from "@tiptap/extension-superscript";
|
||||
import SubScript from "@tiptap/extension-subscript";
|
||||
import { Typography } from "@tiptap/extension-typography";
|
||||
import { CustomTypography } from "./custom-typography";
|
||||
import { TextStyle } from "@tiptap/extension-text-style";
|
||||
import { Color } from "@tiptap/extension-color";
|
||||
import { Youtube } from "@tiptap/extension-youtube";
|
||||
@@ -245,7 +245,9 @@ export const mainExtensions = [
|
||||
return ReactMarkViewRenderer(SpoilerView);
|
||||
},
|
||||
}),
|
||||
Typography,
|
||||
// Typography with an undo guard: does not re-apply a substitution the user
|
||||
// just undid (e.g. Ctrl+Z on "1/2" -> "½" followed by another space).
|
||||
CustomTypography,
|
||||
TrailingNode,
|
||||
GlobalDragHandle.configure({
|
||||
customNodes: ["transclusionSource", "transclusionReference", "pageEmbed"],
|
||||
|
||||
Reference in New Issue
Block a user