Index: node_modules/vulcanize/node_modules/whacko/lib/api/css.js |
diff --git a/node_modules/vulcanize/node_modules/whacko/lib/api/css.js b/node_modules/vulcanize/node_modules/whacko/lib/api/css.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5febdd470f4ddd3825b7211825cbb101871f42c8 |
--- /dev/null |
+++ b/node_modules/vulcanize/node_modules/whacko/lib/api/css.js |
@@ -0,0 +1,118 @@ |
+var _ = require('lodash'), |
+ domEach = require('../utils').domEach; |
+var toString = Object.prototype.toString; |
+ |
+/** |
+ * Set / Get css. |
+ * |
+ * @param {String|Object} prop |
+ * @param {String} val |
+ * @return {self} |
+ * @api public |
+ */ |
+ |
+exports.css = function(prop, val) { |
+ if (arguments.length === 2 || |
+ // When `prop` is a "plain" object |
+ (toString.call(prop) === '[object Object]')) { |
+ return domEach(this, function(idx, el) { |
+ setCss(el, prop, val, idx); |
+ }); |
+ } else { |
+ return getCss(this[0], prop); |
+ } |
+}; |
+ |
+/** |
+ * Set styles of all elements. |
+ * |
+ * @param {String|Object} prop |
+ * @param {String} val |
+ * @param {Number} idx - optional index within the selection |
+ * @return {self} |
+ * @api private |
+ */ |
+ |
+function setCss(el, prop, val, idx) { |
+ if ('string' == typeof prop) { |
+ var styles = getCss(el); |
+ if (typeof val === 'function') { |
+ val = val.call(el, idx, el); |
+ } |
+ |
+ if (val === '') { |
+ delete styles[prop]; |
+ } else if (val != null) { |
+ styles[prop] = val; |
+ } |
+ |
+ el.attribs.style = stringify(styles); |
+ } else if ('object' == typeof prop) { |
+ Object.keys(prop).forEach(function(k){ |
+ setCss(el, k, prop[k]); |
+ }); |
+ } |
+} |
+ |
+/** |
+ * Get parsed styles of the first element. |
+ * |
+ * @param {String} prop |
+ * @return {Object} |
+ * @api private |
+ */ |
+ |
+function getCss(el, prop) { |
+ var styles = parse(el.attribs.style); |
+ if (typeof prop === 'string') { |
+ return styles[prop]; |
+ } else if (Array.isArray(prop)) { |
+ return _.pick(styles, prop); |
+ } else { |
+ return styles; |
+ } |
+} |
+ |
+/** |
+ * Stringify `obj` to styles. |
+ * |
+ * @param {Object} obj |
+ * @return {Object} |
+ * @api private |
+ */ |
+ |
+function stringify(obj) { |
+ return Object.keys(obj || {}) |
+ .reduce(function(str, prop){ |
+ return str += '' |
+ + (str ? ' ' : '') |
+ + prop |
+ + ': ' |
+ + obj[prop] |
+ + ';'; |
+ }, ''); |
+} |
+ |
+/** |
+ * Parse `styles`. |
+ * |
+ * @param {String} styles |
+ * @return {Object} |
+ * @api private |
+ */ |
+ |
+function parse(styles) { |
+ styles = (styles || '').trim(); |
+ |
+ if (!styles) return {}; |
+ |
+ return styles |
+ .split(';') |
+ .reduce(function(obj, str){ |
+ var n = str.indexOf(':'); |
+ // skip if there is no :, or if it is the first/last character |
+ if (n < 1 || n === str.length-1) return obj; |
+ obj[str.slice(0,n).trim()] = str.slice(n+1).trim(); |
+ return obj; |
+ }, {}); |
+} |