├── .gitignore ├── README.md ├── gradle └── wrapper │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── namethatcolor ├── build.gradle └── src │ ├── main │ ├── kotlin │ │ └── il │ │ │ └── co │ │ │ └── galex │ │ │ └── namethatcolor │ │ │ ├── core │ │ │ ├── exception │ │ │ │ └── ColorNotFoundException.kt │ │ │ ├── manager │ │ │ │ └── ColorNameFinder.kt │ │ │ ├── model │ │ │ │ ├── Color.kt │ │ │ │ ├── HexColor.kt │ │ │ │ ├── Hsl.kt │ │ │ │ └── Rgb.kt │ │ │ └── util │ │ │ │ ├── ColorExtensions.kt │ │ │ │ ├── Colors.kt │ │ │ │ ├── MaterialColors.kt │ │ │ │ └── Rounding.kt │ │ │ └── plugin │ │ │ ├── annotator │ │ │ └── ColorAnnotator.kt │ │ │ ├── completion │ │ │ ├── CaretCompletionContributor.kt │ │ │ └── ClipboardCompletionContributor.kt │ │ │ ├── intention │ │ │ └── NameColorIntention.kt │ │ │ └── util │ │ │ ├── CompletionResultSetExtensions.kt │ │ │ ├── Constants.kt │ │ │ └── XmlOutput.kt │ └── resources │ │ └── META-INF │ │ ├── plugin.xml │ │ └── withKotlin.xml │ └── test │ └── kotlin │ └── il │ └── co │ └── galex │ └── namethatcolor │ └── core │ ├── manager │ ├── ColorExtensionsTest.kt │ └── ColorNameFinderTest.kt │ └── model │ └── HexColorTest.kt ├── screenshots ├── clipboard.png └── quick-fix.png └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | .idea 3 | *.iml 4 | *.jar 5 | .DS_Store 6 | .gradle 7 | build 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Name That Color - Android Studio Plugin 2 | 3 | ## Introduction 4 | 5 | When I get a new color to set in my Android app, I never know how to call it. 6 | 7 | I used the website [Name That Color](http://chir.ag/projects/ntc/) for years, and I wanted to have it integrated inside Android Studio, so I ported its JS library to Kotlin and built this IntelliJ plugin around it. 8 | 9 | Besides its long [list of colors](https://github.com/galex/name-that-color-intellij-plugin/blob/master/namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/core/util/Colors.kt), users requested to add the material colors names, so we can now name our colors as [material colors](https://github.com/galex/name-that-color-intellij-plugin/blob/master/namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/core/util/MaterialColors.kt) as well. 10 | 11 | This plugin lets you insert a name for a color you copy-paste or type in an android resource file. 12 | 13 | # Usage 14 | 15 | Two options are available: Clipboard and Quick Fix. 16 | 17 | ### Clipboard 18 | 19 | When you copy your color to add it in your app, you can use **CONTROL+SPACE** instead of pasting it to insert directly the right `` tag. 20 | 21 | ![after entering CONTROL+SPACE](/screenshots/clipboard.png) 22 | 23 | ### Quick Fix 24 | 25 | You can insert "aaa" and an error warning in the form of a Quick Fix will show up so you can replace "aaa" with its own `#aaa ` tag by using **ALT+ENTER**. 26 | 27 | ![after entering ALT+ENTER](/screenshots/quick-fix.png) 28 | 29 | # Color Input 30 | 31 | The Plugin accepts all formats of colors allowed in Android (lowercase or uppercase), and you don't need to prefix your color with "#": 32 | * Color 33 | * **abc** -> **#abc** 34 | * **#abc** -> **#abc** 35 | * **aBc** -> **#aBc** 36 | * **ab12dc** -> **#ab12dc** 37 | * **#ab12dc** -> **#ab12dc** 38 | * Alpha + Color 39 | * **6abc** -> **#6abc** 40 | * **#6abc** -> **#6abc** 41 | * **60ab12dc** -> **#60ab12dc** 42 | * **#60ab12dc** -> **#60ab12dc** 43 | 44 | # Names 45 | 46 | ### Name that color 47 | 48 | If you chose to use "Name that color", this [list of colors](https://github.com/galex/name-that-color-intellij-plugin/blob/master/namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/core/util/Colors.kt) is used. If the exact color is not found, the algorithm will find the closest match, if possible. 49 | 50 | ##### Examples 51 | 52 | * Color 53 | * **abc** -> `#abc` 54 | * **ab12dc** -> `#ab12dc` 55 | * Alpha + Color 56 | * **6abc** -> `#6abc` 57 | * **60ab12dc** -> `#60ab12dc` 58 | * Alpha(%) + Color 59 | * **40%abc** -> `#66AABBCC` 60 | * **38%ab12dc** -> `#61AB12DC` 61 | 62 | ### Name that material color 63 | 64 | If you chose to use "Name that material color", this [list of material colors](https://github.com/galex/name-that-color-intellij-plugin/blob/master/namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/core/util/MaterialColors.kt) is used. If the exact color is not found, the algorithm will find the closest match, if possible. 65 | 66 | ##### Examples 67 | 68 | * Color 69 | * **abc** -> `#abc` 70 | * **ab12dc** -> `#ab12dc` 71 | * Alpha + Color 72 | * **6abc** -> `#6abc` 73 | * **60ab12dc** -> `#60ab12dc` 74 | * Alpha(%) + Color 75 | * **40%abc** -> `#66AABBCC` 76 | * **38%ab12dc** -> `#61AB12DC` 77 | 78 | ## Install 79 | 80 | In Android Studio, open **Settings** > **Plugins** > **Browse Plugins** and type "**name that color**". 81 | 82 | ## Thanks 83 | 84 | I'd like to thank [aednlaxer](https://github.com/aednlaxer) for submitting bugs and ideas! 85 | 86 | ## License 87 | 88 | This plugin is released under the: Creative Commons License: 89 | Attribution 2.5 http://creativecommons.org/licenses/by/2.5/ -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jan 04 09:52:12 IST 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-all.zip 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /namethatcolor/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | mavenCentral() 4 | jcenter() 5 | } 6 | } 7 | 8 | plugins { 9 | id "org.jetbrains.intellij" version "0.6.5" 10 | id "org.jetbrains.kotlin.jvm" version "1.4.30-RC" 11 | } 12 | 13 | repositories { 14 | mavenCentral() 15 | jcenter() 16 | } 17 | 18 | intellij { 19 | version '2020.3.2' 20 | pluginName 'NameThatColor' 21 | type 'AI' 22 | } 23 | 24 | publishPlugin { 25 | token pluginsDevToken 26 | } 27 | 28 | patchPluginXml { 29 | version "1.7.1" 30 | sinceBuild '201.6668.113' 31 | } -------------------------------------------------------------------------------- /namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/core/exception/ColorNotFoundException.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.core.exception 2 | 3 | class ColorNotFoundException: Exception() -------------------------------------------------------------------------------- /namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/core/manager/ColorNameFinder.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.core.manager 2 | 3 | import il.co.galex.namethatcolor.core.exception.ColorNotFoundException 4 | import il.co.galex.namethatcolor.core.model.Color 5 | import il.co.galex.namethatcolor.core.model.HexColor 6 | import il.co.galex.namethatcolor.core.util.colorsMaterialNames 7 | import il.co.galex.namethatcolor.core.util.colorsNames 8 | import il.co.galex.namethatcolor.core.util.hsl 9 | import il.co.galex.namethatcolor.core.util.rgb 10 | import kotlin.math.pow 11 | 12 | /** 13 | * Class which loads all the hex codes and names and prepare the RGB and HSL values to be searched for an exact or closest match 14 | * Based on http://chir.ag/projects/ntc/ntc.js 15 | */ 16 | object ColorNameFinder { 17 | 18 | private var colors: List = colorsNames.map { entry -> Color(entry.key, entry.value, entry.key.rgb(), entry.key.hsl()) } 19 | private var materialColors: List = colorsMaterialNames.map { entry -> Color(entry.key, entry.value, entry.key.rgb(), entry.key.hsl()) } 20 | 21 | /** 22 | * look for the Color of an hexadecimal color 23 | */ 24 | fun findColor(color: HexColor) = find(color, colors) 25 | 26 | /** 27 | * look for the Color of an hexadecimal material color 28 | */ 29 | fun findMaterialColor(color: HexColor) = find(color, materialColors) 30 | 31 | /** 32 | * look for the Color of an hexadecimal color 33 | */ 34 | private fun find(color: HexColor, colors: List): Pair { 35 | 36 | val (r, g, b) = color.rgb() 37 | val (h, s, l) = color.hsl() 38 | 39 | var cl = -1 40 | var df = -1 41 | 42 | colors.forEachIndexed { index, col -> 43 | 44 | if (color.value == col.hexCode) return color to col 45 | else { 46 | val ndf1 = (r - col.rgb.r).toDouble().pow(2.0).toInt() + (g - col.rgb.g).toDouble().pow(2.0).toInt() + (b - col.rgb.b).toDouble().pow(2.0).toInt() 47 | val ndf2 = (h - col.hsl.h).toDouble().pow(2.0).toInt() + (s - col.hsl.s).toDouble().pow(2.0).toInt() + (l - col.hsl.l).toDouble().pow(2.0).toInt() 48 | val ndf = ndf1 + ndf2 * 2 49 | if (df < 0 || df > ndf) { 50 | df = ndf 51 | cl = index 52 | } 53 | } 54 | } 55 | 56 | // if not found a close by one, we return an error 57 | if (cl < 0) throw ColorNotFoundException() 58 | // if found, return the name 59 | return color to colors[cl] 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/core/model/Color.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.core.model 2 | 3 | data class Color(val hexCode: String, val name: String, val rgb: Rgb, val hsl: Hsl) -------------------------------------------------------------------------------- /namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/core/model/HexColor.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.core.model 2 | 3 | import il.co.galex.namethatcolor.core.util.hsl 4 | import il.co.galex.namethatcolor.core.util.rgb 5 | import il.co.galex.namethatcolor.core.util.roundTo2Decimal 6 | import il.co.galex.namethatcolor.core.util.roundTo2HexString 7 | 8 | class HexColor(val input: String) { 9 | 10 | private var alpha: String? = null 11 | private var hasPercent = false 12 | var percentAlpha: Int? = null 13 | val value: String 14 | 15 | init { 16 | var cup = input.toUpperCase() 17 | 18 | if (cup.isEmpty()) { 19 | throw IllegalArgumentException("The input cannot be an empty string") 20 | } 21 | 22 | if (cup.startsWith("#")) { 23 | cup = cup.substringAfter("#") 24 | } 25 | 26 | // Add support for Alpha format of percentage : 10% 27 | if (cup.contains("%")) { 28 | hasPercent = true 29 | val alphaValueText = cup.substringBefore("%").trim() 30 | if (alphaValueText.isNotEmpty()) { 31 | val alphaValue = alphaValueText.toInt() 32 | alpha = (alphaValue / 100.0 * 255).roundTo2HexString().toUpperCase() 33 | percentAlpha = alphaValue 34 | } 35 | cup = cup.substringAfter("%") 36 | } 37 | 38 | when (cup.length) { 39 | 3 -> { 40 | this.value = cup[0] + cup[0] + cup[1] + cup[1] + cup[2] + cup[2] 41 | } 42 | 43 | 4 -> { 44 | if (hasPercent) { 45 | throw IllegalArgumentException("Length is weird") 46 | } 47 | this.value = cup[1] + cup[1] + cup[2] + cup[2] + cup[3] + cup[3] 48 | this.alpha = cup[0] + cup[0] 49 | } 50 | 51 | 6 -> { 52 | this.value = cup 53 | } 54 | 55 | 8 -> { 56 | if (hasPercent) { 57 | throw IllegalArgumentException("Length is weird") 58 | } 59 | this.value = cup.substring(2) 60 | this.alpha = cup.substring(0, 2) 61 | } 62 | 63 | else -> throw IllegalArgumentException("Length is weird") 64 | } 65 | // if we survived till here, let's now check the format of the value itself 66 | if (!VALUE_REGEX.matches(value)) { 67 | throw IllegalArgumentException("The value $value is not of a correct format") 68 | } 69 | 70 | alpha?.let { 71 | if (!ALPHA_REGEX.matches(it)) { 72 | throw IllegalArgumentException("The alpha $alpha is not of a correct format") 73 | } 74 | if (!hasPercent) { 75 | percentAlpha = (it.toInt(16) / 255.0).roundTo2Decimal() 76 | } 77 | } 78 | } 79 | 80 | fun rgb() = value.rgb() 81 | fun hsl() = value.hsl() 82 | 83 | override fun toString(): String = PREFIX + if (alpha == null) value else "$alpha$value" 84 | 85 | companion object { 86 | private const val PREFIX = "#" 87 | private val VALUE_REGEX = Regex("[0-9a-fA-F]{6}$") 88 | private val ALPHA_REGEX = Regex("[0-9a-fA-F]{2}$") 89 | } 90 | 91 | private operator fun Char.plus(c: Char): String { 92 | return "$this$c" 93 | } 94 | } 95 | 96 | 97 | -------------------------------------------------------------------------------- /namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/core/model/Hsl.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.core.model 2 | 3 | data class Hsl(val h: Int, val s: Int, val l: Int) -------------------------------------------------------------------------------- /namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/core/model/Rgb.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.core.model 2 | 3 | data class Rgb(val r: Int, val g: Int, val b: Int) { 4 | 5 | fun percent(): Triple = Triple(r / 255.0, g / 255.0, b / 255.0) 6 | } -------------------------------------------------------------------------------- /namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/core/util/ColorExtensions.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.core.util 2 | 3 | import il.co.galex.namethatcolor.core.model.Hsl 4 | import il.co.galex.namethatcolor.core.model.Rgb 5 | import il.co.galex.namethatcolor.plugin.util.ALPHA_SEPARATOR 6 | import kotlin.math.roundToInt 7 | 8 | /** 9 | * Transforms a hexadecimal color like "8D90A1" to an Rgb(141, 144, 161) 10 | */ 11 | fun String.rgb() = Rgb( 12 | r = this.substring(0, 2).toInt(16), 13 | g = this.substring(2, 4).toInt(16), 14 | b = this.substring(4, 6).toInt(16) 15 | ) 16 | 17 | /** 18 | * Transforms an hexadecimal color like "#8D90A1" to an Hsl(231, 10, 59) 19 | * Based on http://www.niwa.nu/2013/05/math-behind-colorspace-conversions-rgb-hsl/ 20 | */ 21 | fun String.hsl(): Hsl { 22 | 23 | val (r, g, b) = this.rgb().percent() 24 | 25 | val min = minOf(r, b, g) 26 | val max = maxOf(r, b, g) 27 | 28 | val l = (min + max) / 2 29 | 30 | if (min == max) { 31 | return Hsl(0, 0, l.roundTo2Decimal()) 32 | } else { 33 | 34 | //If Luminance is smaller then 0.5, then Saturation = (max-min)/(max+min) 35 | //If Luminance is bigger then 0.5. then Saturation = ( max-min)/(2.0-max-min) 36 | val s = if (l < 0.5) (max - min) / (max + min) else (max - min) / (2.0 - max - min) 37 | 38 | //If Red is max, then Hue = (G-B)/(max-min) 39 | //If Green is max, then Hue = 2.0 + (B-R)/(max-min) 40 | //If Blue is max, then Hue = 4.0 + (R-G)/(max-min) 41 | var h = when (max) { 42 | r -> (g - b) / (max - min) 43 | g -> 2.0 + (b - r) / (max - min) 44 | b -> 4.0 + (r - g) / (max - min) 45 | else -> throw IllegalStateException("no way") 46 | } 47 | 48 | h *= 60 49 | if (h < 0) h += 360 50 | 51 | return Hsl(h.roundToInt(), s.roundTo2Decimal(), l.roundTo2Decimal()) 52 | } 53 | } 54 | 55 | 56 | fun String.toXmlName(percentAlpha: Int?): String { 57 | var name = this.toLowerCase().replace(" ", "_") 58 | if (percentAlpha != null) { 59 | name += "$ALPHA_SEPARATOR$percentAlpha" 60 | } 61 | return name 62 | } -------------------------------------------------------------------------------- /namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/core/util/Colors.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.core.util 2 | 3 | import il.co.galex.namethatcolor.core.model.Color 4 | 5 | /** 6 | * List of colors 7 | * Based on http://chir.ag/projects/ntc/ntc.js 8 | */ 9 | val colorsNames = mapOf( 10 | "000000" to "Black", 11 | "000080" to "Navy Blue", 12 | "0000C8" to "Dark Blue", 13 | "0000FF" to "Blue", 14 | "000741" to "Stratos", 15 | "001B1C" to "Swamp", 16 | "002387" to "Resolution Blue", 17 | "002900" to "Deep Fir", 18 | "002E20" to "Burnham", 19 | "002FA7" to "International Klein Blue", 20 | "003153" to "Prussian Blue", 21 | "003366" to "Midnight Blue", 22 | "003399" to "Smalt", 23 | "003532" to "Deep Teal", 24 | "003E40" to "Cyprus", 25 | "004620" to "Kaitoke Green", 26 | "0047AB" to "Cobalt", 27 | "004816" to "Crusoe", 28 | "004950" to "Sherpa Blue", 29 | "0056A7" to "Endeavour", 30 | "00581A" to "Camarone", 31 | "0066CC" to "Science Blue", 32 | "0066FF" to "Blue Ribbon", 33 | "00755E" to "Tropical Rain Forest", 34 | "0076A3" to "Allports", 35 | "007BA7" to "Deep Cerulean", 36 | "007EC7" to "Lochmara", 37 | "007FFF" to "Azure Radiance", 38 | "008080" to "Teal", 39 | "0095B6" to "Bondi Blue", 40 | "009DC4" to "Pacific Blue", 41 | "00A693" to "Persian Green", 42 | "00A86B" to "Jade", 43 | "00CC99" to "Caribbean Green", 44 | "00CCCC" to "Robins Egg Blue", 45 | "00FF00" to "Green", 46 | "00FF7F" to "Spring Green", 47 | "00FFFF" to "Cyan Aqua", 48 | "010D1A" to "Blue Charcoal", 49 | "011635" to "Midnight", 50 | "011D13" to "Holly", 51 | "012731" to "Daintree", 52 | "01361C" to "Cardin Green", 53 | "01371A" to "County Green", 54 | "013E62" to "Astronaut Blue", 55 | "013F6A" to "Regal Blue", 56 | "014B43" to "Aqua Deep", 57 | "015E85" to "Orient", 58 | "016162" to "Blue Stone", 59 | "016D39" to "Fun Green", 60 | "01796F" to "Pine Green", 61 | "017987" to "Blue Lagoon", 62 | "01826B" to "Deep Sea", 63 | "01A368" to "Green Haze", 64 | "022D15" to "English Holly", 65 | "02402C" to "Sherwood Green", 66 | "02478E" to "Congress Blue", 67 | "024E46" to "Evening Sea", 68 | "026395" to "Bahama Blue", 69 | "02866F" to "Observatory", 70 | "02A4D3" to "Cerulean", 71 | "03163C" to "Tangaroa", 72 | "032B52" to "Green Vogue", 73 | "036A6E" to "Mosque", 74 | "041004" to "Midnight Moss", 75 | "041322" to "Black Pearl", 76 | "042E4C" to "Blue Whale", 77 | "044022" to "Zuccini", 78 | "044259" to "Teal Blue", 79 | "051040" to "Deep Cove", 80 | "051657" to "Gulf Blue", 81 | "055989" to "Venice Blue", 82 | "056F57" to "Watercourse", 83 | "062A78" to "Catalina Blue", 84 | "063537" to "Tiber", 85 | "069B81" to "Gossamer", 86 | "06A189" to "Niagara", 87 | "073A50" to "Tarawera", 88 | "080110" to "Jaguar", 89 | "081910" to "Black Bean", 90 | "082567" to "Deep Sapphire", 91 | "088370" to "Elf Green", 92 | "08E8DE" to "Bright Turquoise", 93 | "092256" to "Downriver", 94 | "09230F" to "Palm Green", 95 | "09255D" to "Madison", 96 | "093624" to "Bottle Green", 97 | "095859" to "Deep Sea Green", 98 | "097F4B" to "Salem", 99 | "0A001C" to "Black Russian", 100 | "0A480D" to "Dark Fern", 101 | "0A6906" to "Japanese Laurel", 102 | "0A6F75" to "Atoll", 103 | "0B0B0B" to "Cod Gray", 104 | "0B0F08" to "Marshland", 105 | "0B1107" to "Gordons Green", 106 | "0B1304" to "Black Forest", 107 | "0B6207" to "San Felix", 108 | "0BDA51" to "Malachite", 109 | "0C0B1D" to "Ebony", 110 | "0C0D0F" to "Woodsmoke", 111 | "0C1911" to "Racing Green", 112 | "0C7A79" to "Surfie Green", 113 | "0C8990" to "Blue Chill", 114 | "0D0332" to "Black Rock", 115 | "0D1117" to "Bunker", 116 | "0D1C19" to "Aztec", 117 | "0D2E1C" to "Bush", 118 | "0E0E18" to "Cinder", 119 | "0E2A30" to "Firefly", 120 | "0F2D9E" to "Torea Bay", 121 | "10121D" to "Vulcan", 122 | "101405" to "Green Waterloo", 123 | "105852" to "Eden", 124 | "110C6C" to "Arapawa", 125 | "120A8F" to "Ultramarine", 126 | "123447" to "Elephant", 127 | "126B40" to "Jewel", 128 | "130000" to "Diesel", 129 | "130A06" to "Asphalt", 130 | "13264D" to "Blue Zodiac", 131 | "134F19" to "Parsley", 132 | "140600" to "Nero", 133 | "1450AA" to "Tory Blue", 134 | "151F4C" to "Bunting", 135 | "1560BD" to "Denim", 136 | "15736B" to "Genoa", 137 | "161928" to "Mirage", 138 | "161D10" to "Hunter Green", 139 | "162A40" to "Big Stone", 140 | "163222" to "Celtic", 141 | "16322C" to "Timber Green", 142 | "163531" to "Gable Green", 143 | "171F04" to "Pine Tree", 144 | "175579" to "Chathams Blue", 145 | "182D09" to "Deep Forest Green", 146 | "18587A" to "Blumine", 147 | "19330E" to "Palm Leaf", 148 | "193751" to "Nile Blue", 149 | "1959A8" to "Fun Blue", 150 | "1A1A68" to "Lucky Point", 151 | "1AB385" to "Mountain Meadow", 152 | "1B0245" to "Tolopea", 153 | "1B1035" to "Haiti", 154 | "1B127B" to "Deep Koamaru", 155 | "1B1404" to "Acadia", 156 | "1B2F11" to "Seaweed", 157 | "1B3162" to "Biscay", 158 | "1B659D" to "Matisse", 159 | "1C1208" to "Crowshead", 160 | "1C1E13" to "Rangoon Green", 161 | "1C39BB" to "Persian Blue", 162 | "1C402E" to "Everglade", 163 | "1C7C7D" to "Elm", 164 | "1D6142" to "Green Pea", 165 | "1E0F04" to "Creole", 166 | "1E1609" to "Karaka", 167 | "1E1708" to "El Paso", 168 | "1E385B" to "Cello", 169 | "1E433C" to "Te Papa Green", 170 | "1E90FF" to "Dodger Blue", 171 | "1E9AB0" to "Eastern Blue", 172 | "1F120F" to "Night Rider", 173 | "1FC2C2" to "Java", 174 | "20208D" to "Jacksons Purple", 175 | "202E54" to "Cloud Burst", 176 | "204852" to "Blue Dianne", 177 | "211A0E" to "Eternity", 178 | "220878" to "Deep Blue", 179 | "228B22" to "Forest Green", 180 | "233418" to "Mallard", 181 | "240A40" to "Violet", 182 | "240C02" to "Kilamanjaro", 183 | "242A1D" to "Log Cabin", 184 | "242E16" to "Black Olive", 185 | "24500F" to "Green House", 186 | "251607" to "Graphite", 187 | "251706" to "Cannon Black", 188 | "251F4F" to "Port Gore", 189 | "25272C" to "Shark", 190 | "25311C" to "Green Kelp", 191 | "2596D1" to "Curious Blue", 192 | "260368" to "Paua", 193 | "26056A" to "Paris M", 194 | "261105" to "Wood Bark", 195 | "261414" to "Gondola", 196 | "262335" to "Steel Gray", 197 | "26283B" to "Ebony Clay", 198 | "273A81" to "Bay of Many", 199 | "27504B" to "Plantation", 200 | "278A5B" to "Eucalyptus", 201 | "281E15" to "Oil", 202 | "283A77" to "Astronaut", 203 | "286ACD" to "Mariner", 204 | "290C5E" to "Violent Violet", 205 | "292130" to "Bastille", 206 | "292319" to "Zeus", 207 | "292937" to "Charade", 208 | "297B9A" to "Jelly Bean", 209 | "29AB87" to "Jungle Green", 210 | "2A0359" to "Cherry Pie", 211 | "2A140E" to "Coffee Bean", 212 | "2A2630" to "Baltic Sea", 213 | "2A380B" to "Turtle Green", 214 | "2A52BE" to "Cerulean Blue", 215 | "2B0202" to "Sepia Black", 216 | "2B194F" to "Valhalla", 217 | "2B3228" to "Heavy Metal", 218 | "2C0E8C" to "Blue Gem", 219 | "2C1632" to "Revolver", 220 | "2C2133" to "Bleached Cedar", 221 | "2C8C84" to "Lochinvar", 222 | "2D2510" to "Mikado", 223 | "2D383A" to "Outer Space", 224 | "2D569B" to "St Tropaz", 225 | "2E0329" to "Jacaranda", 226 | "2E1905" to "Jacko Bean", 227 | "2E3222" to "Rangitoto", 228 | "2E3F62" to "Rhino", 229 | "2E8B57" to "Sea Green", 230 | "2EBFD4" to "Scooter", 231 | "2F270E" to "Onion", 232 | "2F3CB3" to "Governor Bay", 233 | "2F519E" to "Sapphire", 234 | "2F5A57" to "Spectra", 235 | "2F6168" to "Casal", 236 | "300529" to "Melanzane", 237 | "301F1E" to "Cocoa Brown", 238 | "302A0F" to "Woodrush", 239 | "304B6A" to "San Juan", 240 | "30D5C8" to "Turquoise", 241 | "311C17" to "Eclipse", 242 | "314459" to "Pickled Bluewood", 243 | "315BA1" to "Azure", 244 | "31728D" to "Calypso", 245 | "317D82" to "Paradiso", 246 | "32127A" to "Persian Indigo", 247 | "32293A" to "Blackcurrant", 248 | "323232" to "Mine Shaft", 249 | "325D52" to "Stromboli", 250 | "327C14" to "Bilbao", 251 | "327DA0" to "Astral", 252 | "33036B" to "Christalle", 253 | "33292F" to "Thunder", 254 | "33CC99" to "Shamrock", 255 | "341515" to "Tamarind", 256 | "350036" to "Mardi Gras", 257 | "350E42" to "Valentino", 258 | "350E57" to "Jagger", 259 | "353542" to "Tuna", 260 | "354E8C" to "Chambray", 261 | "363050" to "Martinique", 262 | "363534" to "Tuatara", 263 | "363C0D" to "Waiouru", 264 | "36747D" to "Ming", 265 | "368716" to "La Palma", 266 | "370202" to "Chocolate", 267 | "371D09" to "Clinker", 268 | "37290E" to "Brown Tumbleweed", 269 | "373021" to "Birch", 270 | "377475" to "Oracle", 271 | "380474" to "Blue Diamond", 272 | "381A51" to "Grape", 273 | "383533" to "Dune", 274 | "384555" to "Oxford Blue", 275 | "384910" to "Clover", 276 | "394851" to "Limed Spruce", 277 | "396413" to "Dell", 278 | "3A0020" to "Toledo", 279 | "3A2010" to "Sambuca", 280 | "3A2A6A" to "Jacarta", 281 | "3A686C" to "William", 282 | "3A6A47" to "Killarney", 283 | "3AB09E" to "Keppel", 284 | "3B000B" to "Temptress", 285 | "3B0910" to "Aubergine", 286 | "3B1F1F" to "Jon", 287 | "3B2820" to "Treehouse", 288 | "3B7A57" to "Amazon", 289 | "3B91B4" to "Boston Blue", 290 | "3C0878" to "Windsor", 291 | "3C1206" to "Rebel", 292 | "3C1F76" to "Meteorite", 293 | "3C2005" to "Dark Ebony", 294 | "3C3910" to "Camouflage", 295 | "3C4151" to "Bright Gray", 296 | "3C4443" to "Cape Cod", 297 | "3C493A" to "Lunar Green", 298 | "3D0C02" to "Bean ", 299 | "3D2B1F" to "Bistre", 300 | "3D7D52" to "Goblin", 301 | "3E0480" to "Kingfisher Daisy", 302 | "3E1C14" to "Cedar", 303 | "3E2B23" to "English Walnut", 304 | "3E2C1C" to "Black Marlin", 305 | "3E3A44" to "Ship Gray", 306 | "3EABBF" to "Pelorous", 307 | "3F2109" to "Bronze", 308 | "3F2500" to "Cola", 309 | "3F3002" to "Madras", 310 | "3F307F" to "Minsk", 311 | "3F4C3A" to "Cabbage Pont", 312 | "3F583B" to "Tom Thumb", 313 | "3F5D53" to "Mineral Green", 314 | "3FC1AA" to "Puerto Rico", 315 | "3FFF00" to "Harlequin", 316 | "401801" to "Brown Pod", 317 | "40291D" to "Cork", 318 | "403B38" to "Masala", 319 | "403D19" to "Thatch Green", 320 | "405169" to "Fiord", 321 | "40826D" to "Viridian", 322 | "40A860" to "Chateau Green", 323 | "410056" to "Ripe Plum", 324 | "411F10" to "Paco", 325 | "412010" to "Deep Oak", 326 | "413C37" to "Merlin", 327 | "414257" to "Gun Powder", 328 | "414C7D" to "East Bay", 329 | "4169E1" to "Royal Blue", 330 | "41AA78" to "Ocean Green", 331 | "420303" to "Burnt Maroon", 332 | "423921" to "Lisbon Brown", 333 | "427977" to "Faded Jade", 334 | "431560" to "Scarlet Gum", 335 | "433120" to "Iroko", 336 | "433E37" to "Armadillo", 337 | "434C59" to "River Bed", 338 | "436A0D" to "Green Leaf", 339 | "44012D" to "Barossa", 340 | "441D00" to "Morocco Brown", 341 | "444954" to "Mako", 342 | "454936" to "Kelp", 343 | "456CAC" to "San Marino", 344 | "45B1E8" to "Picton Blue", 345 | "460B41" to "Loulou", 346 | "462425" to "Crater Brown", 347 | "465945" to "Gray Asparagus", 348 | "4682B4" to "Steel Blue", 349 | "480404" to "Rustic Red", 350 | "480607" to "Bulgarian Rose", 351 | "480656" to "Clairvoyant", 352 | "481C1C" to "Cocoa Bean", 353 | "483131" to "Woody Brown", 354 | "483C32" to "Taupe", 355 | "49170C" to "Van Cleef", 356 | "492615" to "Brown Derby", 357 | "49371B" to "Metallic Bronze", 358 | "495400" to "Verdun Green", 359 | "496679" to "Blue Bayoux", 360 | "497183" to "Bismark", 361 | "4A2A04" to "Bracken", 362 | "4A3004" to "Deep Bronze", 363 | "4A3C30" to "Mondo", 364 | "4A4244" to "Tundora", 365 | "4A444B" to "Gravel", 366 | "4A4E5A" to "Trout", 367 | "4B0082" to "Pigment Indigo", 368 | "4B5D52" to "Nandor", 369 | "4C3024" to "Saddle", 370 | "4C4F56" to "Abbey", 371 | "4D0135" to "Blackberry", 372 | "4D0A18" to "Cab Sav", 373 | "4D1E01" to "Indian Tan", 374 | "4D282D" to "Cowboy", 375 | "4D282E" to "Livid Brown", 376 | "4D3833" to "Rock", 377 | "4D3D14" to "Punga", 378 | "4D400F" to "Bronzetone", 379 | "4D5328" to "Woodland", 380 | "4E0606" to "Mahogany", 381 | "4E2A5A" to "Bossanova", 382 | "4E3B41" to "Matterhorn", 383 | "4E420C" to "Bronze Olive", 384 | "4E4562" to "Mulled Wine", 385 | "4E6649" to "Axolotl", 386 | "4E7F9E" to "Wedgewood", 387 | "4EABD1" to "Shakespeare", 388 | "4F1C70" to "Honey Flower", 389 | "4F2398" to "Daisy Bush", 390 | "4F69C6" to "Indigo", 391 | "4F7942" to "Fern Green", 392 | "4F9D5D" to "Fruit Salad", 393 | "4FA83D" to "Apple", 394 | "504351" to "Mortar", 395 | "507096" to "Kashmir Blue", 396 | "507672" to "Cutty Sark", 397 | "50C878" to "Emerald", 398 | "514649" to "Emperor", 399 | "516E3D" to "Chalet Green", 400 | "517C66" to "Como", 401 | "51808F" to "Smalt Blue", 402 | "52001F" to "Castro", 403 | "520C17" to "Maroon Oak", 404 | "523C94" to "Gigas", 405 | "533455" to "Voodoo", 406 | "534491" to "Victoria", 407 | "53824B" to "Hippie Green", 408 | "541012" to "Heath", 409 | "544333" to "Judge Gray", 410 | "54534D" to "Fuscous Gray", 411 | "549019" to "Vida Loca", 412 | "55280C" to "Cioccolato", 413 | "555B10" to "Saratoga", 414 | "556D56" to "Finlandia", 415 | "5590D9" to "Havelock Blue", 416 | "56B4BE" to "Fountain Blue", 417 | "578363" to "Spring Leaves", 418 | "583401" to "Saddle Brown", 419 | "585562" to "Scarpa Flow", 420 | "587156" to "Cactus", 421 | "589AAF" to "Hippie Blue", 422 | "591D35" to "Wine Berry", 423 | "592804" to "Brown Bramble", 424 | "593737" to "Congo Brown", 425 | "594433" to "Millbrook", 426 | "5A6E9C" to "Waikawa Gray", 427 | "5A87A0" to "Horizon", 428 | "5B3013" to "Jambalaya", 429 | "5C0120" to "Bordeaux", 430 | "5C0536" to "Mulberry Wood", 431 | "5C2E01" to "Carnaby Tan", 432 | "5C5D75" to "Comet", 433 | "5D1E0F" to "Redwood", 434 | "5D4C51" to "Don Juan", 435 | "5D5C58" to "Chicago", 436 | "5D5E37" to "Verdigris", 437 | "5D7747" to "Dingley", 438 | "5DA19F" to "Breaker Bay", 439 | "5E483E" to "Kabul", 440 | "5E5D3B" to "Hemlock", 441 | "5F3D26" to "Irish Coffee", 442 | "5F5F6E" to "Mid Gray", 443 | "5F6672" to "Shuttle Gray", 444 | "5FA777" to "Aqua Forest", 445 | "5FB3AC" to "Tradewind", 446 | "604913" to "Horses Neck", 447 | "605B73" to "Smoky", 448 | "606E68" to "Corduroy", 449 | "6093D1" to "Danube", 450 | "612718" to "Espresso", 451 | "614051" to "Eggplant", 452 | "615D30" to "Costa Del Sol", 453 | "61845F" to "Glade Green", 454 | "622F30" to "Buccaneer", 455 | "623F2D" to "Quincy", 456 | "624E9A" to "Butterfly Bush", 457 | "625119" to "West Coast", 458 | "626649" to "Finch", 459 | "639A8F" to "Patina", 460 | "63B76C" to "Fern", 461 | "6456B7" to "Blue Violet", 462 | "646077" to "Dolphin", 463 | "646463" to "Storm Dust", 464 | "646A54" to "Siam", 465 | "646E75" to "Nevada", 466 | "6495ED" to "Cornflower Blue", 467 | "64CCDB" to "Viking", 468 | "65000B" to "Rosewood", 469 | "651A14" to "Cherrywood", 470 | "652DC1" to "Purple Heart", 471 | "657220" to "Fern Frond", 472 | "65745D" to "Willow Grove", 473 | "65869F" to "Hoki", 474 | "660045" to "Pompadour", 475 | "660099" to "Purple", 476 | "66023C" to "Tyrian Purple", 477 | "661010" to "Dark Tan", 478 | "66B58F" to "Silver Tree", 479 | "66FF00" to "Bright Green", 480 | "66FF66" to "Screamin Green", 481 | "67032D" to "Black Rose", 482 | "675FA6" to "Scampi", 483 | "676662" to "Ironside Gray", 484 | "678975" to "Viridian Green", 485 | "67A712" to "Christi", 486 | "683600" to "Nutmeg Wood Finish", 487 | "685558" to "Zambezi", 488 | "685E6E" to "Salt Box", 489 | "692545" to "Tawny Port", 490 | "692D54" to "Finn", 491 | "695F62" to "Scorpion", 492 | "697E9A" to "Lynch", 493 | "6A442E" to "Spice", 494 | "6A5D1B" to "Himalaya", 495 | "6A6051" to "Soya Bean", 496 | "6B2A14" to "Hairy Heath", 497 | "6B3FA0" to "Royal Purple", 498 | "6B4E31" to "Shingle Fawn", 499 | "6B5755" to "Dorado", 500 | "6B8BA2" to "Bermuda Gray", 501 | "6B8E23" to "Olive Drab", 502 | "6C3082" to "Eminence", 503 | "6CDAE7" to "Turquoise Blue", 504 | "6D0101" to "Lonestar", 505 | "6D5E54" to "Pine Cone", 506 | "6D6C6C" to "Dove Gray", 507 | "6D9292" to "Juniper", 508 | "6D92A1" to "Gothic", 509 | "6E0902" to "Red Oxide", 510 | "6E1D14" to "Moccaccino", 511 | "6E4826" to "Pickled Bean", 512 | "6E4B26" to "Dallas", 513 | "6E6D57" to "Kokoda", 514 | "6E7783" to "Pale Sky", 515 | "6F440C" to "Cafe Royale", 516 | "6F6A61" to "Flint", 517 | "6F8E63" to "Highland", 518 | "6F9D02" to "Limeade", 519 | "6FD0C5" to "Downy", 520 | "701C1C" to "Persian Plum", 521 | "704214" to "Sepia", 522 | "704A07" to "Antique Bronze", 523 | "704F50" to "Ferra", 524 | "706555" to "Coffee", 525 | "708090" to "Slate Gray", 526 | "711A00" to "Cedar Wood Finish", 527 | "71291D" to "Metallic Copper", 528 | "714693" to "Affair", 529 | "714AB2" to "Studio", 530 | "715D47" to "Tobacco Brown", 531 | "716338" to "Yellow Metal", 532 | "716B56" to "Peat", 533 | "716E10" to "Olivetone", 534 | "717486" to "Storm Gray", 535 | "718080" to "Sirocco", 536 | "71D9E2" to "Aquamarine Blue", 537 | "72010F" to "Venetian Red", 538 | "724A2F" to "Old Copper", 539 | "726D4E" to "Go Ben", 540 | "727B89" to "Raven", 541 | "731E8F" to "Seance", 542 | "734A12" to "Raw Umber", 543 | "736C9F" to "Kimberly", 544 | "736D58" to "Crocodile", 545 | "737829" to "Crete", 546 | "738678" to "Xanadu", 547 | "74640D" to "Spicy Mustard", 548 | "747D63" to "Limed Ash", 549 | "747D83" to "Rolling Stone", 550 | "748881" to "Blue Smoke", 551 | "749378" to "Laurel", 552 | "74C365" to "Mantis", 553 | "755A57" to "Russett", 554 | "7563A8" to "Deluge", 555 | "76395D" to "Cosmic", 556 | "7666C6" to "Blue Marguerite", 557 | "76BD17" to "Lima", 558 | "76D7EA" to "Sky Blue", 559 | "770F05" to "Dark Burgundy", 560 | "771F1F" to "Crown of Thorns", 561 | "773F1A" to "Walnut", 562 | "776F61" to "Pablo", 563 | "778120" to "Pacifika", 564 | "779E86" to "Oxley", 565 | "77DD77" to "Pastel Green", 566 | "780109" to "Japanese Maple", 567 | "782D19" to "Mocha", 568 | "782F16" to "Peanut", 569 | "78866B" to "Camouflage Green", 570 | "788A25" to "Wasabi", 571 | "788BBA" to "Ship Cove", 572 | "78A39C" to "Sea Nymph", 573 | "795D4C" to "Roman Coffee", 574 | "796878" to "Old Lavender", 575 | "796989" to "Rum", 576 | "796A78" to "Fedora", 577 | "796D62" to "Sandstone", 578 | "79DEEC" to "Spray", 579 | "7A013A" to "Siren", 580 | "7A58C1" to "Fuchsia Blue", 581 | "7A7A7A" to "Boulder", 582 | "7A89B8" to "Wild Blue Yonder", 583 | "7AC488" to "De York", 584 | "7B3801" to "Red Beech", 585 | "7B3F00" to "Cinnamon", 586 | "7B6608" to "Yukon Gold", 587 | "7B7874" to "Tapa", 588 | "7B7C94" to "Waterloo ", 589 | "7B8265" to "Flax Smoke", 590 | "7B9F80" to "Amulet", 591 | "7BA05B" to "Asparagus", 592 | "7C1C05" to "Kenyan Copper", 593 | "7C7631" to "Pesto", 594 | "7C778A" to "Topaz", 595 | "7C7B7A" to "Concord", 596 | "7C7B82" to "Jumbo", 597 | "7C881A" to "Trendy Green", 598 | "7CA1A6" to "Gumbo", 599 | "7CB0A1" to "Acapulco", 600 | "7CB7BB" to "Neptune", 601 | "7D2C14" to "Pueblo", 602 | "7DA98D" to "Bay Leaf", 603 | "7DC8F7" to "Malibu", 604 | "7DD8C6" to "Bermuda", 605 | "7E3A15" to "Copper Canyon", 606 | "7F1734" to "Claret", 607 | "7F3A02" to "Peru Tan", 608 | "7F626D" to "Falcon", 609 | "7F7589" to "Mobster", 610 | "7F76D3" to "Moody Blue", 611 | "7FFF00" to "Chartreuse", 612 | "7FFFD4" to "Aquamarine", 613 | "800000" to "Maroon", 614 | "800B47" to "Rose Bud Cherry", 615 | "801818" to "Falu Red", 616 | "80341F" to "Red Robin", 617 | "803790" to "Vivid Violet", 618 | "80461B" to "Russet", 619 | "807E79" to "Friar Gray", 620 | "808000" to "Olive", 621 | "808080" to "Gray", 622 | "80B3AE" to "Gulf Stream", 623 | "80B3C4" to "Glacier", 624 | "80CCEA" to "Seagull", 625 | "81422C" to "Nutmeg", 626 | "816E71" to "Spicy Pink", 627 | "817377" to "Empress", 628 | "819885" to "Spanish Green", 629 | "826F65" to "Sand Dune", 630 | "828685" to "Gunsmoke", 631 | "828F72" to "Battleship Gray", 632 | "831923" to "Merlot", 633 | "837050" to "Shadow", 634 | "83AA5D" to "Chelsea Cucumber", 635 | "83D0C6" to "Monte Carlo", 636 | "843179" to "Plum", 637 | "84A0A0" to "Granny Smith", 638 | "8581D9" to "Chetwode Blue", 639 | "858470" to "Bandicoot", 640 | "859FAF" to "Bali Hai", 641 | "85C4CC" to "Half Baked", 642 | "860111" to "Red Devil", 643 | "863C3C" to "Lotus", 644 | "86483C" to "Ironstone", 645 | "864D1E" to "Bull Shot", 646 | "86560A" to "Rusty Nail", 647 | "868974" to "Bitter", 648 | "86949F" to "Regent Gray", 649 | "871550" to "Disco", 650 | "87756E" to "Americano", 651 | "877C7B" to "Hurricane", 652 | "878D91" to "Oslo Gray", 653 | "87AB39" to "Sushi", 654 | "885342" to "Spicy Mix", 655 | "886221" to "Kumera", 656 | "888387" to "Suva Gray", 657 | "888D65" to "Avocado", 658 | "893456" to "Camelot", 659 | "893843" to "Solid Pink", 660 | "894367" to "Cannon Pink", 661 | "897D6D" to "Makara", 662 | "8A3324" to "Burnt Umber", 663 | "8A73D6" to "True V", 664 | "8A8360" to "Clay Creek", 665 | "8A8389" to "Monsoon", 666 | "8A8F8A" to "Stack", 667 | "8AB9F1" to "Jordy Blue", 668 | "8B00FF" to "Electric Violet", 669 | "8B0723" to "Monarch", 670 | "8B6B0B" to "Corn Harvest", 671 | "8B8470" to "Olive Haze", 672 | "8B847E" to "Schooner", 673 | "8B8680" to "Natural Gray", 674 | "8B9C90" to "Mantle", 675 | "8B9FEE" to "Portage", 676 | "8BA690" to "Envy", 677 | "8BA9A5" to "Cascade", 678 | "8BE6D8" to "Riptide", 679 | "8C055E" to "Cardinal Pink", 680 | "8C472F" to "Mule Fawn", 681 | "8C5738" to "Potters Clay", 682 | "8C6495" to "Trendy Pink", 683 | "8D0226" to "Paprika", 684 | "8D3D38" to "Sanguine Brown", 685 | "8D3F3F" to "Tosca", 686 | "8D7662" to "Cement", 687 | "8D8974" to "Granite Green", 688 | "8D90A1" to "Manatee", 689 | "8DA8CC" to "Polo Blue", 690 | "8E0000" to "Red Berry", 691 | "8E4D1E" to "Rope", 692 | "8E6F70" to "Opium", 693 | "8E775E" to "Domino", 694 | "8E8190" to "Mamba", 695 | "8EABC1" to "Nepal", 696 | "8F021C" to "Pohutukawa", 697 | "8F3E33" to "El Salva", 698 | "8F4B0E" to "Korma", 699 | "8F8176" to "Squirrel", 700 | "8FD6B4" to "Vista Blue", 701 | "900020" to "Burgundy", 702 | "901E1E" to "Old Brick", 703 | "907874" to "Hemp", 704 | "907B71" to "Almond Frost", 705 | "908D39" to "Sycamore", 706 | "92000A" to "Sangria", 707 | "924321" to "Cumin", 708 | "926F5B" to "Beaver", 709 | "928573" to "Stonewall", 710 | "928590" to "Venus", 711 | "9370DB" to "Medium Purple", 712 | "93CCEA" to "Cornflower", 713 | "93DFB8" to "Algae Green", 714 | "944747" to "Copper Rust", 715 | "948771" to "Arrowtown", 716 | "950015" to "Scarlett", 717 | "956387" to "Strikemaster", 718 | "959396" to "Mountain Mist", 719 | "960018" to "Carmine", 720 | "964B00" to "Brown", 721 | "967059" to "Leather", 722 | "9678B6" to "Purple Mountains Majesty", 723 | "967BB6" to "Lavender Purple", 724 | "96A8A1" to "Pewter", 725 | "96BBAB" to "Summer Green", 726 | "97605D" to "Au Chico", 727 | "9771B5" to "Wisteria", 728 | "97CD2D" to "Atlantis", 729 | "983D61" to "Vin Rouge", 730 | "9874D3" to "Lilac Bush", 731 | "98777B" to "Bazaar", 732 | "98811B" to "Hacienda", 733 | "988D77" to "Pale Oyster", 734 | "98FF98" to "Mint Green", 735 | "990066" to "Fresh Eggplant", 736 | "991199" to "Violet Eggplant", 737 | "991613" to "Tamarillo", 738 | "991B07" to "Totem Pole", 739 | "996666" to "Copper Rose", 740 | "9966CC" to "Amethyst", 741 | "997A8D" to "Mountbatten Pink", 742 | "9999CC" to "Blue Bell", 743 | "9A3820" to "Prairie Sand", 744 | "9A6E61" to "Toast", 745 | "9A9577" to "Gurkha", 746 | "9AB973" to "Olivine", 747 | "9AC2B8" to "Shadow Green", 748 | "9B4703" to "Oregon", 749 | "9B9E8F" to "Lemon Grass", 750 | "9C3336" to "Stiletto", 751 | "9D5616" to "Hawaiian Tan", 752 | "9DACB7" to "Gull Gray", 753 | "9DC209" to "Pistachio", 754 | "9DE093" to "Granny Smith Apple", 755 | "9DE5FF" to "Anakiwa", 756 | "9E5302" to "Chelsea Gem", 757 | "9E5B40" to "Sepia Skin", 758 | "9EA587" to "Sage", 759 | "9EA91F" to "Citron", 760 | "9EB1CD" to "Rock Blue", 761 | "9EDEE0" to "Morning Glory", 762 | "9F381D" to "Cognac", 763 | "9F821C" to "Reef Gold", 764 | "9F9F9C" to "Star Dust", 765 | "9FA0B1" to "Santas Gray", 766 | "9FD7D3" to "Sinbad", 767 | "9FDD8C" to "Feijoa", 768 | "A02712" to "Tabasco", 769 | "A1750D" to "Buttered Rum", 770 | "A1ADB5" to "Hit Gray", 771 | "A1C50A" to "Citrus", 772 | "A1DAD7" to "Aqua Island", 773 | "A1E9DE" to "Water Leaf", 774 | "A2006D" to "Flirt", 775 | "A23B6C" to "Rouge", 776 | "A26645" to "Cape Palliser", 777 | "A2AAB3" to "Gray Chateau", 778 | "A2AEAB" to "Edward", 779 | "A3807B" to "Pharlap", 780 | "A397B4" to "Amethyst Smoke", 781 | "A3E3ED" to "Blizzard Blue", 782 | "A4A49D" to "Delta", 783 | "A4A6D3" to "Wistful", 784 | "A4AF6E" to "Green Smoke", 785 | "A50B5E" to "Jazzberry Jam", 786 | "A59B91" to "Zorba", 787 | "A5CB0C" to "Bahia", 788 | "A62F20" to "Roof Terracotta", 789 | "A65529" to "Paarl", 790 | "A68B5B" to "Barley Corn", 791 | "A69279" to "Donkey Brown", 792 | "A6A29A" to "Dawn", 793 | "A72525" to "Mexican Red", 794 | "A7882C" to "Luxor Gold", 795 | "A85307" to "Rich Gold", 796 | "A86515" to "Reno Sand", 797 | "A86B6B" to "Coral Tree", 798 | "A8989B" to "Dusty Gray", 799 | "A899E6" to "Dull Lavender", 800 | "A8A589" to "Tallow", 801 | "A8AE9C" to "Bud", 802 | "A8AF8E" to "Locust", 803 | "A8BD9F" to "Norway", 804 | "A8E3BD" to "Chinook", 805 | "A9A491" to "Gray Olive", 806 | "A9ACB6" to "Aluminium", 807 | "A9B2C3" to "Cadet Blue", 808 | "A9B497" to "Schist", 809 | "A9BDBF" to "Tower Gray", 810 | "A9BEF2" to "Perano", 811 | "A9C6C2" to "Opal", 812 | "AA375A" to "Night Shadz", 813 | "AA4203" to "Fire", 814 | "AA8B5B" to "Muesli", 815 | "AA8D6F" to "Sandal", 816 | "AAA5A9" to "Shady Lady", 817 | "AAA9CD" to "Logan", 818 | "AAABB7" to "Spun Pearl", 819 | "AAD6E6" to "Regent St Blue", 820 | "AAF0D1" to "Magic Mint", 821 | "AB0563" to "Lipstick", 822 | "AB3472" to "Royal Heath", 823 | "AB917A" to "Sandrift", 824 | "ABA0D9" to "Cold Purple", 825 | "ABA196" to "Bronco", 826 | "AC8A56" to "Limed Oak", 827 | "AC91CE" to "East Side", 828 | "AC9E22" to "Lemon Ginger", 829 | "ACA494" to "Napa", 830 | "ACA586" to "Hillary", 831 | "ACA59F" to "Cloudy", 832 | "ACACAC" to "Silver Chalice", 833 | "ACB78E" to "Swamp Green", 834 | "ACCBB1" to "Spring Rain", 835 | "ACDD4D" to "Conifer", 836 | "ACE1AF" to "Celadon", 837 | "AD781B" to "Mandalay", 838 | "ADBED1" to "Casper", 839 | "ADDFAD" to "Moss Green", 840 | "ADE6C4" to "Padua", 841 | "ADFF2F" to "Green Yellow", 842 | "AE4560" to "Hippie Pink", 843 | "AE6020" to "Desert", 844 | "AE809E" to "Bouquet", 845 | "AF4035" to "Medium Carmine", 846 | "AF4D43" to "Apple Blossom", 847 | "AF593E" to "Brown Rust", 848 | "AF8751" to "Driftwood", 849 | "AF8F2C" to "Alpine", 850 | "AF9F1C" to "Lucky", 851 | "AFA09E" to "Martini", 852 | "AFB1B8" to "Bombay", 853 | "AFBDD9" to "Pigeon Post", 854 | "B04C6A" to "Cadillac", 855 | "B05D54" to "Matrix", 856 | "B05E81" to "Tapestry", 857 | "B06608" to "Mai Tai", 858 | "B09A95" to "Del Rio", 859 | "B0E0E6" to "Powder Blue", 860 | "B0E313" to "Inch Worm", 861 | "B10000" to "Bright Red", 862 | "B14A0B" to "Vesuvius", 863 | "B1610B" to "Pumpkin Skin", 864 | "B16D52" to "Santa Fe", 865 | "B19461" to "Teak", 866 | "B1E2C1" to "Fringy Flower", 867 | "B1F4E7" to "Ice Cold", 868 | "B20931" to "Shiraz", 869 | "B2A1EA" to "Biloba Flower", 870 | "B32D29" to "Tall Poppy", 871 | "B35213" to "Fiery Orange", 872 | "B38007" to "Hot Toddy", 873 | "B3AF95" to "Taupe Gray", 874 | "B3C110" to "La Rioja", 875 | "B43332" to "Well Read", 876 | "B44668" to "Blush", 877 | "B4CFD3" to "Jungle Mist", 878 | "B57281" to "Turkish Rose", 879 | "B57EDC" to "Lavender", 880 | "B5A27F" to "Mongoose", 881 | "B5B35C" to "Olive Green", 882 | "B5D2CE" to "Jet Stream", 883 | "B5ECDF" to "Cruise", 884 | "B6316C" to "Hibiscus", 885 | "B69D98" to "Thatch", 886 | "B6B095" to "Heathered Gray", 887 | "B6BAA4" to "Eagle", 888 | "B6D1EA" to "Spindle", 889 | "B6D3BF" to "Gum Leaf", 890 | "B7410E" to "Rust", 891 | "B78E5C" to "Muddy Waters", 892 | "B7A214" to "Sahara", 893 | "B7A458" to "Husk", 894 | "B7B1B1" to "Nobel", 895 | "B7C3D0" to "Heather", 896 | "B7F0BE" to "Madang", 897 | "B81104" to "Milano Red", 898 | "B87333" to "Copper", 899 | "B8B56A" to "Gimblet", 900 | "B8C1B1" to "Green Spring", 901 | "B8C25D" to "Celery", 902 | "B8E0F9" to "Sail", 903 | "B94E48" to "Chestnut", 904 | "B95140" to "Crail", 905 | "B98D28" to "Marigold", 906 | "B9C46A" to "Wild Willow", 907 | "B9C8AC" to "Rainee", 908 | "BA0101" to "Guardsman Red", 909 | "BA450C" to "Rock Spray", 910 | "BA6F1E" to "Bourbon", 911 | "BA7F03" to "Pirate Gold", 912 | "BAB1A2" to "Nomad", 913 | "BAC7C9" to "Submarine", 914 | "BAEEF9" to "Charlotte", 915 | "BB3385" to "Medium Red Violet", 916 | "BB8983" to "Brandy Rose", 917 | "BBD009" to "Rio Grande", 918 | "BBD7C1" to "Surf", 919 | "BCC9C2" to "Powder Ash", 920 | "BD5E2E" to "Tuscany", 921 | "BD978E" to "Quicksand", 922 | "BDB1A8" to "Silk", 923 | "BDB2A1" to "Malta", 924 | "BDB3C7" to "Chatelle", 925 | "BDBBD7" to "Lavender Gray", 926 | "BDBDC6" to "French Gray", 927 | "BDC8B3" to "Clay Ash", 928 | "BDC9CE" to "Loblolly", 929 | "BDEDFD" to "French Pass", 930 | "BEA6C3" to "London Hue", 931 | "BEB5B7" to "Pink Swan", 932 | "BEDE0D" to "Fuego", 933 | "BF5500" to "Rose of Sharon", 934 | "BFB8B0" to "Tide", 935 | "BFBED8" to "Blue Haze", 936 | "BFC1C2" to "Silver Sand", 937 | "BFC921" to "Key Lime Pie", 938 | "BFDBE2" to "Ziggurat", 939 | "BFFF00" to "Lime", 940 | "C02B18" to "Thunderbird", 941 | "C04737" to "Mojo", 942 | "C08081" to "Old Rose", 943 | "C0C0C0" to "Silver", 944 | "C0D3B9" to "Pale Leaf", 945 | "C0D8B6" to "Pixie Green", 946 | "C1440E" to "Tia Maria", 947 | "C154C1" to "Fuchsia Pink", 948 | "C1A004" to "Buddha Gold", 949 | "C1B7A4" to "Bison Hide", 950 | "C1BAB0" to "Tea", 951 | "C1BECD" to "Gray Suit", 952 | "C1D7B0" to "Sprout", 953 | "C1F07C" to "Sulu", 954 | "C26B03" to "Indochine", 955 | "C2955D" to "Twine", 956 | "C2BDB6" to "Cotton Seed", 957 | "C2CAC4" to "Pumice", 958 | "C2E8E5" to "Jagged Ice", 959 | "C32148" to "Maroon Flush", 960 | "C3B091" to "Indian Khaki", 961 | "C3BFC1" to "Pale Slate", 962 | "C3C3BD" to "Gray Nickel", 963 | "C3CDE6" to "Periwinkle Gray", 964 | "C3D1D1" to "Tiara", 965 | "C3DDF9" to "Tropical Blue", 966 | "C41E3A" to "Cardinal", 967 | "C45655" to "Fuzzy Wuzzy Brown", 968 | "C45719" to "Orange Roughy", 969 | "C4C4BC" to "Mist Gray", 970 | "C4D0B0" to "Coriander", 971 | "C4F4EB" to "Mint Tulip", 972 | "C54B8C" to "Mulberry", 973 | "C59922" to "Nugget", 974 | "C5994B" to "Tussock", 975 | "C5DBCA" to "Sea Mist", 976 | "C5E17A" to "Yellow Green", 977 | "C62D42" to "Brick Red", 978 | "C6726B" to "Contessa", 979 | "C69191" to "Oriental Pink", 980 | "C6A84B" to "Roti", 981 | "C6C3B5" to "Ash", 982 | "C6C8BD" to "Kangaroo", 983 | "C6E610" to "Las Palmas", 984 | "C7031E" to "Monza", 985 | "C71585" to "Red Violet", 986 | "C7BCA2" to "Coral Reef", 987 | "C7C1FF" to "Melrose", 988 | "C7C4BF" to "Cloud", 989 | "C7C9D5" to "Ghost", 990 | "C7CD90" to "Pine Glade", 991 | "C7DDE5" to "Botticelli", 992 | "C88A65" to "Antique Brass", 993 | "C8A2C8" to "Lilac", 994 | "C8A528" to "Hokey Pokey", 995 | "C8AABF" to "Lily", 996 | "C8B568" to "Laser", 997 | "C8E3D7" to "Edgewater", 998 | "C96323" to "Piper", 999 | "C99415" to "Pizza", 1000 | "C9A0DC" to "Light Wisteria", 1001 | "C9B29B" to "Rodeo Dust", 1002 | "C9B35B" to "Sundance", 1003 | "C9B93B" to "Earls Green", 1004 | "C9C0BB" to "Silver Rust", 1005 | "C9D9D2" to "Conch", 1006 | "C9FFA2" to "Reef", 1007 | "C9FFE5" to "Aero Blue", 1008 | "CA3435" to "Flush Mahogany", 1009 | "CABB48" to "Turmeric", 1010 | "CADCD4" to "Paris White", 1011 | "CAE00D" to "Bitter Lemon", 1012 | "CAE6DA" to "Skeptic", 1013 | "CB8FA9" to "Viola", 1014 | "CBCAB6" to "Foggy Gray", 1015 | "CBD3B0" to "Green Mist", 1016 | "CBDBD6" to "Nebula", 1017 | "CC3333" to "Persian Red", 1018 | "CC5500" to "Burnt Orange", 1019 | "CC7722" to "Ochre", 1020 | "CC8899" to "Puce", 1021 | "CCCAA8" to "Thistle Green", 1022 | "CCCCFF" to "Periwinkle", 1023 | "CCFF00" to "Electric Lime", 1024 | "CD5700" to "Tenn", 1025 | "CD5C5C" to "Chestnut Rose", 1026 | "CD8429" to "Brandy Punch", 1027 | "CDF4FF" to "Onahau", 1028 | "CEB98F" to "Sorrell Brown", 1029 | "CEBABA" to "Cold Turkey", 1030 | "CEC291" to "Yuma", 1031 | "CEC7A7" to "Chino", 1032 | "CFA39D" to "Eunry", 1033 | "CFB53B" to "Old Gold", 1034 | "CFDCCF" to "Tasman", 1035 | "CFE5D2" to "Surf Crest", 1036 | "CFF9F3" to "Humming Bird", 1037 | "CFFAF4" to "Scandal", 1038 | "D05F04" to "Red Stage", 1039 | "D06DA1" to "Hopbush", 1040 | "D07D12" to "Meteor", 1041 | "D0BEF8" to "Perfume", 1042 | "D0C0E5" to "Prelude", 1043 | "D0F0C0" to "Tea Green", 1044 | "D18F1B" to "Geebung", 1045 | "D1BEA8" to "Vanilla", 1046 | "D1C6B4" to "Soft Amber", 1047 | "D1D2CA" to "Celeste", 1048 | "D1D2DD" to "Mischka", 1049 | "D1E231" to "Pear", 1050 | "D2691E" to "Hot Cinnamon", 1051 | "D27D46" to "Raw Sienna", 1052 | "D29EAA" to "Careys Pink", 1053 | "D2B48C" to "Tan", 1054 | "D2DA97" to "Deco", 1055 | "D2F6DE" to "Blue Romance", 1056 | "D2F8B0" to "Gossip", 1057 | "D3CBBA" to "Sisal", 1058 | "D3CDC5" to "Swirl", 1059 | "D47494" to "Charm", 1060 | "D4B6AF" to "Clam Shell", 1061 | "D4BF8D" to "Straw", 1062 | "D4C4A8" to "Akaroa", 1063 | "D4CD16" to "Bird Flower", 1064 | "D4D7D9" to "Iron", 1065 | "D4DFE2" to "Geyser", 1066 | "D4E2FC" to "Hawkes Blue", 1067 | "D54600" to "Grenadier", 1068 | "D591A4" to "Can Can", 1069 | "D59A6F" to "Whiskey", 1070 | "D5D195" to "Winter Hazel", 1071 | "D5F6E3" to "Granny Apple", 1072 | "D69188" to "My Pink", 1073 | "D6C562" to "Tacha", 1074 | "D6CEF6" to "Moon Raker", 1075 | "D6D6D1" to "Quill Gray", 1076 | "D6FFDB" to "Snowy Mint", 1077 | "D7837F" to "New York Pink", 1078 | "D7C498" to "Pavlova", 1079 | "D7D0FF" to "Fog", 1080 | "D84437" to "Valencia", 1081 | "D87C63" to "Japonica", 1082 | "D8BFD8" to "Thistle", 1083 | "D8C2D5" to "Maverick", 1084 | "D8FCFA" to "Foam", 1085 | "D94972" to "Cabaret", 1086 | "D99376" to "Burning Sand", 1087 | "D9B99B" to "Cameo", 1088 | "D9D6CF" to "Timberwolf", 1089 | "D9DCC1" to "Tana", 1090 | "D9E4F5" to "Link Water", 1091 | "D9F7FF" to "Mabel", 1092 | "DA3287" to "Cerise", 1093 | "DA5B38" to "Flame Pea", 1094 | "DA6304" to "Bamboo", 1095 | "DA6A41" to "Red Damask", 1096 | "DA70D6" to "Orchid", 1097 | "DA8A67" to "Copperfield", 1098 | "DAA520" to "Golden Grass", 1099 | "DAECD6" to "Zanah", 1100 | "DAF4F0" to "Iceberg", 1101 | "DAFAFF" to "Oyster Bay", 1102 | "DB5079" to "Cranberry", 1103 | "DB9690" to "Petite Orchid", 1104 | "DB995E" to "Di Serria", 1105 | "DBDBDB" to "Alto", 1106 | "DBFFF8" to "Frosted Mint", 1107 | "DC143C" to "Crimson", 1108 | "DC4333" to "Punch", 1109 | "DCB20C" to "Galliano", 1110 | "DCB4BC" to "Blossom", 1111 | "DCD747" to "Wattle", 1112 | "DCD9D2" to "Westar", 1113 | "DCDDCC" to "Moon Mist", 1114 | "DCEDB4" to "Caper", 1115 | "DCF0EA" to "Swans Down", 1116 | "DDD6D5" to "Swiss Coffee", 1117 | "DDF9F1" to "White Ice", 1118 | "DE3163" to "Cerise Red", 1119 | "DE6360" to "Roman", 1120 | "DEA681" to "Tumbleweed", 1121 | "DEBA13" to "Gold Tips", 1122 | "DEC196" to "Brandy", 1123 | "DECBC6" to "Wafer", 1124 | "DED4A4" to "Sapling", 1125 | "DED717" to "Barberry", 1126 | "DEE5C0" to "Beryl Green", 1127 | "DEF5FF" to "Pattens Blue", 1128 | "DF73FF" to "Heliotrope", 1129 | "DFBE6F" to "Apache", 1130 | "DFCD6F" to "Chenin", 1131 | "DFCFDB" to "Lola", 1132 | "DFECDA" to "Willow Brook", 1133 | "DFFF00" to "Chartreuse Yellow", 1134 | "E0B0FF" to "Mauve", 1135 | "E0B646" to "Anzac", 1136 | "E0B974" to "Harvest Gold", 1137 | "E0C095" to "Calico", 1138 | "E0FFFF" to "Baby Blue", 1139 | "E16865" to "Sunglo", 1140 | "E1BC64" to "Equator", 1141 | "E1C0C8" to "Pink Flare", 1142 | "E1E6D6" to "Periglacial Blue", 1143 | "E1EAD4" to "Kidnapper", 1144 | "E1F6E8" to "Tara", 1145 | "E25465" to "Mandy", 1146 | "E2725B" to "Terracotta", 1147 | "E28913" to "Golden Bell", 1148 | "E292C0" to "Shocking", 1149 | "E29418" to "Dixie", 1150 | "E29CD2" to "Light Orchid", 1151 | "E2D8ED" to "Snuff", 1152 | "E2EBED" to "Mystic", 1153 | "E2F3EC" to "Apple Green", 1154 | "E30B5C" to "Razzmatazz", 1155 | "E32636" to "Alizarin Crimson", 1156 | "E34234" to "Cinnabar", 1157 | "E3BEBE" to "Cavern Pink", 1158 | "E3F5E1" to "Peppermint", 1159 | "E3F988" to "Mindaro", 1160 | "E47698" to "Deep Blush", 1161 | "E49B0F" to "Gamboge", 1162 | "E4C2D5" to "Melanie", 1163 | "E4CFDE" to "Twilight", 1164 | "E4D1C0" to "Bone", 1165 | "E4D422" to "Sunflower", 1166 | "E4D5B7" to "Grain Brown", 1167 | "E4D69B" to "Zombie", 1168 | "E4F6E7" to "Frostee", 1169 | "E4FFD1" to "Snow Flurry", 1170 | "E52B50" to "Amaranth", 1171 | "E5841B" to "Zest", 1172 | "E5CCC9" to "Dust Storm", 1173 | "E5D7BD" to "Stark White", 1174 | "E5D8AF" to "Hampton", 1175 | "E5E0E1" to "Bon Jour", 1176 | "E5E5E5" to "Mercury", 1177 | "E5F9F6" to "Polar", 1178 | "E64E03" to "Trinidad", 1179 | "E6BE8A" to "Gold Sand", 1180 | "E6BEA5" to "Cashmere", 1181 | "E6D7B9" to "Double Spanish White", 1182 | "E6E4D4" to "Satin Linen", 1183 | "E6F2EA" to "Harp", 1184 | "E6F8F3" to "Off Green", 1185 | "E6FFE9" to "Hint of Green", 1186 | "E6FFFF" to "Tranquil", 1187 | "E77200" to "Mango Tango", 1188 | "E7730A" to "Christine", 1189 | "E79F8C" to "Tonys Pink", 1190 | "E79FC4" to "Kobi", 1191 | "E7BCB4" to "Rose Fog", 1192 | "E7BF05" to "Corn", 1193 | "E7CD8C" to "Putty", 1194 | "E7ECE6" to "Gray Nurse", 1195 | "E7F8FF" to "Lily White", 1196 | "E7FEFF" to "Bubbles", 1197 | "E89928" to "Fire Bush", 1198 | "E8B9B3" to "Shilo", 1199 | "E8E0D5" to "Pearl Bush", 1200 | "E8EBE0" to "Green White", 1201 | "E8F1D4" to "Chrome White", 1202 | "E8F2EB" to "Gin", 1203 | "E8F5F2" to "Aqua Squeeze", 1204 | "E96E00" to "Clementine", 1205 | "E97451" to "Burnt Sienna", 1206 | "E97C07" to "Tahiti Gold", 1207 | "E9CECD" to "Oyster Pink", 1208 | "E9D75A" to "Confetti", 1209 | "E9E3E3" to "Ebb", 1210 | "E9F8ED" to "Ottoman", 1211 | "E9FFFD" to "Clear Day", 1212 | "EA88A8" to "Carissma", 1213 | "EAAE69" to "Porsche", 1214 | "EAB33B" to "Tulip Tree", 1215 | "EAC674" to "Rob Roy", 1216 | "EADAB8" to "Raffia", 1217 | "EAE8D4" to "White Rock", 1218 | "EAF6EE" to "Panache", 1219 | "EAF6FF" to "Solitude", 1220 | "EAF9F5" to "Aqua Spring", 1221 | "EAFFFE" to "Dew", 1222 | "EB9373" to "Apricot", 1223 | "EBC2AF" to "Zinnwaldite", 1224 | "ECA927" to "Fuel Yellow", 1225 | "ECC54E" to "Ronchi", 1226 | "ECC7EE" to "French Lilac", 1227 | "ECCDB9" to "Just Right", 1228 | "ECE090" to "Wild Rice", 1229 | "ECEBBD" to "Fall Green", 1230 | "ECEBCE" to "Aths Special", 1231 | "ECF245" to "Starship", 1232 | "ED0A3F" to "Red Ribbon", 1233 | "ED7A1C" to "Tango", 1234 | "ED9121" to "Carrot Orange", 1235 | "ED989E" to "Sea Pink", 1236 | "EDB381" to "Tacao", 1237 | "EDC9AF" to "Desert Sand", 1238 | "EDCDAB" to "Pancho", 1239 | "EDDCB1" to "Chamois", 1240 | "EDEA99" to "Primrose", 1241 | "EDF5DD" to "Frost", 1242 | "EDF5F5" to "Aqua Haze", 1243 | "EDF6FF" to "Zumthor", 1244 | "EDF9F1" to "Narvik", 1245 | "EDFC84" to "Honeysuckle", 1246 | "EE82EE" to "Lavender Magenta", 1247 | "EEC1BE" to "Beauty Bush", 1248 | "EED794" to "Chalky", 1249 | "EED9C4" to "Almond", 1250 | "EEDC82" to "Flax", 1251 | "EEDEDA" to "Bizarre", 1252 | "EEE3AD" to "Double Colonial White", 1253 | "EEEEE8" to "Cararra", 1254 | "EEEF78" to "Manz", 1255 | "EEF0C8" to "Tahuna Sands", 1256 | "EEF0F3" to "Athens Gray", 1257 | "EEF3C3" to "Tusk", 1258 | "EEF4DE" to "Loafer", 1259 | "EEF6F7" to "Catskill White", 1260 | "EEFDFF" to "Twilight Blue", 1261 | "EEFF9A" to "Jonquil", 1262 | "EEFFE2" to "Rice Flower", 1263 | "EF863F" to "Jaffa", 1264 | "EFEFEF" to "Gallery", 1265 | "EFF2F3" to "Porcelain", 1266 | "F091A9" to "Mauvelous", 1267 | "F0D52D" to "Golden Dream", 1268 | "F0DB7D" to "Golden Sand", 1269 | "F0DC82" to "Buff", 1270 | "F0E2EC" to "Prim", 1271 | "F0E68C" to "Khaki", 1272 | "F0EEFD" to "Selago", 1273 | "F0EEFF" to "Titan White", 1274 | "F0F8FF" to "Alice Blue", 1275 | "F0FCEA" to "Feta", 1276 | "F18200" to "Gold Drop", 1277 | "F19BAB" to "Wewak", 1278 | "F1E788" to "Sahara Sand", 1279 | "F1E9D2" to "Parchment", 1280 | "F1E9FF" to "Blue Chalk", 1281 | "F1EEC1" to "Mint Julep", 1282 | "F1F1F1" to "Seashell", 1283 | "F1F7F2" to "Saltpan", 1284 | "F1FFAD" to "Tidal", 1285 | "F1FFC8" to "Chiffon", 1286 | "F2552A" to "Flamingo", 1287 | "F28500" to "Tangerine", 1288 | "F2C3B2" to "Mandys Pink", 1289 | "F2F2F2" to "Concrete", 1290 | "F2FAFA" to "Black Squeeze", 1291 | "F34723" to "Pomegranate", 1292 | "F3AD16" to "Buttercup", 1293 | "F3D69D" to "New Orleans", 1294 | "F3D9DF" to "Vanilla Ice", 1295 | "F3E7BB" to "Sidecar", 1296 | "F3E9E5" to "Dawn Pink", 1297 | "F3EDCF" to "Wheatfield", 1298 | "F3FB62" to "Canary", 1299 | "F3FBD4" to "Orinoco", 1300 | "F3FFD8" to "Carla", 1301 | "F400A1" to "Hollywood Cerise", 1302 | "F4A460" to "Sandy brown", 1303 | "F4C430" to "Saffron", 1304 | "F4D81C" to "Ripe Lemon", 1305 | "F4EBD3" to "Janna", 1306 | "F4F2EE" to "Pampas", 1307 | "F4F4F4" to "Wild Sand", 1308 | "F4F8FF" to "Zircon", 1309 | "F57584" to "Froly", 1310 | "F5C85C" to "Cream Can", 1311 | "F5C999" to "Manhattan", 1312 | "F5D5A0" to "Maize", 1313 | "F5DEB3" to "Wheat", 1314 | "F5E7A2" to "Sandwisp", 1315 | "F5E7E2" to "Pot Pourri", 1316 | "F5E9D3" to "Albescent White", 1317 | "F5EDEF" to "Soft Peach", 1318 | "F5F3E5" to "Ecru White", 1319 | "F5F5DC" to "Beige", 1320 | "F5FB3D" to "Golden Fizz", 1321 | "F5FFBE" to "Australian Mint", 1322 | "F64A8A" to "French Rose", 1323 | "F653A6" to "Brilliant Rose", 1324 | "F6A4C9" to "Illusion", 1325 | "F6F0E6" to "Merino", 1326 | "F6F7F7" to "Black Haze", 1327 | "F6FFDC" to "Spring Sun", 1328 | "F7468A" to "Violet Red", 1329 | "F77703" to "Chilean Fire", 1330 | "F77FBE" to "Persian Pink", 1331 | "F7B668" to "Rajah", 1332 | "F7C8DA" to "Azalea", 1333 | "F7DBE6" to "We Peep", 1334 | "F7F2E1" to "Quarter Spanish White", 1335 | "F7F5FA" to "Whisper", 1336 | "F7FAF7" to "Snow Drift", 1337 | "F8B853" to "Casablanca", 1338 | "F8C3DF" to "Chantilly", 1339 | "F8D9E9" to "Cherub", 1340 | "F8DB9D" to "Marzipan", 1341 | "F8DD5C" to "Energy Yellow", 1342 | "F8E4BF" to "Givry", 1343 | "F8F0E8" to "White Linen", 1344 | "F8F4FF" to "Magnolia", 1345 | "F8F6F1" to "Spring Wood", 1346 | "F8F7DC" to "Coconut Cream", 1347 | "F8F7FC" to "White Lilac", 1348 | "F8F8F7" to "Desert Storm", 1349 | "F8F99C" to "Texas", 1350 | "F8FACD" to "Corn Field", 1351 | "F8FDD3" to "Mimosa", 1352 | "F95A61" to "Carnation", 1353 | "F9BF58" to "Saffron Mango", 1354 | "F9E0ED" to "Carousel Pink", 1355 | "F9E4BC" to "Dairy Cream", 1356 | "F9E663" to "Portica", 1357 | "F9EAF3" to "Amour", 1358 | "F9F8E4" to "Rum Swizzle", 1359 | "F9FF8B" to "Dolly", 1360 | "F9FFF6" to "Sugar Cane", 1361 | "FA7814" to "Ecstasy", 1362 | "FA9D5A" to "Tan Hide", 1363 | "FAD3A2" to "Corvette", 1364 | "FADFAD" to "Peach Yellow", 1365 | "FAE600" to "Turbo", 1366 | "FAEAB9" to "Astra", 1367 | "FAECCC" to "Champagne", 1368 | "FAF0E6" to "Linen", 1369 | "FAF3F0" to "Fantasy", 1370 | "FAF7D6" to "Citrine White", 1371 | "FAFAFA" to "Alabaster", 1372 | "FAFDE4" to "Hint of Yellow", 1373 | "FAFFA4" to "Milan", 1374 | "FB607F" to "Brink Pink", 1375 | "FB8989" to "Geraldine", 1376 | "FBA0E3" to "Lavender Rose", 1377 | "FBA129" to "Sea Buckthorn", 1378 | "FBAC13" to "Sun", 1379 | "FBAED2" to "Lavender Pink", 1380 | "FBB2A3" to "Rose Bud", 1381 | "FBBEDA" to "Cupid", 1382 | "FBCCE7" to "Classic Rose", 1383 | "FBCEB1" to "Apricot Peach", 1384 | "FBE7B2" to "Banana Mania", 1385 | "FBE870" to "Marigold Yellow", 1386 | "FBE96C" to "Festival", 1387 | "FBEA8C" to "Sweet Corn", 1388 | "FBEC5D" to "Candy Corn", 1389 | "FBF9F9" to "Hint of Red", 1390 | "FBFFBA" to "Shalimar", 1391 | "FC0FC0" to "Shocking Pink", 1392 | "FC80A5" to "Tickle Me Pink", 1393 | "FC9C1D" to "Tree Poppy", 1394 | "FCC01E" to "Lightning Yellow", 1395 | "FCD667" to "Goldenrod", 1396 | "FCD917" to "Candlelight", 1397 | "FCDA98" to "Cherokee", 1398 | "FCF4D0" to "Double Pearl Lusta", 1399 | "FCF4DC" to "Pearl Lusta", 1400 | "FCF8F7" to "Vista White", 1401 | "FCFBF3" to "Bianca", 1402 | "FCFEDA" to "Moon Glow", 1403 | "FCFFE7" to "China Ivory", 1404 | "FCFFF9" to "Ceramic", 1405 | "FD0E35" to "Torch Red", 1406 | "FD5B78" to "Wild Watermelon", 1407 | "FD7B33" to "Crusta", 1408 | "FD7C07" to "Sorbus", 1409 | "FD9FA2" to "Sweet Pink", 1410 | "FDD5B1" to "Light Apricot", 1411 | "FDD7E4" to "Pig Pink", 1412 | "FDE1DC" to "Cinderella", 1413 | "FDE295" to "Golden Glow", 1414 | "FDE910" to "Lemon", 1415 | "FDF5E6" to "Old Lace", 1416 | "FDF6D3" to "Half Colonial White", 1417 | "FDF7AD" to "Drover", 1418 | "FDFEB8" to "Pale Prim", 1419 | "FDFFD5" to "Cumulus", 1420 | "FE28A2" to "Persian Rose", 1421 | "FE4C40" to "Sunset Orange", 1422 | "FE6F5E" to "Bittersweet", 1423 | "FE9D04" to "California", 1424 | "FEA904" to "Yellow Sea", 1425 | "FEBAAD" to "Melon", 1426 | "FED33C" to "Bright Sun", 1427 | "FED85D" to "Dandelion", 1428 | "FEDB8D" to "Salomie", 1429 | "FEE5AC" to "Cape Honey", 1430 | "FEEBF3" to "Remy", 1431 | "FEEFCE" to "Oasis", 1432 | "FEF0EC" to "Bridesmaid", 1433 | "FEF2C7" to "Beeswax", 1434 | "FEF3D8" to "Bleach White", 1435 | "FEF4CC" to "Pipi", 1436 | "FEF4DB" to "Half Spanish White", 1437 | "FEF4F8" to "Wisp Pink", 1438 | "FEF5F1" to "Provincial Pink", 1439 | "FEF7DE" to "Half Dutch White", 1440 | "FEF8E2" to "Solitaire", 1441 | "FEF8FF" to "White Pointer", 1442 | "FEF9E3" to "Off Yellow", 1443 | "FEFCED" to "Orange White", 1444 | "FF0000" to "Red", 1445 | "FF007F" to "Rose", 1446 | "FF00CC" to "Purple Pizzazz", 1447 | "FF00FF" to "Magenta Fuchsia", 1448 | "FF2400" to "Scarlet", 1449 | "FF3399" to "Wild Strawberry", 1450 | "FF33CC" to "Razzle Dazzle Rose", 1451 | "FF355E" to "Radical Red", 1452 | "FF3F34" to "Red Orange", 1453 | "FF4040" to "Coral Red", 1454 | "FF4D00" to "Vermilion", 1455 | "FF4F00" to "International Orange", 1456 | "FF6037" to "Outrageous Orange", 1457 | "FF6600" to "Blaze Orange", 1458 | "FF66FF" to "Pink Flamingo", 1459 | "FF681F" to "Orange", 1460 | "FF69B4" to "Hot Pink", 1461 | "FF6B53" to "Persimmon", 1462 | "FF6FFF" to "Blush Pink", 1463 | "FF7034" to "Burning Orange", 1464 | "FF7518" to "Pumpkin", 1465 | "FF7D07" to "Flamenco", 1466 | "FF7F00" to "Flush Orange", 1467 | "FF7F50" to "Coral", 1468 | "FF8C69" to "Salmon", 1469 | "FF9000" to "Pizazz", 1470 | "FF910F" to "West Side", 1471 | "FF91A4" to "Pink Salmon", 1472 | "FF9933" to "Neon Carrot", 1473 | "FF9966" to "Atomic Tangerine", 1474 | "FF9980" to "Vivid Tangerine", 1475 | "FF9E2C" to "Sunshade", 1476 | "FFA000" to "Orange Peel", 1477 | "FFA194" to "Mona Lisa", 1478 | "FFA500" to "Web Orange", 1479 | "FFA6C9" to "Carnation Pink", 1480 | "FFAB81" to "Hit Pink", 1481 | "FFAE42" to "Yellow Orange", 1482 | "FFB0AC" to "Cornflower Lilac", 1483 | "FFB1B3" to "Sundown", 1484 | "FFB31F" to "My Sin", 1485 | "FFB555" to "Texas Rose", 1486 | "FFB7D5" to "Cotton Candy", 1487 | "FFB97B" to "Macaroni and Cheese", 1488 | "FFBA00" to "Selective Yellow", 1489 | "FFBD5F" to "Koromiko", 1490 | "FFBF00" to "Amber", 1491 | "FFC0A8" to "Wax Flower", 1492 | "FFC0CB" to "Pink", 1493 | "FFC3C0" to "Your Pink", 1494 | "FFC901" to "Supernova", 1495 | "FFCBA4" to "Flesh", 1496 | "FFCC33" to "Sunglow", 1497 | "FFCC5C" to "Golden Tainoi", 1498 | "FFCC99" to "Peach Orange", 1499 | "FFCD8C" to "Chardonnay", 1500 | "FFD1DC" to "Pastel Pink", 1501 | "FFD2B7" to "Romantic", 1502 | "FFD38C" to "Grandis", 1503 | "FFD700" to "Gold", 1504 | "FFD800" to "School bus Yellow", 1505 | "FFD8D9" to "Cosmos", 1506 | "FFDB58" to "Mustard", 1507 | "FFDCD6" to "Peach Schnapps", 1508 | "FFDDAF" to "Caramel", 1509 | "FFDDCD" to "Tuft Bush", 1510 | "FFDDCF" to "Watusi", 1511 | "FFDDF4" to "Pink Lace", 1512 | "FFDEAD" to "Navajo White", 1513 | "FFDEB3" to "Frangipani", 1514 | "FFE1DF" to "Pippin", 1515 | "FFE1F2" to "Pale Rose", 1516 | "FFE2C5" to "Negroni", 1517 | "FFE5A0" to "Cream Brulee", 1518 | "FFE5B4" to "Peach", 1519 | "FFE6C7" to "Tequila", 1520 | "FFE772" to "Kournikova", 1521 | "FFEAC8" to "Sandy Beach", 1522 | "FFEAD4" to "Karry", 1523 | "FFEC13" to "Broom", 1524 | "FFEDBC" to "Colonial White", 1525 | "FFEED8" to "Derby", 1526 | "FFEFA1" to "Vis Vis", 1527 | "FFEFC1" to "Egg White", 1528 | "FFEFD5" to "Papaya Whip", 1529 | "FFEFEC" to "Fair Pink", 1530 | "FFF0DB" to "Peach Cream", 1531 | "FFF0F5" to "Lavender blush", 1532 | "FFF14F" to "Gorse", 1533 | "FFF1B5" to "Buttermilk", 1534 | "FFF1D8" to "Pink Lady", 1535 | "FFF1EE" to "Forget Me Not", 1536 | "FFF1F9" to "Tutu", 1537 | "FFF39D" to "Picasso", 1538 | "FFF3F1" to "Chardon", 1539 | "FFF46E" to "Paris Daisy", 1540 | "FFF4CE" to "Barley White", 1541 | "FFF4DD" to "Egg Sour", 1542 | "FFF4E0" to "Sazerac", 1543 | "FFF4E8" to "Serenade", 1544 | "FFF4F3" to "Chablis", 1545 | "FFF5EE" to "Seashell Peach", 1546 | "FFF5F3" to "Sauvignon", 1547 | "FFF6D4" to "Milk Punch", 1548 | "FFF6DF" to "Varden", 1549 | "FFF6F5" to "Rose White", 1550 | "FFF8D1" to "Baja White", 1551 | "FFF9E2" to "Gin Fizz", 1552 | "FFF9E6" to "Early Dawn", 1553 | "FFFACD" to "Lemon Chiffon", 1554 | "FFFAF4" to "Bridal Heath", 1555 | "FFFBDC" to "Scotch Mist", 1556 | "FFFBF9" to "Soapstone", 1557 | "FFFC99" to "Witch Haze", 1558 | "FFFCEA" to "Buttery White", 1559 | "FFFCEE" to "Island Spice", 1560 | "FFFDD0" to "Cream", 1561 | "FFFDE6" to "Chilean Heath", 1562 | "FFFDE8" to "Travertine", 1563 | "FFFDF3" to "Orchid White", 1564 | "FFFDF4" to "Quarter Pearl Lusta", 1565 | "FFFEE1" to "Half and Half", 1566 | "FFFEEC" to "Apricot White", 1567 | "FFFEF0" to "Rice Cake", 1568 | "FFFEF6" to "Black White", 1569 | "FFFEFD" to "Romance", 1570 | "FFFF00" to "Yellow", 1571 | "FFFF66" to "Laser Lemon", 1572 | "FFFF99" to "Pale Canary", 1573 | "FFFFB4" to "Portafino", 1574 | "FFFFF0" to "Ivory", 1575 | "FFFFFF" to "White") 1576 | 1577 | -------------------------------------------------------------------------------- /namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/core/util/MaterialColors.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.core.util 2 | 3 | val colorsMaterialNames = mapOf( 4 | "000000" to "black", 5 | "FFFFFF" to "white", 6 | "FFEBEE" to "red_50", 7 | "FFCDD2" to "red_100", 8 | "EF9A9A" to "red_200", 9 | "E57373" to "red_300", 10 | "EF5350" to "red_400", 11 | "F44336" to "red_500", 12 | "E53935" to "red_600", 13 | "D32F2F" to "red_700", 14 | "C62828" to "red_800", 15 | "B71C1C" to "red_900", 16 | "FF8A80" to "red_A100", 17 | "FF5252" to "red_A200", 18 | "FF1744" to "red_A400", 19 | "D50000" to "red_A700", 20 | "EDE7F6" to "deep_purple_50", 21 | "D1C4E9" to "deep_purple_100", 22 | "B39DDB" to "deep_purple_200", 23 | "9575CD" to "deep_purple_300", 24 | "7E57C2" to "deep_purple_400", 25 | "673AB7" to "deep_purple_500", 26 | "5E35B1" to "deep_purple_600", 27 | "512DA8" to "deep_purple_700", 28 | "4527A0" to "deep_purple_800", 29 | "311B92" to "deep_purple_900", 30 | "B388FF" to "deep_purple_A100", 31 | "7C4DFF" to "deep_purple_A200", 32 | "651FFF" to "deep_purple_A400", 33 | "6200EA" to "deep_purple_A700", 34 | "E1F5FE" to "light_blue_50", 35 | "B3E5FC" to "light_blue_100", 36 | "81D4FA" to "light_blue_200", 37 | "4FC3F7" to "light_blue_300", 38 | "29B6F6" to "light_blue_400", 39 | "03A9F4" to "light_blue_500", 40 | "039BE5" to "light_blue_600", 41 | "0288D1" to "light_blue_700", 42 | "0277BD" to "light_blue_800", 43 | "01579B" to "light_blue_900", 44 | "80D8FF" to "light_blue_A100", 45 | "40C4FF" to "light_blue_A200", 46 | "00B0FF" to "light_blue_A400", 47 | "0091EA" to "light_blue_A700", 48 | "E8F5E9" to "green_50", 49 | "C8E6C9" to "green_100", 50 | "A5D6A7" to "green_200", 51 | "81C784" to "green_300", 52 | "66BB6A" to "green_400", 53 | "4CAF50" to "green_500", 54 | "43A047" to "green_600", 55 | "388E3C" to "green_700", 56 | "2E7D32" to "green_800", 57 | "1B5E20" to "green_900", 58 | "B9F6CA" to "green_A100", 59 | "69F0AE" to "green_A200", 60 | "00E676" to "green_A400", 61 | "00C853" to "green_A700", 62 | "FFFDE7" to "yellow_50", 63 | "FFF9C4" to "yellow_100", 64 | "FFF59D" to "yellow_200", 65 | "FFF176" to "yellow_300", 66 | "FFEE58" to "yellow_400", 67 | "FFEB3B" to "yellow_500", 68 | "FDD835" to "yellow_600", 69 | "FBC02D" to "yellow_700", 70 | "F9A825" to "yellow_800", 71 | "F57F17" to "yellow_900", 72 | "FFFF8D" to "yellow_A100", 73 | "FFFF00" to "yellow_A200", 74 | "FFEA00" to "yellow_A400", 75 | "FFD600" to "yellow_A700", 76 | "FBE9E7" to "deep_orange_50", 77 | "FFCCBC" to "deep_orange_100", 78 | "FFAB91" to "deep_orange_200", 79 | "FF8A65" to "deep_orange_300", 80 | "FF7043" to "deep_orange_400", 81 | "FF5722" to "deep_orange_500", 82 | "F4511E" to "deep_orange_600", 83 | "E64A19" to "deep_orange_700", 84 | "D84315" to "deep_orange_800", 85 | "BF360C" to "deep_orange_900", 86 | "FF9E80" to "deep_orange_A100", 87 | "FF6E40" to "deep_orange_A200", 88 | "FF3D00" to "deep_orange_A400", 89 | "DD2C00" to "deep_orange_A700", 90 | "ECEFF1" to "blue_grey_50", 91 | "CFD8DC" to "blue_grey_100", 92 | "B0BEC5" to "blue_grey_200", 93 | "90A4AE" to "blue_grey_300", 94 | "78909C" to "blue_grey_400", 95 | "607D8B" to "blue_grey_500", 96 | "546E7A" to "blue_grey_600", 97 | "455A64" to "blue_grey_700", 98 | "37474F" to "blue_grey_800", 99 | "263238" to "blue_grey_900", 100 | "FCE4EC" to "pink_50", 101 | "F8BBD0" to "pink_100", 102 | "F48FB1" to "pink_200", 103 | "F06292" to "pink_300", 104 | "EC407A" to "pink_400", 105 | "E91E63" to "pink_500", 106 | "D81B60" to "pink_600", 107 | "C2185B" to "pink_700", 108 | "AD1457" to "pink_800", 109 | "880E4F" to "pink_900", 110 | "FF80AB" to "pink_A100", 111 | "FF4081" to "pink_A200", 112 | "F50057" to "pink_A400", 113 | "C51162" to "pink_A700", 114 | "E8EAF6" to "indigo_50", 115 | "C5CAE9" to "indigo_100", 116 | "9FA8DA" to "indigo_200", 117 | "7986CB" to "indigo_300", 118 | "5C6BC0" to "indigo_400", 119 | "3F51B5" to "indigo_500", 120 | "3949AB" to "indigo_600", 121 | "303F9F" to "indigo_700", 122 | "283593" to "indigo_800", 123 | "1A237E" to "indigo_900", 124 | "8C9EFF" to "indigo_A100", 125 | "536DFE" to "indigo_A200", 126 | "3D5AFE" to "indigo_A400", 127 | "304FFE" to "indigo_A700", 128 | "E0F7FA" to "cyan_50", 129 | "B2EBF2" to "cyan_100", 130 | "80DEEA" to "cyan_200", 131 | "4DD0E1" to "cyan_300", 132 | "26C6DA" to "cyan_400", 133 | "00BCD4" to "cyan_500", 134 | "00ACC1" to "cyan_600", 135 | "0097A7" to "cyan_700", 136 | "00838F" to "cyan_800", 137 | "006064" to "cyan_900", 138 | "84FFFF" to "cyan_A100", 139 | "18FFFF" to "cyan_A200", 140 | "00E5FF" to "cyan_A400", 141 | "00B8D4" to "cyan_A700", 142 | "F1F8E9" to "light_green_50", 143 | "DCEDC8" to "light_green_100", 144 | "C5E1A5" to "light_green_200", 145 | "AED581" to "light_green_300", 146 | "9CCC65" to "light_green_400", 147 | "8BC34A" to "light_green_500", 148 | "7CB342" to "light_green_600", 149 | "689F38" to "light_green_700", 150 | "558B2F" to "light_green_800", 151 | "33691E" to "light_green_900", 152 | "CCFF90" to "light_green_A100", 153 | "B2FF59" to "light_green_A200", 154 | "76FF03" to "light_green_A400", 155 | "64DD17" to "light_green_A700", 156 | "FFF8E1" to "amber_50", 157 | "FFECB3" to "amber_100", 158 | "FFE082" to "amber_200", 159 | "FFD54F" to "amber_300", 160 | "FFCA28" to "amber_400", 161 | "FFC107" to "amber_500", 162 | "FFB300" to "amber_600", 163 | "FFA000" to "amber_700", 164 | "FF8F00" to "amber_800", 165 | "FF6F00" to "amber_900", 166 | "FFE57F" to "amber_A100", 167 | "FFD740" to "amber_A200", 168 | "FFC400" to "amber_A400", 169 | "FFAB00" to "amber_A700", 170 | "EFEBE9" to "brown_50", 171 | "D7CCC8" to "brown_100", 172 | "BCAAA4" to "brown_200", 173 | "A1887F" to "brown_300", 174 | "8D6E63" to "brown_400", 175 | "795548" to "brown_500", 176 | "6D4C41" to "brown_600", 177 | "5D4037" to "brown_700", 178 | "4E342E" to "brown_800", 179 | "3E2723" to "brown_900", 180 | "F3E5F5" to "purple_50", 181 | "E1BEE7" to "purple_100", 182 | "CE93D8" to "purple_200", 183 | "BA68C8" to "purple_300", 184 | "AB47BC" to "purple_400", 185 | "9C27B0" to "purple_500", 186 | "8E24AA" to "purple_600", 187 | "7B1FA2" to "purple_700", 188 | "6A1B9A" to "purple_800", 189 | "4A148C" to "purple_900", 190 | "EA80FC" to "purple_A100", 191 | "E040FB" to "purple_A200", 192 | "D500F9" to "purple_A400", 193 | "AA00FF" to "purple_A700", 194 | "E3F2FD" to "blue_50", 195 | "BBDEFB" to "blue_100", 196 | "90CAF9" to "blue_200", 197 | "64B5F6" to "blue_300", 198 | "42A5F5" to "blue_400", 199 | "2196F3" to "blue_500", 200 | "1E88E5" to "blue_600", 201 | "1976D2" to "blue_700", 202 | "1565C0" to "blue_800", 203 | "0D47A1" to "blue_900", 204 | "82B1FF" to "blue_A100", 205 | "448AFF" to "blue_A200", 206 | "2979FF" to "blue_A400", 207 | "2962FF" to "blue_A700", 208 | "E0F2F1" to "teal_50", 209 | "B2DFDB" to "teal_100", 210 | "80CBC4" to "teal_200", 211 | "4DB6AC" to "teal_300", 212 | "26A69A" to "teal_400", 213 | "009688" to "teal_500", 214 | "00897B" to "teal_600", 215 | "00796B" to "teal_700", 216 | "00695C" to "teal_800", 217 | "004D40" to "teal_900", 218 | "A7FFEB" to "teal_A100", 219 | "64FFDA" to "teal_A200", 220 | "1DE9B6" to "teal_A400", 221 | "00BFA5" to "teal_A700", 222 | "F9FBE7" to "lime_50", 223 | "F0F4C3" to "lime_100", 224 | "E6EE9C" to "lime_200", 225 | "DCE775" to "lime_300", 226 | "D4E157" to "lime_400", 227 | "CDDC39" to "lime_500", 228 | "C0CA33" to "lime_600", 229 | "AFB42B" to "lime_700", 230 | "9E9D24" to "lime_800", 231 | "827717" to "lime_900", 232 | "F4FF81" to "lime_A100", 233 | "EEFF41" to "lime_A200", 234 | "C6FF00" to "lime_A400", 235 | "AEEA00" to "lime_A700", 236 | "FFF3E0" to "orange_50", 237 | "FFE0B2" to "orange_100", 238 | "FFCC80" to "orange_200", 239 | "FFB74D" to "orange_300", 240 | "FFA726" to "orange_400", 241 | "FF9800" to "orange_500", 242 | "FB8C00" to "orange_600", 243 | "F57C00" to "orange_700", 244 | "EF6C00" to "orange_800", 245 | "E65100" to "orange_900", 246 | "FFD180" to "orange_A100", 247 | "FFAB40" to "orange_A200", 248 | "FF9100" to "orange_A400", 249 | "FF6D00" to "orange_A700", 250 | "FAFAFA" to "grey_50", 251 | "F5F5F5" to "grey_100", 252 | "EEEEEE" to "grey_200", 253 | "E0E0E0" to "grey_300", 254 | "BDBDBD" to "grey_400", 255 | "9E9E9E" to "grey_500", 256 | "757575" to "grey_600", 257 | "616161" to "grey_700", 258 | "424242" to "grey_800", 259 | "212121" to "grey_900" 260 | ) -------------------------------------------------------------------------------- /namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/core/util/Rounding.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.core.util 2 | 3 | import kotlin.math.roundToInt 4 | 5 | fun Double.roundTo2Decimal() = (this * 100.0).roundToInt() 6 | fun Double.roundTo2HexString() = "%02x".format((this).roundToInt()) -------------------------------------------------------------------------------- /namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/plugin/annotator/ColorAnnotator.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.plugin.annotator 2 | 3 | import com.intellij.lang.annotation.AnnotationHolder 4 | import com.intellij.lang.annotation.Annotator 5 | import com.intellij.lang.annotation.HighlightSeverity 6 | import com.intellij.psi.PsiElement 7 | import com.intellij.psi.impl.source.xml.XmlTextImpl 8 | import il.co.galex.namethatcolor.core.manager.ColorNameFinder 9 | import il.co.galex.namethatcolor.core.model.HexColor 10 | import il.co.galex.namethatcolor.plugin.intention.NameColorIntention 11 | import il.co.galex.namethatcolor.plugin.util.* 12 | 13 | class ColorAnnotator : Annotator { 14 | 15 | override fun annotate(element: PsiElement, holder: AnnotationHolder) { 16 | 17 | try { 18 | val color = HexColor(element.text) 19 | // we found a value that is a valid color, checking that it is not already in a tag 20 | if ((element.parent as XmlTextImpl).parentTag?.name == RESOURCES_TAG_NAME) { 21 | 22 | // color list from name that color 23 | holder.newAnnotation(HighlightSeverity.ERROR, COLOR_ANNOTATION_MESSAGE) 24 | .newFix(NameColorIntention(NAME_THAT_COLOR, color, ColorNameFinder::findColor)) 25 | .registerFix() 26 | .create() 27 | 28 | // material color palette 29 | holder.newAnnotation(HighlightSeverity.ERROR, MATERIAL_COLOR_ANNOTATION_MESSAGE) 30 | .newFix(NameColorIntention(NAME_THAT_MATERIAL_COLOR, color, ColorNameFinder::findMaterialColor)) 31 | .registerFix() 32 | .create() 33 | } 34 | } catch (e: Exception) { 35 | // found that a color is not valid for us, ignoring it 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/plugin/completion/CaretCompletionContributor.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.plugin.completion 2 | 3 | import com.intellij.codeInsight.completion.* 4 | import com.intellij.codeInsight.completion.CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED 5 | import com.intellij.util.ProcessingContext 6 | import il.co.galex.namethatcolor.core.manager.ColorNameFinder 7 | import il.co.galex.namethatcolor.plugin.util.NAME_THAT_COLOR 8 | import il.co.galex.namethatcolor.plugin.util.NAME_THAT_MATERIAL_COLOR 9 | import il.co.galex.namethatcolor.plugin.util.PLACE 10 | import il.co.galex.namethatcolor.plugin.util.addElement 11 | 12 | /** 13 | * Completes the color on the caret after the color was written 14 | * (For some reason this shows up in the IDE only for lowercase entered colors) 15 | */ 16 | class CaretCompletionContributor : CompletionContributor() { 17 | 18 | init { 19 | extend(CompletionType.BASIC, PLACE, object : CompletionProvider() { 20 | 21 | override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext, resultSet: CompletionResultSet) { 22 | 23 | val text = parameters.position.text.replace(DUMMY_IDENTIFIER_TRIMMED, "") 24 | 25 | resultSet.addElement(NAME_THAT_COLOR, text, ColorNameFinder::findColor) 26 | resultSet.addElement(NAME_THAT_MATERIAL_COLOR, text, ColorNameFinder::findMaterialColor) 27 | } 28 | }) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/plugin/completion/ClipboardCompletionContributor.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.plugin.completion 2 | 3 | import com.intellij.codeInsight.completion.* 4 | import com.intellij.openapi.application.ex.ClipboardUtil 5 | import com.intellij.util.ProcessingContext 6 | import il.co.galex.namethatcolor.core.manager.ColorNameFinder 7 | import il.co.galex.namethatcolor.plugin.util.NAME_THAT_COLOR 8 | import il.co.galex.namethatcolor.plugin.util.NAME_THAT_MATERIAL_COLOR 9 | import il.co.galex.namethatcolor.plugin.util.PLACE 10 | import il.co.galex.namethatcolor.plugin.util.addElement 11 | 12 | /** 13 | * Completes the color from the clipboard 14 | */ 15 | class ClipboardCompletionContributor : CompletionContributor() { 16 | 17 | init { 18 | extend(CompletionType.BASIC, PLACE, object : CompletionProvider() { 19 | 20 | override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext, resultSet: CompletionResultSet) { 21 | 22 | ClipboardUtil.getTextInClipboard()?.let { 23 | resultSet.addElement(NAME_THAT_COLOR, it, ColorNameFinder::findColor) 24 | resultSet.addElement(NAME_THAT_MATERIAL_COLOR, it, ColorNameFinder::findMaterialColor) 25 | } 26 | } 27 | }) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/plugin/intention/NameColorIntention.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.plugin.intention 2 | 3 | import com.intellij.codeInsight.intention.IntentionAction 4 | import com.intellij.lang.ASTFactory 5 | import com.intellij.openapi.editor.Editor 6 | import com.intellij.openapi.project.Project 7 | import com.intellij.psi.PsiElement 8 | import com.intellij.psi.PsiFile 9 | import com.intellij.psi.XmlElementFactory 10 | import com.intellij.psi.xml.XmlElementType 11 | import com.intellij.psi.xml.XmlFile 12 | import com.intellij.psi.xml.XmlText 13 | import il.co.galex.namethatcolor.core.model.Color 14 | import il.co.galex.namethatcolor.core.model.HexColor 15 | import il.co.galex.namethatcolor.core.util.toXmlName 16 | import il.co.galex.namethatcolor.plugin.util.xmlOutput 17 | 18 | @Suppress("DialogTitleCapitalization") 19 | class NameColorIntention(private val text: String, private val hexColor: HexColor, private val find: (color: HexColor) -> Pair) : IntentionAction { 20 | 21 | override fun getFamilyName(): String = "Name That Color" 22 | override fun getText(): String = text 23 | override fun startInWriteAction(): Boolean = true 24 | override fun isAvailable(project: Project, editor: Editor?, file: PsiFile?): Boolean = true 25 | 26 | override fun invoke(project: Project, editor: Editor?, file: PsiFile?) { 27 | 28 | if (file is XmlFile) { 29 | file.rootTag?.let { rootTag -> 30 | val elements = rootTag.children.filterIsInstance() 31 | elements.forEach { oldElement -> 32 | if (oldElement.text.contains(hexColor.input)) { 33 | 34 | val (hexColor, color) = find(HexColor(hexColor.input)) 35 | val name = color.name.toXmlName(hexColor.percentAlpha) 36 | val insert = xmlOutput(name, hexColor.toString()) 37 | 38 | var newElement: PsiElement = XmlElementFactory.getInstance(project).createTagFromText(insert) 39 | val split = oldElement.text.split(hexColor.input) 40 | newElement = oldElement.replace(newElement) 41 | // keep what was before and after the entered color 42 | if (split.isNotEmpty()) rootTag.addBefore(insert(project, split[0]), newElement) 43 | if (split.size > 1) rootTag.addAfter(insert(project, split[1]), newElement) 44 | 45 | // get out of our loop if we found one to replace 46 | return@forEach 47 | } 48 | } 49 | } 50 | } 51 | } 52 | 53 | private fun insert(project: Project, text: String): XmlText { 54 | val tagFromText = XmlElementFactory.getInstance(project).createTagFromText("$text") 55 | val textElements = tagFromText.value.textElements 56 | return if (textElements.isEmpty()) ASTFactory.composite(XmlElementType.XML_TEXT) as XmlText else textElements[0] 57 | } 58 | } -------------------------------------------------------------------------------- /namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/plugin/util/CompletionResultSetExtensions.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.plugin.util 2 | 3 | import com.intellij.codeInsight.completion.CompletionResultSet 4 | import com.intellij.codeInsight.lookup.LookupElementBuilder 5 | import il.co.galex.namethatcolor.core.exception.ColorNotFoundException 6 | import il.co.galex.namethatcolor.core.model.Color 7 | import il.co.galex.namethatcolor.core.model.HexColor 8 | import il.co.galex.namethatcolor.core.util.toXmlName 9 | 10 | inline fun CompletionResultSet.addElement(message: String, clipboard: String, find: (color: HexColor) -> Pair) { 11 | 12 | try { 13 | val (hexColor, color) = find(HexColor(clipboard)) 14 | val name = color.name.toXmlName(hexColor.percentAlpha) 15 | val insert = xmlOutput(name, hexColor.toString()) 16 | addElement(LookupElementBuilder.create(insert).withPresentableText(message)) 17 | 18 | } catch (e: ColorNotFoundException) { 19 | println(e.localizedMessage) 20 | } catch (e: IllegalArgumentException) { 21 | println(e.localizedMessage) 22 | } 23 | } -------------------------------------------------------------------------------- /namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/plugin/util/Constants.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.plugin.util 2 | 3 | import com.intellij.codeInsight.completion.CompletionUtilCore 4 | import com.intellij.patterns.XmlPatterns 5 | import com.intellij.psi.xml.XmlTag 6 | import com.intellij.psi.xml.XmlToken 7 | 8 | const val NAME_THAT_COLOR = "Name that color" 9 | const val NAME_THAT_MATERIAL_COLOR = "Name that material color" 10 | 11 | const val COLOR_ANNOTATION_MESSAGE = "Convert this automatically to an XML color tag named from a large set of colors" 12 | const val MATERIAL_COLOR_ANNOTATION_MESSAGE = "Convert this automatically to an XML color tag named as a Material Color" 13 | 14 | const val ALPHA_SEPARATOR = "_alpha_" 15 | 16 | const val RESOURCES_TAG_NAME = "resources" 17 | 18 | val PLACE = XmlPatterns.psiElement(XmlToken::class.java) 19 | .withText(CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED) 20 | .withParent(XmlPatterns.xmlText() 21 | .withParent(XmlPatterns.psiElement(XmlTag::class.java) 22 | .withName(RESOURCES_TAG_NAME) 23 | ) 24 | ) -------------------------------------------------------------------------------- /namethatcolor/src/main/kotlin/il/co/galex/namethatcolor/plugin/util/XmlOutput.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.plugin.util 2 | 3 | fun xmlOutput(name: String, hexColor: String) = "$hexColor" -------------------------------------------------------------------------------- /namethatcolor/src/main/resources/META-INF/plugin.xml: -------------------------------------------------------------------------------- 1 | 2 | il.co.galex.namethatcolor 3 | Name That Color 4 | 1.7.1 5 | Alexander Gherschon 6 | 7 | 9 | Copy the color in your clipboard and go to your color resources files (usually colors.xml), then open the auto complete pop-up. You'll see there 10 | two suggestions go generate the whole (material) color item, with the name of the (material swatch) color. 11 | ]]> 12 | 13 | 1.7.1
15 | - Updated plugin to latest IntelliJ version (2020.3)
16 | ]]>
17 | 18 | 19 | org.jetbrains.kotlin 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
-------------------------------------------------------------------------------- /namethatcolor/src/main/resources/META-INF/withKotlin.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /namethatcolor/src/test/kotlin/il/co/galex/namethatcolor/core/manager/ColorExtensionsTest.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.core.manager 2 | 3 | import il.co.galex.namethatcolor.core.model.Hsl 4 | import il.co.galex.namethatcolor.core.model.Rgb 5 | import il.co.galex.namethatcolor.core.util.hsl 6 | import il.co.galex.namethatcolor.core.util.rgb 7 | import org.junit.Assert.assertEquals 8 | import org.junit.Test 9 | 10 | class ColorExtensionsTest { 11 | 12 | @Test 13 | fun `color to rgb`() { 14 | // black 15 | assertEquals(Rgb(0, 0, 0), "000000".rgb()) 16 | // white 17 | assertEquals(Rgb(255, 255, 255), "FFFFFFF".rgb()) 18 | // red 19 | assertEquals(Rgb(255, 0, 0), "FF0000".rgb()) 20 | // green 21 | assertEquals(Rgb(0, 255, 0), "00FF00".rgb()) 22 | // blue 23 | assertEquals(Rgb(0, 0, 255), "0000FF".rgb()) 24 | // random color with different values 25 | assertEquals(Rgb(141, 144, 161), "8D90A1".rgb()) 26 | } 27 | 28 | @Test 29 | fun `color input to hsl`() { 30 | // black 31 | assertEquals(Hsl(0, 0, 0), "000000".hsl()) 32 | // white 33 | assertEquals(Hsl(0, 0, 100), "FFFFFFF".hsl()) 34 | // random color with different values 35 | assertEquals(Hsl(231, 10, 59), "8D90A1".hsl()) 36 | // some other random color with different values 37 | assertEquals(Hsl(35, 88, 51), "f09414".hsl()) 38 | // some other random color with different values 39 | assertEquals(Hsl(254, 46, 11), "150f29".hsl()) 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /namethatcolor/src/test/kotlin/il/co/galex/namethatcolor/core/manager/ColorNameFinderTest.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.core.manager 2 | 3 | import il.co.galex.namethatcolor.core.model.HexColor 4 | import org.junit.Assert.assertEquals 5 | import org.junit.Test 6 | 7 | class ColorNameFinderTest { 8 | 9 | @Test 10 | fun `find a color`() { 11 | // black exact match 12 | assertEquals("Black", ColorNameFinder.findColor(HexColor("#000000")).second.name) 13 | // non exact match 14 | assertEquals("Black Russian", ColorNameFinder.findColor(HexColor("#000010")).second.name) 15 | // white exact match 16 | assertEquals("White", ColorNameFinder.findColor(HexColor("#FFFFFF")).second.name) 17 | // white with 3 letters only 18 | assertEquals("White", ColorNameFinder.findColor(HexColor("#FFF")).second.name) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /namethatcolor/src/test/kotlin/il/co/galex/namethatcolor/core/model/HexColorTest.kt: -------------------------------------------------------------------------------- 1 | package il.co.galex.namethatcolor.core.model 2 | 3 | import il.co.galex.namethatcolor.core.util.toXmlName 4 | import org.junit.Assert.assertEquals 5 | import org.junit.Test 6 | 7 | class HexColorTest { 8 | 9 | @Test 10 | fun `input color of 3 chars`() { 11 | assertEquals("#3322DD", HexColor("32D").toString()) 12 | } 13 | 14 | @Test 15 | fun `input color of 3 chars with lowercase letters`() { 16 | assertEquals("#3322DD", HexColor("32d").toString()) 17 | } 18 | 19 | @Test 20 | fun `input color of 3 chars with #`() { 21 | assertEquals("#3322DD", HexColor("#32D").toString()) 22 | } 23 | 24 | @Test 25 | fun `input color of 3 chars with # and lowercase letters`() { 26 | assertEquals("#DDDDDD", HexColor("#ddd").toString()) 27 | } 28 | 29 | @Test 30 | fun `input color of 3 chars with alpha`() { 31 | assertEquals("#003322DD", HexColor("032D").toString()) 32 | } 33 | 34 | @Test 35 | fun `input color of 3 chars with alpha and #`() { 36 | assertEquals("#AA3322DD", HexColor("#A32D").toString()) 37 | } 38 | 39 | @Test 40 | fun `input color of 6 chars`() { 41 | assertEquals("#32DAE1", HexColor("32DAE1").toString()) 42 | } 43 | 44 | @Test 45 | fun `input color of 6 chars with #`() { 46 | assertEquals("#123456", HexColor("#123456").toString()) 47 | } 48 | 49 | @Test 50 | fun `input color of 6 chars with alpha`() { 51 | assertEquals("#A1B1C1D1", HexColor("A1B1C1D1").toString()) 52 | } 53 | 54 | @Test 55 | fun `input color of 6 chars with alpha and #`() { 56 | assertEquals("#AA93214F", HexColor("#AA93214F").toString()) 57 | } 58 | 59 | @Test 60 | fun `alpha of 0 percent`() { 61 | assertEquals(0, HexColor("#0931").percentAlpha) 62 | } 63 | 64 | @Test 65 | fun `alpha of 0%`() { 66 | assertEquals(0, HexColor("#0%931").percentAlpha) 67 | assertEquals("#00993311", HexColor("#0%931").toString()) 68 | } 69 | 70 | @Test 71 | fun `alpha of 5 percent`() { 72 | assertEquals(5, HexColor("#0D93214F").percentAlpha) 73 | } 74 | 75 | @Test 76 | fun `alpha of 5%`() { 77 | assertEquals(5, HexColor("#5%93214F").percentAlpha) 78 | assertEquals("#0D93214F", HexColor("#5%93214F").toString()) 79 | } 80 | 81 | @Test 82 | fun `alpha of 25 percent`() { 83 | assertEquals(25, HexColor("#4093214F").percentAlpha) 84 | } 85 | 86 | @Test 87 | fun `alpha of 25%`() { 88 | assertEquals(25, HexColor("#25%93214F").percentAlpha) 89 | assertEquals("#4093214F", HexColor("#25%93214F").toString()) 90 | } 91 | 92 | @Test 93 | fun `alpha of 50 percent`() { 94 | assertEquals(50, HexColor("#8093214F").percentAlpha) 95 | } 96 | 97 | @Test 98 | fun `alpha of 50%`() { 99 | assertEquals(50, HexColor("#50%93214F").percentAlpha) 100 | assertEquals("#8093214F", HexColor("#50%93214F").toString()) 101 | } 102 | 103 | @Test 104 | fun `alpha of 75 percent`() { 105 | assertEquals(75, HexColor("#BF93214F").percentAlpha) 106 | } 107 | 108 | @Test 109 | fun `alpha of 75%`() { 110 | assertEquals(75, HexColor("#75%93214F").percentAlpha) 111 | assertEquals("#BF93214F", HexColor("#75%93214F").toString()) 112 | } 113 | 114 | @Test 115 | fun `alpha of 100 percent`() { 116 | assertEquals(100, HexColor("#FF93214F").percentAlpha) 117 | } 118 | 119 | @Test 120 | fun `alpha of 100%`() { 121 | assertEquals(100, HexColor("#100%93214F").percentAlpha) 122 | assertEquals("#FF93214F", HexColor("#100%93214F").toString()) 123 | } 124 | 125 | @Test 126 | fun `ignore default alpha value`() { 127 | assertEquals("black", "black".toXmlName(HexColor("000000").percentAlpha)) 128 | assertEquals("black", "black".toXmlName(HexColor("%000000").percentAlpha)) 129 | assertEquals("black_alpha_100", "black".toXmlName(HexColor("100%000000").percentAlpha)) 130 | assertEquals("black_alpha_0", "black".toXmlName(HexColor("0%000000").percentAlpha)) 131 | assertEquals("black_alpha_10", "black".toXmlName(HexColor("10%000000").percentAlpha)) 132 | } 133 | 134 | @Test(expected = IllegalArgumentException::class) 135 | fun `invalid color input of 3 chars`() { 136 | HexColor("#3ZD") 137 | } 138 | 139 | @Test(expected = IllegalArgumentException::class) 140 | fun `invalid alpha input of 3 chars`() { 141 | HexColor("P30D") 142 | } 143 | } -------------------------------------------------------------------------------- /screenshots/clipboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galex/name-that-color-intellij-plugin/0ae897696890a6d34e1b5ecee100bb2c62f3efeb/screenshots/clipboard.png -------------------------------------------------------------------------------- /screenshots/quick-fix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/galex/name-that-color-intellij-plugin/0ae897696890a6d34e1b5ecee100bb2c62f3efeb/screenshots/quick-fix.png -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include 'namethatcolor' --------------------------------------------------------------------------------