docs: function ( node, exemplar ) {
              // If the node is completely contained by the range then
              // we're going to remove all formatting so ignore it.
              if ( isNodeContainedInRange( range, node, false ) ) {
                  return;
              }
  
              var isText = ( node.nodeType === TEXT_NODE ),
                  child, next;
  
              // If not at least partially contained, wrap entire contents
              // in a clone of the tag we're removing and we're done.
              if ( !isNodeContainedInRange( range, node, true ) ) {
                  // Ignore bookmarks and empty text nodes
                  if ( node.nodeName !== 'INPUT' &&
                          ( !isText || node.data ) ) {
                      toWrap.push([ exemplar, node ]);
                  }
                  return;
              }
  
              // Split any partially selected text nodes.
              if ( isText ) {
                  if ( node === endContainer && endOffset !== node.length ) {
                      toWrap.push([ exemplar, node.splitText( endOffset ) ]);
                  }
                  if ( node === startContainer && startOffset ) {
                      node.splitText( startOffset );
                      toWrap.push([ exemplar, node ]);
                  }
              }
              // If not a text node, recurse onto all children.
              // Beware, the tree may be rewritten with each call
              // to examineNode, hence find the next sibling first.
              else {
                  for ( child = node.firstChild; child; child = next ) {
                      next = child.nextSibling;
                      examineNode( child, exemplar );
                  }
              }
          }