rust-office-charts 0.1.7

Render Office Open XML charts to SVG from native Rust or WebAssembly
Documentation
use super::super::colors::{hsl_to_rgb, srgb};
use roxmltree::Node;

fn percent(node: Node, attr: &str) -> Option<f64> {
    let value = node.attribute(attr)?;
    let fraction = if let Some(p) = value.strip_suffix('%') {
        p.parse::<f64>().ok()? / 100.
    } else {
        value.parse::<f64>().ok()? / 100_000.
    };
    fraction.is_finite().then(|| fraction.clamp(0., 1.))
}

pub(super) fn resolve(node: Node) -> Option<String> {
    let rgb = match node.tag_name().name() {
        "prstClr" => return preset(node.attribute("val")?).map(str::to_owned),
        "scrgbClr" => [
            percent(node, "r")?,
            percent(node, "g")?,
            percent(node, "b")?,
        ]
        .map(srgb),
        "hslClr" => {
            let hue = node.attribute("hue")?.parse::<i32>().ok()?;
            hsl_to_rgb(
                f64::from(hue.rem_euclid(21_600_000)) / 3_600_000.,
                percent(node, "sat")?,
                percent(node, "lum")?,
            )
        }
        _ => return None,
    };
    let [r, g, b] = rgb.map(|v| (v * 255.).round() as u8);
    Some(format!("#{r:02x}{g:02x}{b:02x}"))
}

fn preset(name: &str) -> Option<&'static str> {
    Some(match name {
        "aliceBlue" => "#f0f8ff",
        "antiqueWhite" => "#faebd7",
        "aqua" | "cyan" => "#00ffff",
        "aquamarine" => "#7fffd4",
        "azure" => "#f0ffff",
        "beige" => "#f5f5dc",
        "bisque" => "#ffe4c4",
        "black" => "#000000",
        "blanchedAlmond" => "#ffebcd",
        "blue" => "#0000ff",
        "blueViolet" => "#8a2be2",
        "brown" => "#a52a2a",
        "burlyWood" => "#deb887",
        "cadetBlue" => "#5f9ea0",
        "chartreuse" => "#7fff00",
        "chocolate" => "#d2691e",
        "coral" => "#ff7f50",
        "cornflowerBlue" => "#6495ed",
        "cornsilk" => "#fff8dc",
        "crimson" => "#dc143c",
        "darkBlue" | "dkBlue" => "#00008b",
        "darkCyan" | "dkCyan" => "#008b8b",
        "darkGoldenrod" | "dkGoldenrod" => "#b8860b",
        "darkGray" | "darkGrey" | "dkGray" | "dkGrey" => "#a9a9a9",
        "darkGreen" | "dkGreen" => "#006400",
        "darkKhaki" | "dkKhaki" => "#bdb76b",
        "darkMagenta" | "dkMagenta" => "#8b008b",
        "darkOliveGreen" | "dkOliveGreen" => "#556b2f",
        "darkOrange" | "dkOrange" => "#ff8c00",
        "darkOrchid" | "dkOrchid" => "#9932cc",
        "darkRed" | "dkRed" => "#8b0000",
        "darkSalmon" | "dkSalmon" => "#e9967a",
        "darkSeaGreen" | "dkSeaGreen" => "#8fbc8f",
        "darkSlateBlue" | "dkSlateBlue" => "#483d8b",
        "darkSlateGray" | "darkSlateGrey" | "dkSlateGray" | "dkSlateGrey" => "#2f4f4f",
        "darkTurquoise" | "dkTurquoise" => "#00ced1",
        "darkViolet" | "dkViolet" => "#9400d3",
        "deepPink" => "#ff1493",
        "deepSkyBlue" => "#00bfff",
        "dimGray" | "dimGrey" => "#696969",
        "dodgerBlue" => "#1e90ff",
        "firebrick" => "#b22222",
        "floralWhite" => "#fffaf0",
        "forestGreen" => "#228b22",
        "fuchsia" | "magenta" => "#ff00ff",
        "gainsboro" => "#dcdcdc",
        "ghostWhite" => "#f8f8ff",
        "gold" => "#ffd700",
        "goldenrod" => "#daa520",
        "gray" | "grey" => "#808080",
        "green" => "#008000",
        "greenYellow" => "#adff2f",
        "honeydew" => "#f0fff0",
        "hotPink" => "#ff69b4",
        "indianRed" => "#cd5c5c",
        "indigo" => "#4b0082",
        "ivory" => "#fffff0",
        "khaki" => "#f0e68c",
        "lavender" => "#e6e6fa",
        "lavenderBlush" => "#fff0f5",
        "lawnGreen" => "#7cfc00",
        "lemonChiffon" => "#fffacd",
        "lightBlue" | "ltBlue" => "#add8e6",
        "lightCoral" | "ltCoral" => "#f08080",
        "lightCyan" | "ltCyan" => "#e0ffff",
        "lightGoldenrodYellow" | "ltGoldenrodYellow" => "#fafad2",
        "lightGray" | "lightGrey" | "ltGray" | "ltGrey" => "#d3d3d3",
        "lightGreen" | "ltGreen" => "#90ee90",
        "lightPink" | "ltPink" => "#ffb6c1",
        "lightSalmon" | "ltSalmon" => "#ffa07a",
        "lightSeaGreen" | "ltSeaGreen" => "#20b2aa",
        "lightSkyBlue" | "ltSkyBlue" => "#87cefa",
        "lightSlateGray" | "lightSlateGrey" | "ltSlateGray" | "ltSlateGrey" => "#778899",
        "lightSteelBlue" | "ltSteelBlue" => "#b0c4de",
        "lightYellow" | "ltYellow" => "#ffffe0",
        "lime" => "#00ff00",
        "limeGreen" => "#32cd32",
        "linen" => "#faf0e6",
        "maroon" => "#800000",
        "medAquamarine" | "mediumAquamarine" => "#66cdaa",
        "medBlue" | "mediumBlue" => "#0000cd",
        "medOrchid" | "mediumOrchid" => "#ba55d3",
        "medPurple" | "mediumPurple" => "#9370db",
        "medSeaGreen" | "mediumSeaGreen" => "#3cb371",
        "medSlateBlue" | "mediumSlateBlue" => "#7b68ee",
        "medSpringGreen" | "mediumSpringGreen" => "#00fa9a",
        "medTurquoise" | "mediumTurquoise" => "#48d1cc",
        "medVioletRed" | "mediumVioletRed" => "#c71585",
        "midnightBlue" => "#191970",
        "mintCream" => "#f5fffa",
        "mistyRose" => "#ffe4e1",
        "moccasin" => "#ffe4b5",
        "navajoWhite" => "#ffdead",
        "navy" => "#000080",
        "oldLace" => "#fdf5e6",
        "olive" => "#808000",
        "oliveDrab" => "#6b8e23",
        "orange" => "#ffa500",
        "orangeRed" => "#ff4500",
        "orchid" => "#da70d6",
        "paleGoldenrod" => "#eee8aa",
        "paleGreen" => "#98fb98",
        "paleTurquoise" => "#afeeee",
        "paleVioletRed" => "#db7093",
        "papayaWhip" => "#ffefd5",
        "peachPuff" => "#ffdab9",
        "peru" => "#cd853f",
        "pink" => "#ffc0cb",
        "plum" => "#dda0dd",
        "powderBlue" => "#b0e0e6",
        "purple" => "#800080",
        "red" => "#ff0000",
        "rosyBrown" => "#bc8f8f",
        "royalBlue" => "#4169e1",
        "saddleBrown" => "#8b4513",
        "salmon" => "#fa8072",
        "sandyBrown" => "#f4a460",
        "seaGreen" => "#2e8b57",
        "seaShell" => "#fff5ee",
        "sienna" => "#a0522d",
        "silver" => "#c0c0c0",
        "skyBlue" => "#87ceeb",
        "slateBlue" => "#6a5acd",
        "slateGray" | "slateGrey" => "#708090",
        "snow" => "#fffafa",
        "springGreen" => "#00ff7f",
        "steelBlue" => "#4682b4",
        "tan" => "#d2b48c",
        "teal" => "#008080",
        "thistle" => "#d8bfd8",
        "tomato" => "#ff6347",
        "turquoise" => "#40e0d0",
        "violet" => "#ee82ee",
        "wheat" => "#f5deb3",
        "white" => "#ffffff",
        "whiteSmoke" => "#f5f5f5",
        "yellow" => "#ffff00",
        "yellowGreen" => "#9acd32",
        _ => return None,
    })
}