docx_rs/reader/
level.rs

1use std::io::Read;
2use std::str::FromStr;
3
4use xml::attribute::OwnedAttribute;
5use xml::reader::{EventReader, XmlEvent};
6
7use super::*;
8use crate::types::*;
9
10impl ElementReader for Level {
11    fn read<R: Read>(
12        r: &mut EventReader<R>,
13        attrs: &[OwnedAttribute],
14    ) -> Result<Self, ReaderError> {
15        let level = read_indent_level(attrs)?;
16        let mut style_id = None;
17        let mut ppr = ParagraphProperty::new();
18        let mut rpr = RunProperty::new();
19        let mut start = Start::default();
20        let mut num_fmt = NumberFormat::new("decimal");
21        let mut level_text = LevelText::new("");
22        let mut jc = LevelJc::new("left");
23
24        let mut indent_start = None;
25        let mut special_indent = None;
26        let mut indent_end = None;
27        let mut start_chars = None;
28        let mut level_restart = None;
29        let mut has_indent = false;
30        let mut suffix = LevelSuffixType::Tab;
31        let mut is_lgl = None;
32
33        loop {
34            let e = r.next();
35            match e {
36                Ok(XmlEvent::StartElement {
37                    attributes, name, ..
38                }) => {
39                    let e = XMLElement::from_str(&name.local_name).unwrap();
40                    match e {
41                        XMLElement::ParagraphStyle => {
42                            let id = attributes[0].value.clone();
43                            style_id = Some(id);
44                        }
45                        XMLElement::ParagraphProperty => {
46                            if let Ok(pr) = ParagraphProperty::read(r, attrs) {
47                                ppr = pr;
48                            }
49                            continue;
50                        }
51                        XMLElement::RunProperty => {
52                            if let Ok(pr) = RunProperty::read(r, attrs) {
53                                rpr = pr;
54                            }
55                            continue;
56                        }
57                        XMLElement::Start => {
58                            start = Start::new(usize::from_str(&attributes[0].value)?);
59                        }
60                        XMLElement::NumberFormat => {
61                            num_fmt = NumberFormat::new(attributes[0].value.clone());
62                        }
63                        XMLElement::Suffix => {
64                            suffix = LevelSuffixType::from_str(&attributes[0].value)?;
65                        }
66                        XMLElement::IsLgl => {
67                            is_lgl = Some(IsLgl::new());
68                        }
69                        XMLElement::LevelText => {
70                            level_text = LevelText::new(attributes[0].value.clone());
71                        }
72                        XMLElement::LevelRestart => {
73                            if let Ok(v) = u32::from_str(&attributes[0].value) {
74                                level_restart = Some(LevelRestart::new(v));
75                            }
76                        }
77                        XMLElement::LevelJustification => {
78                            jc = LevelJc::new(attributes[0].value.clone());
79                        }
80                        XMLElement::Indent => {
81                            let i = read_indent(&attributes)?;
82                            indent_start = i.0;
83                            indent_end = i.1;
84                            special_indent = i.2;
85                            start_chars = i.3;
86                            has_indent = true;
87                        }
88                        _ => {}
89                    }
90                }
91                Ok(XmlEvent::EndElement { name, .. }) => {
92                    let e = XMLElement::from_str(&name.local_name).unwrap();
93                    if let XMLElement::Level = e {
94                        let mut l =
95                            Level::new(level, start, num_fmt, level_text, jc).suffix(suffix);
96                        if let Some(style_id) = style_id {
97                            l = l.paragraph_style(style_id);
98                        }
99                        if has_indent {
100                            l = l.indent(indent_start, special_indent, indent_end, start_chars);
101                        }
102                        l.paragraph_property = ppr;
103                        l.run_property = rpr;
104                        l.level_restart = level_restart;
105                        l.is_lgl = is_lgl;
106                        return Ok(l);
107                    }
108                }
109                Err(_) => return Err(ReaderError::XMLReadError),
110                _ => {}
111            }
112        }
113    }
114}