JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.6.1
[ckeditor.git] / _source / plugins / styles / plugin.js
index 98b3eba..0850a66 100644 (file)
@@ -79,8 +79,8 @@ CKEDITOR.STYLE_OBJECT = 3;
 \r
 (function()\r
 {\r
-       var blockElements       = { address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1 },\r
-               objectElements  = { a:1,embed:1,hr:1,img:1,li:1,object:1,ol:1,table:1,td:1,tr:1,th:1,ul:1,dl:1,dt:1,dd:1,form:1};\r
+       var blockElements       = { address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,time:1,meter:1,menu:1,command:1,keygen:1,output:1,progress:1,details:1,datagrid:1,datalist:1 },\r
+               objectElements  = { a:1,embed:1,hr:1,img:1,li:1,object:1,ol:1,table:1,td:1,tr:1,th:1,ul:1,dl:1,dt:1,dd:1,form:1,audio:1,video:1 };\r
 \r
        var semicolonFixRegex = /\s*(?:;\s*|$)/,\r
                varRegex = /#\((.+?)\)/g;\r
@@ -98,7 +98,9 @@ CKEDITOR.STYLE_OBJECT = 3;
                        replaceVariables( styleDefinition.styles, variablesValues );\r
                }\r
 \r
-               var element = this.element = ( styleDefinition.element || '*' ).toLowerCase();\r
+               var element = this.element = styleDefinition.element ?\r
+                               ( typeof styleDefinition.element == 'string' ? styleDefinition.element.toLowerCase() : styleDefinition.element )\r
+                               : '*';\r
 \r
                this.type =\r
                        blockElements[ element ] ?\r
@@ -108,6 +110,10 @@ CKEDITOR.STYLE_OBJECT = 3;
                        :\r
                                CKEDITOR.STYLE_INLINE;\r
 \r
+               // If the 'element' property is an object with a set of possible element, it will be applied like an object style: only to existing elements\r
+               if ( typeof this.element == 'object' )\r
+                       this.type = CKEDITOR.STYLE_OBJECT;\r
+\r
                this._ =\r
                {\r
                        definition : styleDefinition\r
@@ -179,9 +185,12 @@ CKEDITOR.STYLE_OBJECT = 3;
                                                          && ( element == elementPath.block || element == elementPath.blockLimit ) )\r
                                                        continue;\r
 \r
-                                               if( this.type == CKEDITOR.STYLE_OBJECT\r
-                                                        && !( element.getName() in objectElements ) )\r
+                                               if( this.type == CKEDITOR.STYLE_OBJECT )\r
+                                               {\r
+                                                       var name = element.getName();\r
+                                                       if ( !( typeof this.element == 'string' ? name == this.element : name in this.element ) )\r
                                                                continue;\r
+                                               }\r
 \r
                                                if ( this.checkElementRemovable( element, true ) )\r
                                                        return true;\r
@@ -217,10 +226,11 @@ CKEDITOR.STYLE_OBJECT = 3;
                                return false;\r
 \r
                        var def = this._.definition,\r
-                               attribs;\r
+                               attribs,\r
+                               name = element.getName();\r
 \r
                        // If the element name is the same as the style name.\r
-                       if ( element.getName() == this.element )\r
+                       if ( typeof this.element == 'string' ? name == this.element : name in this.element )\r
                        {\r
                                // If no attributes are defined in the element.\r
                                if ( !fullMatch && !element.hasAttributes() )\r
@@ -1510,6 +1520,8 @@ CKEDITOR.STYLE_OBJECT = 3;
        function applyStyle( document, remove )\r
        {\r
                var selection = document.getSelection(),\r
+                       // Bookmark the range so we can re-select it after processing.\r
+                       bookmarks = selection.createBookmarks( 1 ),\r
                        ranges = selection.getRanges(),\r
                        func = remove ? this.removeFromRange : this.applyToRange,\r
                        range;\r
@@ -1518,7 +1530,13 @@ CKEDITOR.STYLE_OBJECT = 3;
                while ( ( range = iterator.getNextRange() ) )\r
                        func.call( this, range );\r
 \r
-               selection.selectRanges( ranges );\r
+               if ( bookmarks.length == 1 && bookmarks[ 0 ].collapsed )\r
+               {\r
+                       selection.selectRanges( ranges );\r
+                       document.getById( bookmarks[ 0 ].startNode ).remove();\r
+               }\r
+               else\r
+                       selection.selectBookmarks( bookmarks );\r
 \r
                document.removeCustomData( 'doc_processing_style' );\r
        }\r