/*\r
-Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.\r
+Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.\r
For licensing, see LICENSE.html or http://ckeditor.com/license\r
*/\r
\r
label : editor.lang.removeFormat,\r
command : 'removeFormat'\r
});\r
+\r
+ editor._.removeFormat = { filters: [] };\r
}\r
});\r
\r
var removeAttributes = editor._.removeAttributes ||\r
( editor._.removeAttributes = editor.config.removeFormatAttributes.split( ',' ) );\r
\r
- var ranges = editor.getSelection().getRanges();\r
+ var filter = CKEDITOR.plugins.removeformat.filter;\r
+ var ranges = editor.getSelection().getRanges( true ),\r
+ iterator = ranges.createIterator(),\r
+ range;\r
\r
- for ( var i = 0, range ; range = ranges[ i ] ; i++ )\r
+ while ( ( range = iterator.getNextRange() ) )\r
{\r
if ( range.collapsed )\r
continue;\r
break;\r
\r
// If this element can be removed (even partially).\r
- if ( tagsRegex.test( pathElement.getName() ) )\r
+ if ( tagsRegex.test( pathElement.getName() ) && filter( editor, pathElement ) )\r
node.breakParent( pathElement );\r
}\r
};\r
var nextNode = currentNode.getNextSourceNode( false, CKEDITOR.NODE_ELEMENT );\r
\r
// This node must not be a fake element.\r
- if ( !( currentNode.getName() == 'img' && currentNode.getAttribute( '_cke_realelement' ) ) )\r
+ if ( !( currentNode.getName() == 'img'\r
+ && currentNode.getAttribute( '_cke_realelement' ) )\r
+ && filter( editor, currentNode ) )\r
{\r
// Remove elements nodes that match with this style rules.\r
if ( tagsRegex.test( currentNode.getName() ) )\r
currentNode.remove( true );\r
else\r
+ {\r
currentNode.removeAttributes( removeAttributes );\r
+ editor.fire( 'removeFormatCleanup', currentNode );\r
+ }\r
}\r
\r
currentNode = nextNode;\r
editor.getSelection().selectRanges( ranges );\r
}\r
}\r
+ },\r
+\r
+ /**\r
+ * Perform the remove format filters on the passed element.\r
+ * @param {CKEDITOR.editor} editor\r
+ * @param {CKEDITOR.dom.element} element\r
+ */\r
+ filter : function ( editor, element )\r
+ {\r
+ var filters = editor._.removeFormat.filters;\r
+ for ( var i = 0; i < filters.length; i++ )\r
+ {\r
+ if ( filters[ i ]( element ) === false )\r
+ return false;\r
+ }\r
+ return true;\r
}\r
};\r
\r
/**\r
+ * Add to a collection of functions to decide whether a specific\r
+ * element should be considered as formatting element and thus\r
+ * could be removed during <b>removeFormat</b> command,\r
+ * Note: Only available with the existence of 'removeformat' plugin.\r
+ * @since 3.3\r
+ * @param {Function} func The function to be called, which will be passed a {CKEDITOR.dom.element} element to test.\r
+ * @example\r
+ * // Don't remove empty span\r
+ * editor.addRemoveFormatFilter.push( function( element )\r
+ * {\r
+ * return !( element.is( 'span' ) && CKEDITOR.tools.isEmpty( element.getAttributes() ) );\r
+ * });\r
+ */\r
+CKEDITOR.editor.prototype.addRemoveFormatFilter = function( func )\r
+{\r
+ this._.removeFormat.filters.push( func );\r
+};\r
+\r
+/**\r
* A comma separated list of elements to be removed when executing the "remove\r
" format" command. Note that only inline elements are allowed.\r
* @type String\r
* @example\r
*/\r
CKEDITOR.config.removeFormatAttributes = 'class,style,lang,width,height,align,hspace,valign';\r
+\r
+/**\r
+ * Fired after an element was cleaned by the removeFormat plugin.\r
+ * @name CKEDITOR#removeFormatCleanup\r
+ * @event\r
+ * @param {Object} data.element The element that was cleaned up.\r
+ */\r