diff --git a/src/color.rs b/src/color.rs index 12f6fa85..21b5b563 100644 --- a/src/color.rs +++ b/src/color.rs @@ -106,15 +106,15 @@ impl Color { } } - -#[inline] -fn rgb(red: f32, green: f32, blue: f32) -> Result { - Ok(Color::RGBA(RGBA { - red: red / 255., - green: green / 255., - blue: blue / 255., - alpha: 1., - })) +macro_rules! rgb { + ($red: expr, $green: expr, $blue: expr) => { + Color::RGBA(RGBA { + red: $red / 255., + green: $green / 255., + blue: $blue / 255., + alpha: 1., + }) + } } #[inline] @@ -135,160 +135,159 @@ fn rgba(red: f32, green: f32, blue: f32, alpha: f32) -> Result { /// (For example, the value of an `Ident` token is fine.) #[inline] pub fn parse_color_keyword(ident: &str) -> Result { - match_ignore_ascii_case! { ident, - "black" => rgb(0., 0., 0.), - "silver" => rgb(192., 192., 192.), - "gray" => rgb(128., 128., 128.), - "white" => rgb(255., 255., 255.), - "maroon" => rgb(128., 0., 0.), - "red" => rgb(255., 0., 0.), - "purple" => rgb(128., 0., 128.), - "fuchsia" => rgb(255., 0., 255.), - "green" => rgb(0., 128., 0.), - "lime" => rgb(0., 255., 0.), - "olive" => rgb(128., 128., 0.), - "yellow" => rgb(255., 255., 0.), - "navy" => rgb(0., 0., 128.), - "blue" => rgb(0., 0., 255.), - "teal" => rgb(0., 128., 128.), - "aqua" => rgb(0., 255., 255.), + match_ignore_ascii_case_with_table! { ident => Color, + "black" => rgb!(0., 0., 0.), + "silver" => rgb!(192., 192., 192.), + "gray" => rgb!(128., 128., 128.), + "white" => rgb!(255., 255., 255.), + "maroon" => rgb!(128., 0., 0.), + "red" => rgb!(255., 0., 0.), + "purple" => rgb!(128., 0., 128.), + "fuchsia" => rgb!(255., 0., 255.), + "green" => rgb!(0., 128., 0.), + "lime" => rgb!(0., 255., 0.), + "olive" => rgb!(128., 128., 0.), + "yellow" => rgb!(255., 255., 0.), + "navy" => rgb!(0., 0., 128.), + "blue" => rgb!(0., 0., 255.), + "teal" => rgb!(0., 128., 128.), + "aqua" => rgb!(0., 255., 255.), - "aliceblue" => rgb(240., 248., 255.), - "antiquewhite" => rgb(250., 235., 215.), - "aquamarine" => rgb(127., 255., 212.), - "azure" => rgb(240., 255., 255.), - "beige" => rgb(245., 245., 220.), - "bisque" => rgb(255., 228., 196.), - "blanchedalmond" => rgb(255., 235., 205.), - "blueviolet" => rgb(138., 43., 226.), - "brown" => rgb(165., 42., 42.), - "burlywood" => rgb(222., 184., 135.), - "cadetblue" => rgb(95., 158., 160.), - "chartreuse" => rgb(127., 255., 0.), - "chocolate" => rgb(210., 105., 30.), - "coral" => rgb(255., 127., 80.), - "cornflowerblue" => rgb(100., 149., 237.), - "cornsilk" => rgb(255., 248., 220.), - "crimson" => rgb(220., 20., 60.), - "cyan" => rgb(0., 255., 255.), - "darkblue" => rgb(0., 0., 139.), - "darkcyan" => rgb(0., 139., 139.), - "darkgoldenrod" => rgb(184., 134., 11.), - "darkgray" => rgb(169., 169., 169.), - "darkgreen" => rgb(0., 100., 0.), - "darkgrey" => rgb(169., 169., 169.), - "darkkhaki" => rgb(189., 183., 107.), - "darkmagenta" => rgb(139., 0., 139.), - "darkolivegreen" => rgb(85., 107., 47.), - "darkorange" => rgb(255., 140., 0.), - "darkorchid" => rgb(153., 50., 204.), - "darkred" => rgb(139., 0., 0.), - "darksalmon" => rgb(233., 150., 122.), - "darkseagreen" => rgb(143., 188., 143.), - "darkslateblue" => rgb(72., 61., 139.), - "darkslategray" => rgb(47., 79., 79.), - "darkslategrey" => rgb(47., 79., 79.), - "darkturquoise" => rgb(0., 206., 209.), - "darkviolet" => rgb(148., 0., 211.), - "deeppink" => rgb(255., 20., 147.), - "deepskyblue" => rgb(0., 191., 255.), - "dimgray" => rgb(105., 105., 105.), - "dimgrey" => rgb(105., 105., 105.), - "dodgerblue" => rgb(30., 144., 255.), - "firebrick" => rgb(178., 34., 34.), - "floralwhite" => rgb(255., 250., 240.), - "forestgreen" => rgb(34., 139., 34.), - "gainsboro" => rgb(220., 220., 220.), - "ghostwhite" => rgb(248., 248., 255.), - "gold" => rgb(255., 215., 0.), - "goldenrod" => rgb(218., 165., 32.), - "greenyellow" => rgb(173., 255., 47.), - "grey" => rgb(128., 128., 128.), - "honeydew" => rgb(240., 255., 240.), - "hotpink" => rgb(255., 105., 180.), - "indianred" => rgb(205., 92., 92.), - "indigo" => rgb(75., 0., 130.), - "ivory" => rgb(255., 255., 240.), - "khaki" => rgb(240., 230., 140.), - "lavender" => rgb(230., 230., 250.), - "lavenderblush" => rgb(255., 240., 245.), - "lawngreen" => rgb(124., 252., 0.), - "lemonchiffon" => rgb(255., 250., 205.), - "lightblue" => rgb(173., 216., 230.), - "lightcoral" => rgb(240., 128., 128.), - "lightcyan" => rgb(224., 255., 255.), - "lightgoldenrodyellow" => rgb(250., 250., 210.), - "lightgray" => rgb(211., 211., 211.), - "lightgreen" => rgb(144., 238., 144.), - "lightgrey" => rgb(211., 211., 211.), - "lightpink" => rgb(255., 182., 193.), - "lightsalmon" => rgb(255., 160., 122.), - "lightseagreen" => rgb(32., 178., 170.), - "lightskyblue" => rgb(135., 206., 250.), - "lightslategray" => rgb(119., 136., 153.), - "lightslategrey" => rgb(119., 136., 153.), - "lightsteelblue" => rgb(176., 196., 222.), - "lightyellow" => rgb(255., 255., 224.), - "limegreen" => rgb(50., 205., 50.), - "linen" => rgb(250., 240., 230.), - "magenta" => rgb(255., 0., 255.), - "mediumaquamarine" => rgb(102., 205., 170.), - "mediumblue" => rgb(0., 0., 205.), - "mediumorchid" => rgb(186., 85., 211.), - "mediumpurple" => rgb(147., 112., 219.), - "mediumseagreen" => rgb(60., 179., 113.), - "mediumslateblue" => rgb(123., 104., 238.), - "mediumspringgreen" => rgb(0., 250., 154.), - "mediumturquoise" => rgb(72., 209., 204.), - "mediumvioletred" => rgb(199., 21., 133.), - "midnightblue" => rgb(25., 25., 112.), - "mintcream" => rgb(245., 255., 250.), - "mistyrose" => rgb(255., 228., 225.), - "moccasin" => rgb(255., 228., 181.), - "navajowhite" => rgb(255., 222., 173.), - "oldlace" => rgb(253., 245., 230.), - "olivedrab" => rgb(107., 142., 35.), - "orange" => rgb(255., 165., 0.), - "orangered" => rgb(255., 69., 0.), - "orchid" => rgb(218., 112., 214.), - "palegoldenrod" => rgb(238., 232., 170.), - "palegreen" => rgb(152., 251., 152.), - "paleturquoise" => rgb(175., 238., 238.), - "palevioletred" => rgb(219., 112., 147.), - "papayawhip" => rgb(255., 239., 213.), - "peachpuff" => rgb(255., 218., 185.), - "peru" => rgb(205., 133., 63.), - "pink" => rgb(255., 192., 203.), - "plum" => rgb(221., 160., 221.), - "powderblue" => rgb(176., 224., 230.), - "rebeccapurple" => rgb(102., 51., 153.), - "rosybrown" => rgb(188., 143., 143.), - "royalblue" => rgb(65., 105., 225.), - "saddlebrown" => rgb(139., 69., 19.), - "salmon" => rgb(250., 128., 114.), - "sandybrown" => rgb(244., 164., 96.), - "seagreen" => rgb(46., 139., 87.), - "seashell" => rgb(255., 245., 238.), - "sienna" => rgb(160., 82., 45.), - "skyblue" => rgb(135., 206., 235.), - "slateblue" => rgb(106., 90., 205.), - "slategray" => rgb(112., 128., 144.), - "slategrey" => rgb(112., 128., 144.), - "snow" => rgb(255., 250., 250.), - "springgreen" => rgb(0., 255., 127.), - "steelblue" => rgb(70., 130., 180.), - "tan" => rgb(210., 180., 140.), - "thistle" => rgb(216., 191., 216.), - "tomato" => rgb(255., 99., 71.), - "turquoise" => rgb(64., 224., 208.), - "violet" => rgb(238., 130., 238.), - "wheat" => rgb(245., 222., 179.), - "whitesmoke" => rgb(245., 245., 245.), - "yellowgreen" => rgb(154., 205., 50.), + "aliceblue" => rgb!(240., 248., 255.), + "antiquewhite" => rgb!(250., 235., 215.), + "aquamarine" => rgb!(127., 255., 212.), + "azure" => rgb!(240., 255., 255.), + "beige" => rgb!(245., 245., 220.), + "bisque" => rgb!(255., 228., 196.), + "blanchedalmond" => rgb!(255., 235., 205.), + "blueviolet" => rgb!(138., 43., 226.), + "brown" => rgb!(165., 42., 42.), + "burlywood" => rgb!(222., 184., 135.), + "cadetblue" => rgb!(95., 158., 160.), + "chartreuse" => rgb!(127., 255., 0.), + "chocolate" => rgb!(210., 105., 30.), + "coral" => rgb!(255., 127., 80.), + "cornflowerblue" => rgb!(100., 149., 237.), + "cornsilk" => rgb!(255., 248., 220.), + "crimson" => rgb!(220., 20., 60.), + "cyan" => rgb!(0., 255., 255.), + "darkblue" => rgb!(0., 0., 139.), + "darkcyan" => rgb!(0., 139., 139.), + "darkgoldenrod" => rgb!(184., 134., 11.), + "darkgray" => rgb!(169., 169., 169.), + "darkgreen" => rgb!(0., 100., 0.), + "darkgrey" => rgb!(169., 169., 169.), + "darkkhaki" => rgb!(189., 183., 107.), + "darkmagenta" => rgb!(139., 0., 139.), + "darkolivegreen" => rgb!(85., 107., 47.), + "darkorange" => rgb!(255., 140., 0.), + "darkorchid" => rgb!(153., 50., 204.), + "darkred" => rgb!(139., 0., 0.), + "darksalmon" => rgb!(233., 150., 122.), + "darkseagreen" => rgb!(143., 188., 143.), + "darkslateblue" => rgb!(72., 61., 139.), + "darkslategray" => rgb!(47., 79., 79.), + "darkslategrey" => rgb!(47., 79., 79.), + "darkturquoise" => rgb!(0., 206., 209.), + "darkviolet" => rgb!(148., 0., 211.), + "deeppink" => rgb!(255., 20., 147.), + "deepskyblue" => rgb!(0., 191., 255.), + "dimgray" => rgb!(105., 105., 105.), + "dimgrey" => rgb!(105., 105., 105.), + "dodgerblue" => rgb!(30., 144., 255.), + "firebrick" => rgb!(178., 34., 34.), + "floralwhite" => rgb!(255., 250., 240.), + "forestgreen" => rgb!(34., 139., 34.), + "gainsboro" => rgb!(220., 220., 220.), + "ghostwhite" => rgb!(248., 248., 255.), + "gold" => rgb!(255., 215., 0.), + "goldenrod" => rgb!(218., 165., 32.), + "greenyellow" => rgb!(173., 255., 47.), + "grey" => rgb!(128., 128., 128.), + "honeydew" => rgb!(240., 255., 240.), + "hotpink" => rgb!(255., 105., 180.), + "indianred" => rgb!(205., 92., 92.), + "indigo" => rgb!(75., 0., 130.), + "ivory" => rgb!(255., 255., 240.), + "khaki" => rgb!(240., 230., 140.), + "lavender" => rgb!(230., 230., 250.), + "lavenderblush" => rgb!(255., 240., 245.), + "lawngreen" => rgb!(124., 252., 0.), + "lemonchiffon" => rgb!(255., 250., 205.), + "lightblue" => rgb!(173., 216., 230.), + "lightcoral" => rgb!(240., 128., 128.), + "lightcyan" => rgb!(224., 255., 255.), + "lightgoldenrodyellow" => rgb!(250., 250., 210.), + "lightgray" => rgb!(211., 211., 211.), + "lightgreen" => rgb!(144., 238., 144.), + "lightgrey" => rgb!(211., 211., 211.), + "lightpink" => rgb!(255., 182., 193.), + "lightsalmon" => rgb!(255., 160., 122.), + "lightseagreen" => rgb!(32., 178., 170.), + "lightskyblue" => rgb!(135., 206., 250.), + "lightslategray" => rgb!(119., 136., 153.), + "lightslategrey" => rgb!(119., 136., 153.), + "lightsteelblue" => rgb!(176., 196., 222.), + "lightyellow" => rgb!(255., 255., 224.), + "limegreen" => rgb!(50., 205., 50.), + "linen" => rgb!(250., 240., 230.), + "magenta" => rgb!(255., 0., 255.), + "mediumaquamarine" => rgb!(102., 205., 170.), + "mediumblue" => rgb!(0., 0., 205.), + "mediumorchid" => rgb!(186., 85., 211.), + "mediumpurple" => rgb!(147., 112., 219.), + "mediumseagreen" => rgb!(60., 179., 113.), + "mediumslateblue" => rgb!(123., 104., 238.), + "mediumspringgreen" => rgb!(0., 250., 154.), + "mediumturquoise" => rgb!(72., 209., 204.), + "mediumvioletred" => rgb!(199., 21., 133.), + "midnightblue" => rgb!(25., 25., 112.), + "mintcream" => rgb!(245., 255., 250.), + "mistyrose" => rgb!(255., 228., 225.), + "moccasin" => rgb!(255., 228., 181.), + "navajowhite" => rgb!(255., 222., 173.), + "oldlace" => rgb!(253., 245., 230.), + "olivedrab" => rgb!(107., 142., 35.), + "orange" => rgb!(255., 165., 0.), + "orangered" => rgb!(255., 69., 0.), + "orchid" => rgb!(218., 112., 214.), + "palegoldenrod" => rgb!(238., 232., 170.), + "palegreen" => rgb!(152., 251., 152.), + "paleturquoise" => rgb!(175., 238., 238.), + "palevioletred" => rgb!(219., 112., 147.), + "papayawhip" => rgb!(255., 239., 213.), + "peachpuff" => rgb!(255., 218., 185.), + "peru" => rgb!(205., 133., 63.), + "pink" => rgb!(255., 192., 203.), + "plum" => rgb!(221., 160., 221.), + "powderblue" => rgb!(176., 224., 230.), + "rebeccapurple" => rgb!(102., 51., 153.), + "rosybrown" => rgb!(188., 143., 143.), + "royalblue" => rgb!(65., 105., 225.), + "saddlebrown" => rgb!(139., 69., 19.), + "salmon" => rgb!(250., 128., 114.), + "sandybrown" => rgb!(244., 164., 96.), + "seagreen" => rgb!(46., 139., 87.), + "seashell" => rgb!(255., 245., 238.), + "sienna" => rgb!(160., 82., 45.), + "skyblue" => rgb!(135., 206., 235.), + "slateblue" => rgb!(106., 90., 205.), + "slategray" => rgb!(112., 128., 144.), + "slategrey" => rgb!(112., 128., 144.), + "snow" => rgb!(255., 250., 250.), + "springgreen" => rgb!(0., 255., 127.), + "steelblue" => rgb!(70., 130., 180.), + "tan" => rgb!(210., 180., 140.), + "thistle" => rgb!(216., 191., 216.), + "tomato" => rgb!(255., 99., 71.), + "turquoise" => rgb!(64., 224., 208.), + "violet" => rgb!(238., 130., 238.), + "wheat" => rgb!(245., 222., 179.), + "whitesmoke" => rgb!(245., 245., 245.), + "yellowgreen" => rgb!(154., 205., 50.), - "transparent" => Ok(Color::RGBA(RGBA { red: 0., green: 0., blue: 0., alpha: 0. })), - "currentcolor" => Ok(Color::CurrentColor), - _ => Err(()) + "transparent" => Color::RGBA(RGBA { red: 0., green: 0., blue: 0., alpha: 0. }), + "currentcolor" => Color::CurrentColor, } } @@ -314,10 +313,11 @@ fn parse_color_hash(value: &str) -> Result { (try!(from_hex(value[4])) * 16 + try!(from_hex(value[5]))) as f32, (try!(from_hex(value[6])) * 16 + try!(from_hex(value[7]))) as f32, ), - 6 => rgb( + 6 => rgba( (try!(from_hex(value[0])) * 16 + try!(from_hex(value[1]))) as f32, (try!(from_hex(value[2])) * 16 + try!(from_hex(value[3]))) as f32, (try!(from_hex(value[4])) * 16 + try!(from_hex(value[5]))) as f32, + 255. ), 4 => rgba( (try!(from_hex(value[0])) * 17) as f32, @@ -325,10 +325,11 @@ fn parse_color_hash(value: &str) -> Result { (try!(from_hex(value[2])) * 17) as f32, (try!(from_hex(value[3])) * 17) as f32, ), - 3 => rgb( + 3 => rgba( (try!(from_hex(value[0])) * 17) as f32, (try!(from_hex(value[1])) * 17) as f32, (try!(from_hex(value[2])) * 17) as f32, + 255. ), _ => Err(()) } diff --git a/src/lib.rs b/src/lib.rs index 58859e88..f425cf10 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -136,6 +136,27 @@ macro_rules! match_ignore_ascii_case { }; } +macro_rules! match_ignore_ascii_case_with_table { + ( $input: expr => $ty: ty, $($keyword: expr => $value: expr,)* ) => { + { + use std::ascii::AsciiExt; + static MATCH_IGNORE_ASCII_CASE_TABLE: &'static [(&'static str, $ty)] = &[ + $( + ($keyword, $value), + )* + ]; + let mut result = Err(()); + let input = $input; + for &(keyword, value) in MATCH_IGNORE_ASCII_CASE_TABLE { + if keyword.eq_ignore_ascii_case(&input) { + result = Ok(value) + } + } + result + } + }; +} + mod rules_and_declarations; #[cfg(feature = "dummy_match_byte")]