102 lines
2.7 KiB
Plaintext
102 lines
2.7 KiB
Plaintext
/**
|
|
* 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 DraftEntitySegments
|
|
* @format
|
|
* @flow
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
import type { DraftRange } from './DraftRange';
|
|
import type { DraftRemovalDirection } from './DraftRemovalDirection';
|
|
|
|
/**
|
|
* Identify the range to delete from a segmented entity.
|
|
*
|
|
* Rules:
|
|
*
|
|
* Example: 'John F. Kennedy'
|
|
*
|
|
* - Deletion from within any non-whitespace (i.e. ['John', 'F.', 'Kennedy'])
|
|
* will return the range of that text.
|
|
*
|
|
* 'John F. Kennedy' -> 'John F.'
|
|
* ^
|
|
*
|
|
* - Forward deletion of whitespace will remove the following section:
|
|
*
|
|
* 'John F. Kennedy' -> 'John Kennedy'
|
|
* ^
|
|
*
|
|
* - Backward deletion of whitespace will remove the previous section:
|
|
*
|
|
* 'John F. Kennedy' -> 'F. Kennedy'
|
|
* ^
|
|
*/
|
|
var DraftEntitySegments = {
|
|
getRemovalRange: function (selectionStart: number, selectionEnd: number, text: string, entityStart: number, direction: DraftRemovalDirection): DraftRange {
|
|
var segments = text.split(' ');
|
|
segments = segments.map(( /*string*/segment, /*number*/ii) => {
|
|
if (direction === 'forward') {
|
|
if (ii > 0) {
|
|
return ' ' + segment;
|
|
}
|
|
} else if (ii < segments.length - 1) {
|
|
return segment + ' ';
|
|
}
|
|
return segment;
|
|
});
|
|
|
|
var segmentStart = entityStart;
|
|
var segmentEnd;
|
|
var segment;
|
|
var removalStart: any = null;
|
|
var removalEnd: any = null;
|
|
|
|
for (var jj = 0; jj < segments.length; jj++) {
|
|
segment = segments[jj];
|
|
segmentEnd = segmentStart + segment.length;
|
|
|
|
// Our selection overlaps this segment.
|
|
if (selectionStart < segmentEnd && segmentStart < selectionEnd) {
|
|
if (removalStart !== null) {
|
|
removalEnd = segmentEnd;
|
|
} else {
|
|
removalStart = segmentStart;
|
|
removalEnd = segmentEnd;
|
|
}
|
|
} else if (removalStart !== null) {
|
|
break;
|
|
}
|
|
|
|
segmentStart = segmentEnd;
|
|
}
|
|
|
|
var entityEnd = entityStart + text.length;
|
|
var atStart = removalStart === entityStart;
|
|
var atEnd = removalEnd === entityEnd;
|
|
|
|
if (!atStart && atEnd || atStart && !atEnd) {
|
|
if (direction === 'forward') {
|
|
if (removalEnd !== entityEnd) {
|
|
removalEnd++;
|
|
}
|
|
} else if (removalStart !== entityStart) {
|
|
removalStart--;
|
|
}
|
|
}
|
|
|
|
return {
|
|
start: removalStart,
|
|
end: removalEnd
|
|
};
|
|
}
|
|
};
|
|
|
|
module.exports = DraftEntitySegments; |