Rust CSS颜色解析库css-color-parser2的使用:高效解析与转换CSS颜色格式
Rust CSS颜色解析库css-color-parser2的使用:高效解析与转换CSS颜色格式
css-color-parser2是一个易于使用的Rust库,用于解析CSS3颜色字符串。它具有以下特点:
- 轻量级
- 可靠(提供测试,处理所有错误以避免panic)
- 不完全符合规范,但提供了便利性(允许额外的空格,允许在标准仅允许百分比的地方使用浮点数)
安装
在Cargo.toml中添加依赖:
[dependencies]
css-color-parser = "*"
示例
以下是一些基本用法示例:
extern crate css_color_parser;
use css_color_parser::Color as CssColor;
// 定义默认颜色
let default_color = CssColor { r: 0, g: 0, b: 0, a: 1.0 };
// 解析RGBA颜色
println!("{:?}", " rgba (255, 128, 12, 0.5)".parse::<CssColor>().unwrap_or(default_color));
// 输出: Color { r: 255, g: 128, b: 12, a: 0.5 }
// 解析十六进制简写格式
println!("{:?}", "#fff".parse::<CssColor>().unwrap_or(default_color));
// 输出: Color { r: 255, g: 255, b: 255, a: 1 }
// 解析颜色名称
println!("{:?}", "slateblue".parse::<CssColor>().unwrap_or(default_color));
// 输出: Color { r: 106, g: 90, b: 205, a: 1 }
// 解析错误示例
println!("{:?}", "blah".parse::<CssColor>().unwrap_or(default_color));
// 输出: Color { r: 0, g: 0, b: 0, a: 0 } - 表示解析错误
完整示例
下面是一个更完整的示例,展示了如何解析多种CSS颜色格式并进行格式转换:
// 导入库
extern crate css_color_parser;
use css_color_parser::Color as CssColor;
fn main() {
// 定义默认颜色(解析失败时使用)
let default_color = CssColor {
r: 0,
g: 0,
b: 0,
a: 0.0,
};
// 示例颜色字符串
let color_strings = vec![
"rgb(255, 100, 50)", // RGB格式
"rgba(200, 150, 100, 0.8)", // RGBA格式
"#abc", // 十六进制简写
"#aabbcc", // 十六进制完整格式
"hsl(120, 100%, 50%)", // HSL格式
"hsla(240, 80%, 70%, 0.5)", // HSLA格式
"darkblue", // 颜色名称
"invalid_color", // 无效颜色
];
// 解析并打印每种颜色
for color_str in color_strings {
match color_str.parse::<CssColor>() {
Ok(color) => {
println!("成功解析 '{}': {:?}", color_str, color);
// 转换为RGBA格式
println!(" RGBA格式: rgba({}, {}, {}, {})",
color.r, color.g, color.b, color.a);
// 转换为十六进制格式
if color.a == 1.0 {
println!(" 十六进制格式: #{:02x}{:02x}{:02x}",
color.r, color.g, color.b);
} else {
println!(" 十六进制格式(带透明度): #{:02x}{:02x}{:02x}{:02x}",
color.r, color.g, color.b, (color.a * 255.0) as u8);
}
},
Err(_) => {
println!("解析 '{}' 失败,使用默认颜色", color_str);
}
}
println!("----------------------");
}
}
支持的格式
该库支持以下CSS颜色格式:
- 十六进制格式(#rgb, #rrggbb)
- RGB/RGBA格式(rgb(r,g,b), rgba(r,g,b,a))
- HSL/HSLA格式(hsl(h,s%,l%), hsla(h,s%,l%,a))
- 颜色名称(如"red", “blue”, "slateblue"等)
错误处理
解析失败时会返回ColorParseError,可以使用unwrap_or提供默认值来处理错误情况。
许可证
该项目使用MIT许可证。
1 回复
Rust CSS颜色解析库css-color-parser2使用指南
介绍
css-color-parser2
是一个高效的Rust库,专门用于解析和转换CSS颜色格式。它支持所有标准的CSS颜色表示法,包括:
- 十六进制颜色 (#RRGGBB, #RGB)
- RGB/RGBA函数 (rgb(), rgba())
- HSL/HSLA函数 (hsl(), hsla())
- 命名颜色 (red, blue等)
- 透明关键字 (transparent)
安装
在Cargo.toml中添加依赖:
[dependencies]
css-color-parser2 = "0.1"
完整示例代码
use css_color_parser2::Color;
fn main() {
println!("===== CSS颜色解析示例 =====");
// 示例1: 解析不同格式的颜色
let colors = vec![
"#ff0000", // 十六进制红色
"rgb(0, 255, 0)", // RGB绿色
"rgba(0, 0, 255, 0.5)", // 半透明蓝色
"hsl(120, 100%, 50%)", // HSL绿色
"purple", // 命名颜色
"transparent" // 透明
];
for color_str in colors {
match Color::from_str(color_str) {
Ok(color) => println!("解析成功: {} -> {:?}", color_str, color),
Err(e) => println!("解析失败: {} -> {}", color_str, e),
}
}
// 示例2: 颜色转换
let hsl_color = Color::from_str("hsl(180, 50%, 50%)").unwrap();
println!("\n===== 颜色转换示例 =====");
println!("RGB值: ({}, {}, {})", hsl_color.r, hsl_color.g, hsl_color.b);
println!("HSL值: ({}°, {}%, {}%)",
hsl_color.to_hsl().0, hsl_color.to_hsl().1, hsl_color.to_hsl().2);
println!("十六进制: {}", hsl_color.to_hex_string());
println!("RGBA字符串: {}", hsl_color.to_rgba_string());
// 示例3: 颜色操作
let mut color = Color::from_str("rgba(100, 150, 200, 0.8)").unwrap();
println!("\n===== 颜色操作示例 =====");
println!("原始颜色: {}", color.to_rgba_string());
color.r = 255; // 修改红色分量
color.a = 1.0; // 修改透明度
println!("修改后: {}", color.to_rgba_string());
color.lighten(0.1); // 变亮10%
println!("变亮后: {}", color.to_rgba_string());
color.darken(0.2); // 变暗20%
println!("变暗后: {}", color.to_rgba_string());
color.fade_out(0.3); // 减少30%透明度
println!("减少透明度后: {}", color.to_rgba_string());
color.fade_in(0.1); // 增加10%透明度
println!("增加透明度后: {}", color.to_rgba_string());
// 示例4: 颜色混合
let red = Color::from_str("red").unwrap();
let blue = Color::from_str("blue").unwrap();
println!("\n===== 颜色混合示例 =====");
let purple = red.mix(&blue, 0.5); // 50%混合
println!("红色和蓝色混合: {}", purple.to_hex_string());
let dark_red = red.multiply(&blue); // 乘性混合
println!("红色和蓝色乘性混合: {}", dark_red.to_hex_string());
// 示例5: 自定义格式输出
let custom_color = Color::from_str("hsl(270, 60%, 70%)").unwrap();
println!("\n===== 自定义格式输出 =====");
println!("RGB格式: rgb({}, {}, {})", custom_color.r, custom_color.g, custom_color.b);
println!("十六进制大写: #{:02X}{:02X}{:02X}",
custom_color.r, custom_color.g, custom_color.b);
println!("带透明度: rgba({}, {}, {}, {:.2})",
custom_color.r, custom_color.g, custom_color.b, custom_color.a);
// 示例6: 错误处理
println!("\n===== 错误处理示例 =====");
match Color::from_str("not_a_color") {
Ok(color) => println!("意外成功解析: {:?}", color),
Err(e) => println!("预期中的解析错误: {}", e),
}
}
性能提示
css-color-parser2
经过优化,可以高效解析颜色字符串。对于需要频繁解析的场景,建议:
- 重用
Color
实例而不是反复解析 - 对于已知格式的颜色,直接构造
Color
结构体可能更快 - 批量处理颜色字符串时,考虑并行处理