// 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;
}
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)
{
}
//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'
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);
}
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 + "}";
}
- 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);
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);
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("'", "\\'") + "'");
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);
}
left += " : ";
- var right = vo.mungeToString(k == "listeners", pad + " ");
+ var right = vo.mungeToString(k == "listeners", pad + " ",doubleStringProps);
//if (!left.length && isArray) print(right);
}
+
+
+ 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 "";
}
var spad = pad.substring(0, pad.length-4);
return "{\n" +
- pad + string.join(",\n" + pad , els) +
+ pad + gLibStringListJoin(",\n" + pad , els) +
"\n" + spad + "}";
}
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);
+
+ }
}