whole_func_string: function bringTheHurt( node ) {
  						let span, splitNodes;
  
  						if ( node.nodeType === 3 ) {
  							ecount++;
  
  							/* sometimes IE likes to ignore the space between two spans, solution is to insert a placeholder span with
  							   a non-breaking space.  The markup removal code substitutes this span for a space later */
  							if (
  								parent.isIE() &&
  								node.nodeValue.length > 0 &&
  								node.nodeValue.substr( 0, 1 ) === ' '
  							) {
  								return parent.create(
  									emptySpan +
  										node.nodeValue.substr( 1, node.nodeValue.length - 1 ).replace( regexp, result ),
  									false
  								);
  							}
  
  							if ( textOnlyMode ) {
  								return parent.create( node.nodeValue.replace( regexp, result ), false );
  							}
  
  							span = parent.create( '<span />' );
  							if ( typeof textOnlyMode === 'undefined' ) {
  								// cache this to avoid adding / removing nodes unnecessarily
  								textOnlyMode = typeof span.appendChild !== 'function';
  								if ( textOnlyMode ) {
  									parent.remove( span );
  									return parent.create( node.nodeValue.replace( regexp, result ), false );
  								}
  							}
  
  							// "Visual" mode
  							splitNodes = splitTextNode( node, regexp, result );
  							for ( i = 0; i < splitNodes.length; i++ ) {
  								span.appendChild( splitNodes[ i ] );
  							}
  
  							node = span;
  							return node;
  						}
  
  						contents = parent.contents( node );
  
  						for ( y = 0; y < contents.length; y++ ) {
  							if ( contents[ y ].nodeType === 3 && regexp.test( contents[ y ].nodeValue ) ) {
  								if (
  									parent.isIE() &&
  									contents[ y ].nodeValue.length > 0 &&
  									contents[ y ].nodeValue.substr( 0, 1 ) === ' '
  								) {
  									nnode = parent.create(
  										emptySpan +
  											contents[ y ].nodeValue
  												.substr( 1, contents[ y ].nodeValue.length - 1 )
  												.replace( regexp, result ),
  										true
  									);
  								} else {
  									nnode = parent.create( contents[ y ].nodeValue.replace( regexp, result ), true );
  								}
  
  								parent.replaceWith( contents[ y ], nnode );
  								parent.removeParent( nnode );
  
  								ecount++;
  
  								return node; /* we did a replacement so we can call it quits, errors only get used once */
  							}
  						}
  
  						return node;
  					}
func_code_string: function bringTheHurt( node ) {
  						let span, splitNodes;
  
  						if ( node.nodeType === 3 ) {
  							ecount++;
  
  							/* sometimes IE likes to ignore the space between two spans, solution is to insert a placeholder span with
  							   a non-breaking space.  The markup removal code substitutes this span for a space later */
  							if (
  								parent.isIE() &&
  								node.nodeValue.length > 0 &&
  								node.nodeValue.substr( 0, 1 ) === ' '
  							) {
  								return parent.create(
  									emptySpan +
  										node.nodeValue.substr( 1, node.nodeValue.length - 1 ).replace( regexp, result ),
  									false
  								);
  							}
  
  							if ( textOnlyMode ) {
  								return parent.create( node.nodeValue.replace( regexp, result ), false );
  							}
  
  							span = parent.create( '<span />' );
  							if ( typeof textOnlyMode === 'undefined' ) {
  								// cache this to avoid adding / removing nodes unnecessarily
  								textOnlyMode = typeof span.appendChild !== 'function';
  								if ( textOnlyMode ) {
  									parent.remove( span );
  									return parent.create( node.nodeValue.replace( regexp, result ), false );
  								}
  							}
  
  							// "Visual" mode
  							splitNodes = splitTextNode( node, regexp, result );
  							for ( i = 0; i < splitNodes.length; i++ ) {
  								span.appendChild( splitNodes[ i ] );
  							}
  
  							node = span;
  							return node;
  						}
  
  						contents = parent.contents( node );
  
  						for ( y = 0; y < contents.length; y++ ) {
  							if ( contents[ y ].nodeType === 3 && regexp.test( contents[ y ].nodeValue ) ) {
  								if (
  									parent.isIE() &&
  									contents[ y ].nodeValue.length > 0 &&
  									contents[ y ].nodeValue.substr( 0, 1 ) === ' '
  								) {
  									nnode = parent.create(
  										emptySpan +
  											contents[ y ].nodeValue
  												.substr( 1, contents[ y ].nodeValue.length - 1 )
  												.replace( regexp, result ),
  										true
  									);
  								} else {
  									nnode = parent.create( contents[ y ].nodeValue.replace( regexp, result ), true );
  								}
  
  								parent.replaceWith( contents[ y ], nnode );
  								parent.removeParent( nnode );
  
  								ecount++;
  
  								return node; /* we did a replacement so we can call it quits, errors only get used once */
  							}
  						}
  
  						return node;
  					}
func_documentation_string: /* it's assumed that this function is only being called on text nodes (nodeType == 3), the iterating is necessary
  because eventually the whole thing gets wrapped in an mceItemHidden span and from there it's necessary to
  handle each node individually.