1 | 'use strict';
|
2 |
|
3 | var postcss = require('postcss');
|
4 |
|
5 | module.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 |
|
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 |
|
55 | function 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 |
|
61 | function remExists(decls, prop, value) {
|
62 | return decls.some(function (decl) {
|
63 | return (decl.prop === prop && decl.value === value);
|
64 | });
|
65 | }
|