Skip to main content

docx_rs/reader/
settings.rs

1use 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                                    // Ignore w14:val
25                                    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}