docx_rust/font_table/
mod.rs1#![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#[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);