docx_reader/reader/
custom_properties.rs

1use std::io::Read;
2use std::str::FromStr;
3use xml::reader::{EventReader, XmlEvent};
4
5use super::*;
6
7impl FromXML for CustomProps {
8	fn from_xml<R: Read>(reader: R) -> Result<Self, ReaderError> {
9		let mut r = EventReader::new(reader);
10		// TODO: Fow now, support only string.
11		let mut props = CustomProps::new();
12		loop {
13			let e = r.next();
14			match e {
15				Ok(XmlEvent::StartElement {
16					name, attributes, ..
17				}) => {
18					if let Ok(XMLElement::Property) = XMLElement::from_str(&name.local_name) {
19						if let Some(key) = read_name(&attributes) {
20							loop {
21								let e = r.next();
22								match e {
23									Ok(XmlEvent::StartElement { name, .. }) => {
24										// TODO: Fow now, support only string.
25										if let Ok(VtXMLElement::Lpwstr) =
26											VtXMLElement::from_str(&name.local_name)
27										{
28											let e = r.next();
29											if let Ok(XmlEvent::Characters(c)) = e {
30												props = props.add_custom_property(&key, c)
31											}
32										}
33									}
34									Ok(XmlEvent::EndElement { name, .. }) => {
35										if let Ok(XMLElement::Property) =
36											XMLElement::from_str(&name.local_name)
37										{
38											break;
39										}
40									}
41									_ => {}
42								}
43							}
44						}
45					}
46				}
47				Ok(XmlEvent::EndDocument { .. }) => {
48					return Ok(props);
49				}
50				Err(_) => return Err(ReaderError::XMLReadError),
51				_ => {}
52			}
53		}
54	}
55}