editor: plugins/core support for Node.object.describesParent
[fnpeditor.git] / src / wlxml / wlxml.js
index 034312d..0505116 100644 (file)
@@ -11,6 +11,25 @@ define([
 /* globals Node */
 
 
+var WLXMLDocumentNodeMethods =  {
+    isInside: function(query) {
+        var parent = this.getParent(query);
+        return !!parent;
+    },
+    getParent: function(query) {
+        /* globals Node */
+        var me = this.nodeType === Node.ELEMENT_NODE ? [this] : [],
+            toret;
+        me.concat(this.parents()).some(function(node) {
+            if(node.is(query)) {
+                toret = node;
+                return true;
+            }
+        });
+        return toret;
+    },
+};
+
 var AttributesList = function() {};
 AttributesList.prototype = Object.create({});
 AttributesList.prototype.keys = function() {
@@ -49,18 +68,25 @@ var WLXMLElementNode = function(nativeNode, document) {
 };
 WLXMLElementNode.prototype = Object.create(smartxml.ElementNode.prototype);
 
-$.extend(WLXMLElementNode.prototype, smartxml.ElementNode.prototype, {
+$.extend(WLXMLElementNode.prototype, WLXMLDocumentNodeMethods, smartxml.ElementNode.prototype, {
     getClass: function() {
         return this.getAttr('class') || '';
     },
+    getClassHierarchy: function() {
+        return getClassLists(this.getClass());
+    },
     setClass: function(klass) {
         if(klass !== this.klass) {
             installObject(this, klass);
             return this.setAttr('class', klass);
         }
     },
-    is: function(klass) {
-        return this.getClass().substr(0, klass.length) === klass;
+    is: function(query) {
+        if(typeof query === 'string') {
+            query = {klass: query};
+        }
+        return (_.isUndefined(query.klass) || this.getClass().substr(0, query.klass.length) === query.klass) &&
+               (_.isUndefined(query.tagName) || this.getTagName() === query.tagName);
     },
     getMetaAttributes: function() {
         var toret = new AttributesList(),
@@ -175,6 +201,13 @@ var WLXMLDocumentNode = function() {
 };
 WLXMLDocumentNode.prototype = Object.create(smartxml.DocumentNode.prototype);
 
+
+var WLXMLTextNode = function() {
+    smartxml.TextNode.apply(this, arguments);
+};
+WLXMLTextNode.prototype = Object.create(smartxml.TextNode.prototype);
+$.extend(WLXMLTextNode.prototype, WLXMLDocumentNodeMethods);
+
 var WLXMLDocument = function(xml, options) {
     this.classMethods = {};
     this.classTransformations = {};
@@ -188,6 +221,7 @@ var formatter_prefix = '_wlxml_formatter_';
 WLXMLDocument.prototype = Object.create(smartxml.Document.prototype);
 $.extend(WLXMLDocument.prototype, {
     ElementNodeFactory: WLXMLElementNode,
+    TextNodeFactory: WLXMLTextNode,
     loadXML: function(xml) {
         smartxml.Document.prototype.loadXML.call(this, xml, {silent: true});
         this.trigger('contentSet');
@@ -353,7 +387,8 @@ return {
         return this.WLXMLDocumentFromXML(xml).root;
     },
 
-    WLXMLDocument: WLXMLDocument
+    WLXMLDocument: WLXMLDocument,
+    getClassHierarchy: getClassLists
 };
 
 });
\ No newline at end of file