umya_spreadsheet/structs/
text_element.rs

1// r
2use super::Font;
3use super::Text;
4use crate::reader::driver::*;
5use crate::writer::driver::*;
6use md5::Digest;
7use quick_xml::events::{BytesStart, Event};
8use quick_xml::Reader;
9use quick_xml::Writer;
10use std::io::Cursor;
11
12#[derive(Clone, Default, Debug, PartialEq, PartialOrd)]
13pub struct TextElement {
14    text: Text,
15    run_properties: Option<Box<Font>>,
16}
17
18impl TextElement {
19    #[inline]
20    pub fn get_text(&self) -> &str {
21        self.text.get_value()
22    }
23
24    #[inline]
25    pub fn set_text<S: Into<String>>(&mut self, value: S) -> &mut Self {
26        self.text.set_value(value);
27        self
28    }
29
30    #[inline]
31    pub fn get_run_properties(&self) -> Option<&Font> {
32        self.run_properties.as_deref()
33    }
34
35    #[inline]
36    pub fn get_run_properties_mut(&mut self) -> &mut Font {
37        if self.run_properties.is_some() {
38            return self.run_properties.as_mut().unwrap();
39        }
40        self.set_run_properties(Font::get_default_value());
41        self.run_properties.as_mut().unwrap()
42    }
43
44    #[inline]
45    pub(crate) fn get_run_properties_crate(&mut self) -> Option<&mut Font> {
46        self.run_properties.as_deref_mut()
47    }
48
49    #[inline]
50    pub fn set_run_properties(&mut self, value: Font) -> &mut Self {
51        self.run_properties = Some(Box::new(value));
52        self
53    }
54
55    #[inline]
56    pub fn get_font(&self) -> Option<&Font> {
57        self.get_run_properties()
58    }
59
60    #[inline]
61    pub fn get_font_mut(&mut self) -> &mut Font {
62        self.get_run_properties_mut()
63    }
64
65    #[inline]
66    pub fn set_font(&mut self, value: Font) -> &mut Self {
67        self.set_run_properties(value)
68    }
69
70    pub(crate) fn get_hash_code(&self) -> String {
71        format!(
72            "{:x}",
73            md5::Md5::digest(format!(
74                "{}{}",
75                &self.text.get_value(),
76                match &self.run_properties {
77                    Some(v) => {
78                        v.get_hash_code()
79                    }
80                    None => {
81                        "None".into()
82                    }
83                },
84            ))
85        )
86    }
87
88    pub(crate) fn set_attributes<R: std::io::BufRead>(
89        &mut self,
90        reader: &mut Reader<R>,
91        _e: &BytesStart,
92    ) {
93        xml_read_loop!(
94            reader,
95            Event::Start(ref e) => {
96                match e.name().into_inner() {
97                    b"t" => {
98                        let mut obj = Text::default();
99                        obj.set_attributes(reader, e);
100                        self.text = obj;
101                    }
102                    b"rPr" => {
103                        let mut obj = Font::default();
104                        obj.set_attributes(reader, e);
105                        self.set_run_properties(obj);
106                    }
107                    _ => (),
108                }
109            },
110            Event::End(ref e) => {
111                if e.name().into_inner() == b"r" {
112                    return
113                }
114            },
115            Event::Eof => panic!("Error: Could not find {} end element", "r")
116        );
117    }
118
119    pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
120        // r
121        write_start_tag(writer, "r", vec![], false);
122
123        // rPr
124        if let Some(v) = &self.run_properties {
125            v.write_to_rpr(writer);
126        }
127
128        // t
129        self.text.write_to(writer);
130
131        write_end_tag(writer, "r");
132    }
133}