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经过优化,可以高效解析颜色字符串。对于需要频繁解析的场景,建议:

  1. 重用Color实例而不是反复解析
  2. 对于已知格式的颜色,直接构造Color结构体可能更快
  3. 批量处理颜色字符串时,考虑并行处理
回到顶部