nisp
Version:
A language that for easily build cross-language language
117 lines (116 loc) • 3.29 kB
JavaScript
;
exports.__esModule = true;
function walk(obj, cb, path, nodes) {
var type = typeof obj;
if (type === 'object') {
if (obj === null) {
cb('null', obj, path);
}
else {
if (nodes.indexOf(obj) > -1)
throw new TypeError('cycled object');
else
nodes.push(obj);
if (typeof obj.length === 'number') {
cb('array-start', obj, path);
for (var i = 0; i < obj.length; i++) {
var node = obj[i];
var p = path.concat(i);
if (i === 0)
cb('array-first', node, p);
else
cb('array', node, p);
walk(node, cb, p, nodes);
}
cb('array-end', obj, path);
}
else {
cb('object-start', obj, path);
var keys = Object.keys(obj);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
var node = obj[key];
var p = path.concat(key);
if (i === 0)
cb('object-first', node, p);
else
cb('object', node, p);
walk(node, cb, p, nodes);
}
cb('object-end', obj, path);
}
}
}
else {
cb(type, obj, path);
}
}
var ret;
var path;
var nodes;
var listSymbol;
var dictSymbol;
var spaces = {};
var space = function (len) {
if (len in spaces) {
return spaces[len];
}
else {
var s = '';
len *= 4;
for (var i = 0; i < len; i++) {
s += ' ';
}
return spaces[len] = s;
}
};
var last = function (arr) { return arr[arr.length - 1]; };
function gen(type, obj, path) {
switch (type) {
case 'null':
case 'undefined':
case 'boolean':
case 'number':
case 'symbol':
case 'function':
ret += obj + '';
break;
case 'string':
ret += "'" + JSON.stringify(obj).slice(1, -1).replace(/\\"/g, "\"").replace(/'/g, "\\'") + "'";
break;
case 'object-start':
ret += '(' + dictSymbol;
break;
case 'object-first':
case 'object':
ret += '\n' + space(path.length) + last(path) + ' ';
break;
case 'object-end':
ret += '\n' + space(path.length) + ')';
break;
case 'array-start':
ret += '(' + listSymbol;
break;
case 'array-first':
case 'array':
ret += '\n' + space(path.length);
break;
case 'array-end':
ret += '\n' + space(path.length) + ')';
break;
default:
throw new TypeError('unknown type: ' + type);
}
}
function default_1(obj, list, dict) {
if (list === void 0) { list = '|'; }
if (dict === void 0) { dict = ':'; }
ret = '';
path = [];
nodes = [];
listSymbol = list;
dictSymbol = dict;
walk(obj, gen, path, nodes);
return ret;
}
exports["default"] = default_1;