diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-11-19 11:54:43 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-11-19 11:54:43 +0000 |
| commit | 68d8c8140fb6ef1118fa2815243817f8e4f55b59 (patch) | |
| tree | d4e4be8d3b124d98f2d204ed5f97585a8729ca94 /lib/styles/html-paths.js | |
| parent | 5f84e7887b262b96fd6fd47ce6bb1cd96c196f69 (diff) | |
Move html-paths and document-matchers to styles module
Diffstat (limited to 'lib/styles/html-paths.js')
| -rw-r--r-- | lib/styles/html-paths.js | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/lib/styles/html-paths.js b/lib/styles/html-paths.js new file mode 100644 index 0000000..27bb777 --- /dev/null +++ b/lib/styles/html-paths.js @@ -0,0 +1,75 @@ +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 []; + } +}; |
