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}