|
- /**
- * 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 { EntityMap } from "./EntityMap";
- import type SelectionState from "./SelectionState";
-
- const {
- notEmptyKey
- } = require("./draftKeyUtils");
- /**
- * Return the entity key that should be used when inserting text for the
- * specified target selection, only if the entity is `MUTABLE`. `IMMUTABLE`
- * and `SEGMENTED` entities should not be used for insertion behavior.
- */
-
-
- function getEntityKeyForSelection(contentState: ContentState, targetSelection: SelectionState): ?string {
- let entityKey;
-
- if (targetSelection.isCollapsed()) {
- const key = targetSelection.getAnchorKey();
- const offset = targetSelection.getAnchorOffset();
-
- if (offset > 0) {
- entityKey = contentState.getBlockForKey(key).getEntityAt(offset - 1);
-
- if (entityKey !== contentState.getBlockForKey(key).getEntityAt(offset)) {
- return null;
- }
-
- return filterKey(contentState.getEntityMap(), entityKey);
- }
-
- return null;
- }
-
- const startKey = targetSelection.getStartKey();
- const startOffset = targetSelection.getStartOffset();
- const startBlock = contentState.getBlockForKey(startKey);
- entityKey = startOffset === startBlock.getLength() ? null : startBlock.getEntityAt(startOffset);
- return filterKey(contentState.getEntityMap(), entityKey);
- }
- /**
- * Determine whether an entity key corresponds to a `MUTABLE` entity. If so,
- * return it. If not, return null.
- */
-
-
- function filterKey(entityMap: EntityMap, entityKey: ?string): ?string {
- if (notEmptyKey(entityKey)) {
- const entity = entityMap.__get(entityKey);
-
- return entity.getMutability() === 'MUTABLE' ? entityKey : null;
- }
-
- return null;
- }
-
- module.exports = getEntityKeyForSelection;
|