smartxml: trigger events on attr change
[fnpeditor.git] / src / wlxml / wlxml.js
index 1619e57..40f070c 100644 (file)
@@ -21,11 +21,14 @@ $.extend(WLXMLElementNode.prototype, smartxml.ElementNode.prototype, {
     getClass: function() {
         return this.getAttr('class');
     },
     getClass: function() {
         return this.getAttr('class');
     },
+    setClass: function(klass) {
+        return this.setAttr('class', klass);
+    },
     getMetaAttributes: function() {
     getMetaAttributes: function() {
-        var toret = {};
+        var toret = [];
         this.getAttrs().forEach(function(attr) {
             if(isMetaAttribute(attr.name)) {
         this.getAttrs().forEach(function(attr) {
             if(isMetaAttribute(attr.name)) {
-                toret[attr.name.substr(5)] = attr.value;
+                toret.push({name: attr.name.substr(5), value: attr.value});
             }
         });
         return toret;
             }
         });
         return toret;
@@ -44,6 +47,38 @@ $.extend(WLXMLElementNode.prototype, smartxml.ElementNode.prototype, {
 
 var WLXMLDocument = function(xml) {
     smartxml.Document.call(this, xml);
 
 var WLXMLDocument = function(xml) {
     smartxml.Document.call(this, xml);
+
+    $(this.dom).find(':not(iframe)').addBack().contents()
+    .filter(function() {return this.nodeType === Node.TEXT_NODE;})
+    .each(function() {
+        var el = $(this),
+            text = {original: el.text(), trimmed: $.trim(el.text())},
+            elParent = el.parent(),
+            hasSpanParent = elParent.prop('tagName') === 'SPAN',
+            hasSpanBefore = el.prev().length && $(el.prev()).prop('tagName') === 'SPAN',
+            hasSpanAfter = el.next().length && $(el.next()).prop('tagName') === 'SPAN';
+
+
+        text.transformed = text.trimmed;
+
+        if(hasSpanParent || hasSpanBefore || hasSpanAfter) {
+            var startSpace = /\s/g.test(text.original.substr(0,1)),
+                endSpace = /\s/g.test(text.original.substr(-1)) && text.original.length > 1;
+            text.transformed = (startSpace && (hasSpanParent || hasSpanBefore) ? ' ' : '');
+            text.transformed += text.trimmed;
+            text.transformed += (endSpace && (hasSpanParent || hasSpanAfter) ? ' ' : '');
+        } else {
+            if(text.trimmed.length === 0 && text.original.length > 0 && elParent.contents().length === 1) {
+                text.transformed = ' ';
+            }
+        }
+
+        if(!text.transformed) {
+            el.remove();
+            return true; // continue
+        }
+        el.replaceWith(document.createTextNode(text.transformed));
+    });
 };
 WLXMLDocument.prototype = Object.create(smartxml.Document.prototype);
 $.extend(WLXMLDocument.prototype, {
 };
 WLXMLDocument.prototype = Object.create(smartxml.Document.prototype);
 $.extend(WLXMLDocument.prototype, {