diff --git a/README.md b/README.md index 7e87afe..b0c206b 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,18 @@ Convert and manipulate color values. +## Features + +- Supported color formats: rgb, hsv, hsl, hwb, ncol, cmyk +- Includes X11 colors. +- Parse a variety of [color formats](https://firanel.github.io/lua-color/index.html#Color:set). +- Methods for common color manipulations. +- Generate color schemes from a base color. ## Install -Use `luarocks install lua-color` or add folder to your project root. +Use `luarocks install lua-color` or add folder to your project root. +Supports lua >= 5.3. ## Documentation @@ -17,13 +25,27 @@ or from the *docs* folder. ### Import ```lua local Color = require "lua-color" + +-- Use x11 color names +Color.colorNames = require "lua-color.colors.X11" + +-- Use color names from file +local colors = require "lua-color.colors" +Color.colorNames = colors.load "my-colors.conf" ``` ### Create new color ```lua +-- With X11 colors enabled +local color = Color "crimson" + -- These create (roughly) the same color +-- (full list of options in the docs @see Color:set) local color = Color "#41ba69" +local color = Color "hsva 140 65% 73% 1" +local color = Color "cmyk 65% 0% 44% 27%" local color = Color { r = 0.255, g = 0.729, b = 0.412 } +local color = Color { 0.255, 0.729, 0.412 } local color = Color { h = 0.389, s = 0.65, v = 0.73 } local new_color = Color(color) @@ -31,16 +53,24 @@ local new_color = Color(color) ### Retrieve the color ```lua --- Print color as hex string -print(color) +-- Print color +print(Color "#ff0000") -- prints: #ff0000 +print(Color "#ff0000" :tostring "hsl") -- prints: hsl(0, 100%, 50%) -- Print color as hsv local h, s, v = color:hsv() print(h * 360, s * 100, v * 100) --- Print color as rgb -local r, g, b = color:rgb() -print(r * 255, g * 255, b * 255) +-- Print color as hsla +local h, s, l, a = color:hsla() +print(h * 360, s * 100, l * 100, a) + +-- Print color as rgba +local r, g, b, a = color:rgba() +print(r * 255, g * 255, b * 255, a) + +-- Print color as cmyk +print(color:cmyk()) ``` ### Manipulate the color @@ -53,6 +83,20 @@ color:rotate {rad = math.pi} -- Get inverse color:invert() local new_color = -color + +-- to greyscale +color:grey() + +-- to black or white depending on lightness +color:blackOrWhite() + +-- Mix two colors +color:mix(other_color, 0.3) -- mix colors with 70:30 ratio +local new_color = color + other_color -- mix colors 50:50 and return new +local new_color = color - other_color -- complement of + + +-- Apply mask +local new_color = color & 0xff00ff -- Get color without green component ``` ### Generate color scheme @@ -69,6 +113,12 @@ local orig, new_a, new_b = color:triad() -- Tetradic local orig, new_a, new_b, new_c = color:tetrad() +-- Compound +local new_a, orig, new_b = color:compound() + +-- Pentadic (and so forth) +local cols = color:evenlySpaced(5) + -- Combine -- Example: Analogous color scheme around complement local new_a, new_b, new_c = color:complement():analogous() @@ -79,6 +129,11 @@ local new_a, new_b, new_c = color:complement():analogous() -- Check if variable is color if Color.isColor(color) then print "It's a color!" end +-- Compare lightness of colors +if Color "#000000" > Color "#ffffff" then + print "Black is lighter than white!" -- Never runs +end + -- Equate colors assert(color == color:clone()) ``` diff --git a/colors/X11.csv b/colors/X11.csv new file mode 100644 index 0000000..7af9a91 --- /dev/null +++ b/colors/X11.csv @@ -0,0 +1,782 @@ +alice blue,240 248 255 +AliceBlue,240 248 255 +antique white,250 235 215 +AntiqueWhite,250 235 215 +AntiqueWhite1,255 239 219 +AntiqueWhite2,238 223 204 +AntiqueWhite3,205 192 176 +AntiqueWhite4,139 131 120 +aqua,0 255 255 +aquamarine,127 255 212 +aquamarine1,127 255 212 +aquamarine2,118 238 198 +aquamarine3,102 205 170 +aquamarine4,69 139 116 +azure,240 255 255 +azure1,240 255 255 +azure2,224 238 238 +azure3,193 205 205 +azure4,131 139 139 +beige,245 245 220 +bisque,255 228 196 +bisque1,255 228 196 +bisque2,238 213 183 +bisque3,205 183 158 +bisque4,139 125 107 +black,0 0 0 +blanched almond,255 235 205 +BlanchedAlmond,255 235 205 +blue,0 0 255 +blue violet,138 43 226 +blue1,0 0 255 +blue2,0 0 238 +blue3,0 0 205 +blue4,0 0 139 +BlueViolet,138 43 226 +brown,165 42 42 +brown1,255 64 64 +brown2,238 59 59 +brown3,205 51 51 +brown4,139 35 35 +burlywood,222 184 135 +burlywood1,255 211 155 +burlywood2,238 197 145 +burlywood3,205 170 125 +burlywood4,139 115 85 +cadet blue,95 158 160 +CadetBlue,95 158 160 +CadetBlue1,152 245 255 +CadetBlue2,142 229 238 +CadetBlue3,122 197 205 +CadetBlue4,83 134 139 +chartreuse,127 255 0 +chartreuse1,127 255 0 +chartreuse2,118 238 0 +chartreuse3,102 205 0 +chartreuse4,69 139 0 +chocolate,210 105 30 +chocolate1,255 127 36 +chocolate2,238 118 33 +chocolate3,205 102 29 +chocolate4,139 69 19 +coral,255 127 80 +coral1,255 114 86 +coral2,238 106 80 +coral3,205 91 69 +coral4,139 62 47 +cornflower blue,100 149 237 +CornflowerBlue,100 149 237 +cornsilk,255 248 220 +cornsilk1,255 248 220 +cornsilk2,238 232 205 +cornsilk3,205 200 177 +cornsilk4,139 136 120 +crimson,220 20 60 +cyan,0 255 255 +cyan1,0 255 255 +cyan2,0 238 238 +cyan3,0 205 205 +cyan4,0 139 139 +dark blue,0 0 139 +dark cyan,0 139 139 +dark goldenrod,184 134 11 +dark gray,169 169 169 +dark green,0 100 0 +dark grey,169 169 169 +dark khaki,189 183 107 +dark magenta,139 0 139 +dark olive green,85 107 47 +dark orange,255 140 0 +dark orchid,153 50 204 +dark red,139 0 0 +dark salmon,233 150 122 +dark sea green,143 188 143 +dark slate blue,72 61 139 +dark slate gray,47 79 79 +dark slate grey,47 79 79 +dark turquoise,0 206 209 +dark violet,148 0 211 +DarkBlue,0 0 139 +DarkCyan,0 139 139 +DarkGoldenrod,184 134 11 +DarkGoldenrod1,255 185 15 +DarkGoldenrod2,238 173 14 +DarkGoldenrod3,205 149 12 +DarkGoldenrod4,139 101 8 +DarkGray,169 169 169 +DarkGreen,0 100 0 +DarkGrey,169 169 169 +DarkKhaki,189 183 107 +DarkMagenta,139 0 139 +DarkOliveGreen,85 107 47 +DarkOliveGreen1,202 255 112 +DarkOliveGreen2,188 238 104 +DarkOliveGreen3,162 205 90 +DarkOliveGreen4,110 139 61 +DarkOrange,255 140 0 +DarkOrange1,255 127 0 +DarkOrange2,238 118 0 +DarkOrange3,205 102 0 +DarkOrange4,139 69 0 +DarkOrchid,153 50 204 +DarkOrchid1,191 62 255 +DarkOrchid2,178 58 238 +DarkOrchid3,154 50 205 +DarkOrchid4,104 34 139 +DarkRed,139 0 0 +DarkSalmon,233 150 122 +DarkSeaGreen,143 188 143 +DarkSeaGreen1,193 255 193 +DarkSeaGreen2,180 238 180 +DarkSeaGreen3,155 205 155 +DarkSeaGreen4,105 139 105 +DarkSlateBlue,72 61 139 +DarkSlateGray,47 79 79 +DarkSlateGray1,151 255 255 +DarkSlateGray2,141 238 238 +DarkSlateGray3,121 205 205 +DarkSlateGray4,82 139 139 +DarkSlateGrey,47 79 79 +DarkTurquoise,0 206 209 +DarkViolet,148 0 211 +deep pink,255 20 147 +deep sky blue,0 191 255 +DeepPink,255 20 147 +DeepPink1,255 20 147 +DeepPink2,238 18 137 +DeepPink3,205 16 118 +DeepPink4,139 10 80 +DeepSkyBlue,0 191 255 +DeepSkyBlue1,0 191 255 +DeepSkyBlue2,0 178 238 +DeepSkyBlue3,0 154 205 +DeepSkyBlue4,0 104 139 +dim gray,105 105 105 +dim grey,105 105 105 +DimGray,105 105 105 +DimGrey,105 105 105 +dodger blue,30 144 255 +DodgerBlue,30 144 255 +DodgerBlue1,30 144 255 +DodgerBlue2,28 134 238 +DodgerBlue3,24 116 205 +DodgerBlue4,16 78 139 +firebrick,178 34 34 +firebrick1,255 48 48 +firebrick2,238 44 44 +firebrick3,205 38 38 +firebrick4,139 26 26 +floral white,255 250 240 +FloralWhite,255 250 240 +forest green,34 139 34 +ForestGreen,34 139 34 +fuchsia,255 0 255 +gainsboro,220 220 220 +ghost white,248 248 255 +GhostWhite,248 248 255 +gold,255 215 0 +gold1,255 215 0 +gold2,238 201 0 +gold3,205 173 0 +gold4,139 117 0 +goldenrod,218 165 32 +goldenrod1,255 193 37 +goldenrod2,238 180 34 +goldenrod3,205 155 29 +goldenrod4,139 105 20 +gray,190 190 190 +gray0,0 0 0 +gray1,3 3 3 +gray10,26 26 26 +gray100,255 255 255 +gray11,28 28 28 +gray12,31 31 31 +gray13,33 33 33 +gray14,36 36 36 +gray15,38 38 38 +gray16,41 41 41 +gray17,43 43 43 +gray18,46 46 46 +gray19,48 48 48 +gray2,5 5 5 +gray20,51 51 51 +gray21,54 54 54 +gray22,56 56 56 +gray23,59 59 59 +gray24,61 61 61 +gray25,64 64 64 +gray26,66 66 66 +gray27,69 69 69 +gray28,71 71 71 +gray29,74 74 74 +gray3,8 8 8 +gray30,77 77 77 +gray31,79 79 79 +gray32,82 82 82 +gray33,84 84 84 +gray34,87 87 87 +gray35,89 89 89 +gray36,92 92 92 +gray37,94 94 94 +gray38,97 97 97 +gray39,99 99 99 +gray4,10 10 10 +gray40,102 102 102 +gray41,105 105 105 +gray42,107 107 107 +gray43,110 110 110 +gray44,112 112 112 +gray45,115 115 115 +gray46,117 117 117 +gray47,120 120 120 +gray48,122 122 122 +gray49,125 125 125 +gray5,13 13 13 +gray50,127 127 127 +gray51,130 130 130 +gray52,133 133 133 +gray53,135 135 135 +gray54,138 138 138 +gray55,140 140 140 +gray56,143 143 143 +gray57,145 145 145 +gray58,148 148 148 +gray59,150 150 150 +gray6,15 15 15 +gray60,153 153 153 +gray61,156 156 156 +gray62,158 158 158 +gray63,161 161 161 +gray64,163 163 163 +gray65,166 166 166 +gray66,168 168 168 +gray67,171 171 171 +gray68,173 173 173 +gray69,176 176 176 +gray7,18 18 18 +gray70,179 179 179 +gray71,181 181 181 +gray72,184 184 184 +gray73,186 186 186 +gray74,189 189 189 +gray75,191 191 191 +gray76,194 194 194 +gray77,196 196 196 +gray78,199 199 199 +gray79,201 201 201 +gray8,20 20 20 +gray80,204 204 204 +gray81,207 207 207 +gray82,209 209 209 +gray83,212 212 212 +gray84,214 214 214 +gray85,217 217 217 +gray86,219 219 219 +gray87,222 222 222 +gray88,224 224 224 +gray89,227 227 227 +gray9,23 23 23 +gray90,229 229 229 +gray91,232 232 232 +gray92,235 235 235 +gray93,237 237 237 +gray94,240 240 240 +gray95,242 242 242 +gray96,245 245 245 +gray97,247 247 247 +gray98,250 250 250 +gray99,252 252 252 +green,0 255 0 +green yellow,173 255 47 +green1,0 255 0 +green2,0 238 0 +green3,0 205 0 +green4,0 139 0 +GreenYellow,173 255 47 +grey,190 190 190 +grey0,0 0 0 +grey1,3 3 3 +grey10,26 26 26 +grey100,255 255 255 +grey11,28 28 28 +grey12,31 31 31 +grey13,33 33 33 +grey14,36 36 36 +grey15,38 38 38 +grey16,41 41 41 +grey17,43 43 43 +grey18,46 46 46 +grey19,48 48 48 +grey2,5 5 5 +grey20,51 51 51 +grey21,54 54 54 +grey22,56 56 56 +grey23,59 59 59 +grey24,61 61 61 +grey25,64 64 64 +grey26,66 66 66 +grey27,69 69 69 +grey28,71 71 71 +grey29,74 74 74 +grey3,8 8 8 +grey30,77 77 77 +grey31,79 79 79 +grey32,82 82 82 +grey33,84 84 84 +grey34,87 87 87 +grey35,89 89 89 +grey36,92 92 92 +grey37,94 94 94 +grey38,97 97 97 +grey39,99 99 99 +grey4,10 10 10 +grey40,102 102 102 +grey41,105 105 105 +grey42,107 107 107 +grey43,110 110 110 +grey44,112 112 112 +grey45,115 115 115 +grey46,117 117 117 +grey47,120 120 120 +grey48,122 122 122 +grey49,125 125 125 +grey5,13 13 13 +grey50,127 127 127 +grey51,130 130 130 +grey52,133 133 133 +grey53,135 135 135 +grey54,138 138 138 +grey55,140 140 140 +grey56,143 143 143 +grey57,145 145 145 +grey58,148 148 148 +grey59,150 150 150 +grey6,15 15 15 +grey60,153 153 153 +grey61,156 156 156 +grey62,158 158 158 +grey63,161 161 161 +grey64,163 163 163 +grey65,166 166 166 +grey66,168 168 168 +grey67,171 171 171 +grey68,173 173 173 +grey69,176 176 176 +grey7,18 18 18 +grey70,179 179 179 +grey71,181 181 181 +grey72,184 184 184 +grey73,186 186 186 +grey74,189 189 189 +grey75,191 191 191 +grey76,194 194 194 +grey77,196 196 196 +grey78,199 199 199 +grey79,201 201 201 +grey8,20 20 20 +grey80,204 204 204 +grey81,207 207 207 +grey82,209 209 209 +grey83,212 212 212 +grey84,214 214 214 +grey85,217 217 217 +grey86,219 219 219 +grey87,222 222 222 +grey88,224 224 224 +grey89,227 227 227 +grey9,23 23 23 +grey90,229 229 229 +grey91,232 232 232 +grey92,235 235 235 +grey93,237 237 237 +grey94,240 240 240 +grey95,242 242 242 +grey96,245 245 245 +grey97,247 247 247 +grey98,250 250 250 +grey99,252 252 252 +honeydew,240 255 240 +honeydew1,240 255 240 +honeydew2,224 238 224 +honeydew3,193 205 193 +honeydew4,131 139 131 +hot pink,255 105 180 +HotPink,255 105 180 +HotPink1,255 110 180 +HotPink2,238 106 167 +HotPink3,205 96 144 +HotPink4,139 58 98 +indian red,205 92 92 +IndianRed,205 92 92 +IndianRed1,255 106 106 +IndianRed2,238 99 99 +IndianRed3,205 85 85 +IndianRed4,139 58 58 +indigo,75 0 130 +ivory,255 255 240 +ivory1,255 255 240 +ivory2,238 238 224 +ivory3,205 205 193 +ivory4,139 139 131 +khaki,240 230 140 +khaki1,255 246 143 +khaki2,238 230 133 +khaki3,205 198 115 +khaki4,139 134 78 +lavender,230 230 250 +lavender blush,255 240 245 +LavenderBlush,255 240 245 +LavenderBlush1,255 240 245 +LavenderBlush2,238 224 229 +LavenderBlush3,205 193 197 +LavenderBlush4,139 131 134 +lawn green,124 252 0 +LawnGreen,124 252 0 +lemon chiffon,255 250 205 +LemonChiffon,255 250 205 +LemonChiffon1,255 250 205 +LemonChiffon2,238 233 191 +LemonChiffon3,205 201 165 +LemonChiffon4,139 137 112 +light blue,173 216 230 +light coral,240 128 128 +light cyan,224 255 255 +light goldenrod,238 221 130 +light goldenrod yellow,250 250 210 +light gray,211 211 211 +light green,144 238 144 +light grey,211 211 211 +light pink,255 182 193 +light salmon,255 160 122 +light sea green,32 178 170 +light sky blue,135 206 250 +light slate blue,132 112 255 +light slate gray,119 136 153 +light slate grey,119 136 153 +light steel blue,176 196 222 +light yellow,255 255 224 +LightBlue,173 216 230 +LightBlue1,191 239 255 +LightBlue2,178 223 238 +LightBlue3,154 192 205 +LightBlue4,104 131 139 +LightCoral,240 128 128 +LightCyan,224 255 255 +LightCyan1,224 255 255 +LightCyan2,209 238 238 +LightCyan3,180 205 205 +LightCyan4,122 139 139 +LightGoldenrod,238 221 130 +LightGoldenrod1,255 236 139 +LightGoldenrod2,238 220 130 +LightGoldenrod3,205 190 112 +LightGoldenrod4,139 129 76 +LightGoldenrodYellow,250 250 210 +LightGray,211 211 211 +LightGreen,144 238 144 +LightGrey,211 211 211 +LightPink,255 182 193 +LightPink1,255 174 185 +LightPink2,238 162 173 +LightPink3,205 140 149 +LightPink4,139 95 101 +LightSalmon,255 160 122 +LightSalmon1,255 160 122 +LightSalmon2,238 149 114 +LightSalmon3,205 129 98 +LightSalmon4,139 87 66 +LightSeaGreen,32 178 170 +LightSkyBlue,135 206 250 +LightSkyBlue1,176 226 255 +LightSkyBlue2,164 211 238 +LightSkyBlue3,141 182 205 +LightSkyBlue4,96 123 139 +LightSlateBlue,132 112 255 +LightSlateGray,119 136 153 +LightSlateGrey,119 136 153 +LightSteelBlue,176 196 222 +LightSteelBlue1,202 225 255 +LightSteelBlue2,188 210 238 +LightSteelBlue3,162 181 205 +LightSteelBlue4,110 123 139 +LightYellow,255 255 224 +LightYellow1,255 255 224 +LightYellow2,238 238 209 +LightYellow3,205 205 180 +LightYellow4,139 139 122 +lime,0 255 0 +lime green,50 205 50 +LimeGreen,50 205 50 +linen,250 240 230 +magenta,255 0 255 +magenta1,255 0 255 +magenta2,238 0 238 +magenta3,205 0 205 +magenta4,139 0 139 +maroon,176 48 96 +maroon1,255 52 179 +maroon2,238 48 167 +maroon3,205 41 144 +maroon4,139 28 98 +medium aquamarine,102 205 170 +medium blue,0 0 205 +medium orchid,186 85 211 +medium purple,147 112 219 +medium sea green,60 179 113 +medium slate blue,123 104 238 +medium spring green,0 250 154 +medium turquoise,72 209 204 +medium violet red,199 21 133 +MediumAquamarine,102 205 170 +MediumBlue,0 0 205 +MediumOrchid,186 85 211 +MediumOrchid1,224 102 255 +MediumOrchid2,209 95 238 +MediumOrchid3,180 82 205 +MediumOrchid4,122 55 139 +MediumPurple,147 112 219 +MediumPurple1,171 130 255 +MediumPurple2,159 121 238 +MediumPurple3,137 104 205 +MediumPurple4,93 71 139 +MediumSeaGreen,60 179 113 +MediumSlateBlue,123 104 238 +MediumSpringGreen,0 250 154 +MediumTurquoise,72 209 204 +MediumVioletRed,199 21 133 +midnight blue,25 25 112 +MidnightBlue,25 25 112 +mint cream,245 255 250 +MintCream,245 255 250 +misty rose,255 228 225 +MistyRose,255 228 225 +MistyRose1,255 228 225 +MistyRose2,238 213 210 +MistyRose3,205 183 181 +MistyRose4,139 125 123 +moccasin,255 228 181 +navajo white,255 222 173 +NavajoWhite,255 222 173 +NavajoWhite1,255 222 173 +NavajoWhite2,238 207 161 +NavajoWhite3,205 179 139 +NavajoWhite4,139 121 94 +navy,0 0 128 +navy blue,0 0 128 +NavyBlue,0 0 128 +old lace,253 245 230 +OldLace,253 245 230 +olive,128 128 0 +olive drab,107 142 35 +OliveDrab,107 142 35 +OliveDrab1,192 255 62 +OliveDrab2,179 238 58 +OliveDrab3,154 205 50 +OliveDrab4,105 139 34 +orange,255 165 0 +orange red,255 69 0 +orange1,255 165 0 +orange2,238 154 0 +orange3,205 133 0 +orange4,139 90 0 +OrangeRed,255 69 0 +OrangeRed1,255 69 0 +OrangeRed2,238 64 0 +OrangeRed3,205 55 0 +OrangeRed4,139 37 0 +orchid,218 112 214 +orchid1,255 131 250 +orchid2,238 122 233 +orchid3,205 105 201 +orchid4,139 71 137 +pale goldenrod,238 232 170 +pale green,152 251 152 +pale turquoise,175 238 238 +pale violet red,219 112 147 +PaleGoldenrod,238 232 170 +PaleGreen,152 251 152 +PaleGreen1,154 255 154 +PaleGreen2,144 238 144 +PaleGreen3,124 205 124 +PaleGreen4,84 139 84 +PaleTurquoise,175 238 238 +PaleTurquoise1,187 255 255 +PaleTurquoise2,174 238 238 +PaleTurquoise3,150 205 205 +PaleTurquoise4,102 139 139 +PaleVioletRed,219 112 147 +PaleVioletRed1,255 130 171 +PaleVioletRed2,238 121 159 +PaleVioletRed3,205 104 137 +PaleVioletRed4,139 71 93 +papaya whip,255 239 213 +PapayaWhip,255 239 213 +peach puff,255 218 185 +PeachPuff,255 218 185 +PeachPuff1,255 218 185 +PeachPuff2,238 203 173 +PeachPuff3,205 175 149 +PeachPuff4,139 119 101 +peru,205 133 63 +pink,255 192 203 +pink1,255 181 197 +pink2,238 169 184 +pink3,205 145 158 +pink4,139 99 108 +plum,221 160 221 +plum1,255 187 255 +plum2,238 174 238 +plum3,205 150 205 +plum4,139 102 139 +powder blue,176 224 230 +PowderBlue,176 224 230 +purple,160 32 240 +purple1,155 48 255 +purple2,145 44 238 +purple3,125 38 205 +purple4,85 26 139 +rebecca purple,102 51 153 +RebeccaPurple,102 51 153 +red,255 0 0 +red1,255 0 0 +red2,238 0 0 +red3,205 0 0 +red4,139 0 0 +rosy brown,188 143 143 +RosyBrown,188 143 143 +RosyBrown1,255 193 193 +RosyBrown2,238 180 180 +RosyBrown3,205 155 155 +RosyBrown4,139 105 105 +royal blue,65 105 225 +RoyalBlue,65 105 225 +RoyalBlue1,72 118 255 +RoyalBlue2,67 110 238 +RoyalBlue3,58 95 205 +RoyalBlue4,39 64 139 +saddle brown,139 69 19 +SaddleBrown,139 69 19 +salmon,250 128 114 +salmon1,255 140 105 +salmon2,238 130 98 +salmon3,205 112 84 +salmon4,139 76 57 +sandy brown,244 164 96 +SandyBrown,244 164 96 +sea green,46 139 87 +SeaGreen,46 139 87 +SeaGreen1,84 255 159 +SeaGreen2,78 238 148 +SeaGreen3,67 205 128 +SeaGreen4,46 139 87 +seashell,255 245 238 +seashell1,255 245 238 +seashell2,238 229 222 +seashell3,205 197 191 +seashell4,139 134 130 +sienna,160 82 45 +sienna1,255 130 71 +sienna2,238 121 66 +sienna3,205 104 57 +sienna4,139 71 38 +silver,192 192 192 +sky blue,135 206 235 +SkyBlue,135 206 235 +SkyBlue1,135 206 255 +SkyBlue2,126 192 238 +SkyBlue3,108 166 205 +SkyBlue4,74 112 139 +slate blue,106 90 205 +slate gray,112 128 144 +slate grey,112 128 144 +SlateBlue,106 90 205 +SlateBlue1,131 111 255 +SlateBlue2,122 103 238 +SlateBlue3,105 89 205 +SlateBlue4,71 60 139 +SlateGray,112 128 144 +SlateGray1,198 226 255 +SlateGray2,185 211 238 +SlateGray3,159 182 205 +SlateGray4,108 123 139 +SlateGrey,112 128 144 +snow,255 250 250 +snow1,255 250 250 +snow2,238 233 233 +snow3,205 201 201 +snow4,139 137 137 +spring green,0 255 127 +SpringGreen,0 255 127 +SpringGreen1,0 255 127 +SpringGreen2,0 238 118 +SpringGreen3,0 205 102 +SpringGreen4,0 139 69 +steel blue,70 130 180 +SteelBlue,70 130 180 +SteelBlue1,99 184 255 +SteelBlue2,92 172 238 +SteelBlue3,79 148 205 +SteelBlue4,54 100 139 +tan,210 180 140 +tan1,255 165 79 +tan2,238 154 73 +tan3,205 133 63 +tan4,139 90 43 +teal,0 128 128 +thistle,216 191 216 +thistle1,255 225 255 +thistle2,238 210 238 +thistle3,205 181 205 +thistle4,139 123 139 +tomato,255 99 71 +tomato1,255 99 71 +tomato2,238 92 66 +tomato3,205 79 57 +tomato4,139 54 38 +turquoise,64 224 208 +turquoise1,0 245 255 +turquoise2,0 229 238 +turquoise3,0 197 205 +turquoise4,0 134 139 +violet,238 130 238 +violet red,208 32 144 +VioletRed,208 32 144 +VioletRed1,255 62 150 +VioletRed2,238 58 140 +VioletRed3,205 50 120 +VioletRed4,139 34 82 +web gray,128 128 128 +web green,0 128 0 +web grey,128 128 128 +web maroon,128 0 0 +web purple,128 0 128 +WebGray,128 128 128 +WebGreen,0 128 0 +WebGrey,128 128 128 +WebMaroon,128 0 0 +WebPurple,128 0 128 +wheat,245 222 179 +wheat1,255 231 186 +wheat2,238 216 174 +wheat3,205 186 150 +wheat4,139 126 102 +white,255 255 255 +white smoke,245 245 245 +WhiteSmoke,245 245 245 +x11 gray,190 190 190 +x11 green,0 255 0 +x11 grey,190 190 190 +x11 maroon,176 48 96 +x11 purple,160 32 240 +X11Gray,190 190 190 +X11Green,0 255 0 +X11Grey,190 190 190 +X11Maroon,176 48 96 +X11Purple,160 32 240 +yellow,255 255 0 +yellow green,154 205 50 +yellow1,255 255 0 +yellow2,238 238 0 +yellow3,205 205 0 +yellow4,139 139 0 +YellowGreen,154 205 50 diff --git a/colors/X11.lua b/colors/X11.lua new file mode 100644 index 0000000..0582e4a --- /dev/null +++ b/colors/X11.lua @@ -0,0 +1,36 @@ +--- +-- Table of X11 color names. +-- +-- Data pulled from `https://gitlab.freedesktop.org/xorg/xserver/-/raw/master/os/oscolor.c` +-- +-- @usage Color.colorNames = require "lua-color.colors.X11" +-- +-- @see Color:colorNames + +local __DIR__ = debug.getinfo(1, 'S').source:match "^@(.*)/[^/]+$" + +local filename = __DIR__.."/X11.csv" + +local colors = {} + +local f = io.open(filename) +if f == nil then + assert(os.execute(string.format('bash "%s/loadX11colors.sh" &>/dev/null', __DIR__))) + f = io.open(filename) +end +assert(f) + +while true do + local line = f:read() + if line == nil then break end + + local name, r, g, b = line:match "^([^,]+),(%d+) (%d+) (%d+)$" + colors[name] = { + tonumber(r) / 0xff, + tonumber(g) / 0xff, + tonumber(b) / 0xff, + } +end + + +return colors diff --git a/colors/init.lua b/colors/init.lua new file mode 100644 index 0000000..a61605b --- /dev/null +++ b/colors/init.lua @@ -0,0 +1,125 @@ +--- +-- Get color names from files. +-- +-- @see Color.colorNames + +--- Load table from file. +-- +-- Uses `[:,;=]` as separator. +-- Lines that do not match the pattern are ignored. +-- Only the first occurence of the separator is parsed, other occurences are ignored. +--
+-- Some valid formats are: +-- +-- @tparam string|file file Filename or open file descriptor +-- +-- @treturn {[string]=string,...} +-- +-- @usage Color.colorNames = colors.load "my-colors.yaml" +-- @usage local colors_file = assert(io.open("my-colors.conf", "r")) +-- Color.colorNames = colors.load(colors_file) +-- colors_file:close() +local function load(file) + local res = {} + + local f = type(file) == "string" and io.open(file, "r") or file + while true do + local line = f:read() + if line == nil then break end + + local name, value = line:match "^%s*([^:,;=]+)%s*[:,;=]%s*(.+)%s*$" + if name ~= nil and value ~= nil then + res[name] = value + end + end + + return res +end + +--- Load table from csv file. +-- +-- @tparam string|file file Filename or open file descriptor +-- @tparam ?int nameColumn Column index for the name (Default: 1) +-- @tparam ?int|table valueColumn Column index for the value (Default: 2) +-- or table with column indices (and optionally divisors) for the color components +-- @tparam ?string separator Column separator (Default: `,;`) +-- @tparam ?bool skipFirst Skip first line (Default: `false`) +-- +-- @treturn {[string]=string,...} +-- +-- @usage -- csv file: red,rgb 255 0 0 +-- Color.colorNames = colors.loadCsv "my-colors.csv" +-- +-- @usage -- csv file: red,red is a color,255,0,0,0.5 +-- Color.colorNames = colors.loadCsv("my-colors.csv", 1, { +-- r = {3, 255}, -- load red component from column 3 and divide by 255 +-- g = {4, 255}, +-- b = {5, 255}, +-- a = 6 -- load alpha from column 6 (value is in [0;1] => no division required) +-- }) +local function loadCsv(file, nameColumn, valueColumn, separator, skipFirst) + nameColumn = nameColumn or 1 + valueColumn = valueColumn or 2 + + local res = {} + local pattern = "[^"..(separator or ",;").."]*" + local columnIsNum = true + + if type(valueColumn) ~= "number" then + columnIsNum = false + for comp, val in pairs(valueColumn) do + if type(val) == "number" then + valueColumn[comp] = {val} + end + end + end + + local f = type(file) == "string" and io.open(file, "r") or file + while true do + local line = f:read() + if line == nil then break end + if skipFirst then + skipFirst = false + goto endloop + end + + + local name + local value = {} + local col = 1 + for field in line:gmatch(pattern) do + if col == nameColumn then + name = field + elseif columnIsNum then + if col == valueColumn then value = field end + else + for component, cconf in pairs(valueColumn) do + if col == cconf[1] then + local fieldVal = tonumber(field) + value[component] = #cconf > 1 and fieldVal / cconf[2] or fieldVal + valueColumn[component] = nil + end + end + end + + col = col + 1 + end + + res[name] = value + + ::endloop:: + end + + return res +end + +--- @export +return { + load = load, + loadCsv = loadCsv +} diff --git a/colors/loadX11colors.sh b/colors/loadX11colors.sh new file mode 100644 index 0000000..f3eb042 --- /dev/null +++ b/colors/loadX11colors.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail + + +tmpdir=$(mktemp -d) + +wget -O "$tmpdir/oscolor.c" "https://gitlab.freedesktop.org/xorg/xserver/-/raw/master/os/oscolor.c" + +# sed -n '/^static const BuiltinColor/,${p;/^\}\;/q}' "$tmpdir/oscolor.c" +# sed -n '/^static const BuiltinColor/,/^\}\;/{/^s/d; /^}/d; /\{\([0-9]+\)\, \([0-9]+\)\, \([0-9]+\)\}.+\/\* ([a-zA-Z0-9 ]+) \*\//p\1 \2 \3\,\4;}' "$tmpdir/oscolor.c" +sed -n '/^static const BuiltinColor/,/^\}\;/{/^s/d; /^}/d; s/^ *{\([0-9]*\), \([0-9]*\), \([0-9]*\).*}, *\/\* \(.*\) \*\//\4,\1 \2 \3/p;}' "$tmpdir/oscolor.c" > "$(dirname $0)/X11.csv" + +rm -r "$tmpdir" diff --git a/config.ld b/config.ld index 28bd438..6928e13 100644 --- a/config.ld +++ b/config.ld @@ -1,7 +1,10 @@ project = "Lua Color" package = "lua-color" -file = "init.lua" +file = { + "init.lua", + "colors" +} dir = "docs" readme = "README.md" diff --git a/docs/classes/Color.html b/docs/classes/Color.html index e8dccfe..c4e63ae 100644 --- a/docs/classes/Color.html +++ b/docs/classes/Color.html @@ -26,6 +26,9 @@

Lua Color

+

Contents