diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-13 22:10:42 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-13 22:10:42 +0100 |
| commit | aac776b1711d1e286812035a28108c622e73994a (patch) | |
| tree | 366673f18143771fabbadb0fcef86d638ce33f43 /lib/html | |
| parent | 2fb7a36230b167aac99fe8d43959833bd3b244dd (diff) | |
Add simplification of nodes
Diffstat (limited to 'lib/html')
| -rw-r--r-- | lib/html/ast.js | 13 | ||||
| -rw-r--r-- | lib/html/index.js | 14 | ||||
| -rw-r--r-- | lib/html/simplify.js | 44 |
3 files changed, 68 insertions, 3 deletions
diff --git a/lib/html/ast.js b/lib/html/ast.js index 25f4874..afecfce 100644 --- a/lib/html/ast.js +++ b/lib/html/ast.js @@ -1,5 +1,8 @@ var _ = require("underscore"); +var htmlPaths = require("../html-paths"); + + function fragment(children) { return { type: "fragment", @@ -8,10 +11,15 @@ function fragment(children) { } function element(tagName, attributes, children) { + return elementWithTag( + htmlPaths.element(tagName, attributes, {fresh: true}), + children); +} + +function elementWithTag(tag, children) { return { type: "element", - tagName: tagName, - attributes: attributes, + tag: tag, children: collapseFragments(children) }; } @@ -31,4 +39,5 @@ function collapseFragments(elements) { exports.fragment = fragment; exports.element = element; +exports.elementWithTag = elementWithTag; exports.text = text; diff --git a/lib/html/index.js b/lib/html/index.js index f9e957a..41d348f 100644 --- a/lib/html/index.js +++ b/lib/html/index.js @@ -1,5 +1,17 @@ -var ast = require("./ast.js"); +var ast = require("./ast"); exports.fragment = ast.fragment; exports.element = ast.element; +exports.elementWithTag = ast.elementWithTag; exports.text = ast.text; + +function pathToNode(path, children) { + var result = ast.fragment(children); + for (var index = path.length - 1; index >= 0; index--) { + result = ast.elementWithTag(path[index], [result]); + } + return result; +} + +exports.pathToNode = pathToNode; +exports.simplify = require("./simplify"); diff --git a/lib/html/simplify.js b/lib/html/simplify.js new file mode 100644 index 0000000..52a1b0a --- /dev/null +++ b/lib/html/simplify.js @@ -0,0 +1,44 @@ +var _ = require("underscore"); + +var ast = require("./ast"); + +function simplify(node) { + return simplifiers[node.type](node); +}; + +var simplifiers = { + fragment: simplifyFragment, + element: simplifyElement, + text: simplifyText +}; + +function simplifyFragment(node) { + return ast.fragment(simplifyNodes(node.children)); +} + +function simplifyElement(node) { + return ast.elementWithTag(node.tag, simplifyNodes(node.children)); +} + +function simplifyText(node) { + return node; +} + +function simplifyNodes(nodes) { + var children = []; + + nodes.map(simplify).forEach(function(child) { + var lastChild = children[children.length - 1]; + if (child.type === "element" && !child.tag.fresh && lastChild && _.isEqual(lastChild.tag, child.tag)) { + child.children.forEach(function(grandChild) { + // Mutation is fine since simplifying elements create a copy of the children. + lastChild.children.push(grandChild); + }); + } else { + children.push(child); + } + }); + return children; +} + +module.exports = simplify; |
