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.

86 lines
1.7 KiB

4 years ago
  1. /*
  2. Module Dependencies
  3. */
  4. var htmlparser = require('htmlparser2');
  5. /*
  6. Parser
  7. */
  8. exports = module.exports = function(content, options) {
  9. var dom = exports.evaluate(content, options),
  10. // Generic root element
  11. root = exports.evaluate('<root></root>', options)[0];
  12. root.type = 'root';
  13. // Update the dom using the root
  14. exports.update(dom, root);
  15. return root;
  16. };
  17. exports.evaluate = function(content, options) {
  18. // options = options || $.fn.options;
  19. var dom;
  20. if (typeof content === 'string' || Buffer.isBuffer(content)) {
  21. dom = htmlparser.parseDOM(content, options);
  22. } else {
  23. dom = content;
  24. }
  25. return dom;
  26. };
  27. /*
  28. Update the dom structure, for one changed layer
  29. */
  30. exports.update = function(arr, parent) {
  31. // normalize
  32. if (!Array.isArray(arr)) arr = [arr];
  33. // Update parent
  34. if (parent) {
  35. parent.children = arr;
  36. } else {
  37. parent = null;
  38. }
  39. // Update neighbors
  40. for (var i = 0; i < arr.length; i++) {
  41. var node = arr[i];
  42. // Cleanly remove existing nodes from their previous structures.
  43. var oldParent = node.parent || node.root,
  44. oldSiblings = oldParent && oldParent.children;
  45. if (oldSiblings && oldSiblings !== arr) {
  46. oldSiblings.splice(oldSiblings.indexOf(node), 1);
  47. if (node.prev) {
  48. node.prev.next = node.next;
  49. }
  50. if (node.next) {
  51. node.next.prev = node.prev;
  52. }
  53. }
  54. if (parent) {
  55. node.prev = arr[i - 1] || null;
  56. node.next = arr[i + 1] || null;
  57. } else {
  58. node.prev = node.next = null;
  59. }
  60. if (parent && parent.type === 'root') {
  61. node.root = parent;
  62. node.parent = null;
  63. } else {
  64. node.root = null;
  65. node.parent = parent;
  66. }
  67. }
  68. return parent;
  69. };
  70. // module.exports = $.extend(exports);