src/js/base/core/dom.js
function prevPoint(point, isSkipInnerOffset) {
  let node;
  let offset;

  if (point.offset === 0) {
    if (isEditable(point.node)) {
      return null;
    }

    node = point.node.parentNode;
    offset = position(point.node);
  } else if (hasChildren(point.node)) {
    node = point.node.childNodes[point.offset - 1];
    offset = nodeLength(node);
  } else {
    node = point.node;
    offset = isSkipInnerOffset ? 0 : point.offset - 1;
  }

  return {
    node: node,
    offset: offset,
  };
}
function prevPoint(point, isSkipInnerOffset) {
  let node;
  let offset;

  if (point.offset === 0) {
    if (isEditable(point.node)) {
      return null;
    }

    node = point.node.parentNode;
    offset = position(point.node);
  } else if (hasChildren(point.node)) {
    node = point.node.childNodes[point.offset - 1];
    offset = nodeLength(node);
  } else {
    node = point.node;
    offset = isSkipInnerOffset ? 0 : point.offset - 1;
  }

  return {
    node: node,
    offset: offset,
  };
}
function prevPoint ( point , isSkipInnerOffset ) { let node ; let offset ; if ( point . offset === 0 ) { if ( isEditable ( point . node ) ) { return null ; } node = point . node . parentNode ; offset = position ( point . node ) ; } else if ( hasChildren ( point . node ) ) { node = point . node . childNodes [ point . offset - 1 ] ; offset = nodeLength ( node ) ; } else { node = point . node ; offset = isSkipInnerOffset ? 0 : point . offset - 1 ; } return { node : node , offset : offset , } ; }
returns previous boundaryPoint

@param {BoundaryPoint} point
@param {Boolean} isSkipInnerOffset
@return {BoundaryPoint}
returns previous boundaryPoint