getRelativePosition()

in src/caret/caret.ts [134:169]


  getRelativePosition(curNode: Node, position: number) {
    let curPos = 0;
    // eslint-disable-next-line no-underscore-dangle
    let _curNode = curNode;
    const nodeTypeText = 3;
    if (!_curNode) {
      return {_curNode: this.target, _correctedPosition: position};
    }
    if (position === 0) {
      while (_curNode.nodeType !== nodeTypeText) {
        _curNode = _curNode.childNodes[0];
      }
      // eslint-disable-next-line no-underscore-dangle
      const _correctedPosition = position;
      return {_curNode, _correctedPosition};
    }
    let i = -1;
    if (_curNode && _curNode.nodeType !== undefined) {
      while (curPos < position && _curNode.nodeType !== nodeTypeText) {
        i++;
        if (_curNode.childNodes[i]) {
          curPos += _curNode.childNodes[i].textContent?.length ?? 0;
          if (curPos >= position) {
            _curNode = _curNode.childNodes[i];
            curPos -= _curNode.textContent?.length ?? 0;
            i = -1;
          }
        } else {
          break;
        }
      }
    }
    // eslint-disable-next-line no-underscore-dangle
    const _correctedPosition = position - curPos;
    return {_curNode, _correctedPosition};
  }