sync
[roojs1] / Roo / htmleditor / TidyWriter.js
index e4ca3a0..dfb1144 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Known issues?
  * - not tested much with 'PRE' formated elements.
- * - long text inside of inline can be wrapped and clened?
+ * 
  *
  *
  */
@@ -23,23 +23,7 @@ Roo.htmleditor.TidyWriter = function(settings)
 }
 Roo.htmleditor.TidyWriter.prototype = {
 
-
-
-    makeMap : function (items, delim, map) {
-               var i;
-               items = items || [];
-               delim = delim || ',';
-               if (typeof items == "string") {
-                       items = items.split(delim);
-               }
-               map = map || {};
-               i = items.length;
-               while (i--) {
-                       map[items[i]] = {};
-               }
-               return map;
-       },
-
     state : false,
     
     indent :  '  ',
@@ -72,17 +56,35 @@ Roo.htmleditor.TidyWriter.prototype = {
         
         var is_short   = empty ? Roo.htmleditor.TidyWriter.shortend_elements.indexOf(name) > -1 : false;
         
-        var i_inline = name == 'BR' ? false : in_inline;
+        var add_lb = name == 'BR' ? false : in_inline;
+        
+        if (!add_lb && !this.in_pre && this.lastElementEndsWS()) {
+            i_inline = false;
+        }
 
-        var indentstr = i_inline || this.in_pre ? '' : this.indentstr;
+        var indentstr =  this.indentstr;
         
         // e_inline = elements that can be inline, but still allow \n before and after?
         // only 'BR' ??? any others?
-        var e_inline = name == 'BR' ? false : this.in_inline;
         
-        // if this element is inline - then don't add stuff beforehand..
-        if (!e_inline && !this.in_pre) {
-            this.addLine();
+        // ADD LINE BEFORE tage
+        if (!this.in_pre) {
+            if (in_inline) {
+                //code
+                if (name == 'BR') {
+                    this.addLine();
+                } else if (this.lastElementEndsWS()) {
+                    this.addLine();
+                } else{
+                    // otherwise - no new line. (and dont indent.)
+                    indentstr = '';
+                }
+                
+            } else {
+                this.addLine();
+            }
+        } else {
+            indentstr = '';
         }
         
         this.html.push(indentstr + '<', name.toLowerCase());
@@ -128,7 +130,7 @@ Roo.htmleditor.TidyWriter.prototype = {
         
         
         this.pushState({
-            indentstr : in_pre || in_inline ? '' : (this.indentstr + this.indent),
+            indentstr : in_pre   ? '' : (this.indentstr + this.indent),
             in_pre : in_pre,
             in_inline :  in_inline
         });
@@ -142,6 +144,17 @@ Roo.htmleditor.TidyWriter.prototype = {
          
         
     },
+    
+    lastElementEndsWS : function()
+    {
+        var value = this.html.length > 0 ? this.html[this.html.length-1] : false;
+        if (value === false) {
+            return true;
+        }
+        return value.match(/\s+$/);
+        
+    },
+    
     /**
      * Writes the a end element such as </p>.
      *
@@ -179,26 +192,76 @@ Roo.htmleditor.TidyWriter.prototype = {
         if (text.length < 1) {
             return;
         }
-        if (this.in_pre || this.in_inline) {
+        if (this.in_pre) {
+            this.html[this.html.length] =  text;
+            return;   
+        }
+        
+        if (this.in_inline) {
+            text = text.replace(/\s+/g,' ') // all white space inc line breaks to a slingle' '
+            if (text != ' ') {
+                text = text.replace(/\s+/,' ')  // all white space to single white space
+                
+                    
+                // if next tag is '<BR>', then we can trim right..
+                if (node.nextSibling &&
+                    node.nextSibling.nodeType == 1 &&
+                    node.nextSibling.nodeName == 'BR' )
+                {
+                    text = text.replace(/\s+$/g,'');
+                }
+                // if previous tag was a BR, we can also trim..
+                if (node.previousSibling &&
+                    node.previousSibling.nodeType == 1 &&
+                    node.previousSibling.nodeName == 'BR' )
+                {
+                    text = this.indentstr +  text.replace(/^\s+/g,'');
+                }
+                if (text.match(/\n/)) {
+                    text = text.replace(
+                        /(?![^\n]{1,64}$)([^\n]{1,64})\s/g, '$1\n' + this.indentstr
+                    );
+                    // remoeve the last whitespace / line break.
+                    text = text.replace(/\n\s+$/,'');
+                }
+                // repace long lines
+                
+            }
+             
             this.html[this.html.length] =  text;
             return;   
         }
-        // see if last element was a inline element.
+        // see if previous element was a inline element.
         var indentstr = this.indentstr;
+   
+        text = text.replace(/\s+/g," "); // all whitespace into single white space.
+        
+        // should trim left?
         if (node.previousSibling &&
             node.previousSibling.nodeType == 1 &&
             Roo.htmleditor.TidyWriter.inline_elements.indexOf(node.previousSibling.nodeName) > -1)
         {
             indentstr = '';
+            
         } else {
             this.addLine();
+            text = text.replace(/^\s+/,''); // trim left
+          
         }
+        // should trim right?
+        if (node.nextSibling &&
+            node.nextSibling.nodeType == 1 &&
+            Roo.htmleditor.TidyWriter.inline_elements.indexOf(node.nextSibling.nodeName) > -1)
+        {
+          // noop
             
+        }  else {
+            text = text.replace(/\s+$/,''); // trim right
+        }
+         
+              
         
         
-        text = text.replace(/\s/g," ") // all line breaks to ' '
-                .replace(/^\s+/,'')  // leding white space
-                .replace(/\s+$/,''); // clean trailing white space
         
         if (text.length < 1) {
             return;