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