docx_reader/reader/
table.rs1use 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}