var parseHtml = require('./parseHtml'); var Stack = require('./Stack'); var isArr = require('./isArr'); var each = require('./each'); var isStr = require('./isStr'); var mapObj = require('./mapObj'); function parse(html) { var ret = []; var stack = new Stack(); parseHtml(html, { start: function(tag, attrs) { attrs = mapObj(attrs, function(val) { return unescapeQuote(val); }); stack.push({ tag: tag, attrs: attrs }); }, end: function() { var node = stack.pop(); if (!stack.size) { ret.push(node); return; } var lastNode = stack.peek(); if (!isArr(lastNode.content)) { lastNode.content = []; } lastNode.content.push(node); }, comment: function(text) { var comment = ''); var lastNode = stack.peek(); if (!lastNode) { ret.push(comment); return; } if (!lastNode.content) lastNode.content = []; lastNode.content.push(comment); }, text: function(text) { var lastNode = stack.peek(); if (!lastNode) { ret.push(text); return; } if (!lastNode.content) lastNode.content = []; lastNode.content.push(text); } }); return ret; } function stringify(tree) { var ret = ''; if (isArr(tree)) { each(tree, function(node) { return (ret += stringify(node)); }); } else if (isStr(tree)) { ret = tree; } else { ret += '<'.concat(tree.tag); each(tree.attrs, function(val, key) { return (ret += ' '.concat(key, '="').concat(escapeQuote(val), '"')); }); ret += '>'; if (tree.content) ret += stringify(tree.content); ret += ''); } return ret; } var unescapeQuote = function(str) { return str.replace(/"/g, '"'); }; var escapeQuote = function(str) { return str.replace(/"/g, '"'); }; exports = { parse: parse, stringify: stringify }; module.exports = exports;