You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
3.5 KiB
96 lines
3.5 KiB
8 months ago
|
var Class = require('./Class');
|
||
|
var isStr = require('./isStr');
|
||
|
var clamp = require('./clamp');
|
||
|
var rgbToHsl = require('./rgbToHsl');
|
||
|
var hslToRgb = require('./hslToRgb');
|
||
|
var hex = require('./hex');
|
||
|
exports = Class(
|
||
|
{
|
||
|
initialize: function Color(color) {
|
||
|
if (isStr(color)) color = exports.parse(color);
|
||
|
this.model = color.model;
|
||
|
this.val = color.val;
|
||
|
},
|
||
|
toRgb: function() {
|
||
|
var val = this.val;
|
||
|
if (this.model === 'hsl') val = hslToRgb(val);
|
||
|
var prefix = 'rgba';
|
||
|
if (val[3] === 1) {
|
||
|
prefix = 'rgb';
|
||
|
val = val.slice(0, 3);
|
||
|
}
|
||
|
return prefix + '(' + val.join(', ') + ')';
|
||
|
},
|
||
|
toHex: function() {
|
||
|
var val = this.val;
|
||
|
if (this.model === 'hsl') val = hslToRgb(val);
|
||
|
var ret = hex.encode(val.slice(0, 3));
|
||
|
if (ret[0] === ret[1] && ret[2] === ret[3] && ret[4] === ret[5]) {
|
||
|
ret = ret[0] + ret[2] + ret[5];
|
||
|
}
|
||
|
return '#' + ret;
|
||
|
},
|
||
|
toHsl: function() {
|
||
|
var val = this.val;
|
||
|
if (this.model === 'rgb') val = rgbToHsl(val);
|
||
|
var prefix = 'hsla';
|
||
|
if (val[3] === 1) {
|
||
|
prefix = 'hsl';
|
||
|
val = val.slice(0, 3);
|
||
|
}
|
||
|
val[1] = val[1] + '%';
|
||
|
val[2] = val[2] + '%';
|
||
|
return prefix + '(' + val.join(', ') + ')';
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
parse: function(colorStr) {
|
||
|
var i, match;
|
||
|
var val = [0, 0, 0, 1],
|
||
|
model = 'rgb';
|
||
|
|
||
|
if ((match = colorStr.match(regHexAbbr))) {
|
||
|
match = match[1];
|
||
|
for (i = 0; i < 3; i++) {
|
||
|
val[i] = parseInt(match[i] + match[i], 16);
|
||
|
}
|
||
|
} else if ((match = colorStr.match(regHex))) {
|
||
|
match = match[1];
|
||
|
for (i = 0; i < 3; i++) {
|
||
|
var i2 = i * 2;
|
||
|
val[i] = parseInt(match.slice(i2, i2 + 2), 16);
|
||
|
}
|
||
|
} else if ((match = colorStr.match(regRgba))) {
|
||
|
for (i = 0; i < 3; i++) {
|
||
|
val[i] = parseInt(match[i + 1], 0);
|
||
|
}
|
||
|
if (match[4]) val[3] = parseFloat(match[4]);
|
||
|
} else if ((match = colorStr.match(regRgbaPer))) {
|
||
|
for (i = 0; i < 3; i++) {
|
||
|
val[i] = Math.round(parseFloat(match[i + 1]) * 2.55);
|
||
|
}
|
||
|
if (match[4]) val[3] = parseFloat(match[4]);
|
||
|
} else if ((match = colorStr.match(regHsla))) {
|
||
|
model = 'hsl';
|
||
|
val = [
|
||
|
((parseFloat(match[1]) % 360) + 360) % 360,
|
||
|
clamp(parseFloat(match[2]), 0, 100),
|
||
|
clamp(parseFloat(match[3]), 0, 100),
|
||
|
clamp(parseFloat(match[4]), 0, 1)
|
||
|
];
|
||
|
}
|
||
|
return {
|
||
|
val: val,
|
||
|
model: model
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
);
|
||
|
var regHexAbbr = /^#([a-fA-F0-9]{3})$/;
|
||
|
var regHex = /^#([a-fA-F0-9]{6})$/;
|
||
|
var regRgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d.]+)\s*)?\)$/;
|
||
|
var regRgbaPer = /^rgba?\(\s*([+-]?[\d.]+)%\s*,\s*([+-]?[\d.]+)%\s*,\s*([+-]?[\d.]+)%\s*(?:,\s*([+-]?[\d.]+)\s*)?\)$/;
|
||
|
var regHsla = /^hsla?\(\s*([+-]?\d*[.]?\d+)(?:deg)?\s*,\s*([+-]?[\d.]+)%\s*,\s*([+-]?[\d.]+)%\s*(?:,\s*([+-]?[\d.]+)\s*)?\)$/;
|
||
|
|
||
|
module.exports = exports;
|