Roo/form/ComboBoxArray.js
[roojs1] / Roo / DomTemplate.js
index 2a7064d..a971190 100644 (file)
@@ -45,13 +45,23 @@ Roo.DomTemplate = function()
 
 
 Roo.extend(Roo.DomTemplate, Roo.Template, {
-
+    /**
+     * id counter for sub templates.
+     */
     id : 0,
+    /**
+     * flag to indicate if dom parser is inside a pre,
+     * it will strip whitespace if not.
+     */
+    inPre : false,
     
     /**
      * The various sub templates
      */
     tpls : false,
+    
+    
+    
     /**
      *
      * basic tag replacing syntax
@@ -65,11 +75,19 @@ Roo.extend(Roo.DomTemplate, Roo.Template, {
 
     
     iterChild : function (node, method) {
+        
+        var oldPre = this.inPre;
+        if (node.tagName == 'PRE') {
+            this.inPre = true;
+        }
         for( var i = 0; i < node.childNodes.length; i++) {
             method.call(this, node.childNodes[i]);
         }
+        this.inPre = oldPre;
     },
     
+    
+    
     /**
      * compile the template
      *
@@ -128,8 +146,14 @@ Roo.extend(Roo.DomTemplate, Roo.Template, {
         // test for
         //Roo.log(node);
         
+        
         // skip anything not a tag..
         if (node.nodeType != 1) {
+            if (node.nodeType == 3 && !this.inPre) {
+                // reduce white space..
+                node.nodeValue = node.nodeValue.replace(/\s+/g, ' '); 
+                
+            }
             return;
         }
         
@@ -147,6 +171,8 @@ Roo.extend(Roo.DomTemplate, Roo.Template, {
             
             
         };
+        
+        
         switch(true) {
             case (node.hasAttribute('roo-for')): tpl.attr = 'for'; break;
             case (node.hasAttribute('roo-if')): tpl.attr = 'if'; break;
@@ -154,19 +180,24 @@ Roo.extend(Roo.DomTemplate, Roo.Template, {
             case (node.hasAttribute('roo-exec')): tpl.attr = 'exec'; break;
             // no default..
         }
+        
+        
         if (!tpl.attr) {
             // just itterate children..
-            this.iterChild(node,this.compileNode)
+            this.iterChild(node,this.compileNode);
             return;
         }
         tpl.uid = this.id++;
-        var value = node.getAttribute('roo-' +  tpl.attr);
+        tpl.value = node.getAttribute('roo-' +  tpl.attr);
         node.removeAttribute('roo-'+ tpl.attr);
         if (tpl.attr != 'name') {
             var placeholder = document.createTextNode('{domtpl' + tpl.uid + '}');
             node.parentNode.replaceChild(placeholder,  node);
         } else {
-            node.parentNode.removeChild(node);
+            
+            var placeholder =  document.createElement('span');
+            placeholder.className = 'roo-tpl-' + tpl.value;
+            node.parentNode.replaceChild(placeholder,  node);
         }
         
         // parent now sees '{domtplXXXX}
@@ -199,7 +230,7 @@ Roo.extend(Roo.DomTemplate, Roo.Template, {
                 break;
             
             case 'name':
-                tpl.id  = value; // replace non characters???
+                tpl.id  = tpl.value; // replace non characters???
                 break;
             
         }
@@ -210,65 +241,11 @@ Roo.extend(Roo.DomTemplate, Roo.Template, {
         
         
     },
-     
     /**
-     * same as applyTemplate, except it's done to one of the subTemplates
-     * when using named templates, you can do:
-     *
-     * var str = pl.applySubTemplate('your-name', values);
-     *
+     * Compile a segment of the template into a 'sub-template'
      * 
-     * @param {Number} id of the template
-     * @param {Object} values to apply to template
-     * @param {Object} parent (normaly the instance of this object)
+     *
      */
-    applySubTemplate : function(id, values, parent)
-    {
-        
-        
-        var t = this.tpls[id];
-        
-        
-        try { 
-            if(t.ifCall && !t.ifCall.call(this, values, parent)){
-                return '';
-            }
-        } catch(e) {
-            Roo.log("Xtemplate.applySubTemplate 'test': Exception thrown");
-            Roo.log(e.toString());
-            Roo.log(t.ifCall);
-            return ''
-        }
-        try { 
-            
-            if(t.execCall && t.execCall.call(this, values, parent)){
-                return '';
-            }
-        } catch(e) {
-            Roo.log("Xtemplate.applySubTemplate 'exec': Exception thrown");
-            Roo.log(e.toString());
-            Roo.log(t.execCall);
-            return ''
-        }
-        try {
-            var vs = t.forCall ? t.forCall.call(this, values, parent) : values;
-            parent = t.target ? values : parent;
-            if(t.forCall && vs instanceof Array){
-                var buf = [];
-                for(var i = 0, len = vs.length; i < len; i++){
-                    buf[buf.length] = t.compiled.call(this, vs[i], parent);
-                }
-                return buf.join('');
-            }
-            return t.compiled.call(this, vs, parent);
-        } catch (e) {
-            Roo.log("Xtemplate.applySubTemplate : Exception thrown");
-            Roo.log(e.toString());
-            Roo.log(t.compiled);
-            return '';
-        }
-    },
-
     compileTpl : function(tpl)
     {
         var fm = Roo.util.Format;
@@ -356,6 +333,81 @@ Roo.extend(Roo.DomTemplate, Roo.Template, {
         
         return this;
     },
+     
+    /**
+     * same as applyTemplate, except it's done to one of the subTemplates
+     * when using named templates, you can do:
+     *
+     * var str = pl.applySubTemplate('your-name', values);
+     *
+     * 
+     * @param {Number} id of the template
+     * @param {Object} values to apply to template
+     * @param {Object} parent (normaly the instance of this object)
+     */
+    applySubTemplate : function(id, values, parent)
+    {
+        
+        
+        var t = this.tpls[id];
+        
+        
+        try { 
+            if(t.ifCall && !t.ifCall.call(this, values, parent)){
+                Roo.log('if call on ' + t.value + ' return false');
+                return '';
+            }
+        } catch(e) {
+            Roo.log('Xtemplate.applySubTemplate('+ id+ '): Exception thrown on roo-if="' + t.value + '" - ' + e.toString());
+            Roo.log(values);
+          
+            return '';
+        }
+        try { 
+            
+            if(t.execCall && t.execCall.call(this, values, parent)){
+                return '';
+            }
+        } catch(e) {
+            Roo.log('Xtemplate.applySubTemplate('+ id+ '): Exception thrown on roo-for="' + t.value + '" - ' + e.toString());
+            Roo.log(values);
+            return '';
+        }
+        
+        try {
+            var vs = t.forCall ? t.forCall.call(this, values, parent) : values;
+            parent = t.target ? values : parent;
+            if(t.forCall && vs instanceof Array){
+                var buf = [];
+                for(var i = 0, len = vs.length; i < len; i++){
+                    try {
+                        buf[buf.length] = t.compiled.call(this, vs[i], parent);
+                    } catch (e) {
+                        Roo.log('Xtemplate.applySubTemplate('+ id+ '): Exception thrown on body="' + t.value + '" - ' + e.toString());
+                        Roo.log(e.body);
+                        //Roo.log(t.compiled);
+                        Roo.log(vs[i]);
+                    }   
+                }
+                return buf.join('');
+            }
+        } catch (e) {
+            Roo.log('Xtemplate.applySubTemplate('+ id+ '): Exception thrown on roo-for="' + t.value + '" - ' + e.toString());
+            Roo.log(values);
+            return '';
+        }
+        try {
+            return t.compiled.call(this, vs, parent);
+        } catch (e) {
+            Roo.log('Xtemplate.applySubTemplate('+ id+ '): Exception thrown on body="' + t.value + '" - ' + e.toString());
+            Roo.log(e.body);
+            //Roo.log(t.compiled);
+            Roo.log(values);
+            return '';
+        }
+    },
+
+   
 
     applyTemplate : function(values){
         return this.master.compiled.call(this, values, {});