docx_reader/reader/
table_row.rs

1use std::io::Read;
2use std::str::FromStr;
3use xml::attribute::OwnedAttribute;
4use xml::reader::{EventReader, XmlEvent};
5
6use crate::HeightRule;
7
8use super::*;
9
10impl ElementReader for TableRow {
11	fn read<R: Read>(r: &mut EventReader<R>, _: &[OwnedAttribute]) -> Result<Self, ReaderError> {
12		let mut cells = vec![];
13		let mut grid_after = None;
14		let mut width_after = None;
15		let mut grid_before = None;
16		let mut width_before = None;
17		let mut row_height = None;
18		let mut del = None;
19		let mut ins = None;
20		let mut height_rule = None;
21		loop {
22			let e = r.next();
23			match e {
24				Ok(XmlEvent::StartElement {
25					attributes, name, ..
26				}) => {
27					let e = XMLElement::from_str(&name.local_name).unwrap();
28
29					ignore::ignore_element(e.clone(), XMLElement::TableRowPropertyChange, r);
30
31					match e {
32						XMLElement::TableCell => {
33							cells.push(TableCell::read(r, &attributes)?);
34							continue;
35						}
36						XMLElement::GridAfter => {
37							if let Some(v) = read_val(&attributes) {
38								grid_after = Some(u32::from_str(&v)?);
39							}
40						}
41						XMLElement::WidthAfter => {
42							if let Ok(v) = read_width(&attributes) {
43								width_after = Some(v.0 as f32);
44							}
45						}
46						XMLElement::GridBefore => {
47							if let Some(v) = read_val(&attributes) {
48								grid_before = Some(u32::from_str(&v)?);
49							}
50						}
51						XMLElement::WidthBefore => {
52							if let Ok(v) = read_width(&attributes) {
53								width_before = Some(v.0 as f32);
54							}
55						}
56						XMLElement::TableRowHeight => {
57							if let Some(v) = read_val(&attributes) {
58								let h = f32::from_str(&v);
59								if let Ok(h) = h {
60									row_height = Some(h);
61								}
62							}
63
64							if let Some(v) = read(&attributes, "hRule") {
65								let h = HeightRule::from_str(&v);
66								if let Ok(h) = h {
67									height_rule = Some(h);
68								}
69							}
70						}
71						XMLElement::Delete => {
72							if let Ok(d) = Delete::read(r, &attributes) {
73								del = Some(d);
74							}
75						}
76						XMLElement::Insert => {
77							if let Ok(i) = Insert::read(r, &attributes) {
78								ins = Some(i);
79							}
80						}
81						_ => {}
82					}
83				}
84				Ok(XmlEvent::EndElement { name, .. }) => {
85					let e = XMLElement::from_str(&name.local_name).unwrap();
86					if e == XMLElement::TableRow {
87						let mut row = TableRow::new(cells);
88						if let Some(grid_after) = grid_after {
89							row = row.grid_after(grid_after);
90						}
91
92						if let Some(grid_before) = grid_before {
93							row = row.grid_before(grid_before);
94						}
95
96						if let Some(row_height) = row_height {
97							row = row.row_height(row_height);
98						}
99
100						if let Some(width_after) = width_after {
101							row = row.width_after(width_after);
102						}
103
104						if let Some(width_before) = width_before {
105							row = row.width_before(width_before);
106						}
107
108						if let Some(height_rule) = height_rule {
109							row = row.height_rule(height_rule);
110						}
111
112						if let Some(del) = del {
113							row = row.delete(del);
114						}
115
116						if let Some(ins) = ins {
117							row = row.insert(ins);
118						}
119
120						return Ok(row);
121					}
122				}
123				Err(_) => return Err(ReaderError::XMLReadError),
124				_ => {}
125			}
126		}
127	}
128}