You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.3 KiB
84 lines
2.3 KiB
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 = '<!--'.concat(text, '-->');
|
|
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 += '</'.concat(tree.tag, '>');
|
|
}
|
|
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;
|
|
|