use crate::excel::XmlReader;
use anyhow::bail;
use std::io::Read;
use complex_sript_font::XlsxComplexScriptFont;
use east_asian_font::XlsxEastAsianFont;
use latin_font::XlsxLatinFont;
use quick_xml::events::Event;
use supplemental_font::XlsxSupplementalFont;
pub mod base_font;
pub mod complex_sript_font;
pub mod east_asian_font;
pub mod font_reference;
pub mod latin_font;
pub mod supplemental_font;
pub mod text_font_type;
pub type XlsxMinorFont = XlsxFontBase;
pub type XlsxMajorFont = XlsxFontBase;
#[derive(Debug, Clone, PartialEq)]
pub struct XlsxFontBase {
pub cs: Option<XlsxComplexScriptFont>,
pub ea: Option<XlsxEastAsianFont>,
pub font: Option<Vec<XlsxSupplementalFont>>,
pub latin: Option<XlsxLatinFont>,
}
impl XlsxFontBase {
pub(crate) fn load_major(reader: &mut XmlReader<impl Read>) -> anyhow::Result<XlsxMajorFont> {
return Self::load_helper(reader, b"majorFont");
}
pub(crate) fn load_minor(reader: &mut XmlReader<impl Read>) -> anyhow::Result<XlsxMajorFont> {
return Self::load_helper(reader, b"minorFont");
}
fn load_helper(reader: &mut XmlReader<impl Read>, tag: &[u8]) -> anyhow::Result<Self> {
let mut font: Self = Self {
cs: None,
ea: None,
font: None,
latin: None,
};
let mut supplemental_fonts: Vec<XlsxSupplementalFont> = vec![];
let mut buf = Vec::new();
loop {
buf.clear();
match reader.read_event_into(&mut buf) {
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"extLst" => {
let _ = reader.read_to_end_into(e.to_end().to_owned().name(), &mut Vec::new());
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"cs" => {
font.cs = Some(XlsxComplexScriptFont::load(e)?);
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"ea" => {
font.ea = Some(XlsxEastAsianFont::load(e)?);
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"font" => {
supplemental_fonts.push(XlsxSupplementalFont::load(e)?);
}
Ok(Event::Start(ref e)) if e.local_name().as_ref() == b"latin" => {
font.latin = Some(XlsxLatinFont::load(e)?);
}
Ok(Event::End(ref e)) if e.local_name().as_ref() == tag => break,
Ok(Event::Eof) => bail!("unexpected end of file."),
Err(e) => bail!(e.to_string()),
_ => (),
}
}
font.font = Some(supplemental_fonts);
Ok(font)
}
}