forked from Gitlink/forgeplus-react
58 lines
1.8 KiB
JavaScript
58 lines
1.8 KiB
JavaScript
|
|
/**
|
||
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
||
|
|
* All rights reserved.
|
||
|
|
*
|
||
|
|
* This source code is licensed under the BSD-style license found in the
|
||
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||
|
|
*
|
||
|
|
* @providesModule getEntityKeyForSelection
|
||
|
|
* @format
|
||
|
|
*
|
||
|
|
*/
|
||
|
|
|
||
|
|
'use strict';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 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, targetSelection) {
|
||
|
|
var entityKey;
|
||
|
|
|
||
|
|
if (targetSelection.isCollapsed()) {
|
||
|
|
var key = targetSelection.getAnchorKey();
|
||
|
|
var 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;
|
||
|
|
}
|
||
|
|
|
||
|
|
var startKey = targetSelection.getStartKey();
|
||
|
|
var startOffset = targetSelection.getStartOffset();
|
||
|
|
var 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, entityKey) {
|
||
|
|
if (entityKey) {
|
||
|
|
var entity = entityMap.__get(entityKey);
|
||
|
|
return entity.getMutability() === 'MUTABLE' ? entityKey : null;
|
||
|
|
}
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = getEntityKeyForSelection;
|