aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/html/ast.js24
-rw-r--r--lib/html/index.js4
-rw-r--r--tests/html/ast.tests.js14
3 files changed, 42 insertions, 0 deletions
diff --git a/lib/html/ast.js b/lib/html/ast.js
new file mode 100644
index 0000000..f5f38da
--- /dev/null
+++ b/lib/html/ast.js
@@ -0,0 +1,24 @@
+var _ = require("underscore");
+
+function fragment(children) {
+ return {
+ type: "fragment",
+ children: collapseFragments(children || [])
+ };
+}
+
+function text(value) {
+ return {
+ type: "text",
+ value: value
+ };
+}
+
+function collapseFragments(elements) {
+ return _.flatten(elements.map(function(element) {
+ return element.type === "fragment" ? element.children : [element];
+ }), true)
+}
+
+exports.fragment = fragment;
+exports.text = text;
diff --git a/lib/html/index.js b/lib/html/index.js
new file mode 100644
index 0000000..5e28f7b
--- /dev/null
+++ b/lib/html/index.js
@@ -0,0 +1,4 @@
+var ast = require("./ast.js");
+
+exports.fragment = ast.fragment;
+exports.text = ast.text;
diff --git a/tests/html/ast.tests.js b/tests/html/ast.tests.js
new file mode 100644
index 0000000..1920e63
--- /dev/null
+++ b/tests/html/ast.tests.js
@@ -0,0 +1,14 @@
+var assert = require("assert");
+
+var test = require("../testing").test;
+var html = require("../../lib/html");
+
+
+describe("HTML ast", function() {
+ test("nested fragments are collapsed", function() {
+ assert.deepEqual(
+ html.fragment([html.fragment([html.text("Hello")])]),
+ html.fragment([html.text("Hello")]));
+ });
+});
+