docx_rust/formatting/
color.rs

1use hard_xml::{XmlRead, XmlWrite};
2use std::borrow::Cow;
3
4use crate::{__string_enum, __xml_test_suites};
5
6/// Text Color
7///
8/// Specifies the color to be used to display text.
9///
10/// ```rust
11/// use docx_rust::formatting::Color;
12///
13/// let color = Color::from("000000");
14/// let color = Color::from(String::from("000000"));
15/// let color = Color::from(0u32); // "000000"
16/// let color = Color::from((0u8, 0u8, 0u8)); // "000000"
17/// ```
18#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
19#[cfg_attr(test, derive(PartialEq))]
20#[xml(tag = "w:color")]
21pub struct Color<'a> {
22    #[xml(attr = "w:val")]
23    pub value: Cow<'a, str>,
24}
25
26impl<'a> From<&'a str> for Color<'a> {
27    fn from(val: &'a str) -> Self {
28        Color {
29            value: Cow::Borrowed(val),
30        }
31    }
32}
33
34impl From<String> for Color<'_> {
35    fn from(val: String) -> Self {
36        Color {
37            value: Cow::Owned(val),
38        }
39    }
40}
41
42impl From<u32> for Color<'_> {
43    fn from(val: u32) -> Self {
44        Color {
45            value: Cow::Owned(format!("{:06x}", val)),
46        }
47    }
48}
49
50impl From<(u8, u8, u8)> for Color<'_> {
51    fn from(val: (u8, u8, u8)) -> Self {
52        Color {
53            value: Cow::Owned(format!("{:02x}{:02x}{:02x}", val.0, val.1, val.2)),
54        }
55    }
56}
57
58#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
59#[cfg_attr(test, derive(PartialEq))]
60#[xml(tag = "w:highlight")]
61pub struct Highlight {
62    #[xml(attr = "w:val")]
63    pub value: Option<HighlightType>,
64}
65
66#[derive(Debug, Clone)]
67#[cfg_attr(test, derive(PartialEq))]
68pub enum HighlightType {
69    Black,       //Black Highlighting Color
70    Blue,        //Blue Highlighting Color
71    Cyan,        //Cyan Highlighting Color
72    Green,       //Green Highlighting Color
73    Magenta,     //Magenta Highlighting Color
74    Red,         //Red Highlighting Color
75    Yellow,      //Yellow Highlighting Color
76    White,       //White Highlighting Color
77    DarkBlue,    //Dark Blue Highlighting Color
78    DarkCyan,    //Dark Cyan Highlighting Color
79    DarkGreen,   //Dark Green Highlighting Color
80    DarkMagenta, //Dark Magenta Highlighting Color
81    DarkRed,     //Dark Red Highlighting Color
82    DarkYellow,  //Dark Yellow Highlighting Color
83    DarkGray,    //Dark Gray Highlighting Color
84    LightGray,   //Light Gray Highlighting Color
85    None,        //No Text Highlighting
86}
87
88__string_enum! {
89    HighlightType {
90        Black = "black",
91        Blue = "blue",
92        Cyan = "cyan",
93        Green = "green",
94        Magenta = "magenta",
95        Red = "red",
96        Yellow = "yellow",
97        White = "white",
98        DarkBlue = "darkBlue",
99        DarkCyan = "darkCyan",
100        DarkGreen = "darkGreen",
101        DarkMagenta = "darkMagenta",
102        DarkRed = "darkRed",
103        DarkYellow = "darkYellow",
104        DarkGray = "darkGray",
105        LightGray = "lightGray",
106        None = "none",
107    }
108}
109
110#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
111#[cfg_attr(test, derive(PartialEq))]
112#[xml(tag = "w:vertAlign")]
113pub struct VertAlign {
114    #[xml(attr = "w:val")]
115    pub value: Option<VertAlignType>,
116}
117
118#[derive(Debug, Clone)]
119#[cfg_attr(test, derive(PartialEq))]
120pub enum VertAlignType {
121    Baseline,    //Regular Vertical Positioning
122    Superscript, //	Superscript
123    Subscript,   //	Subscript
124}
125
126__string_enum! {
127    VertAlignType {
128        Baseline = "baseline",
129        Subscript = "subscript",
130        Superscript = "superscript",
131    }
132}
133
134__xml_test_suites!(
135    Color,
136    Color::from("000000"),
137    r#"<w:color w:val="000000"/>"#,
138    Color::from(0u32),
139    r#"<w:color w:val="000000"/>"#,
140    Color::from((0u8, 0u8, 0u8)),
141    r#"<w:color w:val="000000"/>"#,
142);