docx_reader/reader/
settings.rs1use 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 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}