docx_rust/font_table/
mod.rs

1//! Font Table part
2//!
3//! The corresponding ZIP item is `/word/fontTable.xml`.
4#![allow(unused_must_use)]
5
6mod charset;
7mod family;
8mod font;
9mod pitch;
10
11pub use self::{charset::*, family::*, font::*, pitch::*};
12
13use hard_xml::{XmlRead, XmlResult, XmlWrite, XmlWriter};
14use std::io::Write;
15
16use crate::__xml_test_suites;
17use crate::schema::{SCHEMA_MAIN, SCHEMA_RELATIONSHIPS_DOCUMENT, SCHEMA_XML};
18
19/// Font Table
20///
21/// ```rust
22/// use docx_rust::font_table::*;
23///
24/// let fonts = FontTable::default()
25///     .push_font("Arial")
26///     .push_font(Font::new("Helvetica").family("swiss"));
27/// ```
28#[derive(Debug, Default, XmlRead, Clone)]
29#[cfg_attr(test, derive(PartialEq))]
30#[xml(tag = "w:fonts")]
31pub struct FontTable<'a> {
32    #[xml(child = "w:font")]
33    pub fonts: Vec<Font<'a>>,
34}
35
36impl<'a> XmlWrite for FontTable<'a> {
37    fn to_writer<W: Write>(&self, writer: &mut XmlWriter<W>) -> XmlResult<()> {
38        let FontTable { fonts } = self;
39
40        log::debug!("[FontTable] Started writing.");
41        let _ = write!(writer.inner, "{}", SCHEMA_XML);
42
43        writer.write_element_start("w:fonts")?;
44
45        writer.write_attribute("xmlns:w", SCHEMA_MAIN)?;
46        writer.write_attribute("xmlns:r", SCHEMA_RELATIONSHIPS_DOCUMENT)?;
47
48        if fonts.is_empty() {
49            writer.write_element_end_empty()?;
50        } else {
51            writer.write_element_end_open()?;
52            for ele in fonts {
53                ele.to_writer(writer)?;
54            }
55            writer.write_element_end_close("w:fonts")?;
56        }
57
58        log::debug!("[FontTable] Finished writing.");
59
60        Ok(())
61    }
62}
63
64impl<'a> FontTable<'a> {
65    pub fn push_font<T: Into<Font<'a>>>(&mut self, font: T) -> &mut Self {
66        self.fonts.push(font.into());
67        self
68    }
69}
70
71__xml_test_suites!(
72    FontTable,
73    FontTable::default(),
74    format!(
75        r#"{}<w:fonts xmlns:w="{}" xmlns:r="{}"/>"#,
76        SCHEMA_XML, SCHEMA_MAIN, SCHEMA_RELATIONSHIPS_DOCUMENT
77    )
78    .as_str(),
79    FontTable {
80        fonts: vec!["Arial".into()]
81    },
82    format!(
83        r#"{}<w:fonts xmlns:w="{}" xmlns:r="{}"><w:font w:name="Arial"/></w:fonts>"#,
84        SCHEMA_XML, SCHEMA_MAIN, SCHEMA_RELATIONSHIPS_DOCUMENT
85    )
86    .as_str(),
87);