docx_rust/
web_settings.rs

1//! WebSettings part
2//!
3//! The corresponding ZIP item is `/word/webSettings.xml`.
4//!
5
6use 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/// The root element of the main document part.
13#[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}