3 // 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
7 GLib.List<JsRender.Node> items; // child items..
9 Gee.HashMap<string,string> props; // the properties..
17 this.items = new GLib.List<JsRender.Node>();
18 this.props = new Gee.HashMap<string,string>();
19 this.is_array = false;
32 return this.items.length() > 0;
36 if (this.props.get("|xns") != null && this.props.get("xtype") != null) {
42 // wrapper around get props that returns empty string if not found.
43 string get(string key)
45 var k = this.props.get(key);
53 /* creates javascript based on the rules */
55 string mungeToString (bool isListener, string pad)
59 pad = pad.length < 1 ? " " : pad;
64 //isListener = isListener || false;
66 //var keys = this.keys();
67 var isArray = this.isArray();
70 var els = new GLib.List<string>();
71 var skip = new Gee.ArrayList<string>();
72 if (!isArray && this.hasXnsType() ) {
73 // this.mungeXtype(obj['|xns'] + '.' + obj['xtype'], els); ??????
80 //var newitems = new Gee.ArrayList<JsRender.Node>();
81 var oprops = new Gee.HashMap<string,JsRender.Node>();
83 if (!isArray && this.hasChildren()) {
86 for (var ii =0; ii< this.items.length(); ii++) {
87 var pl = this.items.nth_data(ii);
88 if (!pl.props.has_key("*prop")) {
93 //print(JSON.stringify(pl,null,4));
95 //var prop = pl['*prop'] + '';
97 var prop = pl.get("*prop");
99 if (! Regex.match_simple("\\[\\]$", prop)) {
100 // it's a standard prop..
102 // munge property..??
103 oprops.set(prop, pl);
110 prop = prop.substring(0, -2); //strip []
111 // it's an array type..
112 if (!oprops.has_key(prop)) {
113 var cn = new JsRender.Node();
114 oprops.set(prop, pl);
117 // ignores the fact it might be duplciated...
118 oprops.get(prop).is_array = true;
119 oprops.get(prop).items.append(pl);
126 //obj.items = newitems;
127 //if (!obj.items.length) {
132 if (this.isArray()) {
135 for (var i=0;i< this.items.length();i++) {
136 var el = this.items.nth_data(i);
138 els.append("%d".printf(i) + " : " + el.mungeToString(false, pad));
141 var spad = pad.substring(0, pad.length-4);
143 pad + string.join(",\n" + pad , els) +
154 func_regex = new Regex("^\\s+|\\s+$");
156 print("failed to build regex");
159 var piter = this.props.map_iterator();
160 while (piter.next() ) {
161 var k = piter.get_key();
162 var v = piter.get_value();
164 if (skip.contains(k) ) {
169 string leftv = k[0] == '|' ? k.substring(1) : k;
170 // skip builder stuff. prefixed with '.' .. just like unix fs..
171 if (leftv[0] == '.') { // |. or . -- do not output..
180 if (JsRender.Lang.isKeyword(leftv) || JsRender.Lang.isBuiltin(leftv)) {
181 left = "'" + leftv + "'";
182 } else if (Regex.match_simple("[^A-Za-z_]+",leftv)) { // not plain a-z... - quoted.
183 var val = this.quoteString(leftv);
185 left = "'" + val.substring(1, val.length-1).replace("'", "\\'") + "'";
192 // change the lines...
193 var str= func_regex.replace(v, v.length, 0, ""); // remove bar. ???
194 var lines = str.split("\n");
195 if (lines.length > 1) {
196 str = string.join("\n" + pad, lines);
199 els.append(left + str);
203 // next.. is it a function..
205 // does not hapepnd with arrays..
206 if (v.length < 1) { //if (typeof(el) == 'string' && !obj[i].length) { //skip empty.
210 var str= func_regex.replace(v,v.length, 0, "");
211 var lines = str.split("\n");
212 if (lines.length > 1) {
213 str = string.join("\n" + pad, lines);
216 els.append(left + str);
222 if (JsRender.Lang.isNumber(v) || JsRender.Lang.isBoolean(v)) { // boolean or number...?
223 els.append(left + v );
226 /* -- fix me - we need a wrapper that starts this..
228 if (!this.doubleStringProps.length) {
229 els.append(left + this.quoteString(v));
233 if (this.doubleStringProps.index(k) > -1) {
234 els.append(left + this.quoteString(v));
238 // single quote.. v.substring(1, v.length-1).replace("'", "\\'") + "'";
239 els.append(left + "'" + v.substring(1, v.length-1).replace("'", "\\'") + "'");
246 var iter = oprops.map_iterator();
247 while (iter.next()) {
248 var k = iter.get_key();
249 var vo = iter.get_value();
250 string leftv = k[0] == '|' ? k.substring(1) : k;
251 if (JsRender.Lang.isKeyword(leftv) || JsRender.Lang.isBuiltin(leftv)) {
252 left = "'" + leftv + "'";
253 } else if (Regex.match_simple("[^A-Za-z_]+",leftv)) { // not plain a-z... - quoted.
254 var val = this.quoteString(leftv);
256 left = "'" + val.substring(1, val.length-1).replace("'", "\\'") + "'";
262 var right = vo.mungeToString(k == "listeners", pad + " ");
264 //if (!left.length && isArray) print(right);
266 if (right.length > 0){
267 els.append(left + right);
272 if (els.length < 1) {
277 var spad = pad.substring(0, pad.length-4);
279 pad + string.join(",\n" + pad , els) +
287 static Json.Generator gen = null;
289 string quoteString(string str)
291 if (Node.gen == null) {
292 Node.gen = new Json.Generator();
294 var builder = new Json.Builder();
295 builder.add_string_value(str);
296 Node.gen.set_root (builder.get_root ());
297 return Node.gen.to_data (null);