code: function splitNode(point, options) {
    let isSkipPaddingBlankHTML = options && options.isSkipPaddingBlankHTML;
    const isNotSplitEdgePoint = options && options.isNotSplitEdgePoint;
    const isDiscardEmptySplits = options && options.isDiscardEmptySplits;
  
    if (isDiscardEmptySplits) {
      isSkipPaddingBlankHTML = true;
    }
  
    // edge case
    if (isEdgePoint(point) && (isText(point.node) || isNotSplitEdgePoint)) {
      if (isLeftEdgePoint(point)) {
        return point.node;
      } else if (isRightEdgePoint(point)) {
        return point.node.nextSibling;
      }
    }
  
    // split #text
    if (isText(point.node)) {
      return point.node.splitText(point.offset);
    } else {
      const childNode = point.node.childNodes[point.offset];
      const clone = insertAfter(point.node.cloneNode(false), point.node);
      appendChildNodes(clone, listNext(childNode));
  
      if (!isSkipPaddingBlankHTML) {
        paddingBlankHTML(point.node);
        paddingBlankHTML(clone);
      }
  
      if (isDiscardEmptySplits) {
        if (isEmpty(point.node)) {
          remove(point.node);
        }
        if (isEmpty(clone)) {
          remove(clone);
          return point.node.nextSibling;
        }
      }
  
      return clone;
    }
  }
docs: @method splitNode
  
  split element or #text
  
  @param {BoundaryPoint} point
  @param {Object} [options]
  @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false
  @param {Boolean} [options.isNotSplitEdgePoint] - default: false
  @param {Boolean} [options.isDiscardEmptySplits] - default: false
  @return {Node} right node of boundaryPoint