docx_reader/reader/
settings.rs

1use std::io::Read;
2use std::str::FromStr;
3use xml::reader::{EventReader, XmlEvent};
4
5use crate::reader::{FromXML, ReaderError};
6use crate::types::CharacterSpacingValues;
7
8use super::*;
9
10impl FromXML for Settings {
11	fn from_xml<R: Read>(reader: R) -> Result<Self, ReaderError> {
12		let mut parser = EventReader::new(reader);
13		let mut settings = Self::default();
14
15		loop {
16			let e = parser.next();
17			match e {
18				Ok(XmlEvent::StartElement {
19					attributes, name, ..
20				}) => {
21					let e = XMLElement::from_str(&name.local_name).unwrap();
22					match e {
23						XMLElement::DocId => {
24							for a in attributes {
25								if let Some(prefix) = a.name.prefix {
26									let local_name = &a.name.local_name;
27									// Ignore w14:val
28									if local_name == "val" && prefix == "w15" {
29										settings = settings.doc_id(
30											&a.value.to_owned().replace("{", "").replace("}", ""),
31										);
32									}
33								}
34							}
35						}
36						XMLElement::DocVar => {
37							let name = attributes::read_name(&attributes);
38							let val = attributes::read_val(&attributes);
39							if let Some(name) = name {
40								if let Some(val) = val {
41									settings = settings.add_doc_var(name, val);
42								}
43							}
44						}
45						XMLElement::DefaultTabStop => {
46							let val = attributes::read_val(&attributes);
47							if let Some(val) = val {
48								if let Ok(val) = f32::from_str(&val) {
49									settings = settings.default_tab_stop(val as usize);
50								}
51							}
52						}
53						XMLElement::AdjustLineHeightInTable => {
54							settings = settings.adjust_line_height_in_table();
55						}
56						XMLElement::CharacterSpacingControl => {
57							let val = read_val(&attributes);
58							if let Some(val) = val {
59								if let Ok(v) = CharacterSpacingValues::from_str(&val) {
60									settings = settings.character_spacing_control(v);
61								}
62							}
63						}
64						_ => {}
65					}
66				}
67				Ok(XmlEvent::EndElement { name, .. }) => {
68					let e = XMLElement::from_str(&name.local_name).unwrap();
69					if let XMLElement::Settings = e {
70						break;
71					}
72				}
73				Ok(XmlEvent::EndDocument { .. }) => break,
74				Err(_) => return Err(ReaderError::XMLReadError),
75				_ => {}
76			}
77		}
78		Ok(settings)
79	}
80}