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

update

parent 0a1a0a91
{
"name": "react-ag-qeditor",
"version": "1.1.86",
"version": "1.1.87",
"description": "WYSIWYG html editor",
"author": "atma",
"license": "MIT",
......
......@@ -38,6 +38,7 @@ import TableExtension from './extensions/TableExtension'
import ToggleBlock from './extensions/ToggleBlock'
import InteractiveImage from './extensions/InteractiveImage'
import TrailingNode from './extensions/TrailingNode'
import EnterAsBreak from './extensions/EnterAsBreak'
import FontSize from './extensions/FontSize'
import BlockId from './extensions/BlockId'
import ActivityRef from './extensions/ActivityRef'
......@@ -909,6 +910,9 @@ const QEditor = ({
onCreateImage: onCreateInteractiveImage,
}),
WordNavigation,
// Enter = перенос строки, двойной Enter = абзац.
// Строго ДО ImageWrapEnter: клавишу первым получает тот, кто ниже в списке
EnterAsBreak,
ImageWrapEnter,
// Пустой абзац в конце: иначе после последней картинки писать негде
TrailingNode,
......
import { Extension } from '@tiptap/core'
/**
* Enter — перенос строки, Enter второй раз подряд — новый абзац.
*
* Зачем. Между абзацами стоит вертикальный ритм (1.5rem), и обычный Enter,
* который делит абзац, разносит соседние строки на полтора интервала. Методист
* же нажимает Enter просто чтобы перевести каретку — и получает разрыв там, где
* ждал следующую строку. Shift+Enter даёт то, что нужно, но о нём никто не знает.
* Поэтому поведение поменяно местами: обычный Enter ставит перенос (<br>),
* а настоящий абзац получается вторым нажатием подряд — ровно так, как человек
* и показывает намерение «здесь новая мысль».
*
* Второй Enter не добавляет второй перенос, а ЗАМЕНЯЕТ первый на деление абзаца:
* иначе в конце абзаца оставался бы висячий <br> и лишняя пустая строка у ученика.
*
* Где НЕ вмешиваемся (там у Enter своё устоявшееся значение):
* - пункты списков — Enter создаёт следующий пункт;
* - заголовки — Enter уводит в новый абзац под заголовком;
* - блоки кода и всё, что не абзац, — там свои обработчики;
* - есть выделение — сначала обычная замена выделенного.
*
* Расширение обязано стоять в списке ДО ImageWrapEnter: tiptap разворачивает
* массив расширений при сборке плагинов, поэтому тот, кто ниже в списке,
* получает клавишу раньше, — и особый случай картинки с обтеканием остаётся
* за ImageWrapEnter.
*/
const KEEP_DEFAULT_INSIDE = ['listItem', 'taskItem']
export const EnterAsBreak = Extension.create({
name: 'enterAsBreak',
addKeyboardShortcuts() {
return {
Enter: ({ editor }) => {
const { state } = editor
const { selection, schema } = state
const { $from, empty } = selection
if (!empty || !schema.nodes.hardBreak) {
return false
}
if ($from.parent.type.name !== 'paragraph') {
return false
}
const wrapper = $from.depth > 0 ? $from.node(-1) : null
if (wrapper && KEEP_DEFAULT_INSIDE.includes(wrapper.type.name)) {
return false
}
const before = $from.nodeBefore
if (before && before.type.name === 'hardBreak') {
return editor.chain()
.deleteRange({ from: $from.pos - before.nodeSize, to: $from.pos })
.splitBlock()
.run()
}
return editor.commands.setHardBreak()
},
}
},
})
export default EnterAsBreak
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