var domEach = require('../utils').domEach,
|
|
_ = {
|
|
pick: require('lodash.pick'),
|
|
};
|
|
|
|
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, styles[prop]);
|
|
}
|
|
|
|
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;
|
|
}, {});
|
|
}
|