docx_reader/reader/
table.rsuse std::io::Read;
use std::str::FromStr;
use xml::attribute::OwnedAttribute;
use xml::reader::{EventReader, XmlEvent};
use crate::types::*;
use super::*;
impl ElementReader for Table {
fn read<R: Read>(r: &mut EventReader<R>, _: &[OwnedAttribute]) -> Result<Self, ReaderError> {
let mut t = Table::without_borders(vec![]);
let mut grid_col: Vec<usize> = vec![];
loop {
let e = r.next();
match e {
Ok(XmlEvent::StartElement {
attributes, name, ..
}) => {
let e = XMLElement::from_str(&name.local_name).unwrap();
ignore::ignore_element(e.clone(), XMLElement::TablePropertyChange, r);
ignore::ignore_element(e.clone(), XMLElement::TableGridChange, r);
match e {
XMLElement::TableRow => {
t = t.add_row(TableRow::read(r, &attributes)?);
continue;
}
XMLElement::TableWidth => {
let (w, width_type) = read_width(&attributes)?;
t = t.width(w as usize, width_type);
continue;
}
XMLElement::Justification => {
t = t.align(TableAlignmentType::from_str(&attributes[0].value)?);
}
XMLElement::TableIndent => {
let (w, _) = read_width(&attributes)?;
t = t.indent(w as i32);
continue;
}
XMLElement::TableBorders => {
if let Ok(borders) = TableBorders::read(r, &attributes) {
t = t.set_borders(borders);
}
}
XMLElement::TableStyle => {
if let Some(s) = read_val(&attributes) {
t = t.style(s);
}
}
XMLElement::TableCellMargin => {
if let Ok(margins) = TableCellMargins::read(r, &attributes) {
t = t.margins(margins)
}
}
XMLElement::GridCol => {
let (w, _) = read_width(&attributes)?;
grid_col.push(w as usize);
}
_ => {}
}
}
Ok(XmlEvent::EndElement { name, .. }) => {
let e = XMLElement::from_str(&name.local_name).unwrap();
if e == XMLElement::Table {
t = t.set_grid(grid_col);
return Ok(t);
}
}
Err(_) => return Err(ReaderError::XMLReadError),
_ => {}
}
}
}
}