Sha256: 92d4aad20193ae3f9e8259236ccf08aa45b106d31861294c71b511aae6727775

Contents?: true

Size: 1.99 KB

Versions: 2

Compression:

Stored size: 1.99 KB

Contents

'use strict';
var postcss, _remgex, _rootvalue, _options;

// Add pixel fallbacks for rem units to a string of CSS
// - css `String`: the contents of a CSS file.
// - rootvalue `String | Null`: The root element font size. Default = 16px.
// - options `Object`
//     - replace `Boolean`: Replace rems with pixels instead of providing
//       fallbacks. Default = false.

function Pixrem (rootvalue, options) {
  postcss = require('postcss');
  _remgex = /(\d*\.?\d+)rem/ig;
  _rootvalue = typeof rootvalue !== 'undefined' ? rootvalue : 16;
  _options = typeof options !== 'undefined' ? options : {
    replace: false
  };
}

Pixrem.prototype.process = function (css) {
  return postcss(this.postcss).process(css).css;
}

Pixrem.prototype.postcss = function (css) {
  css.eachDecl(function (decl, i) {
    var rule = decl.parent;
    var value = decl.value;

    if (value.indexOf('rem') != -1) {

      value = value.replace(_remgex, function ($1) {
        // Round decimal pixels down to match webkit and opera behavior:
        // http://tylertate.com/blog/2012/01/05/subpixel-rounding.html
        return Math.floor(parseFloat($1) * toPx(_rootvalue)) + 'px';
      });

      if (_options.replace) {
        decl.value = value;
      } else {
        rule.insertBefore(i, decl.clone({ value: value }));
      }
    }
  });
}

// Return a unitless pixel value from any root font-size value.
function toPx(value) {
  var parts = /^(\d+\.?\d*)([a-zA-Z%]*)$/.exec(value);
  var number = parts[1];
  var unit = parts[2];

  if (unit === 'px' || unit === '') {
    return parseFloat(number);
  }
  else if (unit === 'em' || unit === 'rem') {
    return parseFloat(number) * 16;
  }
  else if (unit === '%') {
    return (parseFloat(number) / 100) * 16;
  }

  // TODO: Should we throw an error here?
  return false;
}

var pixrem = function (rootvalue, options) {
  return new Pixrem(rootvalue, options);
};
pixrem.process = function(css, rootvalue, options) {
  return new Pixrem(rootvalue, options).process(css);
}

module.exports = pixrem;

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
pleeease-0.0.3 node_modules/pleeease/node_modules/pixrem/lib/pixrem.js
pleeease-0.0.2 node_modules/pleeease/node_modules/pixrem/lib/pixrem.js