docx_reader/reader/
table.rs

1use std::io::Read;
2use std::str::FromStr;
3use xml::attribute::OwnedAttribute;
4use xml::reader::{EventReader, XmlEvent};
5
6use crate::types::*;
7
8use super::*;
9
10impl ElementReader for Table {
11	fn read<R: Read>(r: &mut EventReader<R>, _: &[OwnedAttribute]) -> Result<Self, ReaderError> {
12		let mut t = Table::without_borders(vec![]);
13		let mut grid_col: Vec<usize> = vec![];
14		loop {
15			let e = r.next();
16			match e {
17				Ok(XmlEvent::StartElement {
18					attributes, name, ..
19				}) => {
20					let e = XMLElement::from_str(&name.local_name).unwrap();
21
22					ignore::ignore_element(e.clone(), XMLElement::TablePropertyChange, r);
23					ignore::ignore_element(e.clone(), XMLElement::TableGridChange, r);
24
25					match e {
26						XMLElement::TableRow => {
27							t = t.add_row(TableRow::read(r, &attributes)?);
28							continue;
29						}
30						XMLElement::TableWidth => {
31							let (w, width_type) = read_width(&attributes)?;
32							t = t.width(w as usize, width_type);
33							continue;
34						}
35						XMLElement::Justification => {
36							t = t.align(TableAlignmentType::from_str(&attributes[0].value)?);
37						}
38						XMLElement::TableIndent => {
39							let (w, _) = read_width(&attributes)?;
40							t = t.indent(w as i32);
41							continue;
42						}
43						XMLElement::TableBorders => {
44							if let Ok(borders) = TableBorders::read(r, &attributes) {
45								t = t.set_borders(borders);
46							}
47						}
48						XMLElement::TableStyle => {
49							if let Some(s) = read_val(&attributes) {
50								t = t.style(s);
51							}
52						}
53						XMLElement::TableCellMargin => {
54							if let Ok(margins) = TableCellMargins::read(r, &attributes) {
55								t = t.margins(margins)
56							}
57						}
58						XMLElement::GridCol => {
59							let (w, _) = read_width(&attributes)?;
60							grid_col.push(w as usize);
61						}
62						_ => {}
63					}
64				}
65				Ok(XmlEvent::EndElement { name, .. }) => {
66					let e = XMLElement::from_str(&name.local_name).unwrap();
67					if e == XMLElement::Table {
68						t = t.set_grid(grid_col);
69						return Ok(t);
70					}
71				}
72				Err(_) => return Err(ReaderError::XMLReadError),
73				_ => {}
74			}
75		}
76	}
77}