diff --git a/index.js b/index.js index 7bcc46a..d2bb878 100755 --- a/index.js +++ b/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); + }); +} \ No newline at end of file diff --git a/spec/px-to-viewport.spec.js b/spec/px-to-viewport.spec.js index 23632e2..f530ac5 100644 --- a/spec/px-to-viewport.spec.js +++ b/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); + }); +}); \ No newline at end of file