index.js
function standardizeOldGradientArgs(type, args){
        var stdArgStr = '';
        var stops = [];
        if(/^linear/.test(type)){
            // linear gradient, args 1 and 2 tend to be start/end keywords
            var points = [].concat(args[0].name.split(/\s+/), args[1].name.split(/\s+/)); // example: [left, top, right, top]
            // Old webkit syntax "uses a two-point syntax that lets you explicitly state where a linear gradient starts and ends"
            // if start/end keywords are percentages, let's massage the values a little more..
            var rxPercTest = /\d+\%/;
            if(rxPercTest.test(points[0]) || points[0] === 0){
                var startX = parseInt(points[0]), startY = parseInt(points[1]), endX = parseInt(points[2]), endY = parseInt(points[3]);
                stdArgStr += Math.atan2(endY - startY, endX - startX) * (180 / Math.PI) + 90;
                stdArgStr += 'deg';
            }else{
                if(points[1] === points[3]){ // both 'top' or 'bottom, this linear gradient goes left-right
                    stdArgStr += 'to ' + points[2];
                }else if(points[0] === points[2]){ // both 'left' or 'right', this linear gradient goes top-bottom
                    stdArgStr += 'to ' + points[3];
                }else if(points[1] === 'top'){ // diagonal gradient - from top left to opposite corner is 135deg
                    stdArgStr += '135deg';
                }else{
                    stdArgStr += '45deg';
                }
            }

        }else if(/^radial/i.test(type)){ // oooh, radial gradients..
            stdArgStr += 'circle ' + args[3].name.replace(/(\d+)$/, '$1px') + ' at ' + args[0].name.replace(/(\d+) /, '$1px ').replace(/(\d+)$/, '$1px');
        }

        var toColor;
        var startStep = type === 'linear' ? 2 : 4;
        for (var j = startStep; j < args.length; j++) {
            var position, color, colorIndex;
            if(args[j].name === 'color-stop'){
                position = args[j].args[0].name;
                if (args[j].args[1]) {
                    colorIndex = 1;
                } else {
                    colorIndex = 0;
                    position = (j - startStep) / (args.length - startStep - 1);
                }
            }else if (args[j].name === 'to') {
                position = '100%';
                colorIndex = 0;
            }else if (args[j].name === 'from') {
                position = '0%';
                colorIndex = 0;
            }
            if (position >= 0 || position.indexOf('%') === -1) { // original Safari syntax had 0.5 equivalent to 50%
                position = parseFloat(position) * 100 + '%';
            }
            color = args[j].args[colorIndex].name;
            if (args[j].args[colorIndex].args) { // the color is itself a function call, like rgb()
                color += '(' + colorValue(args[j].args[colorIndex].args) + ')';
            }
            if (args[j].name === 'from'){
                stops.unshift(color + ' ' + position);
            }else if(args[j].name === 'to'){
                toColor = color;
            }else{
                stops.push(color + ' ' + position);
            }
        }

        // translating values to right syntax
        for(j = 0; j < stops.length; j++){
            stdArgStr += ', ' + stops[j];
        }
        if(toColor){
            stdArgStr += ', ' + toColor + ' 100%';
        }
        return stdArgStr;
    }
function standardizeOldGradientArgs(type, args){
        var stdArgStr = '';
        var stops = [];
        if(/^linear/.test(type)){
            // linear gradient, args 1 and 2 tend to be start/end keywords
            var points = [].concat(args[0].name.split(/\s+/), args[1].name.split(/\s+/)); // example: [left, top, right, top]
            // Old webkit syntax "uses a two-point syntax that lets you explicitly state where a linear gradient starts and ends"
            // if start/end keywords are percentages, let's massage the values a little more..
            var rxPercTest = /\d+\%/;
            if(rxPercTest.test(points[0]) || points[0] === 0){
                var startX = parseInt(points[0]), startY = parseInt(points[1]), endX = parseInt(points[2]), endY = parseInt(points[3]);
                stdArgStr += Math.atan2(endY - startY, endX - startX) * (180 / Math.PI) + 90;
                stdArgStr += 'deg';
            }else{
                if(points[1] === points[3]){ // both 'top' or 'bottom, this linear gradient goes left-right
                    stdArgStr += 'to ' + points[2];
                }else if(points[0] === points[2]){ // both 'left' or 'right', this linear gradient goes top-bottom
                    stdArgStr += 'to ' + points[3];
                }else if(points[1] === 'top'){ // diagonal gradient - from top left to opposite corner is 135deg
                    stdArgStr += '135deg';
                }else{
                    stdArgStr += '45deg';
                }
            }

        }else if(/^radial/i.test(type)){ // oooh, radial gradients..
            stdArgStr += 'circle ' + args[3].name.replace(/(\d+)$/, '$1px') + ' at ' + args[0].name.replace(/(\d+) /, '$1px ').replace(/(\d+)$/, '$1px');
        }

        var toColor;
        var startStep = type === 'linear' ? 2 : 4;
        for (var j = startStep; j < args.length; j++) {
            var position, color, colorIndex;
            if(args[j].name === 'color-stop'){
                position = args[j].args[0].name;
                if (args[j].args[1]) {
                    colorIndex = 1;
                } else {
                    colorIndex = 0;
                    position = (j - startStep) / (args.length - startStep - 1);
                }
            }else if (args[j].name === 'to') {
                position = '100%';
                colorIndex = 0;
            }else if (args[j].name === 'from') {
                position = '0%';
                colorIndex = 0;
            }
            if (position >= 0 || position.indexOf('%') === -1) { // original Safari syntax had 0.5 equivalent to 50%
                position = parseFloat(position) * 100 + '%';
            }
            color = args[j].args[colorIndex].name;
            if (args[j].args[colorIndex].args) { // the color is itself a function call, like rgb()
                color += '(' + colorValue(args[j].args[colorIndex].args) + ')';
            }
            if (args[j].name === 'from'){
                stops.unshift(color + ' ' + position);
            }else if(args[j].name === 'to'){
                toColor = color;
            }else{
                stops.push(color + ' ' + position);
            }
        }

        // translating values to right syntax
        for(j = 0; j < stops.length; j++){
            stdArgStr += ', ' + stops[j];
        }
        if(toColor){
            stdArgStr += ', ' + toColor + ' 100%';
        }
        return stdArgStr;
    }
function standardizeOldGradientArgs ( type , args ) { var stdArgStr = '' ; var stops = [ ] ; if ( / ^linear / . test ( type ) ) { // linear gradient, args 1 and 2 tend to be start/end keywords var points = [ ] . concat ( args [ 0 ] . name . split ( / \s+ / ) , args [ 1 ] . name . split ( / \s+ / ) ) ; // example: [left, top, right, top] // Old webkit syntax "uses a two-point syntax that lets you explicitly state where a linear gradient starts and ends" // if start/end keywords are percentages, let's massage the values a little more.. var rxPercTest = / \d+\% / ; if ( rxPercTest . test ( points [ 0 ] ) || points [ 0 ] === 0 ) { var startX = parseInt ( points [ 0 ] ) , startY = parseInt ( points [ 1 ] ) , endX = parseInt ( points [ 2 ] ) , endY = parseInt ( points [ 3 ] ) ; stdArgStr += Math . atan2 ( endY - startY , endX - startX ) * ( 180 / Math . PI ) + 90 ; stdArgStr += 'deg' ; } else { if ( points [ 1 ] === points [ 3 ] ) { // both 'top' or 'bottom, this linear gradient goes left-right stdArgStr += 'to ' + points [ 2 ] ; } else if ( points [ 0 ] === points [ 2 ] ) { // both 'left' or 'right', this linear gradient goes top-bottom stdArgStr += 'to ' + points [ 3 ] ; } else if ( points [ 1 ] === 'top' ) { // diagonal gradient - from top left to opposite corner is 135deg stdArgStr += '135deg' ; } else { stdArgStr += '45deg' ; } } } else if ( / ^radial / i . test ( type ) ) { // oooh, radial gradients.. stdArgStr += 'circle ' + args [ 3 ] . name . replace ( / (\d+)$ / , '$1px' ) + ' at ' + args [ 0 ] . name . replace ( / (\d+)  / , '$1px ' ) . replace ( / (\d+)$ / , '$1px' ) ; } var toColor ; var startStep = type === 'linear' ? 2 : 4 ; for ( var j = startStep ; j < args . length ; j ++ ) { var position , color , colorIndex ; if ( args [ j ] . name === 'color-stop' ) { position = args [ j ] . args [ 0 ] . name ; if ( args [ j ] . args [ 1 ] ) { colorIndex = 1 ; } else { colorIndex = 0 ; position = ( j - startStep ) / ( args . length - startStep - 1 ) ; } } else if ( args [ j ] . name === 'to' ) { position = '100%' ; colorIndex = 0 ; } else if ( args [ j ] . name === 'from' ) { position = '0%' ; colorIndex = 0 ; } if ( position >= 0 || position . indexOf ( '%' ) === - 1 ) { // original Safari syntax had 0.5 equivalent to 50% position = parseFloat ( position ) * 100 + '%' ; } color = args [ j ] . args [ colorIndex ] . name ; if ( args [ j ] . args [ colorIndex ] . args ) { // the color is itself a function call, like rgb() color += '(' + colorValue ( args [ j ] . args [ colorIndex ] . args ) + ')' ; } if ( args [ j ] . name === 'from' ) { stops . unshift ( color + ' ' + position ) ; } else if ( args [ j ] . name === 'to' ) { toColor = color ; } else { stops . push ( color + ' ' + position ) ; } } // translating values to right syntax for ( j = 0 ; j < stops . length ; j ++ ) { stdArgStr += ', ' + stops [ j ] ; } if ( toColor ) { stdArgStr += ', ' + toColor + ' 100%' ; } return stdArgStr ; }
/* Given an array of args for "-webkit-gradient(...)" returned by
oldGradientParser(), this function constructs a string representing the
equivalent arguments for a standard "linear-gradient(...)" or
"radial-gradient(...)" expression.

@param type  Either 'linear' or 'radial'.
@param args  An array of args for a "-webkit-gradient(...)" expression,
provided by oldGradientParser() (not including gradient type).
/ * Given an array of args for - webkit - gradient ( ... ) returned by oldGradientParser () this function constructs a string representing the equivalent arguments for a standard linear - gradient ( ... ) or radial - gradient ( ... ) expression .