nisp
Version:
A language that for easily build cross-language language
154 lines (153 loc) • 4.71 kB
JavaScript
;
exports.__esModule = true;
var extended_1 = require("../parser/extended");
var style_1 = require("./style");
var TPL_CONTAINER = "<pre class=\"nisp-container\">{lines}</pre>";
var TPL_LINE = "<div class=\"nisp-line\">{ranges}</div>";
var TPL_BLOCK = "<div class=\"nisp-block\">{ranges}</div>";
var TPL_RANGE = "<div class=\"nisp-range nisp-{class}\">{range}</div>";
var htmlEscapes = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
'\'': '''
};
var renderRange = function (text, type) {
return TPL_RANGE.replace('{class}', type).replace('{range}', escape(text));
};
var renderLine = function (text) {
return TPL_LINE.replace('{ranges}', text);
};
var renderBlock = function (text) {
return TPL_BLOCK.replace('{ranges}', text);
};
var renderContainer = function (text) {
return TPL_CONTAINER.replace('{lines}', text);
};
var escape = function (value) {
return String(value).replace(/[&<>"']/g, function (l) {
return htmlEscapes[l] || l;
});
};
var comments = function (nodes) {
var ret = [];
if (!nodes) {
return ret;
}
for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
var item = nodes_1[_i];
if (item.type === Type.comment) {
ret.push(item);
}
}
return ret;
};
var Type;
(function (Type) {
Type[Type["blank"] = 0] = "blank";
Type[Type["comment"] = 1] = "comment";
Type[Type["package"] = 2] = "package";
Type[Type["value"] = 3] = "value";
Type[Type["nisp"] = 4] = "nisp";
})(Type || (Type = {}));
var Context = (function () {
function Context() {
this.root = null;
this.first = false;
}
return Context;
}());
var table = (_a = {
start: function (node) {
var context = new Context();
context.root = node;
return renderContainer(table.router(node, context) || '');
},
router: function (node, context) {
if (!node) {
return node;
}
var handler = table[node.type];
if (handler) {
return handler(node, context);
}
return node;
}
},
_a[Type.value] = function (node, context) {
var value = node.value;
var type;
if (context.first) {
type = style_1["default"].name;
context.first = false;
}
else if (value === null) {
type = style_1["default"]["null"];
}
else if (!isNaN(+value)) {
type = style_1["default"].number;
}
else if (String(value).charAt(0) === '\'') {
type = style_1["default"].string;
}
else {
type = style_1["default"].identifier;
}
return renderRange(value, type);
},
_a[Type.blank] = function () {
return '';
},
_a[Type.comment] = function (node) {
var value = node.value;
value = '# ' + value.replace(/^\s*#\s*/, '');
return renderRange(value, style_1["default"].comment);
},
_a[Type.package] = function (node, context) {
var ret = [];
var list = comments(node.left);
list.push(node.value);
list = list.concat(comments(node.right));
ret.push(table.router(list.shift(), context));
if (list.length) {
ret[0] = renderBlock(ret[0]);
for (var _i = 0, list_1 = list; _i < list_1.length; _i++) {
var item = list_1[_i];
ret.push(renderBlock(table.router(item, context)));
}
}
return ret.join('');
},
_a[Type.nisp] = function (node, context) {
var ret = [];
var list = comments(node.left);
list = list.concat(node.value);
list = list.concat(comments(node.right));
ret.push(renderRange('(', style_1["default"].symbol));
if (list.length) {
var top_1 = list[0];
context.first = true;
if (top_1.type === Type.value) {
ret.push(table.router(top_1, context));
list.shift();
}
for (var _i = 0, list_2 = list; _i < list_2.length; _i++) {
var item = list_2[_i];
ret.push(renderLine(table.router(item, context)));
if (item.type === Type.nisp) {
context.first = false;
}
}
}
ret.push(renderRange(')', style_1["default"].symbol));
return ret.join('');
},
_a);
function default_1(code) {
var ast = extended_1.parse(code);
return table.start(ast);
}
exports["default"] = default_1;
;
var _a;