Commit d13af7f4 authored by Яков's avatar Яков
Browse files

update

parent 09f46ddf
......@@ -38,6 +38,7 @@ import TableExtension from './extensions/TableExtension'
import ToggleBlock from './extensions/ToggleBlock'
import InteractiveImage from './extensions/InteractiveImage'
import FontSize from './extensions/FontSize'
import BlockId from './extensions/BlockId'
import ButtonLinkExtension from './extensions/ButtonLink'
// import Image from '@tiptap/extension-image'
......@@ -826,6 +827,7 @@ const QEditor = ({
}),
TextStyle,
FontSize,
BlockId,
ButtonLinkExtension,
Color.configure({
types: ['textStyle']
......
import { Extension } from '@tiptap/core'
/**
* Стабильный идентификатор блока.
*
* Зачем. На blockId завязаны прогресс по обязательным блокам, аналитика
* и сравнение ревизий документа. Он обязан пережить цикл
* «сохранили → закрыли → открыли снова», иначе прогресс учащегося переедет
* на другой блок при первом же сохранении урока автором.
*
* Проставляет идентификаторы СЕРВЕР — источников документа два (редактор
* и MCP-агент), и гарантия должна быть в одном месте. Задача этого расширения
* другая: не потерять то, что сервер уже проставил.
*
* Без него цепочка рвалась так:
* 1. сервер проставил blockId и собрал HTML с data-block-id;
* 2. редактор при следующем открытии разобрал HTML — и выбросил атрибут,
* потому что в схеме его нет;
* 3. на сохранении сервер увидел документ без идентификаторов и выдал новые;
* 4. хеш документа изменился, появилась лишняя ревизия — при том, что автор
* ничего не правил.
*
* Поймано сквозной проверкой: два сохранения подряд без единой правки давали
* две ревизии вместо одной.
*/
const BLOCK_TYPES = [
'paragraph', 'heading', 'bulletList', 'orderedList', 'blockquote', 'codeBlock',
'horizontalRule', 'image', 'video', 'audio', 'iframe', 'interactiveImage',
'toggleBlock', 'buttonLink', 'table',
]
const BlockId = Extension.create({
name: 'blockId',
addGlobalAttributes() {
return [
{
types: BLOCK_TYPES,
attributes: {
blockId: {
default: null,
// Редактор сам идентификаторы не придумывает: пустой
// blockId — нормальное состояние нового блока, его
// заполнит сервер при сохранении.
parseHTML: (element) => element.getAttribute('data-block-id') || null,
renderHTML: (attributes) =>
attributes.blockId ? { 'data-block-id': attributes.blockId } : {},
},
},
},
]
},
})
export default BlockId
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment