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.
75 lines
1.9 KiB
75 lines
1.9 KiB
var _ = require("underscore");
|
|
|
|
var html = require("../html");
|
|
|
|
exports.topLevelElement = topLevelElement;
|
|
exports.elements = elements;
|
|
exports.element = element;
|
|
|
|
function topLevelElement(tagName, attributes) {
|
|
return elements([element(tagName, attributes, {fresh: true})]);
|
|
}
|
|
|
|
function elements(elementStyles) {
|
|
return new HtmlPath(elementStyles.map(function(elementStyle) {
|
|
if (_.isString(elementStyle)) {
|
|
return element(elementStyle);
|
|
} else {
|
|
return elementStyle;
|
|
}
|
|
}));
|
|
}
|
|
|
|
function HtmlPath(elements) {
|
|
this._elements = elements;
|
|
}
|
|
|
|
HtmlPath.prototype.wrap = function wrap(children) {
|
|
var result = children();
|
|
for (var index = this._elements.length - 1; index >= 0; index--) {
|
|
result = this._elements[index].wrapNodes(result);
|
|
}
|
|
return result;
|
|
};
|
|
|
|
function element(tagName, attributes, options) {
|
|
options = options || {};
|
|
return new Element(tagName, attributes, options);
|
|
}
|
|
|
|
function Element(tagName, attributes, options) {
|
|
var tagNames = {};
|
|
if (_.isArray(tagName)) {
|
|
tagName.forEach(function(tagName) {
|
|
tagNames[tagName] = true;
|
|
});
|
|
tagName = tagName[0];
|
|
} else {
|
|
tagNames[tagName] = true;
|
|
}
|
|
|
|
this.tagName = tagName;
|
|
this.tagNames = tagNames;
|
|
this.attributes = attributes || {};
|
|
this.fresh = options.fresh;
|
|
this.separator = options.separator;
|
|
}
|
|
|
|
Element.prototype.matchesElement = function(element) {
|
|
return this.tagNames[element.tagName] && _.isEqual(this.attributes || {}, element.attributes || {});
|
|
};
|
|
|
|
Element.prototype.wrap = function wrap(generateNodes) {
|
|
return this.wrapNodes(generateNodes());
|
|
};
|
|
|
|
Element.prototype.wrapNodes = function wrapNodes(nodes) {
|
|
return [html.elementWithTag(this, nodes)];
|
|
};
|
|
|
|
exports.empty = elements([]);
|
|
exports.ignore = {
|
|
wrap: function() {
|
|
return [];
|
|
}
|
|
};
|
|
|