docx_reader/reader/
styles.rs

1use std::io::Read;
2use std::str::FromStr;
3use xml::reader::{EventReader, XmlEvent};
4
5use crate::reader::{FromXML, ReaderError};
6
7use super::*;
8
9impl FromXML for Styles {
10	fn from_xml<R: Read>(reader: R) -> Result<Self, ReaderError> {
11		let mut parser = EventReader::new(reader);
12		let mut styles = Self::default();
13		loop {
14			let e = parser.next();
15			match e {
16				Ok(XmlEvent::StartElement {
17					attributes, name, ..
18				}) => {
19					let e = XMLElement::from_str(&name.local_name).unwrap();
20					match e {
21						XMLElement::Style => {
22							if let Ok(s) = Style::read(&mut parser, &attributes) {
23								styles = styles.add_style(s);
24							}
25							continue;
26						}
27						XMLElement::DocDefaults => {
28							if let Ok(d) = DocDefaults::read(&mut parser, &attributes) {
29								styles = styles.doc_defaults(d);
30							}
31							continue;
32						}
33						_ => {}
34					}
35				}
36				Ok(XmlEvent::EndElement { name, .. }) => {
37					let e = XMLElement::from_str(&name.local_name).unwrap();
38					if let XMLElement::Styles = e {
39						break;
40					}
41				}
42				Err(_) => return Err(ReaderError::XMLReadError),
43				_ => {}
44			}
45		}
46		Ok(styles)
47	}
48}