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.
134 lines
4.0 KiB
134 lines
4.0 KiB
var assert = require("assert");
|
|
|
|
var _ = require("underscore");
|
|
|
|
var test = require("../test")(module);
|
|
var html = require("../../lib/html");
|
|
var htmlPaths = require("../../lib/styles/html-paths");
|
|
|
|
var nonFreshElement = html.nonFreshElement;
|
|
var text = html.text;
|
|
|
|
test("empty text nodes are removed", function() {
|
|
assert.deepEqual(
|
|
simplifyNode(text("")),
|
|
[]
|
|
);
|
|
});
|
|
|
|
test("elements with no children are removed", function() {
|
|
assert.deepEqual(
|
|
simplifyNode(nonFreshElement("p", {}, [])),
|
|
[]
|
|
);
|
|
});
|
|
|
|
test("elements only containing empty nodes are removed", function() {
|
|
assert.deepEqual(
|
|
simplifyNode(nonFreshElement("p", {}, [text("")])),
|
|
[]
|
|
);
|
|
});
|
|
|
|
test("empty children of element are removed", function() {
|
|
assert.deepEqual(
|
|
simplifyNode(nonFreshElement("p", {}, [text("Hello"), text("")])),
|
|
[nonFreshElement("p", {}, [text("Hello")])]
|
|
);
|
|
});
|
|
|
|
test("successive fresh elements are not collapsed", function() {
|
|
var path = htmlPaths.elements([
|
|
htmlPaths.element("p", {}, {fresh: true})
|
|
]);
|
|
var original = concat(
|
|
pathToNodes(path, [text("Hello")]),
|
|
pathToNodes(path, [text(" there")])
|
|
);
|
|
|
|
assert.deepEqual(
|
|
html.simplify(original),
|
|
original);
|
|
});
|
|
|
|
test("successive plain non-fresh elements are collapsed if they have the same tag name", function() {
|
|
var path = htmlPaths.elements([
|
|
htmlPaths.element("p", {}, {fresh: false})
|
|
]);
|
|
assert.deepEqual(
|
|
html.simplify(concat(
|
|
pathToNodes(path, [text("Hello")]),
|
|
pathToNodes(path, [text(" there")])
|
|
)),
|
|
pathToNodes(path, [text("Hello"), text(" there")])
|
|
);
|
|
});
|
|
|
|
test("non-fresh can collapse into preceding fresh element", function() {
|
|
var freshPath = htmlPaths.elements([
|
|
htmlPaths.element("p", {}, {fresh: true})]);
|
|
var nonFreshPath = htmlPaths.elements([
|
|
htmlPaths.element("p", {}, {fresh: false})]);
|
|
assert.deepEqual(
|
|
html.simplify(concat(
|
|
pathToNodes(freshPath, [text("Hello")]),
|
|
pathToNodes(nonFreshPath, [text(" there")])
|
|
)),
|
|
pathToNodes(freshPath, [text("Hello"), text(" there")])
|
|
);
|
|
});
|
|
|
|
test("children of collapsed element can collapse with children of another collapsed element", function() {
|
|
assert.deepEqual(
|
|
html.simplify([
|
|
nonFreshElement("blockquote", {}, [nonFreshElement("p", {}, [text("Hello")])]),
|
|
nonFreshElement("blockquote", {}, [nonFreshElement("p", {}, [text("there")])])
|
|
]),
|
|
[nonFreshElement("blockquote", {}, [nonFreshElement("p", {}, [text("Hello"), text("there")])])]
|
|
);
|
|
});
|
|
|
|
test("empty elements are removed before collapsing", function() {
|
|
var freshPath = htmlPaths.elements([
|
|
htmlPaths.element("p", {}, {fresh: true})]);
|
|
var nonFreshPath = htmlPaths.elements([
|
|
htmlPaths.element("p", {}, {fresh: false})]);
|
|
assert.deepEqual(
|
|
html.simplify(concat(
|
|
pathToNodes(nonFreshPath, [text("Hello")]),
|
|
pathToNodes(freshPath, []),
|
|
pathToNodes(nonFreshPath, [text(" there")])
|
|
)),
|
|
pathToNodes(nonFreshPath, [text("Hello"), text(" there")])
|
|
);
|
|
});
|
|
|
|
test("when separator is present then separator is prepended to collapsed element", function() {
|
|
var unseparatedPath = htmlPaths.elements([
|
|
htmlPaths.element("pre", {}, {fresh: false})
|
|
]);
|
|
var separatedPath = htmlPaths.elements([
|
|
htmlPaths.element("pre", {}, {fresh: false, separator: "\n"})
|
|
]);
|
|
assert.deepEqual(
|
|
html.simplify(concat(
|
|
pathToNodes(unseparatedPath, [text("Hello")]),
|
|
pathToNodes(separatedPath, [text(" the"), text("re")])
|
|
)),
|
|
pathToNodes(unseparatedPath, [text("Hello"), text("\n"), text(" the"), text("re")])
|
|
);
|
|
});
|
|
|
|
function simplifyNode(node) {
|
|
return html.simplify([node]);
|
|
}
|
|
|
|
function concat() {
|
|
return _.flatten(arguments, true);
|
|
}
|
|
|
|
function pathToNodes(path, nodes) {
|
|
return path.wrap(function() {
|
|
return nodes;
|
|
});
|
|
}
|
|
|