Mimimum syndical pour en faire un produit zope / cmf.
[ckeditor.git] / skins / ckeditor / _source / core / dom / elementpath.js
diff --git a/skins/ckeditor/_source/core/dom/elementpath.js b/skins/ckeditor/_source/core/dom/elementpath.js
new file mode 100644 (file)
index 0000000..6dcd4d4
--- /dev/null
@@ -0,0 +1,119 @@
+/*\r
+Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.\r
+For licensing, see LICENSE.html or http://ckeditor.com/license\r
+*/\r
+\r
+(function()\r
+{\r
+       // Elements that may be considered the "Block boundary" in an element path.\r
+       var pathBlockElements = { address:1,blockquote:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,li:1,dt:1,dd:1, legend:1,caption:1 };\r
+\r
+       // Elements that may be considered the "Block limit" in an element path.\r
+       var pathBlockLimitElements = { body:1,div:1,table:1,tbody:1,tr:1,td:1,th:1,form:1,fieldset:1 };\r
+\r
+       // Check if an element contains any block element.\r
+       var checkHasBlock = function( element )\r
+       {\r
+               var childNodes = element.getChildren();\r
+\r
+               for ( var i = 0, count = childNodes.count() ; i < count ; i++ )\r
+               {\r
+                       var child = childNodes.getItem( i );\r
+\r
+                       if ( child.type == CKEDITOR.NODE_ELEMENT && CKEDITOR.dtd.$block[ child.getName() ] )\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       };\r
+\r
+       /**\r
+        * @class\r
+        */\r
+       CKEDITOR.dom.elementPath = function( lastNode )\r
+       {\r
+               var block = null;\r
+               var blockLimit = null;\r
+               var elements = [];\r
+\r
+               var e = lastNode;\r
+\r
+               while ( e )\r
+               {\r
+                       if ( e.type == CKEDITOR.NODE_ELEMENT )\r
+                       {\r
+                               if ( !this.lastElement )\r
+                                       this.lastElement = e;\r
+\r
+                               var elementName = e.getName();\r
+                               if ( CKEDITOR.env.ie && e.$.scopeName != 'HTML' )\r
+                                       elementName = e.$.scopeName.toLowerCase() + ':' + elementName;\r
+\r
+                               if ( !blockLimit )\r
+                               {\r
+                                       if ( !block && pathBlockElements[ elementName ] )\r
+                                               block = e;\r
+\r
+                                       if ( pathBlockLimitElements[ elementName ] )\r
+                                       {\r
+                                               // DIV is considered the Block, if no block is available (#525)\r
+                                               // and if it doesn't contain other blocks.\r
+                                               if ( !block && elementName == 'div' && !checkHasBlock( e ) )\r
+                                                       block = e;\r
+                                               else\r
+                                                       blockLimit = e;\r
+                                       }\r
+                               }\r
+\r
+                               elements.push( e );\r
+\r
+                               if ( elementName == 'body' )\r
+                                       break;\r
+                       }\r
+                       e = e.getParent();\r
+               }\r
+\r
+               this.block = block;\r
+               this.blockLimit = blockLimit;\r
+               this.elements = elements;\r
+       };\r
+})();\r
+\r
+CKEDITOR.dom.elementPath.prototype =\r
+{\r
+       /**\r
+        * Compares this element path with another one.\r
+        * @param {CKEDITOR.dom.elementPath} otherPath The elementPath object to be\r
+        * compared with this one.\r
+        * @returns {Boolean} "true" if the paths are equal, containing the same\r
+        * number of elements and the same elements in the same order.\r
+        */\r
+       compare : function( otherPath )\r
+       {\r
+               var thisElements = this.elements;\r
+               var otherElements = otherPath && otherPath.elements;\r
+\r
+               if ( !otherElements || thisElements.length != otherElements.length )\r
+                       return false;\r
+\r
+               for ( var i = 0 ; i < thisElements.length ; i++ )\r
+               {\r
+                       if ( !thisElements[ i ].equals( otherElements[ i ] ) )\r
+                               return false;\r
+               }\r
+\r
+               return true;\r
+       },\r
+\r
+       contains : function( tagNames )\r
+       {\r
+               var elements = this.elements;\r
+               for ( var i = 0 ; i < elements.length ; i++ )\r
+               {\r
+                       if ( elements[ i ].getName() in tagNames )\r
+                               return elements[ i ];\r
+               }\r
+\r
+               return null;\r
+       }\r
+};\r