Implement basic color parsing

This commit is contained in:
ConnorSkees 2020-02-08 08:48:31 -05:00
parent 76b2685894
commit c5bc6062a0
5 changed files with 298 additions and 185 deletions

View File

@ -4,47 +4,44 @@ pub(crate) use name::ColorName;
mod name;
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
#[derive(Debug, Clone, Eq, PartialEq)]
pub(crate) struct Color {
red: u16,
green: u16,
blue: u16,
alpha: u16,
repr: ColorRepr,
repr: String,
}
impl Color {
pub const fn new(red: u16, green: u16, blue: u16, alpha: u16, repr: ColorRepr) -> Self {
Color { red, green, blue, alpha, repr }
pub const fn new(red: u16, green: u16, blue: u16, alpha: u16, repr: String) -> Self {
Color {
red,
green,
blue,
alpha,
repr,
}
}
pub fn from_values(red: u16, green: u16, blue: u16, alpha: u16) -> Self {
let repr = if alpha >= 1 {
format!("#{:X}{:X}{:X}", red, green, blue)
} else {
format!("#{:X}{:X}{:X}{:X}", red, green, blue, alpha)
};
Color {
red,
green,
blue,
alpha,
repr,
}
}
}
impl Display for Color {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self.repr {
ColorRepr::Name(n) => write!(f, "{}", n),
ColorRepr::Hex3 => todo!(), //write!(f, "#{}{}{}", self.red, self.green, self.blue),
ColorRepr::Hex6 => write!(f, "#{:X}{:X}{:X}", self.red, self.green, self.blue),
ColorRepr::Hex8 => write!(
f,
"#{:X}{:X}{:X}{:X}",
self.red, self.green, self.blue, self.alpha
),
ColorRepr::Function if self.alpha < 1 => write!(
f,
"rgba({}, {}, {}, {})",
self.red, self.green, self.blue, self.alpha
),
ColorRepr::Function => write!(f, "#{:X}{:X}{:X}", self.red, self.green, self.blue),
}
write!(f, "{}", self.repr)
}
}
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub(crate) enum ColorRepr {
Name(ColorName),
Hex3,
Hex6,
Hex8,
Function,
}

View File

@ -1,7 +1,7 @@
use std::convert::{Into, TryFrom};
use std::convert::TryFrom;
use std::fmt::{self, Display};
use super::{Color, ColorRepr};
use super::Color;
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub(crate) enum ColorName {
@ -470,157 +470,157 @@ impl TryFrom<&str> for ColorName {
}
}
impl Into<Color> for ColorName {
fn into(self) -> Color {
impl ColorName {
pub fn into_color(self, repr: String) -> Color {
match self {
Self::AliceBlue => Color::new(0xF0, 0xF8, 0xFF, 0xFF, ColorRepr::Name(self)),
Self::AntiqueWhite => Color::new(0xFA, 0xEB, 0xD7, 0xFF, ColorRepr::Name(self)),
Self::Aqua => Color::new(0x00, 0xFF, 0xFF, 0xFF, ColorRepr::Name(self)),
Self::Aquamarine => Color::new(0x7F, 0xFF, 0xD4, 0xFF, ColorRepr::Name(self)),
Self::Azure => Color::new(0xF0, 0xFF, 0xFF, 0xFF, ColorRepr::Name(self)),
Self::Beige => Color::new(0xF5, 0xF5, 0xDC, 0xFF, ColorRepr::Name(self)),
Self::Bisque => Color::new(0xFF, 0xE4, 0xC4, 0xFF, ColorRepr::Name(self)),
Self::Black => Color::new(0x00, 0x00, 0x00, 0xFF, ColorRepr::Name(self)),
Self::BlanchedAlmond => Color::new(0xFF, 0xEB, 0xCD, 0xFF, ColorRepr::Name(self)),
Self::Blue => Color::new(0x00, 0x00, 0xFF, 0xFF, ColorRepr::Name(self)),
Self::BlueViolet => Color::new(0x8A, 0x2B, 0xE2, 0xFF, ColorRepr::Name(self)),
Self::Brown => Color::new(0xA5, 0x2A, 0x2A, 0xFF, ColorRepr::Name(self)),
Self::BurlyWood => Color::new(0xDE, 0xB8, 0x87, 0xFF, ColorRepr::Name(self)),
Self::CadetBlue => Color::new(0x5F, 0x9E, 0xA0, 0xFF, ColorRepr::Name(self)),
Self::Chartreuse => Color::new(0x7F, 0xFF, 0x00, 0xFF, ColorRepr::Name(self)),
Self::Chocolate => Color::new(0xD2, 0x69, 0x1E, 0xFF, ColorRepr::Name(self)),
Self::Coral => Color::new(0xFF, 0x7F, 0x50, 0xFF, ColorRepr::Name(self)),
Self::CornflowerBlue => Color::new(0x64, 0x95, 0xED, 0xFF, ColorRepr::Name(self)),
Self::Cornsilk => Color::new(0xFF, 0xF8, 0xDC, 0xFF, ColorRepr::Name(self)),
Self::Crimson => Color::new(0xDC, 0x14, 0x3C, 0xFF, ColorRepr::Name(self)),
Self::Cyan => Color::new(0x00, 0xFF, 0xFF, 0xFF, ColorRepr::Name(self)),
Self::DarkBlue => Color::new(0x00, 0x00, 0x8B, 0xFF, ColorRepr::Name(self)),
Self::DarkCyan => Color::new(0x00, 0x8B, 0x8B, 0xFF, ColorRepr::Name(self)),
Self::DarkGoldenRod => Color::new(0xB8, 0x86, 0x0B, 0xFF, ColorRepr::Name(self)),
Self::DarkGray => Color::new(0xA9, 0xA9, 0xA9, 0xFF, ColorRepr::Name(self)),
Self::DarkGrey => Color::new(0xA9, 0xA9, 0xA9, 0xFF, ColorRepr::Name(self)),
Self::DarkGreen => Color::new(0x00, 0x64, 0x00, 0xFF, ColorRepr::Name(self)),
Self::DarkKhaki => Color::new(0xBD, 0xB7, 0x6B, 0xFF, ColorRepr::Name(self)),
Self::DarkMagenta => Color::new(0x8B, 0x00, 0x8B, 0xFF, ColorRepr::Name(self)),
Self::DarkOliveGreen => Color::new(0x55, 0x6B, 0x2F, 0xFF, ColorRepr::Name(self)),
Self::DarkOrange => Color::new(0xFF, 0x8C, 0x00, 0xFF, ColorRepr::Name(self)),
Self::DarkOrchid => Color::new(0x99, 0x32, 0xCC, 0xFF, ColorRepr::Name(self)),
Self::DarkRed => Color::new(0x8B, 0x00, 0x00, 0xFF, ColorRepr::Name(self)),
Self::DarkSalmon => Color::new(0xE9, 0x96, 0x7A, 0xFF, ColorRepr::Name(self)),
Self::DarkSeaGreen => Color::new(0x8F, 0xBC, 0x8F, 0xFF, ColorRepr::Name(self)),
Self::DarkSlateBlue => Color::new(0x48, 0x3D, 0x8B, 0xFF, ColorRepr::Name(self)),
Self::DarkSlateGray => Color::new(0x2F, 0x4F, 0x4F, 0xFF, ColorRepr::Name(self)),
Self::DarkSlateGrey => Color::new(0x2F, 0x4F, 0x4F, 0xFF, ColorRepr::Name(self)),
Self::DarkTurquoise => Color::new(0x00, 0xCE, 0xD1, 0xFF, ColorRepr::Name(self)),
Self::DarkViolet => Color::new(0x94, 0x00, 0xD3, 0xFF, ColorRepr::Name(self)),
Self::DeepPink => Color::new(0xFF, 0x14, 0x93, 0xFF, ColorRepr::Name(self)),
Self::DeepSkyBlue => Color::new(0x00, 0xBF, 0xFF, 0xFF, ColorRepr::Name(self)),
Self::DimGray => Color::new(0x69, 0x69, 0x69, 0xFF, ColorRepr::Name(self)),
Self::DimGrey => Color::new(0x69, 0x69, 0x69, 0xFF, ColorRepr::Name(self)),
Self::DodgerBlue => Color::new(0x1E, 0x90, 0xFF, 0xFF, ColorRepr::Name(self)),
Self::FireBrick => Color::new(0xB2, 0x22, 0x22, 0xFF, ColorRepr::Name(self)),
Self::FloralWhite => Color::new(0xFF, 0xFA, 0xF0, 0xFF, ColorRepr::Name(self)),
Self::ForestGreen => Color::new(0x22, 0x8B, 0x22, 0xFF, ColorRepr::Name(self)),
Self::Fuchsia => Color::new(0xFF, 0x00, 0xFF, 0xFF, ColorRepr::Name(self)),
Self::Gainsboro => Color::new(0xDC, 0xDC, 0xDC, 0xFF, ColorRepr::Name(self)),
Self::GhostWhite => Color::new(0xF8, 0xF8, 0xFF, 0xFF, ColorRepr::Name(self)),
Self::Gold => Color::new(0xFF, 0xD7, 0x00, 0xFF, ColorRepr::Name(self)),
Self::GoldenRod => Color::new(0xDA, 0xA5, 0x20, 0xFF, ColorRepr::Name(self)),
Self::Gray => Color::new(0x80, 0x80, 0x80, 0xFF, ColorRepr::Name(self)),
Self::Grey => Color::new(0x80, 0x80, 0x80, 0xFF, ColorRepr::Name(self)),
Self::Green => Color::new(0x00, 0x80, 0x00, 0xFF, ColorRepr::Name(self)),
Self::GreenYellow => Color::new(0xAD, 0xFF, 0x2F, 0xFF, ColorRepr::Name(self)),
Self::HoneyDew => Color::new(0xF0, 0xFF, 0xF0, 0xFF, ColorRepr::Name(self)),
Self::HotPink => Color::new(0xFF, 0x69, 0xB4, 0xFF, ColorRepr::Name(self)),
Self::IndianRed => Color::new(0xCD, 0x5C, 0x5C, 0xFF, ColorRepr::Name(self)),
Self::Indigo => Color::new(0x4B, 0x00, 0x82, 0xFF, ColorRepr::Name(self)),
Self::Ivory => Color::new(0xFF, 0xFF, 0xF0, 0xFF, ColorRepr::Name(self)),
Self::Khaki => Color::new(0xF0, 0xE6, 0x8C, 0xFF, ColorRepr::Name(self)),
Self::Lavender => Color::new(0xE6, 0xE6, 0xFA, 0xFF, ColorRepr::Name(self)),
Self::LavenderBlush => Color::new(0xFF, 0xF0, 0xF5, 0xFF, ColorRepr::Name(self)),
Self::LawnGreen => Color::new(0x7C, 0xFC, 0x00, 0xFF, ColorRepr::Name(self)),
Self::LemonChiffon => Color::new(0xFF, 0xFA, 0xCD, 0xFF, ColorRepr::Name(self)),
Self::LightBlue => Color::new(0xAD, 0xD8, 0xE6, 0xFF, ColorRepr::Name(self)),
Self::LightCoral => Color::new(0xF0, 0x80, 0x80, 0xFF, ColorRepr::Name(self)),
Self::LightCyan => Color::new(0xE0, 0xFF, 0xFF, 0xFF, ColorRepr::Name(self)),
Self::LightGoldenRodYellow => Color::new(0xFA, 0xFA, 0xD2, 0xFF, ColorRepr::Name(self)),
Self::LightGray => Color::new(0xD3, 0xD3, 0xD3, 0xFF, ColorRepr::Name(self)),
Self::LightGrey => Color::new(0xD3, 0xD3, 0xD3, 0xFF, ColorRepr::Name(self)),
Self::LightGreen => Color::new(0x90, 0xEE, 0x90, 0xFF, ColorRepr::Name(self)),
Self::LightPink => Color::new(0xFF, 0xB6, 0xC1, 0xFF, ColorRepr::Name(self)),
Self::LightSalmon => Color::new(0xFF, 0xA0, 0x7A, 0xFF, ColorRepr::Name(self)),
Self::LightSeaGreen => Color::new(0x20, 0xB2, 0xAA, 0xFF, ColorRepr::Name(self)),
Self::LightSkyBlue => Color::new(0x87, 0xCE, 0xFA, 0xFF, ColorRepr::Name(self)),
Self::LightSlateGray => Color::new(0x77, 0x88, 0x99, 0xFF, ColorRepr::Name(self)),
Self::LightSlateGrey => Color::new(0x77, 0x88, 0x99, 0xFF, ColorRepr::Name(self)),
Self::LightSteelBlue => Color::new(0xB0, 0xC4, 0xDE, 0xFF, ColorRepr::Name(self)),
Self::LightYellow => Color::new(0xFF, 0xFF, 0xE0, 0xFF, ColorRepr::Name(self)),
Self::Lime => Color::new(0x00, 0xFF, 0x00, 0xFF, ColorRepr::Name(self)),
Self::LimeGreen => Color::new(0x32, 0xCD, 0x32, 0xFF, ColorRepr::Name(self)),
Self::Linen => Color::new(0xFA, 0xF0, 0xE6, 0xFF, ColorRepr::Name(self)),
Self::Magenta => Color::new(0xFF, 0x00, 0xFF, 0xFF, ColorRepr::Name(self)),
Self::Maroon => Color::new(0x80, 0x00, 0x00, 0xFF, ColorRepr::Name(self)),
Self::MediumAquaMarine => Color::new(0x66, 0xCD, 0xAA, 0xFF, ColorRepr::Name(self)),
Self::MediumBlue => Color::new(0x00, 0x00, 0xCD, 0xFF, ColorRepr::Name(self)),
Self::MediumOrchid => Color::new(0xBA, 0x55, 0xD3, 0xFF, ColorRepr::Name(self)),
Self::MediumPurple => Color::new(0x93, 0x70, 0xDB, 0xFF, ColorRepr::Name(self)),
Self::MediumSeaGreen => Color::new(0x3C, 0xB3, 0x71, 0xFF, ColorRepr::Name(self)),
Self::MediumSlateBlue => Color::new(0x7B, 0x68, 0xEE, 0xFF, ColorRepr::Name(self)),
Self::MediumSpringGreen => Color::new(0x00, 0xFA, 0x9A, 0xFF, ColorRepr::Name(self)),
Self::MediumTurquoise => Color::new(0x48, 0xD1, 0xCC, 0xFF, ColorRepr::Name(self)),
Self::MediumVioletRed => Color::new(0xC7, 0x15, 0x85, 0xFF, ColorRepr::Name(self)),
Self::MidnightBlue => Color::new(0x19, 0x19, 0x70, 0xFF, ColorRepr::Name(self)),
Self::MintCream => Color::new(0xF5, 0xFF, 0xFA, 0xFF, ColorRepr::Name(self)),
Self::MistyRose => Color::new(0xFF, 0xE4, 0xE1, 0xFF, ColorRepr::Name(self)),
Self::Moccasin => Color::new(0xFF, 0xE4, 0xB5, 0xFF, ColorRepr::Name(self)),
Self::NavajoWhite => Color::new(0xFF, 0xDE, 0xAD, 0xFF, ColorRepr::Name(self)),
Self::Navy => Color::new(0x00, 0x00, 0x80, 0xFF, ColorRepr::Name(self)),
Self::OldLace => Color::new(0xFD, 0xF5, 0xE6, 0xFF, ColorRepr::Name(self)),
Self::Olive => Color::new(0x80, 0x80, 0x00, 0xFF, ColorRepr::Name(self)),
Self::OliveDrab => Color::new(0x6B, 0x8E, 0x23, 0xFF, ColorRepr::Name(self)),
Self::Orange => Color::new(0xFF, 0xA5, 0x00, 0xFF, ColorRepr::Name(self)),
Self::OrangeRed => Color::new(0xFF, 0x45, 0x00, 0xFF, ColorRepr::Name(self)),
Self::Orchid => Color::new(0xDA, 0x70, 0xD6, 0xFF, ColorRepr::Name(self)),
Self::PaleGoldenRod => Color::new(0xEE, 0xE8, 0xAA, 0xFF, ColorRepr::Name(self)),
Self::PaleGreen => Color::new(0x98, 0xFB, 0x98, 0xFF, ColorRepr::Name(self)),
Self::PaleTurquoise => Color::new(0xAF, 0xEE, 0xEE, 0xFF, ColorRepr::Name(self)),
Self::PaleVioletRed => Color::new(0xDB, 0x70, 0x93, 0xFF, ColorRepr::Name(self)),
Self::PapayaWhip => Color::new(0xFF, 0xEF, 0xD5, 0xFF, ColorRepr::Name(self)),
Self::PeachPuff => Color::new(0xFF, 0xDA, 0xB9, 0xFF, ColorRepr::Name(self)),
Self::Peru => Color::new(0xCD, 0x85, 0x3F, 0xFF, ColorRepr::Name(self)),
Self::Pink => Color::new(0xFF, 0xC0, 0xCB, 0xFF, ColorRepr::Name(self)),
Self::Plum => Color::new(0xDD, 0xA0, 0xDD, 0xFF, ColorRepr::Name(self)),
Self::PowderBlue => Color::new(0xB0, 0xE0, 0xE6, 0xFF, ColorRepr::Name(self)),
Self::Purple => Color::new(0x80, 0x00, 0x80, 0xFF, ColorRepr::Name(self)),
Self::RebeccaPurple => Color::new(0x66, 0x33, 0x99, 0xFF, ColorRepr::Name(self)),
Self::Red => Color::new(0xFF, 0x00, 0x00, 0xFF, ColorRepr::Name(self)),
Self::RosyBrown => Color::new(0xBC, 0x8F, 0x8F, 0xFF, ColorRepr::Name(self)),
Self::RoyalBlue => Color::new(0x41, 0x69, 0xE1, 0xFF, ColorRepr::Name(self)),
Self::SaddleBrown => Color::new(0x8B, 0x45, 0x13, 0xFF, ColorRepr::Name(self)),
Self::Salmon => Color::new(0xFA, 0x80, 0x72, 0xFF, ColorRepr::Name(self)),
Self::SandyBrown => Color::new(0xF4, 0xA4, 0x60, 0xFF, ColorRepr::Name(self)),
Self::SeaGreen => Color::new(0x2E, 0x8B, 0x57, 0xFF, ColorRepr::Name(self)),
Self::SeaShell => Color::new(0xFF, 0xF5, 0xEE, 0xFF, ColorRepr::Name(self)),
Self::Sienna => Color::new(0xA0, 0x52, 0x2D, 0xFF, ColorRepr::Name(self)),
Self::Silver => Color::new(0xC0, 0xC0, 0xC0, 0xFF, ColorRepr::Name(self)),
Self::SkyBlue => Color::new(0x87, 0xCE, 0xEB, 0xFF, ColorRepr::Name(self)),
Self::SlateBlue => Color::new(0x6A, 0x5A, 0xCD, 0xFF, ColorRepr::Name(self)),
Self::SlateGray => Color::new(0x70, 0x80, 0x90, 0xFF, ColorRepr::Name(self)),
Self::SlateGrey => Color::new(0x70, 0x80, 0x90, 0xFF, ColorRepr::Name(self)),
Self::Snow => Color::new(0xFF, 0xFA, 0xFA, 0xFF, ColorRepr::Name(self)),
Self::SpringGreen => Color::new(0x00, 0xFF, 0x7F, 0xFF, ColorRepr::Name(self)),
Self::SteelBlue => Color::new(0x46, 0x82, 0xB4, 0xFF, ColorRepr::Name(self)),
Self::Tan => Color::new(0xD2, 0xB4, 0x8C, 0xFF, ColorRepr::Name(self)),
Self::Teal => Color::new(0x00, 0x80, 0x80, 0xFF, ColorRepr::Name(self)),
Self::Thistle => Color::new(0xD8, 0xBF, 0xD8, 0xFF, ColorRepr::Name(self)),
Self::Tomato => Color::new(0xFF, 0x63, 0x47, 0xFF, ColorRepr::Name(self)),
Self::Turquoise => Color::new(0x40, 0xE0, 0xD0, 0xFF, ColorRepr::Name(self)),
Self::Violet => Color::new(0xEE, 0x82, 0xEE, 0xFF, ColorRepr::Name(self)),
Self::Wheat => Color::new(0xF5, 0xDE, 0xB3, 0xFF, ColorRepr::Name(self)),
Self::White => Color::new(0xFF, 0xFF, 0xFF, 0xFF, ColorRepr::Name(self)),
Self::WhiteSmoke => Color::new(0xF5, 0xF5, 0xF5, 0xFF, ColorRepr::Name(self)),
Self::Yellow => Color::new(0xFF, 0xFF, 0x00, 0xFF, ColorRepr::Name(self)),
Self::YellowGreen => Color::new(0x9A, 0xCD, 0x32, 0xFF, ColorRepr::Name(self)),
Self::AliceBlue => Color::new(0xF0, 0xF8, 0xFF, 0xFF, repr),
Self::AntiqueWhite => Color::new(0xFA, 0xEB, 0xD7, 0xFF, repr),
Self::Aqua => Color::new(0x00, 0xFF, 0xFF, 0xFF, repr),
Self::Aquamarine => Color::new(0x7F, 0xFF, 0xD4, 0xFF, repr),
Self::Azure => Color::new(0xF0, 0xFF, 0xFF, 0xFF, repr),
Self::Beige => Color::new(0xF5, 0xF5, 0xDC, 0xFF, repr),
Self::Bisque => Color::new(0xFF, 0xE4, 0xC4, 0xFF, repr),
Self::Black => Color::new(0x00, 0x00, 0x00, 0xFF, repr),
Self::BlanchedAlmond => Color::new(0xFF, 0xEB, 0xCD, 0xFF, repr),
Self::Blue => Color::new(0x00, 0x00, 0xFF, 0xFF, repr),
Self::BlueViolet => Color::new(0x8A, 0x2B, 0xE2, 0xFF, repr),
Self::Brown => Color::new(0xA5, 0x2A, 0x2A, 0xFF, repr),
Self::BurlyWood => Color::new(0xDE, 0xB8, 0x87, 0xFF, repr),
Self::CadetBlue => Color::new(0x5F, 0x9E, 0xA0, 0xFF, repr),
Self::Chartreuse => Color::new(0x7F, 0xFF, 0x00, 0xFF, repr),
Self::Chocolate => Color::new(0xD2, 0x69, 0x1E, 0xFF, repr),
Self::Coral => Color::new(0xFF, 0x7F, 0x50, 0xFF, repr),
Self::CornflowerBlue => Color::new(0x64, 0x95, 0xED, 0xFF, repr),
Self::Cornsilk => Color::new(0xFF, 0xF8, 0xDC, 0xFF, repr),
Self::Crimson => Color::new(0xDC, 0x14, 0x3C, 0xFF, repr),
Self::Cyan => Color::new(0x00, 0xFF, 0xFF, 0xFF, repr),
Self::DarkBlue => Color::new(0x00, 0x00, 0x8B, 0xFF, repr),
Self::DarkCyan => Color::new(0x00, 0x8B, 0x8B, 0xFF, repr),
Self::DarkGoldenRod => Color::new(0xB8, 0x86, 0x0B, 0xFF, repr),
Self::DarkGray => Color::new(0xA9, 0xA9, 0xA9, 0xFF, repr),
Self::DarkGrey => Color::new(0xA9, 0xA9, 0xA9, 0xFF, repr),
Self::DarkGreen => Color::new(0x00, 0x64, 0x00, 0xFF, repr),
Self::DarkKhaki => Color::new(0xBD, 0xB7, 0x6B, 0xFF, repr),
Self::DarkMagenta => Color::new(0x8B, 0x00, 0x8B, 0xFF, repr),
Self::DarkOliveGreen => Color::new(0x55, 0x6B, 0x2F, 0xFF, repr),
Self::DarkOrange => Color::new(0xFF, 0x8C, 0x00, 0xFF, repr),
Self::DarkOrchid => Color::new(0x99, 0x32, 0xCC, 0xFF, repr),
Self::DarkRed => Color::new(0x8B, 0x00, 0x00, 0xFF, repr),
Self::DarkSalmon => Color::new(0xE9, 0x96, 0x7A, 0xFF, repr),
Self::DarkSeaGreen => Color::new(0x8F, 0xBC, 0x8F, 0xFF, repr),
Self::DarkSlateBlue => Color::new(0x48, 0x3D, 0x8B, 0xFF, repr),
Self::DarkSlateGray => Color::new(0x2F, 0x4F, 0x4F, 0xFF, repr),
Self::DarkSlateGrey => Color::new(0x2F, 0x4F, 0x4F, 0xFF, repr),
Self::DarkTurquoise => Color::new(0x00, 0xCE, 0xD1, 0xFF, repr),
Self::DarkViolet => Color::new(0x94, 0x00, 0xD3, 0xFF, repr),
Self::DeepPink => Color::new(0xFF, 0x14, 0x93, 0xFF, repr),
Self::DeepSkyBlue => Color::new(0x00, 0xBF, 0xFF, 0xFF, repr),
Self::DimGray => Color::new(0x69, 0x69, 0x69, 0xFF, repr),
Self::DimGrey => Color::new(0x69, 0x69, 0x69, 0xFF, repr),
Self::DodgerBlue => Color::new(0x1E, 0x90, 0xFF, 0xFF, repr),
Self::FireBrick => Color::new(0xB2, 0x22, 0x22, 0xFF, repr),
Self::FloralWhite => Color::new(0xFF, 0xFA, 0xF0, 0xFF, repr),
Self::ForestGreen => Color::new(0x22, 0x8B, 0x22, 0xFF, repr),
Self::Fuchsia => Color::new(0xFF, 0x00, 0xFF, 0xFF, repr),
Self::Gainsboro => Color::new(0xDC, 0xDC, 0xDC, 0xFF, repr),
Self::GhostWhite => Color::new(0xF8, 0xF8, 0xFF, 0xFF, repr),
Self::Gold => Color::new(0xFF, 0xD7, 0x00, 0xFF, repr),
Self::GoldenRod => Color::new(0xDA, 0xA5, 0x20, 0xFF, repr),
Self::Gray => Color::new(0x80, 0x80, 0x80, 0xFF, repr),
Self::Grey => Color::new(0x80, 0x80, 0x80, 0xFF, repr),
Self::Green => Color::new(0x00, 0x80, 0x00, 0xFF, repr),
Self::GreenYellow => Color::new(0xAD, 0xFF, 0x2F, 0xFF, repr),
Self::HoneyDew => Color::new(0xF0, 0xFF, 0xF0, 0xFF, repr),
Self::HotPink => Color::new(0xFF, 0x69, 0xB4, 0xFF, repr),
Self::IndianRed => Color::new(0xCD, 0x5C, 0x5C, 0xFF, repr),
Self::Indigo => Color::new(0x4B, 0x00, 0x82, 0xFF, repr),
Self::Ivory => Color::new(0xFF, 0xFF, 0xF0, 0xFF, repr),
Self::Khaki => Color::new(0xF0, 0xE6, 0x8C, 0xFF, repr),
Self::Lavender => Color::new(0xE6, 0xE6, 0xFA, 0xFF, repr),
Self::LavenderBlush => Color::new(0xFF, 0xF0, 0xF5, 0xFF, repr),
Self::LawnGreen => Color::new(0x7C, 0xFC, 0x00, 0xFF, repr),
Self::LemonChiffon => Color::new(0xFF, 0xFA, 0xCD, 0xFF, repr),
Self::LightBlue => Color::new(0xAD, 0xD8, 0xE6, 0xFF, repr),
Self::LightCoral => Color::new(0xF0, 0x80, 0x80, 0xFF, repr),
Self::LightCyan => Color::new(0xE0, 0xFF, 0xFF, 0xFF, repr),
Self::LightGoldenRodYellow => Color::new(0xFA, 0xFA, 0xD2, 0xFF, repr),
Self::LightGray => Color::new(0xD3, 0xD3, 0xD3, 0xFF, repr),
Self::LightGrey => Color::new(0xD3, 0xD3, 0xD3, 0xFF, repr),
Self::LightGreen => Color::new(0x90, 0xEE, 0x90, 0xFF, repr),
Self::LightPink => Color::new(0xFF, 0xB6, 0xC1, 0xFF, repr),
Self::LightSalmon => Color::new(0xFF, 0xA0, 0x7A, 0xFF, repr),
Self::LightSeaGreen => Color::new(0x20, 0xB2, 0xAA, 0xFF, repr),
Self::LightSkyBlue => Color::new(0x87, 0xCE, 0xFA, 0xFF, repr),
Self::LightSlateGray => Color::new(0x77, 0x88, 0x99, 0xFF, repr),
Self::LightSlateGrey => Color::new(0x77, 0x88, 0x99, 0xFF, repr),
Self::LightSteelBlue => Color::new(0xB0, 0xC4, 0xDE, 0xFF, repr),
Self::LightYellow => Color::new(0xFF, 0xFF, 0xE0, 0xFF, repr),
Self::Lime => Color::new(0x00, 0xFF, 0x00, 0xFF, repr),
Self::LimeGreen => Color::new(0x32, 0xCD, 0x32, 0xFF, repr),
Self::Linen => Color::new(0xFA, 0xF0, 0xE6, 0xFF, repr),
Self::Magenta => Color::new(0xFF, 0x00, 0xFF, 0xFF, repr),
Self::Maroon => Color::new(0x80, 0x00, 0x00, 0xFF, repr),
Self::MediumAquaMarine => Color::new(0x66, 0xCD, 0xAA, 0xFF, repr),
Self::MediumBlue => Color::new(0x00, 0x00, 0xCD, 0xFF, repr),
Self::MediumOrchid => Color::new(0xBA, 0x55, 0xD3, 0xFF, repr),
Self::MediumPurple => Color::new(0x93, 0x70, 0xDB, 0xFF, repr),
Self::MediumSeaGreen => Color::new(0x3C, 0xB3, 0x71, 0xFF, repr),
Self::MediumSlateBlue => Color::new(0x7B, 0x68, 0xEE, 0xFF, repr),
Self::MediumSpringGreen => Color::new(0x00, 0xFA, 0x9A, 0xFF, repr),
Self::MediumTurquoise => Color::new(0x48, 0xD1, 0xCC, 0xFF, repr),
Self::MediumVioletRed => Color::new(0xC7, 0x15, 0x85, 0xFF, repr),
Self::MidnightBlue => Color::new(0x19, 0x19, 0x70, 0xFF, repr),
Self::MintCream => Color::new(0xF5, 0xFF, 0xFA, 0xFF, repr),
Self::MistyRose => Color::new(0xFF, 0xE4, 0xE1, 0xFF, repr),
Self::Moccasin => Color::new(0xFF, 0xE4, 0xB5, 0xFF, repr),
Self::NavajoWhite => Color::new(0xFF, 0xDE, 0xAD, 0xFF, repr),
Self::Navy => Color::new(0x00, 0x00, 0x80, 0xFF, repr),
Self::OldLace => Color::new(0xFD, 0xF5, 0xE6, 0xFF, repr),
Self::Olive => Color::new(0x80, 0x80, 0x00, 0xFF, repr),
Self::OliveDrab => Color::new(0x6B, 0x8E, 0x23, 0xFF, repr),
Self::Orange => Color::new(0xFF, 0xA5, 0x00, 0xFF, repr),
Self::OrangeRed => Color::new(0xFF, 0x45, 0x00, 0xFF, repr),
Self::Orchid => Color::new(0xDA, 0x70, 0xD6, 0xFF, repr),
Self::PaleGoldenRod => Color::new(0xEE, 0xE8, 0xAA, 0xFF, repr),
Self::PaleGreen => Color::new(0x98, 0xFB, 0x98, 0xFF, repr),
Self::PaleTurquoise => Color::new(0xAF, 0xEE, 0xEE, 0xFF, repr),
Self::PaleVioletRed => Color::new(0xDB, 0x70, 0x93, 0xFF, repr),
Self::PapayaWhip => Color::new(0xFF, 0xEF, 0xD5, 0xFF, repr),
Self::PeachPuff => Color::new(0xFF, 0xDA, 0xB9, 0xFF, repr),
Self::Peru => Color::new(0xCD, 0x85, 0x3F, 0xFF, repr),
Self::Pink => Color::new(0xFF, 0xC0, 0xCB, 0xFF, repr),
Self::Plum => Color::new(0xDD, 0xA0, 0xDD, 0xFF, repr),
Self::PowderBlue => Color::new(0xB0, 0xE0, 0xE6, 0xFF, repr),
Self::Purple => Color::new(0x80, 0x00, 0x80, 0xFF, repr),
Self::RebeccaPurple => Color::new(0x66, 0x33, 0x99, 0xFF, repr),
Self::Red => Color::new(0xFF, 0x00, 0x00, 0xFF, repr),
Self::RosyBrown => Color::new(0xBC, 0x8F, 0x8F, 0xFF, repr),
Self::RoyalBlue => Color::new(0x41, 0x69, 0xE1, 0xFF, repr),
Self::SaddleBrown => Color::new(0x8B, 0x45, 0x13, 0xFF, repr),
Self::Salmon => Color::new(0xFA, 0x80, 0x72, 0xFF, repr),
Self::SandyBrown => Color::new(0xF4, 0xA4, 0x60, 0xFF, repr),
Self::SeaGreen => Color::new(0x2E, 0x8B, 0x57, 0xFF, repr),
Self::SeaShell => Color::new(0xFF, 0xF5, 0xEE, 0xFF, repr),
Self::Sienna => Color::new(0xA0, 0x52, 0x2D, 0xFF, repr),
Self::Silver => Color::new(0xC0, 0xC0, 0xC0, 0xFF, repr),
Self::SkyBlue => Color::new(0x87, 0xCE, 0xEB, 0xFF, repr),
Self::SlateBlue => Color::new(0x6A, 0x5A, 0xCD, 0xFF, repr),
Self::SlateGray => Color::new(0x70, 0x80, 0x90, 0xFF, repr),
Self::SlateGrey => Color::new(0x70, 0x80, 0x90, 0xFF, repr),
Self::Snow => Color::new(0xFF, 0xFA, 0xFA, 0xFF, repr),
Self::SpringGreen => Color::new(0x00, 0xFF, 0x7F, 0xFF, repr),
Self::SteelBlue => Color::new(0x46, 0x82, 0xB4, 0xFF, repr),
Self::Tan => Color::new(0xD2, 0xB4, 0x8C, 0xFF, repr),
Self::Teal => Color::new(0x00, 0x80, 0x80, 0xFF, repr),
Self::Thistle => Color::new(0xD8, 0xBF, 0xD8, 0xFF, repr),
Self::Tomato => Color::new(0xFF, 0x63, 0x47, 0xFF, repr),
Self::Turquoise => Color::new(0x40, 0xE0, 0xD0, 0xFF, repr),
Self::Violet => Color::new(0xEE, 0x82, 0xEE, 0xFF, repr),
Self::Wheat => Color::new(0xF5, 0xDE, 0xB3, 0xFF, repr),
Self::White => Color::new(0xFF, 0xFF, 0xFF, 0xFF, repr),
Self::WhiteSmoke => Color::new(0xF5, 0xF5, 0xF5, 0xFF, repr),
Self::Yellow => Color::new(0xFF, 0xFF, 0x00, 0xFF, repr),
Self::YellowGreen => Color::new(0x9A, 0xCD, 0x32, 0xFF, repr),
}
}
}

View File

@ -3,7 +3,7 @@ use std::iter::Peekable;
use std::str::Chars;
use crate::atrule::AtRuleKind;
use crate::color::{ColorName};
use crate::color::ColorName;
use crate::common::{Keyword, Op, Pos, Symbol};
use crate::selector::{Attribute, AttributeKind, CaseKind};
use crate::{Token, TokenKind, Whitespace};
@ -415,7 +415,7 @@ impl<'a> Lexer<'a> {
}
if let Ok(c) = ColorName::try_from(string.as_ref()) {
return TokenKind::Color(c.into());
return TokenKind::Color(c.into_color(string));
}
if string == "-" {

View File

@ -361,6 +361,89 @@ impl Value {
TokenKind::Symbol(Symbol::BitAnd) => {
Some(Value::Ident(String::from("&"), QuoteKind::None))
}
TokenKind::Symbol(Symbol::Hash) => {
let mut s = String::new();
while let Some(tok) = toks.peek() {
match tok.kind.clone() {
TokenKind::Interpolation => {
toks.next();
s.push_str(
&parse_interpolation(toks, scope)
.iter()
.map(|x| x.kind.to_string())
.collect::<String>(),
)
}
TokenKind::Ident(ref i) => {
toks.next();
s.push_str(i)
}
TokenKind::Number(ref n) => {
toks.next();
s.push_str(n)
}
_ => break,
}
}
match s.len() {
3 => {
let v = u16::from_str_radix(&s, 16).unwrap();
let red = ((v & 0xf00) >> 8) * 0x11;
let green = ((v & 0x0f0) >> 4) * 0x11;
let blue = (v & 0x00f) * 0x11;
Some(Value::Color(Color::new(
red,
green,
blue,
1,
format!("#{}", s),
)))
}
4 => {
let v = u16::from_str_radix(&s, 16).unwrap();
let red = ((v & 0xf000) >> 12) * 0x11;
let green = ((v & 0x0f00) >> 8) * 0x11;
let blue = ((v & 0x00f0) >> 4) * 0x11;
let alpha = (v & 0x000f) * 0x11;
Some(Value::Color(Color::new(
red,
green,
blue,
alpha,
format!("#{}", s),
)))
}
6 => {
let v = u32::from_str_radix(&s, 16).unwrap();
let red: u16 = ((v & 0xff0000) >> 16) as u16;
let green: u16 = ((v & 0x00ff00) >> 8) as u16;
let blue: u16 = (v & 0x0000ff) as u16;
Some(Value::Color(Color::new(
red,
green,
blue,
1,
format!("#{}", s),
)))
}
8 => {
let v = u32::from_str_radix(&s, 16).unwrap();
let red = ((v & 0xff000000) >> 24) as u16;
let green = ((v & 0x00ff0000) >> 16) as u16;
let blue = ((v & 0x0000ff00) >> 8) as u16;
let alpha = (v & 0x000000ff) as u16;
Some(Value::Color(Color::new(
red,
green,
blue,
alpha,
format!("#{}", s),
)))
}
_ => Some(Value::Ident(s, QuoteKind::None)),
}
}
TokenKind::Ident(mut s) => {
while let Some(tok) = toks.peek() {
match tok.kind.clone() {

33
tests/color.rs Normal file
View File

@ -0,0 +1,33 @@
#![cfg(test)]
#[macro_use]
mod macros;
test!(preserves_named_color_case, "a {\n color: OrAnGe;\n}\n");
test!(preserves_hex_color_case, "a {\n color: #FfFfFf;\n}\n");
test!(
preserves_hex_8_val_00000000,
"a {\n color: #00000000;\n}\n"
);
test!(
preserves_hex_8_val_12312312,
"a {\n color: #12312312;\n}\n"
);
test!(
preserves_hex_8_val_ab234cff,
"a {\n color: #ab234cff;\n}\n"
);
test!(preserves_hex_6_val_000000, "a {\n color: #000000;\n}\n");
test!(preserves_hex_6_val_123123, "a {\n color: #123123;\n}\n");
test!(preserves_hex_6_val_ab234c, "a {\n color: #ab234c;\n}\n");
test!(preserves_hex_4_val_0000, "a {\n color: #0000;\n}\n");
test!(preserves_hex_4_val_123a, "a {\n color: #123a;\n}\n");
test!(preserves_hex_4_val_ab2f, "a {\n color: #ab2f;\n}\n");
test!(preserves_hex_3_val_000, "a {\n color: #000;\n}\n");
test!(preserves_hex_3_val_123, "a {\n color: #123;\n}\n");
test!(preserves_hex_3_val_ab2, "a {\n color: #ab2;\n}\n");
// test!(
// ,
// "a {\n color: OrAnGe;\n}\n",
// "a {\n color: OrAnGe;\n}\n"
// );