UNPKG

nisp

Version:

A language that for easily build cross-language language

117 lines (116 loc) 3.29 kB
"use strict"; 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;