html.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. var parseHtml = require('./parseHtml');
  2. var Stack = require('./Stack');
  3. var isArr = require('./isArr');
  4. var each = require('./each');
  5. var isStr = require('./isStr');
  6. var mapObj = require('./mapObj');
  7. function parse(html) {
  8. var ret = [];
  9. var stack = new Stack();
  10. parseHtml(html, {
  11. start: function(tag, attrs) {
  12. attrs = mapObj(attrs, function(val) {
  13. return unescapeQuote(val);
  14. });
  15. stack.push({
  16. tag: tag,
  17. attrs: attrs
  18. });
  19. },
  20. end: function() {
  21. var node = stack.pop();
  22. if (!stack.size) {
  23. ret.push(node);
  24. return;
  25. }
  26. var lastNode = stack.peek();
  27. if (!isArr(lastNode.content)) {
  28. lastNode.content = [];
  29. }
  30. lastNode.content.push(node);
  31. },
  32. comment: function(text) {
  33. var comment = '<!--'.concat(text, '-->');
  34. var lastNode = stack.peek();
  35. if (!lastNode) {
  36. ret.push(comment);
  37. return;
  38. }
  39. if (!lastNode.content) lastNode.content = [];
  40. lastNode.content.push(comment);
  41. },
  42. text: function(text) {
  43. var lastNode = stack.peek();
  44. if (!lastNode) {
  45. ret.push(text);
  46. return;
  47. }
  48. if (!lastNode.content) lastNode.content = [];
  49. lastNode.content.push(text);
  50. }
  51. });
  52. return ret;
  53. }
  54. function stringify(tree) {
  55. var ret = '';
  56. if (isArr(tree)) {
  57. each(tree, function(node) {
  58. return (ret += stringify(node));
  59. });
  60. } else if (isStr(tree)) {
  61. ret = tree;
  62. } else {
  63. ret += '<'.concat(tree.tag);
  64. each(tree.attrs, function(val, key) {
  65. return (ret += ' '.concat(key, '="').concat(escapeQuote(val), '"'));
  66. });
  67. ret += '>';
  68. if (tree.content) ret += stringify(tree.content);
  69. ret += '</'.concat(tree.tag, '>');
  70. }
  71. return ret;
  72. }
  73. var unescapeQuote = function(str) {
  74. return str.replace(/&quot;/g, '"');
  75. };
  76. var escapeQuote = function(str) {
  77. return str.replace(/"/g, '&quot;');
  78. };
  79. exports = {
  80. parse: parse,
  81. stringify: stringify
  82. };
  83. module.exports = exports;