/*!
* Jodit Editor PRO (https://xdsoft.net/jodit/)
* See LICENSE.md in the project root for license information.
* Copyright (c) 2013-2022 Valeriy Chupurnov. All rights reserved. https://xdsoft.net/jodit/pro/
*/
import { Dom } from 'jodit/core/dom';
/**
* For collapsed selection return left text value before cursor
* @example
* ```
*
testpop|
=> pop
* test|pop
=> test
* te|stpop
=> te
* ```
*/
export function getTextLeftOfCursor(range: Range): string {
const { startContainer, startOffset } = range;
if (Dom.isText(startContainer)) {
return startContainer.nodeValue?.substr(0, startOffset) ?? '';
}
const node = startContainer.childNodes[startOffset];
if (!node) {
return '';
}
if (Dom.isText(node)) {
return node.nodeValue ?? '';
}
const previous = Dom.findNotEmptyNeighbor(
node,
true,
startContainer as HTMLElement
);
if (Dom.isText(previous)) {
return node.nodeValue ?? '';
}
return '';
}
/**
* For collapsed selection replace part of left text value before cursor but started after space
* @example
* ```
* testpap|
+ pappy = testpappy|
* testpap| test
+ pappy = testpappy| test
* teststat pap| test
+ pappy = teststat pappy| test
* ```
*/
export function replaceTextLeftOfCursorAfterSpace(
range: Range,
elm: Node
): void {
const { startContainer, startOffset } = range;
if (Dom.isText(startContainer)) {
const value = startContainer.nodeValue ?? '',
leftSide = value.substr(0, startOffset),
rightSide = value.substr(startOffset);
const words = leftSide.split(' ');
words[words.length - 1] = '';
const newLeftSide = words.join(' ');
startContainer.nodeValue = newLeftSide + rightSide;
range.setStart(startContainer, newLeftSide.length);
range.insertNode(elm);
return;
}
}