/*! * 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; } }