2020-10-09 14:30:55 +03:00
|
|
|
use std::io::Read;
|
|
|
|
use std::str::FromStr;
|
|
|
|
|
|
|
|
use xml::attribute::OwnedAttribute;
|
|
|
|
use xml::reader::{EventReader, XmlEvent};
|
|
|
|
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
fn read_page_size(attributes: &[OwnedAttribute]) -> Result<PageSize, ReaderError> {
|
|
|
|
let mut size = PageSize::new();
|
|
|
|
for a in attributes {
|
|
|
|
let local_name = &a.name.local_name;
|
|
|
|
match local_name.as_str() {
|
|
|
|
"w" => {
|
2020-10-26 04:23:16 +02:00
|
|
|
size = size.width(value_to_dax(&a.value)? as u32);
|
2020-10-09 14:30:55 +03:00
|
|
|
}
|
|
|
|
"h" => {
|
2020-10-26 04:23:16 +02:00
|
|
|
size = size.height(value_to_dax(&a.value)? as u32);
|
2020-10-09 14:30:55 +03:00
|
|
|
}
|
|
|
|
_ => {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Ok(size)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn read_page_margin(
|
|
|
|
attributes: &[OwnedAttribute],
|
|
|
|
) -> Result<crate::types::PageMargin, ReaderError> {
|
|
|
|
let mut margin = crate::types::PageMargin::new();
|
|
|
|
for a in attributes {
|
|
|
|
let local_name = &a.name.local_name;
|
|
|
|
match local_name.as_str() {
|
|
|
|
"top" => {
|
2020-10-26 04:23:16 +02:00
|
|
|
margin = margin.top(value_to_dax(&a.value)? as u32);
|
2020-10-09 14:30:55 +03:00
|
|
|
}
|
|
|
|
"right" => {
|
2020-10-26 04:23:16 +02:00
|
|
|
margin = margin.right(value_to_dax(&a.value)? as u32);
|
2020-10-09 14:30:55 +03:00
|
|
|
}
|
|
|
|
"bottom" => {
|
2020-10-26 04:23:16 +02:00
|
|
|
margin = margin.bottom(value_to_dax(&a.value)? as u32);
|
2020-10-09 14:30:55 +03:00
|
|
|
}
|
|
|
|
"left" => {
|
2020-10-26 04:23:16 +02:00
|
|
|
margin = margin.left(value_to_dax(&a.value)? as u32);
|
2020-10-09 14:30:55 +03:00
|
|
|
}
|
|
|
|
"header" => {
|
2020-10-26 04:23:16 +02:00
|
|
|
margin = margin.header(value_to_dax(&a.value)? as u32);
|
2020-10-09 14:30:55 +03:00
|
|
|
}
|
|
|
|
"footer" => {
|
2020-10-26 04:23:16 +02:00
|
|
|
margin = margin.footer(value_to_dax(&a.value)? as u32);
|
2020-10-09 14:30:55 +03:00
|
|
|
}
|
|
|
|
"gutter" => {
|
2020-10-26 04:23:16 +02:00
|
|
|
margin = margin.gutter(value_to_dax(&a.value)? as u32);
|
2020-10-09 14:30:55 +03:00
|
|
|
}
|
|
|
|
_ => {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Ok(margin)
|
|
|
|
}
|
|
|
|
|
|
|
|
impl ElementReader for SectionProperty {
|
|
|
|
fn read<R: Read>(
|
|
|
|
r: &mut EventReader<R>,
|
|
|
|
_attrs: &[OwnedAttribute],
|
|
|
|
) -> Result<Self, ReaderError> {
|
|
|
|
let mut sp = SectionProperty::new();
|
|
|
|
loop {
|
|
|
|
let e = r.next();
|
|
|
|
match e {
|
|
|
|
Ok(XmlEvent::StartElement {
|
|
|
|
attributes, name, ..
|
|
|
|
}) => {
|
|
|
|
let e = XMLElement::from_str(&name.local_name).unwrap();
|
|
|
|
match e {
|
|
|
|
XMLElement::PageMargin => {
|
|
|
|
let margin = read_page_margin(&attributes)?;
|
|
|
|
sp = sp.page_margin(margin);
|
|
|
|
}
|
|
|
|
XMLElement::PageSize => {
|
|
|
|
let size = read_page_size(&attributes)?;
|
|
|
|
sp = sp.page_size(size);
|
|
|
|
}
|
2021-03-19 18:38:22 +02:00
|
|
|
XMLElement::DocGrid => {
|
|
|
|
if let Ok(doc_grid) = DocGrid::read(r, &attributes) {
|
|
|
|
sp = sp.doc_grid(doc_grid);
|
|
|
|
}
|
|
|
|
}
|
2020-10-09 14:30:55 +03:00
|
|
|
_ => {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Ok(XmlEvent::EndElement { name, .. }) => {
|
|
|
|
let e = XMLElement::from_str(&name.local_name).unwrap();
|
|
|
|
if e == XMLElement::SectionProperty {
|
|
|
|
return Ok(sp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Err(_) => return Err(ReaderError::XMLReadError),
|
|
|
|
_ => {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|