From b45a6a3cfa7930c9e998c7827eb5b321da8696a1 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Fri, 29 Aug 2025 14:53:06 -0600 Subject: [PATCH 1/5] Update rgb regex to support decimal fractions --- index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index b98a278..26e556a 100644 --- a/index.js +++ b/index.js @@ -52,7 +52,7 @@ cs.get.rgb = function (string) { const abbr = /^#([a-f\d]{3,4})$/i; const hex = /^#([a-f\d]{6})([a-f\d]{2})?$/i; - const rgba = /^rgba?\(\s*([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)\s*(?:[\s,|/]\s*([+-]?[\d.]+)(%?)\s*)?\)$/; + const rgba = /^rgba?\(\s*([+-]?(?:\d*\.)?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?(?:\d*\.)?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?(?:\d*\.)?\d+)\s*(?:[\s,|/]\s*([+-]?(?:\d*\.)?\d+)(%?)\s*)?\)$/; const per = /^rgba?\(\s*([+-]?[\d.]+)%\s*,?\s*([+-]?[\d.]+)%\s*,?\s*([+-]?[\d.]+)%\s*(?:[\s,|/]\s*([+-]?[\d.]+)(%?)\s*)?\)$/; const keyword = /^(\w+)$/; @@ -87,7 +87,7 @@ cs.get.rgb = function (string) { } } else if (match = string.match(rgba)) { for (i = 0; i < 3; i++) { - rgb[i] = Number.parseInt(match[i + 1], 10); + rgb[i] = Number.parseFloat(match[i + 1]); } if (match[4]) { From b1ddcd8c5d341193171265f7af1e42345cfcb886 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Fri, 29 Aug 2025 14:55:39 -0600 Subject: [PATCH 2/5] Add some tests for rgb decimal fractions --- test.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test.js b/test.js index 405664c..d261eaa 100644 --- a/test.js +++ b/test.js @@ -15,6 +15,8 @@ assert.deepEqual(string.get.rgb('#fef'), [255, 238, 255, 1]); assert.deepEqual(string.get.rgb('#fffFEF'), [255, 255, 239, 1]); assert.deepEqual(string.get.rgb('rgb(244, 233, 100)'), [244, 233, 100, 1]); assert.deepEqual(string.get.rgb('rgb(244 233 100)'), [244, 233, 100, 1]); +assert.deepEqual(string.get.rgb('rgb(244.5, 233.5, 100.5)'), [244.5, 233.5, 100.5, 1]); +assert.deepEqual(string.get.rgb('rgb(244.5 233.5 100.5)'), [244.5, 233.5, 100.5, 1]); assert.deepEqual(string.get.rgb('rgb(100%, 30%, 90%)'), [255, 77, 229, 1]); assert.deepEqual(string.get.rgb('rgb(100% 30% 90%)'), [255, 77, 229, 1]); assert.deepEqual(string.get.rgb('transparent'), [0, 0, 0, 0]); @@ -34,6 +36,8 @@ assert.deepEqual(string.get('#fffFEF00'), {model: 'rgb', value: [255, 255, 239, assert.deepEqual(normalizeAlpha(string.get('#fffFEFa9')), {model: 'rgb', value: [255, 255, 239, '0.66']}); assert.deepEqual(string.get('rgb(244, 233, 100)'), {model: 'rgb', value: [244, 233, 100, 1]}); assert.deepEqual(string.get('rgb(244 233 100)'), {model: 'rgb', value: [244, 233, 100, 1]}); +assert.deepEqual(string.get('rgb(244.5, 233.5, 100.5)'), {model: 'rgb', value: [244.5, 233.5, 100.5, 1]}); +assert.deepEqual(string.get('rgb(244.5 233.5 100.5)'), {model: 'rgb', value: [244.5, 233.5, 100.5, 1]}); assert.deepEqual(string.get('rgb(100%, 30%, 90%)'), {model: 'rgb', value: [255, 77, 229, 1]}); assert.deepEqual(string.get('rgb(100% 30% 90%)'), {model: 'rgb', value: [255, 77, 229, 1]}); assert.deepEqual(string.get('transparent'), {model: 'rgb', value: [0, 0, 0, 0]}); @@ -70,6 +74,8 @@ assert.strictEqual(string.get('rgba(10, 3)'), null); // With sign assert.deepEqual(string.get.rgb('rgb(-244, +233, -100)'), [0, 233, 0, 1]); assert.deepEqual(string.get.rgb('rgb(-244 +233 -100)'), [0, 233, 0, 1]); +assert.deepEqual(string.get.rgb('rgb(-244.5, +233.5, -100.5)'), [0, 233.5, 0, 1]); +assert.deepEqual(string.get.rgb('rgb(-244.5 +233.5 -100.5)'), [0, 233.5, 0, 1]); assert.deepEqual(string.get.hsl('hsl(+240, 100%, 50.5%)'), [240, 100, 50.5, 1]); assert.deepEqual(string.get.hsl('hsl(+240 100% 50.5%)'), [240, 100, 50.5, 1]); assert.deepEqual(string.get.rgb('rgba(200, +20, -233, -0.0)'), [200, 20, 0, 0]); From beaf3e10ef21ce978a2b81af25b95ca2395d39ea Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Mon, 1 Sep 2025 18:39:24 -0600 Subject: [PATCH 3/5] Add support for scientific notation in rgb regex --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index d7b04f7..04103ee 100644 --- a/index.js +++ b/index.js @@ -52,7 +52,7 @@ cs.get.rgb = function (string) { const abbr = /^#([a-f\d]{3,4})$/i; const hex = /^#([a-f\d]{6})([a-f\d]{2})?$/i; - const rgba = /^rgba?\(\s*([+-]?(?:\d*\.)?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?(?:\d*\.)?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?(?:\d*\.)?\d+)\s*(?:[\s,|/]\s*([+-]?(?:\d*\.)?\d+)(%?)\s*)?\)$/; + const rgba = /^rgba?\(\s*([+-]?(?:\d*\.)?\d+(?:[eE]\d+)?)(?=[\s,])\s*(?:,\s*)?([+-]?(?:\d*\.)?\d+(?:[eE]\d+)?)(?=[\s,])\s*(?:,\s*)?([+-]?(?:\d*\.)?\d+(?:[eE]\d+)?)\s*(?:[\s,|/]\s*([+-]?(?:\d*\.)?\d+(?:[eE]\d+)?)(%?)\s*)?\)$/; const per = /^rgba?\(\s*([+-]?[\d.]+)%\s*,?\s*([+-]?[\d.]+)%\s*,?\s*([+-]?[\d.]+)%\s*(?:[\s,|/]\s*([+-]?[\d.]+)(%?)\s*)?\)$/; const keyword = /^(\w+)$/; From abcd35c055d8995c1a2be7c22d3c10e754adb197 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Mon, 1 Sep 2025 18:40:00 -0600 Subject: [PATCH 4/5] Add scientific notation tests --- test.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test.js b/test.js index 3e7fbf1..2342b25 100644 --- a/test.js +++ b/test.js @@ -17,6 +17,8 @@ assert.deepEqual(string.get.rgb('rgb(244, 233, 100)'), [244, 233, 100, 1]); assert.deepEqual(string.get.rgb('rgb(244 233 100)'), [244, 233, 100, 1]); assert.deepEqual(string.get.rgb('rgb(244.5, 233.5, 100.5)'), [244.5, 233.5, 100.5, 1]); assert.deepEqual(string.get.rgb('rgb(244.5 233.5 100.5)'), [244.5, 233.5, 100.5, 1]); +assert.deepEqual(string.get.rgb('rgb(2.44E2, 2.33e2, 1.00E2)'), [244, 233, 100, 1]); +assert.deepEqual(string.get.rgb('rgb(2.44E2 2.33e2 1.00E2)'), [244, 233, 100, 1]); assert.deepEqual(string.get.rgb('rgb(100%, 30%, 90%)'), [255, 77, 229, 1]); assert.deepEqual(string.get.rgb('rgb(100% 30% 90%)'), [255, 77, 229, 1]); assert.deepEqual(string.get.rgb('transparent'), [0, 0, 0, 0]); @@ -39,6 +41,8 @@ assert.deepEqual(string.get('rgb(244, 233, 100)'), {model: 'rgb', value: [244, 2 assert.deepEqual(string.get('rgb(244 233 100)'), {model: 'rgb', value: [244, 233, 100, 1]}); assert.deepEqual(string.get('rgb(244.5, 233.5, 100.5)'), {model: 'rgb', value: [244.5, 233.5, 100.5, 1]}); assert.deepEqual(string.get('rgb(244.5 233.5 100.5)'), {model: 'rgb', value: [244.5, 233.5, 100.5, 1]}); +assert.deepEqual(string.get('rgb(2.44E2, 2.33e2, 1.00E2)'), {model: 'rgb', value: [244, 233, 100, 1]}); +assert.deepEqual(string.get('rgb(2.44E2 2.33e2 1.00E2)'), {model: 'rgb', value: [244, 233, 100, 1]}); assert.deepEqual(string.get('rgb(100%, 30%, 90%)'), {model: 'rgb', value: [255, 77, 229, 1]}); assert.deepEqual(string.get('rgb(100% 30% 90%)'), {model: 'rgb', value: [255, 77, 229, 1]}); assert.deepEqual(string.get('transparent'), {model: 'rgb', value: [0, 0, 0, 0]}); @@ -78,6 +82,8 @@ assert.deepEqual(string.get.rgb('rgb(-244, +233, -100)'), [0, 233, 0, 1]); assert.deepEqual(string.get.rgb('rgb(-244 +233 -100)'), [0, 233, 0, 1]); assert.deepEqual(string.get.rgb('rgb(-244.5, +233.5, -100.5)'), [0, 233.5, 0, 1]); assert.deepEqual(string.get.rgb('rgb(-244.5 +233.5 -100.5)'), [0, 233.5, 0, 1]); +assert.deepEqual(string.get.rgb('rgb(-2.44E2, +2.33e2, -1.00E2)'), [0, 233, 0, 1]); +assert.deepEqual(string.get.rgb('rgb(-2.44E2 +2.33e2 -1.00E2)'), [0, 233, 0, 1]); assert.deepEqual(string.get.hsl('hsl(+240, 100%, 50.5%)'), [240, 100, 50.5, 1]); assert.deepEqual(string.get.hsl('hsl(+240 100% 50.5%)'), [240, 100, 50.5, 1]); assert.deepEqual(string.get.rgb('rgba(200, +20, -233, -0.0)'), [200, 20, 0, 0]); From f9620a1da95a06bbf966bfc4cbbb3c59557c7979 Mon Sep 17 00:00:00 2001 From: Cameron DeCoster Date: Tue, 2 Sep 2025 15:29:27 -0600 Subject: [PATCH 5/5] Switch to case insensitive regex pattern --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 04103ee..023e24d 100644 --- a/index.js +++ b/index.js @@ -52,7 +52,7 @@ cs.get.rgb = function (string) { const abbr = /^#([a-f\d]{3,4})$/i; const hex = /^#([a-f\d]{6})([a-f\d]{2})?$/i; - const rgba = /^rgba?\(\s*([+-]?(?:\d*\.)?\d+(?:[eE]\d+)?)(?=[\s,])\s*(?:,\s*)?([+-]?(?:\d*\.)?\d+(?:[eE]\d+)?)(?=[\s,])\s*(?:,\s*)?([+-]?(?:\d*\.)?\d+(?:[eE]\d+)?)\s*(?:[\s,|/]\s*([+-]?(?:\d*\.)?\d+(?:[eE]\d+)?)(%?)\s*)?\)$/; + const rgba = /^rgba?\(\s*([+-]?(?:\d*\.)?\d+(?:e\d+)?)(?=[\s,])\s*(?:,\s*)?([+-]?(?:\d*\.)?\d+(?:e\d+)?)(?=[\s,])\s*(?:,\s*)?([+-]?(?:\d*\.)?\d+(?:e\d+)?)\s*(?:[\s,|/]\s*([+-]?(?:\d*\.)?\d+(?:e\d+)?)(%?)\s*)?\)$/i; const per = /^rgba?\(\s*([+-]?[\d.]+)%\s*,?\s*([+-]?[\d.]+)%\s*,?\s*([+-]?[\d.]+)%\s*(?:[\s,|/]\s*([+-]?[\d.]+)(%?)\s*)?\)$/; const keyword = /^(\w+)$/;