docx_reader/reader/
styles.rs1use 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}