From b348dc1765f4e51daf293bdb09952b1b28b51340 Mon Sep 17 00:00:00 2001 From: Fabrice Gangler Date: Thu, 8 Jun 2017 22:53:57 +0200 Subject: [PATCH] #57 Allowed colors by CSS name --- .../utils/colorconvertor/ColorConverter.java | 27 +- .../colornamelookup/ColorNameLookup.java | 241 ++++++++++++++++++ .../colornamelookup/ColorNameLookupTest.java | 85 ++++++ .../i18n/contrast-finder_fr.properties | 8 +- 4 files changed, 356 insertions(+), 5 deletions(-) create mode 100644 contrast-finder-utils/src/main/java/org/asqatasun/utils/colornamelookup/ColorNameLookup.java create mode 100644 contrast-finder-utils/src/test/java/org/asqatasun/utils/colornamelookup/ColorNameLookupTest.java diff --git a/contrast-finder-utils/src/main/java/org/asqatasun/utils/colorconvertor/ColorConverter.java b/contrast-finder-utils/src/main/java/org/asqatasun/utils/colorconvertor/ColorConverter.java index aa747f15..9b59f215 100644 --- a/contrast-finder-utils/src/main/java/org/asqatasun/utils/colorconvertor/ColorConverter.java +++ b/contrast-finder-utils/src/main/java/org/asqatasun/utils/colorconvertor/ColorConverter.java @@ -20,9 +20,9 @@ package org.asqatasun.utils.colorconvertor; import java.awt.Color; +import org.asqatasun.utils.colornamelookup.ColorNameLookup; /** - * * @author alingua */ public final class ColorConverter { @@ -120,7 +120,7 @@ public static Color offsetRgbColor(Color bgColor, int offsetRed, int offsetGreen } /** - * @param colorStr ex: fff, FFF, #fff, #FFF, ffffff, rgb(255,255,255) or 255,255,255 + * @param colorStr ex: fff, FFF, #fff, #FFF, ffffff, rgb(255,255,255) or 255,255,255, color name (black, darkmagenta, ...) * @return color in hexadecimal, with '#' appended if necessary, in upper case */ public static String formatColorStr(String colorStr) { @@ -137,23 +137,44 @@ else if(str.matches(HEXADECIMAL_DICTIONNARY_V2)) { } colorStr = str.toUpperCase(); } + else { + ColorNameLookup c = new ColorNameLookup(); + String name = c.getColorNameFromStr(str); + if(name != ""){ + colorStr = name; + } + } return colorStr; } /** - * @param colorStr ex: fff, FFF, #fff, #FFF, ffffff, rgb(255,255,255) or 255,255,255 + * @param colorStr ex: fff, FFF, #fff, #FFF, ffffff, rgb(255,255,255) or 255,255,255, color name (black, darkmagenta, ...) * @return Color object or NULL */ public static Color colorFromStr(String colorStr) { Color color = hex2Rgb(colorStr); if (color == null) { color = colorFromRgbStr(colorStr); + if (color == null) { + color = colorFromColorName(colorStr); + } } return color; } + /** + * @param colorStr ex: silver, red, SteelBlue, ... + * @return Color object or NULL + */ + public static Color colorFromColorName(String colorStr) { + colorStr = colorStr.replaceAll("\\s", ""); // replace ' ', \t, \n, ... + ColorNameLookup c = new ColorNameLookup(); + return c.getColorFromName(colorStr); + } + + /** * @param colorStr ex: rgb(255,255,255) or 255,255,255 * @return Color object or NULL diff --git a/contrast-finder-utils/src/main/java/org/asqatasun/utils/colornamelookup/ColorNameLookup.java b/contrast-finder-utils/src/main/java/org/asqatasun/utils/colornamelookup/ColorNameLookup.java new file mode 100644 index 00000000..03c4faf6 --- /dev/null +++ b/contrast-finder-utils/src/main/java/org/asqatasun/utils/colornamelookup/ColorNameLookup.java @@ -0,0 +1,241 @@ +/* + * Contrast Finder + * Copyright (C) 2008-2017 Asqatasun.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * Contact us by mail: asqatasun AT asqatasun DOT org + */ +package org.asqatasun.utils.colornamelookup; + +import java.awt.Color; +import java.util.ArrayList; + +public class ColorNameLookup { + + private ArrayList colorList; + public ColorNameLookup() { + this.colorList = initColorList(); + } + + /** + * @param colorStr color name (ex: silver, darkmagenta, SIVLER, ...) + * @return empty or color name width correct case (ex: Silver, DarkMagenta, Silver, ...) + */ + public String getColorNameFromStr(String colorStr) { + colorStr = colorStr.trim(); + for (ColorName c : colorList) { + String name = c.getName(); // .toLowerCase() + if ( name.equalsIgnoreCase(colorStr)) { + return name; + } + } + return ""; + } + + /** + * @param colorStr color name (ex: red, silver, DarkMagenta, BLACK, ...) + * @return Color object or NULL + */ + public Color getColorFromName(String colorStr) { + colorStr = colorStr.trim(); + for (ColorName c : colorList) { + String name = c.getName(); + if ( name.equalsIgnoreCase(colorStr)) { + return new Color(c.getRed(), c.getGreen(), c.getBlue()); + } + } + return null; + } + + /** + * Initialize the color list + * @@@TODO missing some alias (ex: grey = gray, ...) = 10 alis missing + * https://developer.mozilla.org/fr/docs/Web/CSS/Type_color + * https://www.w3schools.com/colors/colors_names.asp + * http://htmlcolorcodes.com/fr/noms-de-couleur/ + */ + private ArrayList initColorList() { + ArrayList colors = new ArrayList(); + colors.add( new ColorName("AliceBlue",0xF0,0xF8,0xFF)); + colors.add( new ColorName("AntiqueWhite",0xFA,0xEB,0xD7)); + colors.add( new ColorName("Aqua",0x00,0xFF,0xFF)); + colors.add( new ColorName("Aquamarine",0x7F,0xFF,0xD4)); + colors.add( new ColorName("Azure",0xF0,0xFF,0xFF)); + colors.add( new ColorName("Beige",0xF5,0xF5,0xDC)); + colors.add( new ColorName("Bisque",0xFF,0xE4,0xC4)); + colors.add( new ColorName("Black",0x00,0x00,0x00)); + colors.add( new ColorName("BlanchedAlmond",0xFF,0xEB,0xCD)); + colors.add( new ColorName("Blue",0x00,0x00,0xFF)); + colors.add( new ColorName("BlueViolet",0x8A,0x2B,0xE2)); + colors.add( new ColorName("Brown",0xA5,0x2A,0x2A)); + colors.add( new ColorName("BurlyWood",0xDE,0xB8,0x87)); + colors.add( new ColorName("CadetBlue",0x5F,0x9E,0xA0)); + colors.add( new ColorName("Chartreuse",0x7F,0xFF,0x00)); + colors.add( new ColorName("Chocolate",0xD2,0x69,0x1E)); + colors.add( new ColorName("Coral",0xFF,0x7F,0x50)); + colors.add( new ColorName("CornflowerBlue",0x64,0x95,0xED)); + colors.add( new ColorName("Cornsilk",0xFF,0xF8,0xDC)); + colors.add( new ColorName("Crimson",0xDC,0x14,0x3C)); + colors.add( new ColorName("Cyan",0x00,0xFF,0xFF)); + colors.add( new ColorName("DarkBlue",0x00,0x00,0x8B)); + colors.add( new ColorName("DarkCyan",0x00,0x8B,0x8B)); + colors.add( new ColorName("DarkGoldenRod",0xB8,0x86,0x0B)); + colors.add( new ColorName("DarkGray",0xA9,0xA9,0xA9)); + colors.add( new ColorName("DarkGreen",0x00,0x64,0x00)); + colors.add( new ColorName("DarkKhaki",0xBD,0xB7,0x6B)); + colors.add( new ColorName("DarkMagenta",0x8B,0x00,0x8B)); + colors.add( new ColorName("DarkOliveGreen",0x55,0x6B,0x2F)); + colors.add( new ColorName("DarkOrange",0xFF,0x8C,0x00)); + colors.add( new ColorName("DarkOrchid",0x99,0x32,0xCC)); + colors.add( new ColorName("DarkRed",0x8B,0x00,0x00)); + colors.add( new ColorName("DarkSalmon",0xE9,0x96,0x7A)); + colors.add( new ColorName("DarkSeaGreen",0x8F,0xBC,0x8F)); + colors.add( new ColorName("DarkSlateBlue",0x48,0x3D,0x8B)); + colors.add( new ColorName("DarkSlateGray",0x2F,0x4F,0x4F)); + colors.add( new ColorName("DarkTurquoise",0x00,0xCE,0xD1)); + colors.add( new ColorName("DarkViolet",0x94,0x00,0xD3)); + colors.add( new ColorName("DeepPink",0xFF,0x14,0x93)); + colors.add( new ColorName("DeepSkyBlue",0x00,0xBF,0xFF)); + colors.add( new ColorName("DimGray",0x69,0x69,0x69)); + colors.add( new ColorName("DodgerBlue",0x1E,0x90,0xFF)); + colors.add( new ColorName("FireBrick",0xB2,0x22,0x22)); + colors.add( new ColorName("FloralWhite",0xFF,0xFA,0xF0)); + colors.add( new ColorName("ForestGreen",0x22,0x8B,0x22)); + colors.add( new ColorName("Fuchsia",0xFF,0x00,0xFF)); + colors.add( new ColorName("Gainsboro",0xDC,0xDC,0xDC)); + colors.add( new ColorName("GhostWhite",0xF8,0xF8,0xFF)); + colors.add( new ColorName("Gold",0xFF,0xD7,0x00)); + colors.add( new ColorName("GoldenRod",0xDA,0xA5,0x20)); + colors.add( new ColorName("Gray",0x80,0x80,0x80)); + colors.add( new ColorName("Green",0x00,0x80,0x00)); + colors.add( new ColorName("GreenYellow",0xAD,0xFF,0x2F)); + colors.add( new ColorName("HoneyDew",0xF0,0xFF,0xF0)); + colors.add( new ColorName("HotPink",0xFF,0x69,0xB4)); + colors.add( new ColorName("IndianRed",0xCD,0x5C,0x5C)); + colors.add( new ColorName("Indigo",0x4B,0x00,0x82)); + colors.add( new ColorName("Ivory",0xFF,0xFF,0xF0)); + colors.add( new ColorName("Khaki",0xF0,0xE6,0x8C)); + colors.add( new ColorName("Lavender",0xE6,0xE6,0xFA)); + colors.add( new ColorName("LavenderBlush",0xFF,0xF0,0xF5)); + colors.add( new ColorName("LawnGreen",0x7C,0xFC,0x00)); + colors.add( new ColorName("LemonChiffon",0xFF,0xFA,0xCD)); + colors.add( new ColorName("LightBlue",0xAD,0xD8,0xE6)); + colors.add( new ColorName("LightCoral",0xF0,0x80,0x80)); + colors.add( new ColorName("LightCyan",0xE0,0xFF,0xFF)); + colors.add( new ColorName("LightGoldenRodYellow",0xFA,0xFA,0xD2)); + colors.add( new ColorName("LightGray",0xD3,0xD3,0xD3)); + colors.add( new ColorName("LightGreen",0x90,0xEE,0x90)); + colors.add( new ColorName("LightPink",0xFF,0xB6,0xC1)); + colors.add( new ColorName("LightSalmon",0xFF,0xA0,0x7A)); + colors.add( new ColorName("LightSeaGreen",0x20,0xB2,0xAA)); + colors.add( new ColorName("LightSkyBlue",0x87,0xCE,0xFA)); + colors.add( new ColorName("LightSlateGray",0x77,0x88,0x99)); + colors.add( new ColorName("LightSteelBlue",0xB0,0xC4,0xDE)); + colors.add( new ColorName("LightYellow",0xFF,0xFF,0xE0)); + colors.add( new ColorName("Lime",0x00,0xFF,0x00)); + colors.add( new ColorName("LimeGreen",0x32,0xCD,0x32)); + colors.add( new ColorName("Linen",0xFA,0xF0,0xE6)); + colors.add( new ColorName("Magenta",0xFF,0x00,0xFF)); + colors.add( new ColorName("Maroon",0x80,0x00,0x00)); + colors.add( new ColorName("MediumAquaMarine",0x66,0xCD,0xAA)); + colors.add( new ColorName("MediumBlue",0x00,0x00,0xCD)); + colors.add( new ColorName("MediumOrchid",0xBA,0x55,0xD3)); + colors.add( new ColorName("MediumPurple",0x93,0x70,0xDB)); + colors.add( new ColorName("MediumSeaGreen",0x3C,0xB3,0x71)); + colors.add( new ColorName("MediumSlateBlue",0x7B,0x68,0xEE)); + colors.add( new ColorName("MediumSpringGreen",0x00,0xFA,0x9A)); + colors.add( new ColorName("MediumTurquoise",0x48,0xD1,0xCC)); + colors.add( new ColorName("MediumVioletRed",0xC7,0x15,0x85)); + colors.add( new ColorName("MidnightBlue",0x19,0x19,0x70)); + colors.add( new ColorName("MintCream",0xF5,0xFF,0xFA)); + colors.add( new ColorName("MistyRose",0xFF,0xE4,0xE1)); + colors.add( new ColorName("Moccasin",0xFF,0xE4,0xB5)); + colors.add( new ColorName("NavajoWhite",0xFF,0xDE,0xAD)); + colors.add( new ColorName("Navy",0x00,0x00,0x80)); + colors.add( new ColorName("OldLace",0xFD,0xF5,0xE6)); + colors.add( new ColorName("Olive",0x80,0x80,0x00)); + colors.add( new ColorName("OliveDrab",0x6B,0x8E,0x23)); + colors.add( new ColorName("Orange",0xFF,0xA5,0x00)); + colors.add( new ColorName("OrangeRed",0xFF,0x45,0x00)); + colors.add( new ColorName("Orchid",0xDA,0x70,0xD6)); + colors.add( new ColorName("PaleGoldenRod",0xEE,0xE8,0xAA)); + colors.add( new ColorName("PaleGreen",0x98,0xFB,0x98)); + colors.add( new ColorName("PaleTurquoise",0xAF,0xEE,0xEE)); + colors.add( new ColorName("PaleVioletRed",0xDB,0x70,0x93)); + colors.add( new ColorName("PapayaWhip",0xFF,0xEF,0xD5)); + colors.add( new ColorName("PeachPuff",0xFF,0xDA,0xB9)); + colors.add( new ColorName("Peru",0xCD,0x85,0x3F)); + colors.add( new ColorName("Pink",0xFF,0xC0,0xCB)); + colors.add( new ColorName("Plum",0xDD,0xA0,0xDD)); + colors.add( new ColorName("PowderBlue",0xB0,0xE0,0xE6)); + colors.add( new ColorName("Purple",0x80,0x00,0x80)); + colors.add( new ColorName("Red",0xFF,0x00,0x00)); + colors.add( new ColorName("RosyBrown",0xBC,0x8F,0x8F)); + colors.add( new ColorName("RoyalBlue",0x41,0x69,0xE1)); + colors.add( new ColorName("SaddleBrown",0x8B,0x45,0x13)); + colors.add( new ColorName("Salmon",0xFA,0x80,0x72)); + colors.add( new ColorName("SandyBrown",0xF4,0xA4,0x60)); + colors.add( new ColorName("SeaGreen",0x2E,0x8B,0x57)); + colors.add( new ColorName("SeaShell",0xFF,0xF5,0xEE)); + colors.add( new ColorName("Sienna",0xA0,0x52,0x2D)); + colors.add( new ColorName("Silver",0xC0,0xC0,0xC0)); + colors.add( new ColorName("SkyBlue",0x87,0xCE,0xEB)); + colors.add( new ColorName("SlateBlue",0x6A,0x5A,0xCD)); + colors.add( new ColorName("SlateGray",0x70,0x80,0x90)); + colors.add( new ColorName("Snow",0xFF,0xFA,0xFA)); + colors.add( new ColorName("SpringGreen",0x00,0xFF,0x7F)); + colors.add( new ColorName("SteelBlue",0x46,0x82,0xB4)); + colors.add( new ColorName("Tan",0xD2,0xB4,0x8C)); + colors.add( new ColorName("Teal",0x00,0x80,0x80)); + colors.add( new ColorName("Thistle",0xD8,0xBF,0xD8)); + colors.add( new ColorName("Tomato",0xFF,0x63,0x47)); + colors.add( new ColorName("Turquoise",0x40,0xE0,0xD0)); + colors.add( new ColorName("Violet",0xEE,0x82,0xEE)); + colors.add( new ColorName("Wheat",0xF5,0xDE,0xB3)); + colors.add( new ColorName("White",0xFF,0xFF,0xFF)); + colors.add( new ColorName("WhiteSmoke",0xF5,0xF5,0xF5)); + colors.add( new ColorName("Yellow",0xFF,0xFF,0x00)); + colors.add( new ColorName("YellowGreen",0x9A,0xCD,0x32)); + return colors; + } + + + /** + * SubClass of ColorNameLookup + */ + public class ColorName { + public int r,g,b; + public String name; + public ColorName(String name, int r, int g, int b) { + this.r = r; + this.g = g; + this.b = b; + this.name = name; + } + public String getName() { + return name; + } + public int getRed() { + return r; + } + public int getGreen() { + return g; + } + public int getBlue() { + return b; + } + } + +} \ No newline at end of file diff --git a/contrast-finder-utils/src/test/java/org/asqatasun/utils/colornamelookup/ColorNameLookupTest.java b/contrast-finder-utils/src/test/java/org/asqatasun/utils/colornamelookup/ColorNameLookupTest.java new file mode 100644 index 00000000..9a2757dd --- /dev/null +++ b/contrast-finder-utils/src/test/java/org/asqatasun/utils/colornamelookup/ColorNameLookupTest.java @@ -0,0 +1,85 @@ +/* + * Contrast Finder + * Copyright (C) 2008-2017 Asqatasun.org + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * Contact us by mail: asqatasun AT asqatasun DOT org + */ + +package org.asqatasun.utils.colornamelookup; + +import java.awt.Color; +import junit.framework.TestCase; + +/** + * + */ +public class ColorNameLookupTest extends TestCase { + public ColorNameLookupTest(String testName) { + super(testName); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + ////////////////////////////////////////////////////// + + + // @@@TODO add test for getColorNameFromStr + + public void testGetColorFromNameWhite() { + String colorStr = "white"; + System.out.println("GetColorFromNameWhite ["+ colorStr +"]"); + ColorNameLookup c = new ColorNameLookup(); + Color expResult = Color.WHITE; + Color result = c.getColorFromName(colorStr); + assertEquals(expResult, result); + } + + public void testGetColorFromNameSilver() { + String colorStr = "silver"; + System.out.println("GetColorFromNameSilver ["+ colorStr +"]"); + ColorNameLookup c = new ColorNameLookup(); + Color expResult = new Color(192,192,192); + Color result = c.getColorFromName(colorStr); + assertEquals(expResult, result); + } + + public void testGetColorFromNameDarkMagenta() { + String colorStr = "DarkMagenta"; + System.out.println("GetColorFromNameDarkMagenta ["+ colorStr +"]"); + ColorNameLookup c = new ColorNameLookup(); + Color expResult = new Color(139,0,139); + Color result = c.getColorFromName(colorStr); + assertEquals(expResult, result); + } + + public void testGetColorFromNameBadCaseWidthSpaces() { + String colorStr = " darkmagenta "; + System.out.println("GetColorFromNameBadCaseWidthSpaces ["+ colorStr +"]"); + ColorNameLookup c = new ColorNameLookup(); + Color expResult = new Color(139,0,139); + Color result = c.getColorFromName(colorStr); + assertEquals(expResult, result); + } + + +} diff --git a/contrast-finder-webapp/src/main/resources/i18n/contrast-finder_fr.properties b/contrast-finder-webapp/src/main/resources/i18n/contrast-finder_fr.properties index 0e30b27c..09fd4cb3 100644 --- a/contrast-finder-webapp/src/main/resources/i18n/contrast-finder_fr.properties +++ b/contrast-finder-webapp/src/main/resources/i18n/contrast-finder_fr.properties @@ -62,10 +62,14 @@ home.noResultTxt=

Aide

\

Premier plan : couleur du texte

\

\ C'est la couleur du texte. \ - Vous pouvez remplir ce champ avec une valeur hexad\u00e9cimale \ - ou une valeur RGB. \ + Vous pouvez remplir ce champ avec un nom de couleur CSS, une valeur hexad\u00e9cimale, \ + ou une valeur RGB. \ La valeur saisie est alors pr\u00e9visualis\u00e9e \u00e0 droite du champ. \

\ +

Couleur par mots-cl\u00e9s

\ +

Exemple : Black, Silver, YellowGreen, MediumPurple.
\ +Les valeurs autoris\u00e9es sont les noms des couleurs utilisables en CSS 3. \ +

\

Couleur en hexad\u00e9cimale

\

Exemple : #AABBCC. \ Notez que #ABC fonctionne \u00e9galement, \