umya_spreadsheet/structs/
text_element.rs1use 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 write_start_tag(writer, "r", vec![], false);
122
123 if let Some(v) = &self.run_properties {
125 v.write_to_rpr(writer);
126 }
127
128 self.text.write_to(writer);
130
131 write_end_tag(writer, "r");
132 }
133}