1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-08-11 17:53:59 +02:00

Add soft break as a separate overridable editor method (#4873)

add changeset
This commit is contained in:
Bryan Haakman
2022-03-20 12:30:08 +01:00
committed by GitHub
parent 07669dca4b
commit 20acca4bc8
9 changed files with 44 additions and 1 deletions

View File

@@ -0,0 +1,8 @@
---
'slate': minor
'slate-react': minor
---
A different behavior for inserting a soft break with shift+enter is quite common in rich text editors. Right now you have to do this in onKeyDown which is not so nice. This adds a separate insertSoftBreak method on the editor instance that gets called when a soft break is inserted. This maintains the current default behavior for backwards compatibility (it just splits the block). But at least you can easily overwrite it now.
If you rely on overwriting editor.insertBreak for extra behavior for soft breaks this might be a breaking change for you and you should overwrite editor.insertSoftBreak instead.

View File

@@ -460,6 +460,10 @@ Insert a fragment at the current selection. If the selection is currently expand
Insert a block break at the current selection. If the selection is currently expanded, delete it first. Insert a block break at the current selection. If the selection is currently expanded, delete it first.
#### `insertSoftBreak() => void`
Insert a soft break at the current selection. If the selection is currently expanded, delete it first.
#### `insertNode(node: Node) => void` #### `insertNode(node: Node) => void`
Insert a node at the current selection. If the selection is currently expanded, delete it first. Insert a node at the current selection. If the selection is currently expanded, delete it first.

View File

@@ -21,6 +21,7 @@ interface Editor {
deleteForward: (unit: 'character' | 'word' | 'line' | 'block') => void deleteForward: (unit: 'character' | 'word' | 'line' | 'block') => void
deleteFragment: () => void deleteFragment: () => void
insertBreak: () => void insertBreak: () => void
insertSoftBreak: () => void
insertFragment: (fragment: Node[]) => void insertFragment: (fragment: Node[]) => void
insertNode: (node: Node) => void insertNode: (node: Node) => void
insertText: (text: string) => void insertText: (text: string) => void

View File

@@ -472,6 +472,9 @@ export const Editable = (props: EditableProps) => {
} }
case 'insertLineBreak': case 'insertLineBreak':
Editor.insertSoftBreak(editor)
break
case 'insertParagraph': { case 'insertParagraph': {
Editor.insertBreak(editor) Editor.insertBreak(editor)
break break
@@ -1178,6 +1181,12 @@ export const Editable = (props: EditableProps) => {
return return
} }
if (Hotkeys.isSoftBreak(nativeEvent)) {
event.preventDefault()
Editor.insertSoftBreak(editor)
return
}
if (Hotkeys.isSplitBlock(nativeEvent)) { if (Hotkeys.isSplitBlock(nativeEvent)) {
event.preventDefault() event.preventDefault()
Editor.insertBreak(editor) Editor.insertBreak(editor)

View File

@@ -17,7 +17,8 @@ const HOTKEYS = {
extendBackward: 'shift+left', extendBackward: 'shift+left',
extendForward: 'shift+right', extendForward: 'shift+right',
italic: 'mod+i', italic: 'mod+i',
splitBlock: 'shift?+enter', insertSoftBreak: 'shift+enter',
splitBlock: 'enter',
undo: 'mod+z', undo: 'mod+z',
} }
@@ -89,6 +90,7 @@ export default {
isMoveWordBackward: create('moveWordBackward'), isMoveWordBackward: create('moveWordBackward'),
isMoveWordForward: create('moveWordForward'), isMoveWordForward: create('moveWordForward'),
isRedo: create('redo'), isRedo: create('redo'),
isSoftBreak: create('insertSoftBreak'),
isSplitBlock: create('splitBlock'), isSplitBlock: create('splitBlock'),
isTransposeCharacter: create('transposeCharacter'), isTransposeCharacter: create('transposeCharacter'),
isUndo: create('undo'), isUndo: create('undo'),

View File

@@ -158,6 +158,10 @@ export const createEditor = (): Editor => {
Transforms.splitNodes(editor, { always: true }) Transforms.splitNodes(editor, { always: true })
}, },
insertSoftBreak: () => {
Transforms.splitNodes(editor, { always: true })
},
insertFragment: (fragment: Node[]) => { insertFragment: (fragment: Node[]) => {
Transforms.insertFragment(editor, fragment) Transforms.insertFragment(editor, fragment)
}, },

View File

@@ -62,6 +62,7 @@ export interface BaseEditor {
deleteFragment: (direction?: 'forward' | 'backward') => void deleteFragment: (direction?: 'forward' | 'backward') => void
getFragment: () => Descendant[] getFragment: () => Descendant[]
insertBreak: () => void insertBreak: () => void
insertSoftBreak: () => void
insertFragment: (fragment: Node[]) => void insertFragment: (fragment: Node[]) => void
insertNode: (node: Node) => void insertNode: (node: Node) => void
insertText: (text: string) => void insertText: (text: string) => void
@@ -126,6 +127,7 @@ export interface EditorInterface {
hasPath: (editor: Editor, path: Path) => boolean hasPath: (editor: Editor, path: Path) => boolean
hasTexts: (editor: Editor, element: Element) => boolean hasTexts: (editor: Editor, element: Element) => boolean
insertBreak: (editor: Editor) => void insertBreak: (editor: Editor) => void
insertSoftBreak: (editor: Editor) => void
insertFragment: (editor: Editor, fragment: Node[]) => void insertFragment: (editor: Editor, fragment: Node[]) => void
insertNode: (editor: Editor, node: Node) => void insertNode: (editor: Editor, node: Node) => void
insertText: (editor: Editor, text: string) => void insertText: (editor: Editor, text: string) => void
@@ -527,6 +529,16 @@ export const Editor: EditorInterface = {
editor.insertBreak() editor.insertBreak()
}, },
/**
* Insert a soft break at the current selection.
*
* If the selection is currently expanded, it will be deleted first.
*/
insertSoftBreak(editor: Editor): void {
editor.insertSoftBreak()
},
/** /**
* Insert a fragment at the current selection. * Insert a fragment at the current selection.
* *
@@ -582,6 +594,7 @@ export const Editor: EditorInterface = {
typeof value.deleteForward === 'function' && typeof value.deleteForward === 'function' &&
typeof value.deleteFragment === 'function' && typeof value.deleteFragment === 'function' &&
typeof value.insertBreak === 'function' && typeof value.insertBreak === 'function' &&
typeof value.insertSoftBreak === 'function' &&
typeof value.insertFragment === 'function' && typeof value.insertFragment === 'function' &&
typeof value.insertNode === 'function' && typeof value.insertNode === 'function' &&
typeof value.insertText === 'function' && typeof value.insertText === 'function' &&

View File

@@ -11,6 +11,7 @@ export const input = {
deleteForward() {}, deleteForward() {},
deleteFragment() {}, deleteFragment() {},
insertBreak() {}, insertBreak() {},
insertSoftBreak() {},
insertFragment() {}, insertFragment() {},
insertNode() {}, insertNode() {},
insertText() {}, insertText() {},

View File

@@ -12,6 +12,7 @@ export const input = [
deleteForward() {}, deleteForward() {},
deleteFragment() {}, deleteFragment() {},
insertBreak() {}, insertBreak() {},
insertSoftBreak() {},
insertFragment() {}, insertFragment() {},
insertNode() {}, insertNode() {},
insertText() {}, insertText() {},