tinymce.full.js
function genReplacer(nodeName) {
        var makeReplacementNode;

        if (typeof nodeName != 'function') {
          var stencilNode = nodeName.nodeType ? nodeName : doc.createElement(nodeName);

          makeReplacementNode = function (fill, matchIndex) {
            var clone = stencilNode.cloneNode(false);

            clone.setAttribute('data-mce-index', matchIndex);

            if (fill) {
              clone.appendChild(doc.createTextNode(fill));
            }

            return clone;
          };
        } else {
          makeReplacementNode = nodeName;
        }

        return function (range) {
          var before, after, parentNode, startNode = range.startNode,
            endNode = range.endNode, matchIndex = range.matchIndex;

          if (startNode === endNode) {
            var node = startNode;

            parentNode = node.parentNode;
            if (range.startNodeIndex > 0) {
              // Add `before` text node (before the match)
              before = doc.createTextNode(node.data.substring(0, range.startNodeIndex));
              parentNode.insertBefore(before, node);
            }

            // Create the replacement node:
            var el = makeReplacementNode(range.match[0], matchIndex);
            parentNode.insertBefore(el, node);
            if (range.endNodeIndex < node.length) {
              // Add `after` text node (after the match)
              after = doc.createTextNode(node.data.substring(range.endNodeIndex));
              parentNode.insertBefore(after, node);
            }

            node.parentNode.removeChild(node);

            return el;
          }

          // Replace startNode -> [innerNodes...] -> endNode (in that order)
          before = doc.createTextNode(startNode.data.substring(0, range.startNodeIndex));
          after = doc.createTextNode(endNode.data.substring(range.endNodeIndex));
          var elA = makeReplacementNode(startNode.data.substring(range.startNodeIndex), matchIndex);
          var innerEls = [];

          for (var i = 0, l = range.innerNodes.length; i < l; ++i) {
            var innerNode = range.innerNodes[i];
            var innerEl = makeReplacementNode(innerNode.data, matchIndex);
            innerNode.parentNode.replaceChild(innerEl, innerNode);
            innerEls.push(innerEl);
          }

          var elB = makeReplacementNode(endNode.data.substring(0, range.endNodeIndex), matchIndex);

          parentNode = startNode.parentNode;
          parentNode.insertBefore(before, startNode);
          parentNode.insertBefore(elA, startNode);
          parentNode.removeChild(startNode);

          parentNode = endNode.parentNode;
          parentNode.insertBefore(elB, endNode);
          parentNode.insertBefore(after, endNode);
          parentNode.removeChild(endNode);

          return elB;
        };
      }
function genReplacer(nodeName) {
        var makeReplacementNode;

        if (typeof nodeName != 'function') {
          var stencilNode = nodeName.nodeType ? nodeName : doc.createElement(nodeName);

          makeReplacementNode = function (fill, matchIndex) {
            var clone = stencilNode.cloneNode(false);

            clone.setAttribute('data-mce-index', matchIndex);

            if (fill) {
              clone.appendChild(doc.createTextNode(fill));
            }

            return clone;
          };
        } else {
          makeReplacementNode = nodeName;
        }

        return function (range) {
          var before, after, parentNode, startNode = range.startNode,
            endNode = range.endNode, matchIndex = range.matchIndex;

          if (startNode === endNode) {
            var node = startNode;

            parentNode = node.parentNode;
            if (range.startNodeIndex > 0) {
              // Add `before` text node (before the match)
              before = doc.createTextNode(node.data.substring(0, range.startNodeIndex));
              parentNode.insertBefore(before, node);
            }

            // Create the replacement node:
            var el = makeReplacementNode(range.match[0], matchIndex);
            parentNode.insertBefore(el, node);
            if (range.endNodeIndex < node.length) {
              // Add `after` text node (after the match)
              after = doc.createTextNode(node.data.substring(range.endNodeIndex));
              parentNode.insertBefore(after, node);
            }

            node.parentNode.removeChild(node);

            return el;
          }

          // Replace startNode -> [innerNodes...] -> endNode (in that order)
          before = doc.createTextNode(startNode.data.substring(0, range.startNodeIndex));
          after = doc.createTextNode(endNode.data.substring(range.endNodeIndex));
          var elA = makeReplacementNode(startNode.data.substring(range.startNodeIndex), matchIndex);
          var innerEls = [];

          for (var i = 0, l = range.innerNodes.length; i < l; ++i) {
            var innerNode = range.innerNodes[i];
            var innerEl = makeReplacementNode(innerNode.data, matchIndex);
            innerNode.parentNode.replaceChild(innerEl, innerNode);
            innerEls.push(innerEl);
          }

          var elB = makeReplacementNode(endNode.data.substring(0, range.endNodeIndex), matchIndex);

          parentNode = startNode.parentNode;
          parentNode.insertBefore(before, startNode);
          parentNode.insertBefore(elA, startNode);
          parentNode.removeChild(startNode);

          parentNode = endNode.parentNode;
          parentNode.insertBefore(elB, endNode);
          parentNode.insertBefore(after, endNode);
          parentNode.removeChild(endNode);

          return elB;
        };
      }
function genReplacer ( nodeName ) { var makeReplacementNode ; if ( typeof nodeName != 'function' ) { var stencilNode = nodeName . nodeType ? nodeName : doc . createElement ( nodeName ) ; makeReplacementNode = function ( fill , matchIndex ) { var clone = stencilNode . cloneNode ( false ) ; clone . setAttribute ( 'data-mce-index' , matchIndex ) ; if ( fill ) { clone . appendChild ( doc . createTextNode ( fill ) ) ; } return clone ; } ; } else { makeReplacementNode = nodeName ; } return function ( range ) { var before , after , parentNode , startNode = range . startNode , endNode = range . endNode , matchIndex = range . matchIndex ; if ( startNode === endNode ) { var node = startNode ; parentNode = node . parentNode ; if ( range . startNodeIndex > 0 ) { // Add `before` text node (before the match) before = doc . createTextNode ( node . data . substring ( 0 , range . startNodeIndex ) ) ; parentNode . insertBefore ( before , node ) ; } // Create the replacement node: var el = makeReplacementNode ( range . match [ 0 ] , matchIndex ) ; parentNode . insertBefore ( el , node ) ; if ( range . endNodeIndex < node . length ) { // Add `after` text node (after the match) after = doc . createTextNode ( node . data . substring ( range . endNodeIndex ) ) ; parentNode . insertBefore ( after , node ) ; } node . parentNode . removeChild ( node ) ; return el ; } // Replace startNode -> [innerNodes...] -> endNode (in that order) before = doc . createTextNode ( startNode . data . substring ( 0 , range . startNodeIndex ) ) ; after = doc . createTextNode ( endNode . data . substring ( range . endNodeIndex ) ) ; var elA = makeReplacementNode ( startNode . data . substring ( range . startNodeIndex ) , matchIndex ) ; var innerEls = [ ] ; for ( var i = 0 , l = range . innerNodes . length ; i < l ; ++ i ) { var innerNode = range . innerNodes [ i ] ; var innerEl = makeReplacementNode ( innerNode . data , matchIndex ) ; innerNode . parentNode . replaceChild ( innerEl , innerNode ) ; innerEls . push ( innerEl ) ; } var elB = makeReplacementNode ( endNode . data . substring ( 0 , range . endNodeIndex ) , matchIndex ) ; parentNode = startNode . parentNode ; parentNode . insertBefore ( before , startNode ) ; parentNode . insertBefore ( elA , startNode ) ; parentNode . removeChild ( startNode ) ; parentNode = endNode . parentNode ; parentNode . insertBefore ( elB , endNode ) ; parentNode . insertBefore ( after , endNode ) ; parentNode . removeChild ( endNode ) ; return elB ; } ; }
Generates the actual replaceFn which splits up text nodes
and inserts the replacement element.
Generates the actual replaceFn which splits up text nodes and inserts the replacement element .