/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @format * @flow strict-local * @emails oncall+draft_js */ 'use strict'; import type ContentState from "./ContentState"; import type { DraftRemovalDirection } from "./DraftRemovalDirection"; import type EditorState from "./EditorState"; import type SelectionState from "./SelectionState"; const DraftModifier = require("./DraftModifier"); const gkx = require("./gkx"); const experimentalTreeDataSupport = gkx('draft_tree_data_support'); /** * For a collapsed selection state, remove text based on the specified strategy. * If the selection state is not collapsed, remove the entire selected range. */ function removeTextWithStrategy(editorState: EditorState, strategy: (editorState: EditorState) => SelectionState, direction: DraftRemovalDirection): ContentState { const selection = editorState.getSelection(); const content = editorState.getCurrentContent(); let target = selection; const anchorKey = selection.getAnchorKey(); const focusKey = selection.getFocusKey(); const anchorBlock = content.getBlockForKey(anchorKey); if (experimentalTreeDataSupport) { if (direction === 'forward') { if (anchorKey !== focusKey) { // For now we ignore forward delete across blocks, // if there is demand for this we will implement it. return content; } } } if (selection.isCollapsed()) { if (direction === 'forward') { if (editorState.isSelectionAtEndOfContent()) { return content; } if (experimentalTreeDataSupport) { const isAtEndOfBlock = selection.getAnchorOffset() === content.getBlockForKey(anchorKey).getLength(); if (isAtEndOfBlock) { const anchorBlockSibling = content.getBlockForKey(anchorBlock.nextSibling); if (!anchorBlockSibling || anchorBlockSibling.getLength() === 0) { // For now we ignore forward delete at the end of a block, // if there is demand for this we will implement it. return content; } } } } else if (editorState.isSelectionAtStartOfContent()) { return content; } target = strategy(editorState); if (target === selection) { return content; } } return DraftModifier.removeRange(content, target, direction); } module.exports = removeTextWithStrategy;