Base = XObject.define(
function(cfg) {
-
+
XObject.extend(this, cfg);
+
},
Object,
{
+ /**
+ * @cfg {Array} doubleStringProps list of properties that can be double quoted.
+ */
+ doubleStringProps : false,
id : false,
name : false, // is the JS name of the file.
title : false, // a title.. ?? nickname.. ??? -
project: false, // name...
- Project : false, // link to container project!
+ //Project : false, // link to container project!
items : false, // the tree of nodes.
var _this = this;
var write = this.toJsonArray()
print("WRITE: " + this.path);// + "\n" + JSON.stringify(write));
- File.write(this.path, JSON.stringify(write));
+ File.write(this.path, JSON.stringify(write, null, 4));
},
/**
{
var ret = { };
var _this = this;
- ['id', 'name', 'parent', 'title', 'path', 'items'].forEach( function(k) {
- ret[k] = _this[k];
+ ['id', 'name', 'parent', 'title', 'path', 'items' , 'permname' ].forEach( function(k) {
+ ret[k] = typeof(_this[k]) == 'undefined' ? '' _this[k];
});
return ret;
},
},
-
+ /**
+ *
+ * munge JSON tree into Javascript code.
+ *
+ * FIXME: + or / prefixes to properties hide it from renderer.
+ * FIXME: '*props' - not supported by this.. ?? - upto rendering code..
+ * FIXME: needs to understand what properties might be translatable (eg. double quotes)
+ *
+ * @arg {object} obj the object or array to munge..
+ * @arg {boolean} isListener - is the array being sent a listener..
+ * @arg {string} pad - the padding to indent with.
+ */
mungeToString: function(obj, isListener, pad)
{
- pad = pad || '';
+ pad = pad || ' ';
var keys = [];
var isArray = false;
isListener = isListener || false;
typeof(obj['|xns']) != 'undefined' &&
typeof(obj['xtype']) != 'undefined'
) {
- els.push('xtype: '+ obj['|xns'] + '.' + obj['xtype']);
+ this.mungeXtype(obj['|xns'] + '.' + obj['xtype'], els);
+ //els.push('xtype: '+ obj['|xns'] + '.' + obj['xtype']);
skip.push('|xns','xtype');
}
- var _this = this;
+
+ if (!isArray && obj.items && obj.items.length) {
+ // look for props..
+ var newitems = [];
+ obj.items.forEach(function(pl) {
+ if (typeof(pl['*prop']) == 'undefined') {
+ newitems.push(pl);
+ return;
+ }
+ // we have a prop...
+ var prop = pl['*prop'] + '';
+ delete pl['*prop'];
+ if (!prop.match(/\[\]$/)) {
+ // it's a standard prop..
+ obj[prop] = pl;
+ keys.push(prop);
+ return;
+ }
+ prop = prop.substring(0, prop.length -2); //strip []
+ // it's an array type..
+ obj[prop] = obj[prop] || [];
+ obj[prop].push(pl);
+ print("ADDNG PROP:" + prop + ' ' + keys.indexOf(prop) );
+ if (keys.indexOf(prop) < 0) {
+ keys.push(prop);
+ }
+
+
+
+ });
+ obj.items = newitems;
+ if (!obj.items.length) {
+ delete obj.items;
+ }
+
+ }
+
+
+ var _this = this;
+
+ var left = '';
+
keys.forEach(function(i) {
+
+ if (typeof(obj[i]) == 'undefined') { // empty or removed.
+ return;
+ }
var el = obj[i];
if (!isArray && skip.indexOf(i) > -1) { // things we do not write..
return;
}
-
- if (isListener) {
- if (!_this.withDebug) {
- // do not write listeners unless we are debug mode.
- return;
+ if (!isArray) {
+ // set the key to be quoted with singel quotes..
+ var leftv = i[0] == '|' ? i.substring(1) : i;
+ if (Lang.isKeyword(leftv) || Lang.isBuiltin(leftv)) {
+ left = "'" + leftv + "'";
+ } else if (leftv.match(/[^A-Z_]+/i)) { // not plain a-z... - quoted.
+ var val = JSON.stringify(leftv);
+ left = "'" + val.substring(1, val.length-1).replace(/'/g, "\\'") + "'";
+ } else {
+ left = '' + leftv;
}
- //if (obj[i].match(new RegExp("Gtk.main" + "_quit"))) { // we can not handle this very well..
- // return;
- // }
+ left += ' : ';
+
+ }
+ if (isListener) {
+ // change the lines...
var str= ('' + obj[i]).replace(/^\s+|\s+$/g,"");
var lines = str.split("\n");
if (lines.length > 1) {
str = lines.join("\n" + pad);
}
- els.push(JSON.stringify(i) + ":" + str);
+ els.push(left + str);
return;
}
+
-
- var left = isArray ? '' : (JSON.stringify(i) + " : " )
+ //var left = isArray ? '' : (JSON.stringify(i) + " : " )
if (i[0] == '|') {
// does not hapepnd with arrays..
if (typeof(el) == 'object') {
- els.push(left + _this.mungeToString(el, i == 'listeners', pad + ' '));
- return;
- }
- // standard. .
-
- els.push(left + JSON.stringify(obj[i]));
- });
- var spad = pad.substring(0, pad.length-4);
- return (isArray ? '[' : '{') + "\n" +
- pad + els.join(",\n" + pad ) +
- "\n" + spad + (isArray ? ']' : '}');
-
-
-
- },
-
-
-
-
- objectToJsString : function (o, ind)
- {
- ind = ind || 0;
-
-
- var ret = '';
- var ix = new Array(ind+1).join(" ");
- var ix1 = new Array(ind).join(" ");
- for (var k in o) {
- var v = o[k];
- if (k[0] == '+') { // + means hide from renderer.. we do not save this.
- continue;
- }
- if (k[0] == '/') { // means hide from renderer.. we prefix the col with it..
- continue;
- }
-
-
- if (typeof(v) == 'object') {
- if ((v.constructor != Array) && !this.objectKeys(v).length) {
- continue;
+ // we can skip empty items lists and empty listeners..
+ //if (!isArray && i == 'items' && !el.length) {
+ // return;
+ //}
+ //
+ var right = _this.mungeToString(el, i == 'listeners', pad + ' ');
+ if (typeof(right) != 'undefined') {
+ els.push(left + right);
}
- if ((v.constructor == Array) && !v.length && k == 'items') {
- continue;
- }
- }
- ret += ret.length ? ",\n" : '';
- var kk = k[0] == '|' ? k.substring(1) : k;
- if (typeof(o['//' + kk]) != 'undefined') {
- ret += ix + o['//' + kk].split("\n").join( "\n" + ix) + "\n";
+ return;
}
-
- switch(typeof(v)) {
- case 'object':
- if (v.constructor == Array) {
- ret += ix + this.toJsProp(k) + ' : ' + this.arrayToJsString(v, ind+1);
- continue;
- }
-
-
- ret += ix + this.toJsProp(k) + ' : ' + this.objectToJsString(v, ind+1);
- continue;
-
- case 'boolean' :
- ret += ix + this.toJsProp(k) + ' : ' + (v ? 'true' : 'false');
- continue;
-
- case 'number' :
- ret += ix + this.toJsProp(k) + ' : ' + v;
- continue;
-
-
- case 'string':
- if (k[0] == '|') {
- ret += ix + this.toJsProp(k) + ' : ' + v.split("\n").join( "\n" + ix);
- continue;
- }
- // fallthru
-
- default:
- // we should use special stuff here to determine if it's a singly or dobuley
- // quoted string..
- ret += ix + this.toJsProp(k) + ' : ' + this.stringToJsString(v, k, o);
- continue;
-
-
- }
- }
- return "{\n" + ret + "\n" + ix1 + '}';
-
- },
- arrayToJsString : function (ar, ind)
- {
- var isobjar = false;
- ar.forEach( function(o) {
- if (typeof(o) == 'object' && (o.constructor != Array)) {
- isobjar = true;
+ // standard. .
+ if (typeof(obj[i]) != 'string') {
+ els.push(left + JSON.stringify(obj[i]));
+ return;
}
- });
- var ix = '';
- var ix1 = '';
- var cr = ', ';
- var lb = ' ';
- if (isobjar) {
- ix = new Array(ind+1).join(" ");
- ix1 = new Array(ind).join(" ");
- cr = ",\n";
- lb = "\n";
-
- }
- // array of parts...
- var ret = '';
- var _this = this;
- ar.forEach( function(v, n) {
- // skip blank last element in an array
- if ((n == (ar.length -1)) && typeof(v) == 'undefined') {
+ // strings..
+ if (!_this.doubleStringProps) {
+ els.push(left + JSON.stringify(obj[i]));
return;
}
-
- // empty objects in array?
- if (typeof(v) == 'object' && v.constructor != Array) {
- if (!_this.objectKeys(v).length) {
- return;
- }
+ if (_this.doubleStringProps.indexOf(i) > -1) {
+ els.push(left + JSON.stringify(obj[i]));
+ return;
}
-
-
- ret += ret.length ? cr : '';
+ // single quote..
+ els.push(left + "'" + obj[i].replace(/'/g, "\\'") + "'");
- switch(typeof(v)) {
-
- case 'object':
- if (v.constructor == Array) {
-
- ret += ix + _this.arrayToJsString(v, ind+1);
- return;
- }
-
- ret += ix + _this.objectToJsString(v, ind+1);
- return;
-
- case 'boolean' :
- ret += ix + (v ? 'true' : 'false');
- return;
-
- case 'number' :
- ret += ix + v;
- return;
-
-
- case 'string':
- if (k[0] == '|') {
- ret += ix + v.split("\n").join( "\n" + ix);
- return;
- }
- // fallthru
-
- default:
- // we should use special stuff here to determine if it's a singly or dobuley
- // quoted string..
- ret += ix + JSON.stringify(v);
- return;
-
-
- }
-
+
});
- return "[" + lb + ret + lb + ix1 + "]";
- },
- stringToJsString : function(v, k , o) {
- // since most properties can use single quotes (non-translatable)
- // we try to fix this here..
- var val = JSON.stringify(v);
- if (['xns', 'xtype' ].indexOf(k) > -1) {
- return "'" + val.substring(1, val.length-1).replace(/'/, "\\'") + "'";
+ if (!isArray && !els.length) {
+ return;
}
- return val;
+ //output the thing.
+ var spad = pad.substring(0, pad.length-4);
+ return (isArray ? '[' : '{') + "\n" +
+ pad + els.join(",\n" + pad ) +
+ "\n" + spad + (isArray ? ']' : '}');
+
- },
-
-
- toJsProp: function(v) {
- var vv = v[0] == '|' ? v.substring(1) : v;
- if (Lang.isKeyword(vv) || Lang.isBuiltin(vv)) {
- return "'" + vv + "'";
- }
- if (vv.match(/[^A-Z_]+/i)) {
- var val = JSON.stringify(vv);
- return "'" + val.substring(1, val.length-1).replace(/'/, "\\'") + "'";
- }
- return vv;
- }
+ }
+
}
+
+
+
);