UNPKG

nisp

Version:

A language that for easily build cross-language language

154 lines (153 loc) 4.71 kB
"use strict"; 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 = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', '\'': '&#39;' }; 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;