Test.GtkWriter.vala.c
[app.Builder.js] / JsRender / Node.vala
index 82b20f1..5b8daae 100644 (file)
@@ -2,36 +2,39 @@
 // test..
 // valac gitlive/app.Builder.js/JsRender/Lang.vala gitlive/app.Builder.js/JsRender/Node.vala --pkg gee-1.0 --pkg=json-glib-1.0 -o /tmp/Lang ;/tmp/Lang
 
-class JsRender.Node  {
+public class JsRender.Node  {
     
-    GLib.List<JsRender.Node> items; // child items..
-    
-    Gee.HashMap<string,string> props; // the properties..
-    
-  
+    public GLib.List<Node> items; // child items..
     
+    public Gee.HashMap<string,string> props; // the properties..
+    public Gee.HashMap<string,string> listeners; // the listeners..
+    public string  xvala_cls;
+       public string xvala_xcls; // 'Xcls_' + id;
+    public string xvala_id; // item id or ""
+            
     public bool is_array;
     
-    Node()
+    public Node()
     {
-        this.items = new GLib.List<JsRender.Node>();
+        this.items = new GLib.List<Node>();
         this.props = new Gee.HashMap<string,string>();
+               this.listeners = new Gee.HashMap<string,string>();
         this.is_array = false;
-        
+        this.xvala_xcls = "";
     }
     
     
     
     
-    bool isArray()
+    public bool isArray()
     {
         return this.is_array;
     }
-    bool hasChildren()
+    public bool hasChildren()
     {
         return this.items.length() > 0;
     }
-    bool hasXnsType()
+    public bool hasXnsType()
     {
         if (this.props.get("|xns") != null && this.props.get("xtype") != null) {
             return true;
@@ -39,22 +42,60 @@ class JsRender.Node  {
         }
         return false;
     }
+       public string fqn()
+       {
+               if (!this.hasXnsType ()) {
+                       return "";
+               }
+               return this.props.get("|xns") + "." + this.props.get("xtype"); 
+
+       }
+       
     // wrapper around get props that returns empty string if not found.
-    string get(string key)
+    public string get(string key)
     {
         var k = this.props.get(key);
-        if (k == null) {
-            return "";
-        }
-        return k;
+        if (k != null) {
+                       return k;
+               }
+               
+               k = this.props.get("|" + key);
+               if (k != null) {
+                       
+               return k;
+               }
+        
+        return "";
         
     }
      
     /* creates javascript based on the rules */
+    public Node? findProp(string n) {
+               for(var i=0;i< this.items.length();i++) {
+                       var p = this.items.nth_data(i).get("*prop");
+                       if (this.items.nth_data(i).get("*prop").length < 1) {
+                               continue;
+                       }
+                       if (p == n) {
+                               return this.items.nth_data(i);
+                       }
+               }
+               return null;
+
+       }
+
+       string gLibStringListJoin( string sep, GLib.List<string> ar) 
+       {
+               var ret = "";
+               for (var i = 0; i < ar.length(); i++) {
+                       ret += i>0 ? sep : "";
+                       ret += ar.nth_data(i);
+               }
+               return ret;
+
+       }
     
-  
-    
-    string mungeToString (bool isListener, string pad,  Array<string> doubleStringProps;)
+    public string mungeToString (bool isListener, string pad,  GLib.List<string> doubleStringProps)
     {
         
          
@@ -80,7 +121,7 @@ class JsRender.Node  {
                
         }
         //var newitems = new Gee.ArrayList<JsRender.Node>();
-        var oprops = new Gee.HashMap<string,JsRender.Node>();
+        var oprops = new Gee.HashMap<string,Node>();
         
         if (!isArray && this.hasChildren()) {
             // look for '*props'
@@ -112,7 +153,7 @@ class JsRender.Node  {
                 prop  = prop.substring(0,  -2); //strip []
                 // it's an array type..
                 if (!oprops.has_key(prop)) {
-                    var cn = new JsRender.Node();
+                    var cn = new Node();
                     oprops.set(prop, cn);
                     
                 }
@@ -137,12 +178,12 @@ class JsRender.Node  {
             for (var i=0;i< this.items.length();i++) {
                 var el = this.items.nth_data(i);
                 
-                els.append("%d".printf(i) + " : " + el.mungeToString(false, pad));
+                els.append("%d".printf(i) + " : " + el.mungeToString(false, pad,doubleStringProps));
                 
             }
             var spad = pad.substring(0, pad.length-4);
             return   "{\n" +
-                pad  + string.join(",\n" + pad , els) + 
+                pad  + this.gLibStringListJoin(",\n" + pad , els) + 
                 "\n" + spad +  "}";
                
             
@@ -179,7 +220,7 @@ class JsRender.Node  {
              }
                 
             
-            if (JsRender.Lang.isKeyword(leftv) || JsRender.Lang.isBuiltin(leftv)) {
+            if (Lang.isKeyword(leftv) || Lang.isBuiltin(leftv)) {
                 left = "'" + leftv + "'";
             } else if (Regex.match_simple("[^A-Za-z_]+",leftv)) { // not plain a-z... - quoted.
                 var val = this.quoteString(leftv);
@@ -192,18 +233,19 @@ class JsRender.Node  {
             
             if (isListener) {
             // change the lines...
-                            
-                string str;
+                /*           
+                string str = "";
                 try {
                     str = func_regex.replace(v,v.length, 0, "");
                 } catch(Error e) {
                     print("regex failed");
                     return "";
                 }
-                
+                */
+                               var str = v.strip();
                 var lines = str.split("\n");
-                if (lines.length > 1) {
-                    str = string.join("\n" + pad, lines);
+                if (lines.length > 0) {
+                    str = string.joinv("\n" + pad, lines);
                 }
                 
                 els.append(left  + str);
@@ -216,42 +258,46 @@ class JsRender.Node  {
                 if (v.length < 1) {  //if (typeof(el) == 'string' && !obj[i].length) { //skip empty.
                     continue;
                 }
-                
-                string str;
+                               /*
+                       print(v);
+                string str = "";
                 try {
                     str = func_regex.replace(v,v.length, 0, "");
                 } catch(Error e) {
                     print("regex failed");
                     return "";
                 }
-                
+                */
+                var str = v.strip();
+                                 
                 var lines = str.split("\n");
-                if (lines.length > 1) {
-                    str =  string.join("\n" + pad, lines);
+                                 
+                if (lines.length > 0) {
+                    str =  string.joinv("\n" + pad, lines);
                 }
-                
+                //print("==> " +  str + "\n");
                 els.append(left + str);
                 continue;
             }
             // standard..
             
             
-            if (JsRender.Lang.isNumber(v) || JsRender.Lang.isBoolean(v)) { // boolean or number...?
+            if (Lang.isNumber(v) || Lang.isBoolean(v)) { // boolean or number...?
                 els.append(left + v );
                 continue;
             }
-            /* -- fix me - we need a wrapper that starts this..
+            
             // strings..
-            if (!this.doubleStringProps.length) {
+            if (doubleStringProps.length() < 1) {
                 els.append(left + this.quoteString(v));
                 continue;
             }
            
-            if (this.doubleStringProps.index(k) > -1) {
+            if (doubleStringProps.index(k) > -1) {
                 els.append(left + this.quoteString(v));
                 continue;
             }
-            */
+             
             // single quote.. v.substring(1, v.length-1).replace("'", "\\'") + "'";
             els.append(left + "'" + v.substring(1, v.length-1).replace("'", "\\'") + "'");
             
@@ -265,7 +311,7 @@ class JsRender.Node  {
             var k = iter.get_key();
             var vo = iter.get_value();
             string leftv = k[0] == '|' ? k.substring(1) : k;
-            if (JsRender.Lang.isKeyword(leftv) || JsRender.Lang.isBuiltin(leftv)) {
+            if (Lang.isKeyword(leftv) || Lang.isBuiltin(leftv)) {
                 left = "'" + leftv + "'";
             } else if (Regex.match_simple("[^A-Za-z_]+",leftv)) { // not plain a-z... - quoted.
                 var val = this.quoteString(leftv);
@@ -276,7 +322,7 @@ class JsRender.Node  {
             }
             left += " : ";
             
-            var right = vo.mungeToString(k == "listeners", pad + "    ");
+            var right = vo.mungeToString(k == "listeners", pad + "    ",doubleStringProps);
             
             //if (!left.length && isArray) print(right);
             
@@ -286,6 +332,64 @@ class JsRender.Node  {
         
             
         }
+
+
+               if (this.listeners.size > 0) {
+                       // munge the listeners.
+                       //print("ADDING listeners?");
+                       
+                       var liter = this.listeners.map_iterator();
+               
+                   var itms = "listeners : {\n";
+                       var i =0;
+                   while (liter.next()) {
+                               
+                               itms += i >0 ? ",\n" : "";    
+                               // 
+                               var str = liter.get_value().strip();
+                var lines = str.split("\n");
+                if (lines.length > 0) {
+                    str = string.joinv("\n" + pad + "       ", lines);
+                }
+                
+
+                               
+                               itms +=  pad + "    "  + liter.get_key()  + " : " + str;
+
+                               i++;
+                       
+                               
+                       }
+                       itms += "\n" + pad + "}";
+                       //print ( "ADD " + itms); 
+                       els.append(itms);
+
+               }
+
+
+               
+               // finally munge the children...
+               if (this.items.length()> 0) {
+                       var itms = "items : [\n";
+                       for(var i = 0; i < this.items.length();i++) {
+                               // 
+                               itms +=    pad + "    "  +
+                                       this.items.nth_data(i).mungeToString(false, pad + "        ",  doubleStringProps) + "\n";
+
+
+                       }
+                       
+                       els.append(itms);
+               }
+
+               // finally output listeners...
+               
+
+               
+
+
+
+                       
         if (els.length() < 1) {
             return "";
         }
@@ -293,7 +397,7 @@ class JsRender.Node  {
             
         var spad = pad.substring(0, pad.length-4);
         return   "{\n" +
-            pad  + string.join(",\n" + pad , els) + 
+            pad  + gLibStringListJoin(",\n" + pad , els) + 
             "\n" + spad +  "}";
            
            
@@ -303,15 +407,111 @@ class JsRender.Node  {
     }
     static Json.Generator gen = null;
     
-    string quoteString(string str)
+    public string quoteString(string str)
     {
         if (Node.gen == null) {
             Node.gen = new Json.Generator();
         }
-        var builder = new Json.Builder();
-        builder.add_string_value(str);
-        Node.gen.set_root (builder.get_root ());
+       var n = new Json.Node(Json.NodeType.VALUE);
+               n.set_string(str);
+        Node.gen.set_root (n);
         return  Node.gen.to_data (null);   
     }
+
+    public void loadFromJson(Json.Object obj) {
+        obj.foreach_member((o , key, value) => {
+                       //print(key+"\n");
+            if (key == "items") {
+                var ar = value.get_array();
+                ar.foreach_element( (are, ix, el) => {
+                    var node = new Node();
+                    node.loadFromJson(el.get_object());
+                    this.items.append(node);
+                });
+                return;
+            }
+            if (key == "listeners") {
+                var li = value.get_object();
+                li.foreach_member((lio , li_key, li_value) => {
+                    this.listeners.set(li_key, li_value.get_string());
+
+                });
+                return;
+            }
+                       var v = value.get_value();
+                       var sv =  Value (typeof (string));
+                       v.transform(ref sv);
+                        
+            this.props.set(key,  (string)sv);
+        });
+        
+
+
+
+    }
+       public string toJsonString()
+    {
+        if (Node.gen == null) {
+            Node.gen = new Json.Generator();
+        }
+        var n = new Json.Node(Json.NodeType.OBJECT);
+               n.set_object(this.toJsonObject () );
+        Node.gen.set_root (n);
+        return  Node.gen.to_data (null);   
+    }
+       
+    public Json.Object toJsonObject()
+       {
+               var ret = new Json.Object();
+
+               // listeners...
+               var li = new Json.Object();
+               ret.set_object_member("listeners", li);
+               var liter = this.listeners.map_iterator();
+        while (liter.next()) {
+                       li.set_string_member(liter.get_key(), liter.get_value());
+               }
+
+               //props
+           var iter = this.props.map_iterator();
+        while (iter.next()) {
+                       this.jsonObjectsetMember(ret, iter.get_key(), iter.get_value());
+               }
+               
+               var ar = new Json.Array();
+               ret.set_array_member("items", ar);
+               
+               // children..
+               for(var i =0;i < this.items.length();i++) {
+                       ar.add_object_element(this.items.nth_data(i).toJsonObject());
+        }
+               return ret;
+               
+       }
+        
+       public void jsonObjectsetMember(Json.Object o, string key, string val) {
+               if (Lang.isBoolean(val)) {
+                       o.set_boolean_member(key, val == "false" ? false : true);
+                       return;
+               }
+               
+               
+               if (Lang.isNumber(val)) {
+                       if (val.contains(".")) {
+                               //print( "ADD " + key + "=" + val + " as a double?\n");
+                               o.set_double_member(key, double.parse (val));
+                               return;
+
+                       }
+                       //print( "ADD " + key + "=" + val + " as a int?\n")  ;
+                       o.set_int_member(key,long.parse(val));
+                       return;
+               }
+               ///print( "ADD " + key + "=" + val + " as a string?\n");
+               o.set_string_member(key,val);
+               
+       }
     
 }