| /* |
| Module Dependencies |
| */ |
| var htmlparser = require('htmlparser2'); |
| |
| /* |
| Parser |
| */ |
| exports = module.exports = function(content, options) { |
| var dom = exports.evaluate(content, options), |
| // Generic root element |
| root = exports.evaluate('<root></root>', options)[0]; |
| |
| root.type = 'root'; |
| |
| // Update the dom using the root |
| exports.update(dom, root); |
| |
| return root; |
| }; |
| |
| exports.evaluate = function(content, options) { |
| // options = options || $.fn.options; |
| |
| var dom; |
| |
| if (typeof content === 'string' || Buffer.isBuffer(content)) { |
| dom = htmlparser.parseDOM(content, options); |
| } else { |
| dom = content; |
| } |
| |
| return dom; |
| }; |
| |
| /* |
| Update the dom structure, for one changed layer |
| */ |
| exports.update = function(arr, parent) { |
| // normalize |
| if (!Array.isArray(arr)) arr = [arr]; |
| |
| // Update parent |
| if (parent) { |
| parent.children = arr; |
| } else { |
| parent = null; |
| } |
| |
| // Update neighbors |
| for (var i = 0; i < arr.length; i++) { |
| var node = arr[i]; |
| |
| // Cleanly remove existing nodes from their previous structures. |
| var oldParent = node.parent || node.root, |
| oldSiblings = oldParent && oldParent.children; |
| if (oldSiblings && oldSiblings !== arr) { |
| oldSiblings.splice(oldSiblings.indexOf(node), 1); |
| if (node.prev) { |
| node.prev.next = node.next; |
| } |
| if (node.next) { |
| node.next.prev = node.prev; |
| } |
| } |
| |
| if (parent) { |
| node.prev = arr[i - 1] || null; |
| node.next = arr[i + 1] || null; |
| } else { |
| node.prev = node.next = null; |
| } |
| |
| if (parent && parent.type === 'root') { |
| node.root = parent; |
| node.parent = null; |
| } else { |
| node.root = null; |
| node.parent = parent; |
| } |
| } |
| |
| return parent; |
| }; |
| |
| // module.exports = $.extend(exports); |