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