docx_reader/reader/
font_group.rs1use std::io::Read;
2use std::str::FromStr;
3use xml::attribute::OwnedAttribute;
4use xml::reader::{EventReader, XmlEvent};
5
6use super::*;
7
8fn read_typeface(attributes: &[OwnedAttribute]) -> Option<String> {
9 for a in attributes {
10 let local_name = &a.name.local_name;
11 if let "typeface" = local_name.as_str() {
12 return Some(a.value.to_string());
13 }
14 }
15 None
16}
17
18fn read_script_and_typeface(attributes: &[OwnedAttribute]) -> Option<(String, String)> {
19 let mut script = None;
20 let mut typeface = None;
21 for a in attributes {
22 let local_name = &a.name.local_name;
23 if let "script" = local_name.as_str() {
24 script = Some(a.value.to_string());
25 }
26 if let "typeface" = local_name.as_str() {
27 typeface = Some(a.value.to_string());
28 }
29 }
30 if let (Some(script), Some(typeface)) = (script, typeface) {
31 return Some((script, typeface));
32 }
33 None
34}
35
36impl ElementReader for FontGroup {
37 fn read<R: Read>(
38 r: &mut EventReader<R>,
39 _attrs: &[OwnedAttribute],
40 ) -> Result<Self, ReaderError> {
41 let mut f = FontGroup::default();
42 loop {
43 let e = r.next();
44 match e {
45 Ok(XmlEvent::StartElement {
46 attributes, name, ..
47 }) => {
48 let e = AXMLElement::from_str(&name.local_name).unwrap();
49 match e {
50 AXMLElement::Latin => {
51 if let Some(t) = read_typeface(&attributes) {
52 f.latin = t;
53 }
54 }
55 AXMLElement::Ea => {
56 if let Some(t) = read_typeface(&attributes) {
57 f.ea = t;
58 }
59 }
60 AXMLElement::Cs => {
61 if let Some(t) = read_typeface(&attributes) {
62 f.cs = t;
63 }
64 }
65 AXMLElement::Font => {
66 if let Some((script, typeface)) = read_script_and_typeface(&attributes)
67 {
68 f.fonts.push(FontSchemeFont { script, typeface })
69 }
70 }
71 _ => {}
72 }
73 }
74 Ok(XmlEvent::EndElement { name, .. }) => {
75 let e = AXMLElement::from_str(&name.local_name).unwrap();
76 match e {
77 AXMLElement::MajorFont | AXMLElement::MinorFont => {
78 return Ok(f);
79 }
80 _ => {}
81 }
82 }
83 Err(_) => return Err(ReaderError::XMLReadError),
84 _ => {}
85 }
86 }
87 }
88}