| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- 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;
- }, {});
- }
|