90 lines
3.2 KiB
JavaScript
90 lines
3.2 KiB
JavaScript
var shortenHex = require('./color/shorten-hex');
|
|
var shortenHsl = require('./color/shorten-hsl');
|
|
var shortenRgb = require('./color/shorten-rgb');
|
|
|
|
var split = require('../../../utils/split');
|
|
|
|
var ANY_COLOR_FUNCTION_PATTERN = /(rgb|rgba|hsl|hsla)\(([^()]+)\)/gi;
|
|
var COLOR_PREFIX_PATTERN = /#|rgb|hsl/gi;
|
|
var HEX_LONG_PATTERN = /(^|[^='"])#([0-9a-f]{6})/gi;
|
|
var HEX_SHORT_PATTERN = /(^|[^='"])#([0-9a-f]{3})/gi;
|
|
var HEX_VALUE_PATTERN = /[0-9a-f]/i;
|
|
var HSL_PATTERN = /hsl\((-?\d+),(-?\d+)%?,(-?\d+)%?\)/gi;
|
|
var RGBA_HSLA_PATTERN = /(rgb|hsl)a?\((-?\d+),(-?\d+%?),(-?\d+%?),(0*[1-9]+[0-9]*(\.?\d*)?)\)/gi;
|
|
var RGB_PATTERN = /rgb\((-?\d+),(-?\d+),(-?\d+)\)/gi;
|
|
var TRANSPARENT_FUNCTION_PATTERN = /(?:rgba|hsla)\(0,0%?,0%?,0\)/g;
|
|
|
|
var plugin = {
|
|
level1: {
|
|
value: function color(name, value, options) {
|
|
if (!options.compatibility.properties.colors) {
|
|
return value;
|
|
}
|
|
|
|
if (!value.match(COLOR_PREFIX_PATTERN)) {
|
|
return shortenHex(value);
|
|
}
|
|
|
|
value = value
|
|
.replace(RGBA_HSLA_PATTERN, function(match, colorFn, p1, p2, p3, alpha) {
|
|
return (parseInt(alpha) >= 1 ? colorFn + '(' + [p1, p2, p3].join(',') + ')' : match);
|
|
})
|
|
.replace(RGB_PATTERN, function(match, red, green, blue) {
|
|
return shortenRgb(red, green, blue);
|
|
})
|
|
.replace(HSL_PATTERN, function(match, hue, saturation, lightness) {
|
|
return shortenHsl(hue, saturation, lightness);
|
|
})
|
|
.replace(HEX_LONG_PATTERN, function(match, prefix, color, at, inputValue) {
|
|
var suffix = inputValue[at + match.length];
|
|
|
|
if (suffix && HEX_VALUE_PATTERN.test(suffix)) {
|
|
return match;
|
|
} if (color[0] == color[1] && color[2] == color[3] && color[4] == color[5]) {
|
|
return (prefix + '#' + color[0] + color[2] + color[4]).toLowerCase();
|
|
}
|
|
return (prefix + '#' + color).toLowerCase();
|
|
})
|
|
.replace(HEX_SHORT_PATTERN, function(match, prefix, color) {
|
|
return prefix + '#' + color.toLowerCase();
|
|
})
|
|
.replace(ANY_COLOR_FUNCTION_PATTERN, function(match, colorFunction, colorDef) {
|
|
var tokens = colorDef.split(',');
|
|
var colorFnLowercase = colorFunction && colorFunction.toLowerCase();
|
|
var applies = (colorFnLowercase == 'hsl' && tokens.length == 3)
|
|
|| (colorFnLowercase == 'hsla' && tokens.length == 4)
|
|
|| (colorFnLowercase == 'rgb' && tokens.length === 3 && colorDef.indexOf('%') > 0)
|
|
|| (colorFnLowercase == 'rgba' && tokens.length == 4 && tokens[0].indexOf('%') > 0);
|
|
|
|
if (!applies) {
|
|
return match;
|
|
}
|
|
|
|
if (tokens[1].indexOf('%') == -1) {
|
|
tokens[1] += '%';
|
|
}
|
|
|
|
if (tokens[2].indexOf('%') == -1) {
|
|
tokens[2] += '%';
|
|
}
|
|
|
|
return colorFunction + '(' + tokens.join(',') + ')';
|
|
});
|
|
|
|
if (options.compatibility.colors.opacity && name.indexOf('background') == -1) {
|
|
value = value.replace(TRANSPARENT_FUNCTION_PATTERN, function(match) {
|
|
if (split(value, ',').pop().indexOf('gradient(') > -1) {
|
|
return match;
|
|
}
|
|
|
|
return 'transparent';
|
|
});
|
|
}
|
|
|
|
return shortenHex(value);
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = plugin;
|