use super::*; use crate::documents::BuildXML; use crate::xml_builder::*; use serde::Serialize; #[derive(Debug, Clone, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct Settings { default_tab_stop: DefaultTabStop, zoom: Zoom, doc_id: Option, doc_vars: Vec, even_and_odd_headers: bool, } impl Settings { pub fn new() -> Settings { Default::default() } pub fn doc_id(mut self, id: impl Into) -> Self { self.doc_id = Some(DocId::new(id.into())); self } pub fn default_tab_stop(mut self, tab_stop: usize) -> Self { self.default_tab_stop = DefaultTabStop::new(tab_stop); self } pub fn add_doc_var(mut self, name: impl Into, val: impl Into) -> Self { self.doc_vars.push(DocVar::new(name, val)); self } pub fn even_and_odd_headers(mut self) -> Self { self.even_and_odd_headers = true; self } } impl Default for Settings { fn default() -> Self { Self { default_tab_stop: DefaultTabStop::new(840), zoom: Zoom::new(100), doc_id: None, doc_vars: vec![], even_and_odd_headers: false, } } } impl BuildXML for Settings { fn build(&self) -> Vec { let b = XMLBuilder::new(); let mut b = b .declaration(Some(true)) .open_settings() .add_child(&self.default_tab_stop) .add_child(&self.zoom) .open_compat() .space_for_ul() .balance_single_byte_double_byte_width() .do_not_leave_backslash_alone() .ul_trail_space() .do_not_expand_shift_return() .adjust_line_height_table() .use_fe_layout() .compat_setting( "compatibilityMode", "http://schemas.microsoft.com/office/word", "15", ) .compat_setting( "overrideTableStyleFontSizeAndJustification", "http://schemas.microsoft.com/office/word", "1", ) .compat_setting( "enableOpenTypeFeatures", "http://schemas.microsoft.com/office/word", "1", ) .compat_setting( "doNotFlipMirrorIndents", "http://schemas.microsoft.com/office/word", "1", ) .compat_setting( "differentiateMultirowTableHeaders", "http://schemas.microsoft.com/office/word", "1", ) .compat_setting( "useWord2013TrackBottomHyphenation", "http://schemas.microsoft.com/office/word", "0", ) .close() .add_optional_child(&self.doc_id); if !self.doc_vars.is_empty() { b = b.open_doc_vars(); for v in self.doc_vars.iter() { b = b.add_child(v); } b = b.close(); } if self.even_and_odd_headers { b = b.even_and_odd_headers(); } b.close().build() } } #[cfg(test)] mod tests { use super::*; #[cfg(test)] use pretty_assertions::assert_eq; use std::str; #[test] fn test_settings() { let c = Settings::new(); let b = c.build(); assert_eq!( str::from_utf8(&b).unwrap(), r#" "# ); } }