docx_rust/
web_settings.rs1use hard_xml::{XmlRead, XmlResult, XmlWrite, XmlWriter};
7use std::io::Write;
8
9use crate::__xml_test_suites;
10use crate::schema::{SCHEMA_MAIN, SCHEMA_WORDML_14};
11
12#[derive(Debug, Default, XmlRead, Clone)]
14#[cfg_attr(test, derive(PartialEq))]
15#[xml(tag = "w:webSettings")]
16pub struct WebSettings {
17 #[xml(child = "w:optimizeForBrowser")]
18 pub optimize_for_browser: Option<OptimizeForBrowser>,
19 #[xml(child = "w:relyOnVML")]
20 pub rely_on_vml: Option<RelyOnVml>,
21 #[xml(child = "w:allowPNG")]
22 pub allow_png: Option<AllowPNG>,
23 #[xml(child = "w:doNotSaveAsSingleFile")]
24 pub do_not_save_as_single_file: Option<DoNotSaveAsSingleFile>,
25}
26
27#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
28#[cfg_attr(test, derive(PartialEq))]
29#[xml(tag = "w:optimizeForBrowser")]
30pub struct OptimizeForBrowser {}
31
32#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
33#[cfg_attr(test, derive(PartialEq))]
34#[xml(tag = "w:relyOnVML")]
35pub struct RelyOnVml {}
36
37#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
38#[cfg_attr(test, derive(PartialEq))]
39#[xml(tag = "w:allowPNG")]
40pub struct AllowPNG {}
41
42#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
43#[cfg_attr(test, derive(PartialEq))]
44#[xml(tag = "w:doNotSaveAsSingleFile")]
45pub struct DoNotSaveAsSingleFile {}
46
47impl XmlWrite for WebSettings {
48 fn to_writer<W: Write>(&self, writer: &mut XmlWriter<W>) -> XmlResult<()> {
49 let WebSettings {
50 optimize_for_browser,
51 rely_on_vml,
52 allow_png,
53 do_not_save_as_single_file,
54 } = self;
55
56 log::debug!("[WebSettings] Started writing.");
57 let _ = write!(writer.inner, "{}", crate::schema::SCHEMA_XML);
58
59 writer.write_element_start("w:webSettings")?;
60
61 writer.write_attribute("xmlns:w", SCHEMA_MAIN)?;
62
63 writer.write_attribute("xmlns:w14", SCHEMA_WORDML_14)?;
64
65 writer.write_element_end_open()?;
66
67 write_attr(optimize_for_browser, writer)?;
68
69 write_attr(rely_on_vml, writer)?;
70
71 write_attr(allow_png, writer)?;
72
73 write_attr(do_not_save_as_single_file, writer)?;
74
75 writer.write_element_end_close("w:webSettings")?;
76
77 log::debug!("[webSettings] Finished writing.");
78
79 Ok(())
80 }
81}
82
83fn write_attr<W: Write, T: XmlWrite>(
84 element: &Option<T>,
85 writer: &mut XmlWriter<W>,
86) -> Result<(), hard_xml::XmlError> {
87 if let Some(e) = element {
88 e.to_writer(writer)?;
89 };
90 Ok(())
91}
92
93__xml_test_suites!(
94 WebSettings,
95 WebSettings::default(),
96 format!(
97 r#"{}<w:webSettings xmlns:w="{}" xmlns:w14="{}"></w:webSettings>"#,
98 crate::schema::SCHEMA_XML,
99 SCHEMA_MAIN,
100 SCHEMA_WORDML_14
101 )
102 .as_str(),
103);
104
105#[test]
106fn regular_namespace() {
107 let alt_web_settings = r#"<?xml version="1.0" encoding="UTF-8"?>
108 <w:webSettings xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
109 <w:allowPNG />
110 <w:doNotSaveAsSingleFile />
111 </w:webSettings>
112 "#;
113 let web_settings = WebSettings::from_str(&alt_web_settings).unwrap();
114 assert_eq!(web_settings.allow_png, Some(AllowPNG {}));
115 assert_eq!(
116 web_settings.do_not_save_as_single_file,
117 Some(DoNotSaveAsSingleFile {})
118 );
119}
120
121#[test]
122fn alternative_namespace() {
123 let alt_web_settings = r#"<?xml version="1.0" encoding="UTF-8"?>
124 <ns0:webSettings xmlns:ns0="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
125 <ns0:allowPNG />
126 <ns0:doNotSaveAsSingleFile />
127 </ns0:webSettings>
128 "#
129 .replace("ns0:", "w:");
130 let web_settings = WebSettings::from_str(&alt_web_settings).unwrap();
131 assert_eq!(web_settings.allow_png, Some(AllowPNG {}));
132 assert_eq!(
133 web_settings.do_not_save_as_single_file,
134 Some(DoNotSaveAsSingleFile {})
135 );
136}