Skip to content

Instantly share code, notes, and snippets.

@sfaut
Last active September 5, 2022 20:00
Show Gist options
  • Save sfaut/7d56e181c4f317f0203996fe7e4b92bf to your computer and use it in GitHub Desktop.
Save sfaut/7d56e181c4f317f0203996fe7e4b92bf to your computer and use it in GitHub Desktop.
HSL management with MySQL
-- HSL functions, manage HSL CSS colors
-- Author : sfaut <https://github.com/sfaut>
-- Publication date : 2022-09-05
-- Tested with MySQL 8.0.30 (@@sql_mode='ANSI,TRADITIONAL')
/*
Summary :
hsl() Create a CSS HSL representation of a color
hsl_as_json() Extract CSS HSL color components in a JSON object { hue, lightness, saturation }
hsl_get_hue() Extract hue component from CSS HSL color
hsl_get_saturation() Extract saturation component from CSS HSL color
hsl_get_lightness() Extract lightness component from CSS HSL color
hsl_set_hue() Set a new hue to a CSS HSL color
hsl_set_saturation() Set a new saturation to a CSS HSL color
hsl_set_lightness() Set a new lightness to a CSS HSL color
hsl_rotate() Apply a rotation to the hue from a CSS HSL color
hsl_saturate() Apply a saturation to the CSS HSL color
hsl_desaturate() Apply a desaturation to the CSS HSL color
hsl_lighten() Lighten a CSS HSL color
hsl_darken() Darken a CSS HSL color
*/
DELILITER ;;
SET @@sql_mode = 'ANSI,TRADITIONAL';;
CREATE FUNCTION hsl(hue SMALLINT, saturation TINYINT UNSIGNED, lightness TINYINT UNSIGNED)
RETURNS TINYTEXT DETERMINISTIC
COMMENT 'Create a CSS HSL representation of a color'
RETURN CONCAT('hsl(', hue, 'deg ', saturation, '% ', lightness, '%)');;
CREATE FUNCTION hsl_as_json(hsl TINYTEXT)
RETURNS JSON DETERMINISTIC
COMMENT 'Extract CSS HSL color components in a JSON object { hue, lightness, saturation }'
RETURN JSON_OBJECT(
'hue', hsl_get_hue(hsl),
'saturation', hsl_get_saturation(hsl),
'lightness', hsl_get_lightness(hsl)
);;
CREATE FUNCTION hsl_get_hue(hsl TINYTEXT)
RETURNS SMALLINT DETERMINISTIC
COMMENT 'Extract hue component from CSS HSL color'
RETURN REGEXP_SUBSTR(hsl, '\\d+', 1, 1);;
CREATE FUNCTION hsl_get_saturation(hsl TINYTEXT)
RETURNS TINYINT UNSIGNED DETERMINISTIC
COMMENT 'Extract saturation component from CSS HSL color'
RETURN REGEXP_SUBSTR(hsl, '\\d+', 1, 2);;
CREATE FUNCTION hsl_get_lightness(hsl TINYTEXT)
RETURNS TINYINT UNSIGNED DETERMINISTIC
COMMENT 'Extract lightness component from CSS HSL color'
RETURN REGEXP_SUBSTR(hsl, '\\d+', 1, 3);;
CREATE FUNCTION hsl_set_hue(hsl TINYTEXT, new_hue SMALLINT)
RETURNS TINYTEXT DETERMINISTIC
COMMENT 'Set a new hue to a CSS HSL color'
BEGIN
IF new_hue <= -360 OR new_hue >= 360 THEN
SET new_hue = hue MOD 360;
END IF;
IF new_hue < 0 THEN
SET new_hue = 360 + new_hue;
END IF;
RETURN hsl(new_hue, hsl_get_saturation(hsl), hsl_get_lightness(hsl));;
END;;
CREATE FUNCTION hsl_set_saturation(hsl TINYTEXT, new_saturation TINYINT)
RETURNS TINYTEXT DETERMINISTIC
COMMENT 'Set a new saturation to a CSS HSL color'
BEGIN
IF new_saturation < 0 THEN
SET new_saturation = 0;
ELSEIF new_saturation > 100 THEN
SET new_saturation = 100;
END IF;
RETURN hsl(hsl_get_hue(hsl), new_saturation, hsl_get_lightness(hsl));
END;;
CREATE FUNCTION hsl_set_lightness(hsl TINYTEXT, new_lightness TINYINT)
RETURNS TINYTEXT DETERMINISTIC
COMMENT 'Set a new lightness to a CSS HSL color'
BEGIN
IF new_lightness < 0 THEN
SET new_lightness = 0;
ELSEIF new_lightness > 100 THEN
SET new_lightness = 100;
END IF;
RETURN hsl(hsl_get_hue(hsl), hsl_get_saturation(hsl), new_lightness);
END;;
CREATE FUNCTION hsl_rotate(hsl TINYTEXT, rotation SMALLINT)
RETURNS TINYTEXT DETERMINISTIC
COMMENT 'Apply a hue to a CSS HSL color'
BEGIN
DECLARE new_hue SMALLINT DEFAULT hsl_get_hue(hsl) + rotation;
IF new_hue <= -360 OR new_hue >= 360 THEN
SET new_hue = new_hue MOD 360;
END IF;
IF new_hue < 0 THEN
SET new_hue = 360 + new_hue;
END IF;
RETURN hsl_set_hue(hsl, new_hue);
END;;
CREATE FUNCTION hsl_saturate(hsl TINYTEXT, amount TINYINT)
RETURNS TINYTEXT DETERMINISTIC
COMMENT 'Apply a saturation to the CSS HSL color'
BEGIN
DECLARE new_saturation TINYINT DEFAULT hsl_get_saturation(hsl) + amount;
IF new_saturation < 0 THEN
SET new_saturation = 0;
ELSEIF new_saturation > 100 THEN
SET new_saturation = 100;
END IF;
RETURN hsl_set_saturation(hsl, new_saturation);
END;;
CREATE FUNCTION hsl_desaturate(hsl TINYTEXT, amount TINYINT)
RETURNS TINYTEXT DETERMINISTIC
COMMENT 'Apply a desaturation to the CSS HSL color'
RETURN hsl_saturate(hsl, -amount);;
CREATE FUNCTION hsl_lighten(hsl TINYTEXT, amount TINYINT)
RETURNS TINYTEXT DETERMINISTIC
COMMENT 'Lighten a CSS HSL color'
BEGIN
DECLARE new_lightness TINYINT DEFAULT hsl_get_lightness(hsl) + amount;
IF new_lightness < 0 THEN
SET new_lightness = 0;
ELSEIF new_lightness > 100 THEN
SET new_lightness = 100;
END IF;
RETURN hsl_set_lightness(hsl, new_lightness);
END;;
CREATE FUNCTION hsl_darken(hsl TINYTEXT, amount TINYINT)
RETURNS TINYTEXT DETERMINISTIC
COMMENT 'Darken a CSS HSL color'
RETURN hsl_lighten(hsl, -amount);;
DELIMITER ;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment