umya_spreadsheet/structs/drawing/
run.rs

1use super::run_properties::RunProperties;
2use crate::reader::driver::*;
3use crate::writer::driver::*;
4use quick_xml::events::{BytesStart, Event};
5use quick_xml::Reader;
6use quick_xml::Writer;
7use std::io::Cursor;
8
9#[derive(Clone, Default, Debug)]
10pub struct Run {
11    text: Box<str>,
12    run_properties: RunProperties,
13}
14
15impl Run {
16    #[inline]
17    pub fn get_text(&self) -> &str {
18        &self.text
19    }
20
21    #[inline]
22    pub fn set_text<S: Into<String>>(&mut self, value: S) {
23        self.text = value.into().into_boxed_str();
24    }
25
26    #[inline]
27    pub fn get_run_properties(&self) -> &RunProperties {
28        &self.run_properties
29    }
30
31    #[inline]
32    pub fn get_run_properties_mut(&mut self) -> &mut RunProperties {
33        &mut self.run_properties
34    }
35
36    #[inline]
37    pub fn set_run_properties(&mut self, value: RunProperties) {
38        self.run_properties = value;
39    }
40
41    pub(crate) fn set_attributes<R: std::io::BufRead>(
42        &mut self,
43        reader: &mut Reader<R>,
44        _e: &BytesStart,
45    ) {
46        xml_read_loop!(
47            reader,
48            Event::Start(ref e) => {
49                if e.name().0 == b"a:rPr" {
50                    self.run_properties.set_attributes(reader, e, false);
51                }
52            },
53            Event::Empty(ref e) => {
54                if e.name().0 == b"a:rPr" {
55                    self.run_properties.set_attributes(reader, e, true);
56                }
57            },
58            Event::Text(e) => {
59                self.set_text(e.unescape().unwrap());
60            },
61            Event::End(ref e) => {
62                if e.name().0 == b"a:r" {
63                    return;
64                }
65            },
66            Event::Eof => panic!("Error: Could not find {} end element", "a:r")
67        );
68    }
69
70    pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
71        // a:r
72        write_start_tag(writer, "a:r", vec![], false);
73
74        // a:rPr
75        self.run_properties.write_to_rpr(writer);
76
77        // a:t
78        write_start_tag(writer, "a:t", vec![], false);
79        write_text_node(writer, &*self.text);
80        write_end_tag(writer, "a:t");
81
82        write_end_tag(writer, "a:r");
83    }
84}