Browse Source

add replace flag

pull/21/head
Ivan Bunin 7 years ago
parent
commit
c15c1fa2ec
  1. 20
      index.js
  2. 19
      spec/px-to-viewport.spec.js

20
index.js

@ -12,7 +12,8 @@ var defaults = {
fontViewportUnit: 'vw', // vmin is more suitable.
selectorBlackList: [],
minPixelValue: 1,
mediaQuery: false
mediaQuery: false,
replace: true
};
module.exports = postcss.plugin('postcss-px-to-viewport', function (options) {
@ -36,9 +37,16 @@ module.exports = postcss.plugin('postcss-px-to-viewport', function (options) {
if (blacklistedSelector(opts.selectorBlackList, decl.parent.selector)) return;
var unit = getUnit(decl.prop, opts)
var unit = getUnit(decl.prop, opts);
var value = decl.value.replace(pxRegex, createPxReplace(opts.viewportWidth, opts.minPixelValue, opts.unitPrecision, unit));
decl.value = decl.value.replace(pxRegex, createPxReplace(opts.viewportWidth, opts.minPixelValue, opts.unitPrecision, unit));
if (declarationExists(decl.parent, decl.prop, value)) return;
if (opts.replace) {
decl.value = value;
} else {
decl.parent.insertAfter(i, decl.clone({ value: value }));
}
});
if (opts.mediaQuery) {
@ -77,3 +85,9 @@ function blacklistedSelector(blacklist, selector) {
return selector.match(regex);
});
}
function declarationExists(decls, prop, value) {
return decls.some(function (decl) {
return (decl.prop === prop && decl.value === value);
});
}

19
spec/px-to-viewport.spec.js

@ -36,6 +36,13 @@ describe('px-to-viewport', function() {
expect(processed).toBe(expected);
});
it('should not add properties that already exist', function () {
var expected = '.rule { font-size: 16px; font-size: 5vw; }';
var processed = postcss(pxToViewport()).process(expected).css;
expect(processed).toBe(expected);
});
});
describe('value parsing', function() {
@ -196,3 +203,15 @@ describe('minPixelValue', function () {
expect(processed).toBe(expected);
});
});
describe('replace', function () {
it('should leave fallback pixel unit with root em value', function () {
var options = {
replace: false
};
var processed = postcss(pxToViewport(options)).process(basicCSS).css;
var expected = '.rule { font-size: 15px; font-size: 4.6875vw }';
expect(processed).toBe(expected);
});
});
Loading…
Cancel
Save