(container: Element, node: Node, offset: number)
| 591 | } |
| 592 | |
| 593 | function getPosition(container: Element, node: Node, offset: number): Position { |
| 594 | if (node === container) { |
| 595 | return {index: offset, offset: 0}; |
| 596 | } |
| 597 | |
| 598 | let originalNode = node; |
| 599 | while (node.parentNode !== container) { |
| 600 | node = node.parentNode!; |
| 601 | } |
| 602 | |
| 603 | let index = indexOfNode(node); |
| 604 | if (node.nodeType === Node.ELEMENT_NODE) { |
| 605 | let tokenNode = node.childNodes[1]; |
| 606 | if (originalNode === tokenNode) { |
| 607 | // Cursor is inside the token. |
| 608 | offset = offset > 0 ? (tokenNode?.textContent?.length ?? 0) : 0; |
| 609 | } else if (originalNode === node) { |
| 610 | // Cursor is inside the wrapper element. |
| 611 | offset = offset <= 1 ? 0 : (tokenNode?.textContent?.length ?? 0); |
| 612 | } else { |
| 613 | // Cursor is on one of the zero width spaces. |
| 614 | offset = |
| 615 | originalNode === tokenNode.previousSibling ? 0 : (tokenNode?.textContent?.length ?? 0); |
| 616 | } |
| 617 | return {index, offset}; |
| 618 | } |
| 619 | return {index, offset}; |
| 620 | } |
| 621 | |
| 622 | let isProgrammaticSelectionChange = false; |
| 623 |
no test coverage detected