tinymce.full.js
function removeFormat(format, vars, node, compareNode) {
        var i, attrs, stylesModified;

        // Check if node matches format
        if (!matchName(node, format) && !isColorFormatAndAnchor(node, format)) {
          return FALSE;
        }

        // Should we compare with format attribs and styles
        if (format.remove != 'all') {
          // Remove styles
          each(format.styles, function (value, name) {
            value = normalizeStyleValue(replaceVars(value, vars), name);

            // Indexed array
            if (typeof name === 'number') {
              name = value;
              compareNode = 0;
            }

            if (format.remove_similar || (!compareNode || isEq(getStyle(compareNode, name), value))) {
              dom.setStyle(node, name, '');
            }

            stylesModified = 1;
          });

          // Remove style attribute if it's empty
          if (stylesModified && dom.getAttrib(node, 'style') === '') {
            node.removeAttribute('style');
            node.removeAttribute('data-mce-style');
          }

          // Remove attributes
          each(format.attributes, function (value, name) {
            var valueOut;

            value = replaceVars(value, vars);

            // Indexed array
            if (typeof name === 'number') {
              name = value;
              compareNode = 0;
            }

            if (!compareNode || isEq(dom.getAttrib(compareNode, name), value)) {
              // Keep internal classes
              if (name == 'class') {
                value = dom.getAttrib(node, name);
                if (value) {
                  // Build new class value where everything is removed except the internal prefixed classes
                  valueOut = '';
                  each(value.split(/\s+/), function (cls) {
                    if (/mce\-\w+/.test(cls)) {
                      valueOut += (valueOut ? ' ' : '') + cls;
                    }
                  });

                  // We got some internal classes left
                  if (valueOut) {
                    dom.setAttrib(node, name, valueOut);
                    return;
                  }
                }
              }

              // IE6 has a bug where the attribute doesn't get removed correctly
              if (name == "class") {
                node.removeAttribute('className');
              }

              // Remove mce prefixed attributes
              if (MCE_ATTR_RE.test(name)) {
                node.removeAttribute('data-mce-' + name);
              }

              node.removeAttribute(name);
            }
          });

          // Remove classes
          each(format.classes, function (value) {
            value = replaceVars(value, vars);

            if (!compareNode || dom.hasClass(compareNode, value)) {
              dom.removeClass(node, value);
            }
          });

          // Check for non internal attributes
          attrs = dom.getAttribs(node);
          for (i = 0; i < attrs.length; i++) {
            var attrName = attrs[i].nodeName;
            if (attrName.indexOf('_') !== 0 && attrName.indexOf('data-') !== 0) {
              return FALSE;
            }
          }
        }

        // Remove the inline child if it's empty for example <b> or <span>
        if (format.remove != 'none') {
          removeNode(node, format);
          return TRUE;
        }
      }
function removeFormat(format, vars, node, compareNode) {
        var i, attrs, stylesModified;

        // Check if node matches format
        if (!matchName(node, format) && !isColorFormatAndAnchor(node, format)) {
          return FALSE;
        }

        // Should we compare with format attribs and styles
        if (format.remove != 'all') {
          // Remove styles
          each(format.styles, function (value, name) {
            value = normalizeStyleValue(replaceVars(value, vars), name);

            // Indexed array
            if (typeof name === 'number') {
              name = value;
              compareNode = 0;
            }

            if (format.remove_similar || (!compareNode || isEq(getStyle(compareNode, name), value))) {
              dom.setStyle(node, name, '');
            }

            stylesModified = 1;
          });

          // Remove style attribute if it's empty
          if (stylesModified && dom.getAttrib(node, 'style') === '') {
            node.removeAttribute('style');
            node.removeAttribute('data-mce-style');
          }

          // Remove attributes
          each(format.attributes, function (value, name) {
            var valueOut;

            value = replaceVars(value, vars);

            // Indexed array
            if (typeof name === 'number') {
              name = value;
              compareNode = 0;
            }

            if (!compareNode || isEq(dom.getAttrib(compareNode, name), value)) {
              // Keep internal classes
              if (name == 'class') {
                value = dom.getAttrib(node, name);
                if (value) {
                  // Build new class value where everything is removed except the internal prefixed classes
                  valueOut = '';
                  each(value.split(/\s+/), function (cls) {
                    if (/mce\-\w+/.test(cls)) {
                      valueOut += (valueOut ? ' ' : '') + cls;
                    }
                  });

                  // We got some internal classes left
                  if (valueOut) {
                    dom.setAttrib(node, name, valueOut);
                    return;
                  }
                }
              }

              // IE6 has a bug where the attribute doesn't get removed correctly
              if (name == "class") {
                node.removeAttribute('className');
              }

              // Remove mce prefixed attributes
              if (MCE_ATTR_RE.test(name)) {
                node.removeAttribute('data-mce-' + name);
              }

              node.removeAttribute(name);
            }
          });

          // Remove classes
          each(format.classes, function (value) {
            value = replaceVars(value, vars);

            if (!compareNode || dom.hasClass(compareNode, value)) {
              dom.removeClass(node, value);
            }
          });

          // Check for non internal attributes
          attrs = dom.getAttribs(node);
          for (i = 0; i < attrs.length; i++) {
            var attrName = attrs[i].nodeName;
            if (attrName.indexOf('_') !== 0 && attrName.indexOf('data-') !== 0) {
              return FALSE;
            }
          }
        }

        // Remove the inline child if it's empty for example <b> or <span>
        if (format.remove != 'none') {
          removeNode(node, format);
          return TRUE;
        }
      }
function removeFormat ( format , vars , node , compareNode ) { var i , attrs , stylesModified ; // Check if node matches format if ( ! matchName ( node , format ) && ! isColorFormatAndAnchor ( node , format ) ) { return FALSE ; } // Should we compare with format attribs and styles if ( format . remove != 'all' ) { // Remove styles each ( format . styles , function ( value , name ) { value = normalizeStyleValue ( replaceVars ( value , vars ) , name ) ; // Indexed array if ( typeof name === 'number' ) { name = value ; compareNode = 0 ; } if ( format . remove_similar || ( ! compareNode || isEq ( getStyle ( compareNode , name ) , value ) ) ) { dom . setStyle ( node , name , '' ) ; } stylesModified = 1 ; } ) ; // Remove style attribute if it's empty if ( stylesModified && dom . getAttrib ( node , 'style' ) === '' ) { node . removeAttribute ( 'style' ) ; node . removeAttribute ( 'data-mce-style' ) ; } // Remove attributes each ( format . attributes , function ( value , name ) { var valueOut ; value = replaceVars ( value , vars ) ; // Indexed array if ( typeof name === 'number' ) { name = value ; compareNode = 0 ; } if ( ! compareNode || isEq ( dom . getAttrib ( compareNode , name ) , value ) ) { // Keep internal classes if ( name == 'class' ) { value = dom . getAttrib ( node , name ) ; if ( value ) { // Build new class value where everything is removed except the internal prefixed classes valueOut = '' ; each ( value . split ( / \s+ / ) , function ( cls ) { if ( / mce\-\w+ / . test ( cls ) ) { valueOut += ( valueOut ? ' ' : '' ) + cls ; } } ) ; // We got some internal classes left if ( valueOut ) { dom . setAttrib ( node , name , valueOut ) ; return ; } } } // IE6 has a bug where the attribute doesn't get removed correctly if ( name == "class" ) { node . removeAttribute ( 'className' ) ; } // Remove mce prefixed attributes if ( MCE_ATTR_RE . test ( name ) ) { node . removeAttribute ( 'data-mce-' + name ) ; } node . removeAttribute ( name ) ; } } ) ; // Remove classes each ( format . classes , function ( value ) { value = replaceVars ( value , vars ) ; if ( ! compareNode || dom . hasClass ( compareNode , value ) ) { dom . removeClass ( node , value ) ; } } ) ; // Check for non internal attributes attrs = dom . getAttribs ( node ) ; for ( i = 0 ; i < attrs . length ; i ++ ) { var attrName = attrs [ i ] . nodeName ; if ( attrName . indexOf ( '_' ) !== 0 && attrName . indexOf ( 'data-' ) !== 0 ) { return FALSE ; } } } // Remove the inline child if it's empty for example <b> or <span> if ( format . remove != 'none' ) { removeNode ( node , format ) ; return TRUE ; } }
Removes the specified format for the specified node. It will also remove the node if it doesn't have
any attributes if the format specifies it to do so.

@private
@param {Object} format Format object with items to remove from node.
@param {Object} vars Name/value object with variables to apply to format.
@param {Node} node Node to remove the format styles on.
@param {Node} compareNode Optional compare node, if specified the styles will be compared to that node.
@return {Boolean} True/false if the node was removed or not.
Removes the specified format for the specified node . It will also remove the node if it doesn t have any attributes if the format specifies it to do so .