draft-js
Version:
A React framework for building text editors.
51 lines (43 loc) • 1.54 kB
Flow
/**
* 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
*/
;
import type EditorState from "./EditorState";
import type SelectionState from "./SelectionState";
const warning = require("fbjs/lib/warning");
/**
* Given a collapsed selection, move the focus `maxDistance` forward within
* the selected block. If the selection will go beyond the end of the block,
* move focus to the start of the next block, but no further.
*
* This function is not Unicode-aware, so surrogate pairs will be treated
* as having length 2.
*/
function moveSelectionForward(editorState: EditorState, maxDistance: number): SelectionState {
const selection = editorState.getSelection(); // Should eventually make this an invariant
warning(selection.isCollapsed(), 'moveSelectionForward should only be called with a collapsed SelectionState');
const key = selection.getStartKey();
const offset = selection.getStartOffset();
const content = editorState.getCurrentContent();
let focusKey = key;
let focusOffset;
const block = content.getBlockForKey(key);
if (maxDistance > block.getText().length - offset) {
focusKey = content.getKeyAfter(key);
focusOffset = 0;
} else {
focusOffset = offset + maxDistance;
}
return selection.merge({
focusKey,
focusOffset
});
}
module.exports = moveSelectionForward;