PX to EM converter

by Kirubel Girma

HTML

<button>Convert PX to EM</button>
<textarea></textarea>

CSS

textarea {
    width: 100%;
    height: 500px;
}

JavaScript

var basePxSize = 16;
var decimalPlaces = 3;
////////////////////////////////////////
var findPX = new RegExp('(\\d+)px','g');
//define decimalPlaces + 1, to round it if there are more places
var decPlaces = new RegExp('(\.\\d{' + decimalPlaces + '}\\d).*', '');
var last = new RegExp('(\\d$)', '');

$('button').on('click', function () {
    var css = $('textarea').val();
    var result;
    while ((result = findPX.exec(css)) !== null) {
        var px = parseInt(result[1]);
        var em = px / basePxSize;
        //find decimal places defined in decimalPlaces variable
        //if there is more decimal places, round it
        result = decPlaces.exec(em);
        if (result !== null)
            em = round(em, result[1]);
        css = css.replace(px + 'px', em + 'em'); 
    }
     $('textarea').val(css);
});

function round (base, num) {
    var leadingZero = '';
    //base 1.2345 num .2345
    num = num.toString();
    //remove . from num, num 2345
    num = num.substring(1, num.length);
    //if first char is zero 0234, remember it and substring 0, because Math will ignore it when round
    if (num.charAt(0) == 0) {
        leadingZero = '0';
        num = num.substring(1, num.length);
    }
    //make last point as decimal places, so Math can round it, num 234.5
    num = num.replace(last, '.$1');
    //round num 234.5 -> 235
    num = Math.round(num);
    //take only base value, base 1
    base = base.toString().split('.')[0];
    //concanate base and rounded decimal, 1 . 235
    return base + '.' + leadingZero + num;
}