UNPKG

2.02 kBJavaScriptView Raw
1'use strict';
2
3var postcss = require('postcss');
4
5module.exports = postcss.plugin('postcss-pxtorem', function (options) {
6
7 return function (css) {
8
9 options = options || {};
10 var rootValue = options.root_value || 16;
11 var unitPrecision = options.unit_precision || 5;
12 var propWhiteList = options.prop_white_list || ['font', 'font-size', 'line-height', 'letter-spacing'];
13 var replace = (options.replace === false) ? false : true;
14 var mediaQuery = options.media_query || false;
15
16 var pxRegex = /(\d*\.?\d+)px/ig;
17
18 var pxReplace = function (m, $1) {
19 return toFixed((parseFloat($1) / rootValue), unitPrecision) + 'rem';
20 };
21
22 css.eachDecl(function (decl, i) {
23 if (propWhiteList.indexOf(decl.prop) === -1) return;
24
25 var rule = decl.parent;
26 var value = decl.value;
27
28 if (value.indexOf('px') !== -1) {
29 value = value.replace(pxRegex, pxReplace);
30
31 // if rem unit already exists, do not add or replace
32 if (remExists(rule, decl.prop, value)) return;
33
34 if (replace) {
35 decl.value = value;
36 } else {
37 rule.insertAfter(i, decl.clone({ value: value }));
38 }
39 }
40 });
41
42 if (mediaQuery) {
43 css.each(function (rule) {
44 if (rule.type !== 'atrule' && rule.name !== 'media') return;
45
46 if (rule.params.indexOf('px') !== -1) {
47 rule.params = rule.params.replace(pxRegex, pxReplace);
48 }
49 });
50 }
51
52 };
53});
54
55function toFixed(number, precision) {
56 var multiplier = Math.pow(10, precision + 1),
57 wholeNumber = Math.floor(number * multiplier);
58 return Math.round(wholeNumber / 10) * 10 / multiplier;
59}
60
61function remExists(decls, prop, value) {
62 return decls.some(function (decl) {
63 return (decl.prop === prop && decl.value === value);
64 });
65}