Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
lib
react-ag-qeditor
Commits
cf69071b
Commit
cf69071b
authored
Aug 29, 2026
by
Яков
Browse files
update
parent
0a1a0a91
Changes
3
Hide whitespace changes
Inline
Side-by-side
package.json
View file @
cf69071b
{
{
"name"
:
"react-ag-qeditor"
,
"name"
:
"react-ag-qeditor"
,
"version"
:
"1.1.8
6
"
,
"version"
:
"1.1.8
7
"
,
"description"
:
"WYSIWYG html editor"
,
"description"
:
"WYSIWYG html editor"
,
"author"
:
"atma"
,
"author"
:
"atma"
,
"license"
:
"
MIT
"
,
"license"
:
"
MIT
"
,
...
...
src/QEditor.jsx
View file @
cf69071b
...
@@ -38,6 +38,7 @@ import TableExtension from './extensions/TableExtension'
...
@@ -38,6 +38,7 @@ import TableExtension from './extensions/TableExtension'
import
ToggleBlock
from
'
./extensions/ToggleBlock
'
import
ToggleBlock
from
'
./extensions/ToggleBlock
'
import
InteractiveImage
from
'
./extensions/InteractiveImage
'
import
InteractiveImage
from
'
./extensions/InteractiveImage
'
import
TrailingNode
from
'
./extensions/TrailingNode
'
import
TrailingNode
from
'
./extensions/TrailingNode
'
import
EnterAsBreak
from
'
./extensions/EnterAsBreak
'
import
FontSize
from
'
./extensions/FontSize
'
import
FontSize
from
'
./extensions/FontSize
'
import
BlockId
from
'
./extensions/BlockId
'
import
BlockId
from
'
./extensions/BlockId
'
import
ActivityRef
from
'
./extensions/ActivityRef
'
import
ActivityRef
from
'
./extensions/ActivityRef
'
...
@@ -909,6 +910,9 @@ const QEditor = ({
...
@@ -909,6 +910,9 @@ const QEditor = ({
onCreateImage
:
onCreateInteractiveImage
,
onCreateImage
:
onCreateInteractiveImage
,
}),
}),
WordNavigation
,
WordNavigation
,
// Enter = перенос строки, двойной Enter = абзац.
// Строго ДО ImageWrapEnter: клавишу первым получает тот, кто ниже в списке
EnterAsBreak
,
ImageWrapEnter
,
ImageWrapEnter
,
// Пустой абзац в конце: иначе после последней картинки писать негде
// Пустой абзац в конце: иначе после последней картинки писать негде
TrailingNode
,
TrailingNode
,
...
...
src/extensions/EnterAsBreak.js
0 → 100644
View file @
cf69071b
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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment