mirror of
https://github.com/ianstormtaylor/slate.git
synced 2025-04-21 22:02:05 +02:00
add char, word, line delete transforms
This commit is contained in:
parent
4854d11ba4
commit
1fd27578fa
@ -23,11 +23,10 @@ class Transform {
|
||||
*
|
||||
* @param {Object} properties
|
||||
* @property {State} properties.state
|
||||
* @property {Boolean} properties.normalized
|
||||
*/
|
||||
|
||||
constructor(properties) {
|
||||
const { state, normalized = true } = properties
|
||||
const { state } = properties
|
||||
this.state = state
|
||||
this.operations = []
|
||||
}
|
||||
|
@ -369,8 +369,6 @@ function Plugin(options = {}) {
|
||||
*/
|
||||
|
||||
function onKeyDownEnter(e, data, state) {
|
||||
debug('onKeyDownEnter', { data })
|
||||
|
||||
const { document, startKey } = state
|
||||
const hasVoidParent = document.hasVoidParent(startKey)
|
||||
|
||||
@ -401,36 +399,13 @@ function Plugin(options = {}) {
|
||||
*/
|
||||
|
||||
function onKeyDownBackspace(e, data, state) {
|
||||
debug('onKeyDownBackspace', { data })
|
||||
|
||||
// If expanded, delete regularly.
|
||||
if (state.isExpanded) {
|
||||
return state
|
||||
.transform()
|
||||
.delete()
|
||||
.apply()
|
||||
}
|
||||
|
||||
const { startOffset, startBlock } = state
|
||||
const text = startBlock.text
|
||||
let n
|
||||
|
||||
// Determine how far backwards to delete.
|
||||
if (data.isWord) {
|
||||
n = String.getWordOffsetBackward(text, startOffset)
|
||||
}
|
||||
|
||||
else if (data.isLine) {
|
||||
n = startOffset
|
||||
}
|
||||
|
||||
else {
|
||||
n = String.getCharOffsetBackward(text, startOffset)
|
||||
}
|
||||
let boundary = 'Char'
|
||||
if (data.isWord) boundary = 'Word'
|
||||
if (data.isLine) boundary = 'Line'
|
||||
|
||||
return state
|
||||
.transform()
|
||||
.deleteBackward(n)
|
||||
[`delete${boundary}Backward`]()
|
||||
.apply()
|
||||
}
|
||||
|
||||
@ -444,36 +419,13 @@ function Plugin(options = {}) {
|
||||
*/
|
||||
|
||||
function onKeyDownDelete(e, data, state) {
|
||||
debug('onKeyDownDelete', { data })
|
||||
|
||||
// If expanded, delete regularly.
|
||||
if (state.isExpanded) {
|
||||
return state
|
||||
.transform()
|
||||
.delete()
|
||||
.apply()
|
||||
}
|
||||
|
||||
const { startOffset, startBlock } = state
|
||||
const text = startBlock.text
|
||||
let n
|
||||
|
||||
// Determine how far forwards to delete.
|
||||
if (data.isWord) {
|
||||
n = String.getWordOffsetForward(text, startOffset)
|
||||
}
|
||||
|
||||
else if (data.isLine) {
|
||||
n = text.length - startOffset
|
||||
}
|
||||
|
||||
else {
|
||||
n = String.getCharOffsetForward(text, startOffset)
|
||||
}
|
||||
let boundary = 'Char'
|
||||
if (data.isWord) boundary = 'Word'
|
||||
if (data.isLine) boundary = 'Line'
|
||||
|
||||
return state
|
||||
.transform()
|
||||
.deleteForward(n)
|
||||
[`delete${boundary}Forward`]()
|
||||
.apply()
|
||||
}
|
||||
|
||||
@ -505,8 +457,6 @@ function Plugin(options = {}) {
|
||||
const previousText = document.getPreviousText(startKey)
|
||||
if (!previousText) return
|
||||
|
||||
debug('onKeyDownLeft', { data })
|
||||
|
||||
e.preventDefault()
|
||||
return state
|
||||
.transform()
|
||||
@ -543,8 +493,6 @@ function Plugin(options = {}) {
|
||||
const nextText = document.getNextText(startKey)
|
||||
if (!nextText) return state
|
||||
|
||||
debug('onKeyDownRight', { data })
|
||||
|
||||
// COMPAT: In Chrome & Safari, selections that are at the zero offset of
|
||||
// an inline node will be automatically replaced to be at the last offset
|
||||
// of a previous inline node, which screws us up, so we always want to set
|
||||
@ -560,6 +508,26 @@ function Plugin(options = {}) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* On `k` key down, delete untill the end of the line (mac only)
|
||||
*
|
||||
* @param {Event} e
|
||||
* @param {Object} data
|
||||
* @param {State} state
|
||||
* @return {State}
|
||||
*/
|
||||
|
||||
function onKeyDownK(e, data, state) {
|
||||
if (!IS_MAC || !data.isCtrl) return
|
||||
|
||||
const { startOffset, startBlock } = state
|
||||
|
||||
return state
|
||||
.transform()
|
||||
.deleteForward(startBlock.length - startOffset)
|
||||
.apply()
|
||||
}
|
||||
|
||||
/**
|
||||
* On `y` key down, redo.
|
||||
*
|
||||
@ -572,8 +540,6 @@ function Plugin(options = {}) {
|
||||
function onKeyDownY(e, data, state) {
|
||||
if (!data.isMod) return
|
||||
|
||||
debug('onKeyDownY', { data })
|
||||
|
||||
return state
|
||||
.transform()
|
||||
.redo()
|
||||
@ -592,36 +558,12 @@ function Plugin(options = {}) {
|
||||
function onKeyDownZ(e, data, state) {
|
||||
if (!data.isMod) return
|
||||
|
||||
debug('onKeyDownZ', { data })
|
||||
|
||||
return state
|
||||
.transform()
|
||||
[data.isShift ? 'redo' : 'undo']()
|
||||
.apply({ save: false })
|
||||
}
|
||||
|
||||
/**
|
||||
* On `k` key down, delete untill the end of the line (mac only)
|
||||
*
|
||||
* @param {Event} e
|
||||
* @param {Object} data
|
||||
* @param {State} state
|
||||
* @return {State}
|
||||
*/
|
||||
|
||||
function onKeyDownK(e, data, state) {
|
||||
if (!IS_MAC || !data.isCtrl) return
|
||||
|
||||
debug('onKeyDownK', { data })
|
||||
|
||||
const { startOffset, startBlock } = state
|
||||
|
||||
return state
|
||||
.transform()
|
||||
.deleteForward(startBlock.text.length - startOffset)
|
||||
.apply()
|
||||
}
|
||||
|
||||
/**
|
||||
* On paste.
|
||||
*
|
||||
|
@ -63,6 +63,42 @@ export function deleteBackward(transform, n = 1) {
|
||||
transform.deleteBackwardAtRange(selection, n)
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete backward until the character boundary at the current selection.
|
||||
*
|
||||
* @param {Transform} transform
|
||||
*/
|
||||
|
||||
export function deleteCharBackward(transform) {
|
||||
const { state } = transform
|
||||
const { selection } = state
|
||||
transform.deleteCharBackwardAtRange(selection)
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete backward until the line boundary at the current selection.
|
||||
*
|
||||
* @param {Transform} transform
|
||||
*/
|
||||
|
||||
export function deleteLineBackward(transform) {
|
||||
const { state } = transform
|
||||
const { selection } = state
|
||||
transform.deleteLineBackwardAtRange(selection)
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete backward until the word boundary at the current selection.
|
||||
*
|
||||
* @param {Transform} transform
|
||||
*/
|
||||
|
||||
export function deleteWordBackward(transform) {
|
||||
const { state } = transform
|
||||
const { selection } = state
|
||||
transform.deleteWordBackwardAtRange(selection)
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete forward `n` characters at the current selection.
|
||||
*
|
||||
@ -76,6 +112,42 @@ export function deleteForward(transform, n = 1) {
|
||||
transform.deleteForwardAtRange(selection, n)
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete forward until the character boundary at the current selection.
|
||||
*
|
||||
* @param {Transform} transform
|
||||
*/
|
||||
|
||||
export function deleteCharForward(transform) {
|
||||
const { state } = transform
|
||||
const { selection } = state
|
||||
transform.deleteCharForwardAtRange(selection)
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete forward until the line boundary at the current selection.
|
||||
*
|
||||
* @param {Transform} transform
|
||||
*/
|
||||
|
||||
export function deleteLineForward(transform) {
|
||||
const { state } = transform
|
||||
const { selection } = state
|
||||
transform.deleteLineForwardAtRange(selection)
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete forward until the word boundary at the current selection.
|
||||
*
|
||||
* @param {Transform} transform
|
||||
*/
|
||||
|
||||
export function deleteWordForward(transform) {
|
||||
const { state } = transform
|
||||
const { selection } = state
|
||||
transform.deleteWordForwardAtRange(selection)
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert a `block` at the current selection.
|
||||
*
|
||||
|
@ -1,6 +1,7 @@
|
||||
/* eslint no-console: 0 */
|
||||
|
||||
import Normalize from '../utils/normalize'
|
||||
import String from '../utils/string'
|
||||
import SCHEMA from '../schemas/core'
|
||||
import { List } from 'immutable'
|
||||
|
||||
@ -119,6 +120,55 @@ export function deleteAtRange(transform, range, options = {}) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete backward until the character boundary at a `range`.
|
||||
*
|
||||
* @param {Transform} transform
|
||||
* @param {Selection} range
|
||||
* @param {Object} options
|
||||
* @property {Boolean} normalize
|
||||
*/
|
||||
|
||||
export function deleteCharBackwardAtRange(transform, range, options) {
|
||||
const { state } = transform
|
||||
const { startOffset, startBlock } = state
|
||||
const { text } = startBlock
|
||||
const n = String.getCharOffsetBackward(text, startOffset)
|
||||
transform.deleteBackwardAtRange(range, n, options)
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete backward until the line boundary at a `range`.
|
||||
*
|
||||
* @param {Transform} transform
|
||||
* @param {Selection} range
|
||||
* @param {Object} options
|
||||
* @property {Boolean} normalize
|
||||
*/
|
||||
|
||||
export function deleteLineBackwardAtRange(transform, range, options) {
|
||||
const { state } = transform
|
||||
const { startOffset } = state
|
||||
transform.deleteBackwardAtRange(range, startOffset, options)
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete backward until the word boundary at a `range`.
|
||||
*
|
||||
* @param {Transform} transform
|
||||
* @param {Selection} range
|
||||
* @param {Object} options
|
||||
* @property {Boolean} normalize
|
||||
*/
|
||||
|
||||
export function deleteWordBackwardAtRange(transform, range, options) {
|
||||
const { state } = transform
|
||||
const { startOffset, startBlock } = state
|
||||
const { text } = startBlock
|
||||
const n = String.getWordOffsetBackward(text, startOffset)
|
||||
transform.deleteBackwardAtRange(range, n, options)
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete backward `n` characters at a `range`.
|
||||
*
|
||||
@ -189,6 +239,55 @@ export function deleteBackwardAtRange(transform, range, n = 1, options = {}) {
|
||||
transform.deleteAtRange(range, { normalize })
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete forward until the character boundary at a `range`.
|
||||
*
|
||||
* @param {Transform} transform
|
||||
* @param {Selection} range
|
||||
* @param {Object} options
|
||||
* @property {Boolean} normalize
|
||||
*/
|
||||
|
||||
export function deleteCharForwardAtRange(transform, range, options) {
|
||||
const { state } = transform
|
||||
const { startOffset, startBlock } = state
|
||||
const { text } = startBlock
|
||||
const n = String.getCharOffsetForward(text, startOffset)
|
||||
transform.deleteForwardAtRange(range, n, options)
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete forward until the line boundary at a `range`.
|
||||
*
|
||||
* @param {Transform} transform
|
||||
* @param {Selection} range
|
||||
* @param {Object} options
|
||||
* @property {Boolean} normalize
|
||||
*/
|
||||
|
||||
export function deleteLineForwardAtRange(transform, range, options) {
|
||||
const { state } = transform
|
||||
const { startOffset, startBlock } = state
|
||||
transform.deleteForwardAtRange(range, startBlock.length - startOffset, options)
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete forward until the word boundary at a `range`.
|
||||
*
|
||||
* @param {Transform} transform
|
||||
* @param {Selection} range
|
||||
* @param {Object} options
|
||||
* @property {Boolean} normalize
|
||||
*/
|
||||
|
||||
export function deleteWordForwardAtRange(transform, range, options) {
|
||||
const { state } = transform
|
||||
const { startOffset, startBlock } = state
|
||||
const { text } = startBlock
|
||||
const n = String.getWordOffsetForward(text, startOffset)
|
||||
transform.deleteForwardAtRange(range, n, options)
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete forward `n` characters at a `range`.
|
||||
*
|
||||
|
@ -33,7 +33,13 @@ import {
|
||||
import {
|
||||
deleteAtRange,
|
||||
deleteBackwardAtRange,
|
||||
deleteCharBackwardAtRange,
|
||||
deleteCharForwardAtRange,
|
||||
deleteForwardAtRange,
|
||||
deleteLineBackwardAtRange,
|
||||
deleteLineForwardAtRange,
|
||||
deleteWordBackwardAtRange,
|
||||
deleteWordForwardAtRange,
|
||||
insertBlockAtRange,
|
||||
insertFragmentAtRange,
|
||||
insertInlineAtRange,
|
||||
@ -59,7 +65,13 @@ import {
|
||||
import {
|
||||
_delete,
|
||||
deleteBackward,
|
||||
deleteCharBackward,
|
||||
deleteCharForward,
|
||||
deleteForward,
|
||||
deleteLineBackward,
|
||||
deleteLineForward,
|
||||
deleteWordBackward,
|
||||
deleteWordForward,
|
||||
insertBlock,
|
||||
insertFragment,
|
||||
insertInline,
|
||||
@ -194,7 +206,13 @@ export default {
|
||||
|
||||
deleteAtRange,
|
||||
deleteBackwardAtRange,
|
||||
deleteCharBackwardAtRange,
|
||||
deleteCharForwardAtRange,
|
||||
deleteForwardAtRange,
|
||||
deleteLineBackwardAtRange,
|
||||
deleteLineForwardAtRange,
|
||||
deleteWordBackwardAtRange,
|
||||
deleteWordForwardAtRange,
|
||||
insertBlockAtRange,
|
||||
insertFragmentAtRange,
|
||||
insertInlineAtRange,
|
||||
@ -218,7 +236,13 @@ export default {
|
||||
|
||||
delete: _delete,
|
||||
deleteBackward,
|
||||
deleteCharBackward,
|
||||
deleteCharForward,
|
||||
deleteForward,
|
||||
deleteLineBackward,
|
||||
deleteLineForward,
|
||||
deleteWordBackward,
|
||||
deleteWordForward,
|
||||
insertBlock,
|
||||
insertFragment,
|
||||
insertInline,
|
||||
|
Loading…
x
Reference in New Issue
Block a user