docx_reader/reader/
settings.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
use std::io::Read;
use std::str::FromStr;
use xml::reader::{EventReader, XmlEvent};

use crate::reader::{FromXML, ReaderError};
use crate::types::CharacterSpacingValues;

use super::*;

impl FromXML for Settings {
	fn from_xml<R: Read>(reader: R) -> Result<Self, ReaderError> {
		let mut parser = EventReader::new(reader);
		let mut settings = Self::default();

		loop {
			let e = parser.next();
			match e {
				Ok(XmlEvent::StartElement {
					attributes, name, ..
				}) => {
					let e = XMLElement::from_str(&name.local_name).unwrap();
					match e {
						XMLElement::DocId => {
							for a in attributes {
								if let Some(prefix) = a.name.prefix {
									let local_name = &a.name.local_name;
									// Ignore w14:val
									if local_name == "val" && prefix == "w15" {
										settings = settings.doc_id(
											&a.value.to_owned().replace("{", "").replace("}", ""),
										);
									}
								}
							}
						}
						XMLElement::DocVar => {
							let name = attributes::read_name(&attributes);
							let val = attributes::read_val(&attributes);
							if let Some(name) = name {
								if let Some(val) = val {
									settings = settings.add_doc_var(name, val);
								}
							}
						}
						XMLElement::DefaultTabStop => {
							let val = attributes::read_val(&attributes);
							if let Some(val) = val {
								if let Ok(val) = f32::from_str(&val) {
									settings = settings.default_tab_stop(val as usize);
								}
							}
						}
						XMLElement::AdjustLineHeightInTable => {
							settings = settings.adjust_line_height_in_table();
						}
						XMLElement::CharacterSpacingControl => {
							let val = read_val(&attributes);
							if let Some(val) = val {
								if let Ok(v) = CharacterSpacingValues::from_str(&val) {
									settings = settings.character_spacing_control(v);
								}
							}
						}
						_ => {}
					}
				}
				Ok(XmlEvent::EndElement { name, .. }) => {
					let e = XMLElement::from_str(&name.local_name).unwrap();
					if let XMLElement::Settings = e {
						break;
					}
				}
				Ok(XmlEvent::EndDocument { .. }) => break,
				Err(_) => return Err(ReaderError::XMLReadError),
				_ => {}
			}
		}
		Ok(settings)
	}
}