docx_reader/reader/
level.rs

1use std::io::Read;
2use std::str::FromStr;
3use xml::attribute::OwnedAttribute;
4use xml::reader::{EventReader, XmlEvent};
5
6use crate::types::*;
7
8use super::*;
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}