var util = require("util"); var _ = require("underscore"); exports.HtmlGenerator = HtmlGenerator; function HtmlGenerator() { var stack = []; var fragments = []; function text(value) { fragments.push(escapeHtml(value)) } function asString() { popAll(); return fragments.join(""); } function style(style) { var firstFreshPartIndex = findIndex(style, function(part) { return part.fresh; }); var partIndex = 0; while (partIndex < firstFreshPartIndex && style[partIndex].tagName === stack[partIndex]) { partIndex++; } while (stack.length > partIndex) { pop(); } for (; partIndex < style.length; partIndex++) { push(style[partIndex].tagName); } } function push(element) { stack.push(element); fragments.push(util.format("<%s>", element)); } function pop() { var element = stack.pop(); fragments.push(util.format("", element)); } function popAll() { while (stack.length > 0) { pop(); } } return { style: style, text: text, asString: asString }; } function escapeHtml(value) { return value .replace(/&/g, '&') .replace(/"/g, '"') .replace(//g, '>'); } function findIndex(array, predicate) { for (var i = 0; i < array.length; i++) { if (predicate(array[i])) { return i; } } return -1; }