docx_rs/reader/
table_cell.rs1use std::io::Read;
2use std::str::FromStr;
3
4use super::*;
5
6impl ElementReader for TableCell {
7 fn read<R: Read>(r: &mut EventReader<R>, _: &[OwnedAttribute]) -> Result<Self, ReaderError> {
8 let mut cell = TableCell::new();
9 loop {
10 let e = r.next();
11
12 match e {
13 Ok(XmlEvent::StartElement {
14 attributes, name, ..
15 }) => {
16 let e = XMLElement::from_str(&name.local_name).unwrap();
17 match e {
18 XMLElement::Paragraph => {
19 let p = Paragraph::read(r, &attributes)?;
20 cell = cell.add_paragraph(p);
21 continue;
22 }
23 XMLElement::StructuredDataTag => {
24 if let Ok(tag) = StructuredDataTag::read(r, &attributes) {
25 cell = cell.add_structured_data_tag(tag);
26 }
27 continue;
28 }
29 XMLElement::TableCellProperty => {
30 if let Ok(p) = TableCellProperty::read(r, &attributes) {
31 cell.property = p;
32 }
33 continue;
34 }
35 XMLElement::Table => {
36 if let Ok(table) = Table::read(r, &attributes) {
37 cell = cell.add_table(table)
38 }
39 }
40 _ => {}
41 }
42 }
43 Ok(XmlEvent::EndElement { name, .. }) => {
44 let e = XMLElement::from_str(&name.local_name).unwrap();
45 if e == XMLElement::TableCell {
46 return Ok(cell);
47 }
48 }
49 Err(_) => return Err(ReaderError::XMLReadError),
50 _ => {}
51 }
52 }
53 }
54}
55
56#[cfg(test)]
57mod tests {
58
59 use super::*;
60 use crate::types::*;
61 #[cfg(test)]
62 use pretty_assertions::assert_eq;
63
64 #[test]
65 fn test_read_cell_with_prop() {
66 let c = r#"<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
67<w:tc>
68 <w:tcPr>
69 <w:tcW w:w="6425" w:type="dxa"/>
70 <w:vMerge w:val="restart"/>
71 <w:gridSpan w:val="2"/>
72 <w:tcBorders>
73 <w:top w:val="single" w:sz="2" w:space="0" w:color="000000"/>
74 <w:left w:val="single" w:sz="3" w:space="0" w:color="000000"/>
75 <w:right w:val="single" w:sz="2" w:space="0" w:color="000000"/>
76 <w:bottom w:val="double" w:sz="4" w:space="0" w:color="000000"/>
77 <w:insideH w:val="single" w:sz="5" w:space="0" w:color="FF0000"/>
78 <w:insideV w:val="single" w:sz="2" w:space="0" w:color="000000"/>
79 </w:tcBorders>
80 </w:tcPr>
81 <w:p>
82 <w:r>
83 <w:rPr></w:rPr>
84 </w:r>
85 </w:p>
86</w:tc>
87</w:document>"#;
88 let mut parser = EventReader::new(c.as_bytes());
89 let cell = TableCell::read(&mut parser, &[]).unwrap();
90 assert_eq!(
91 cell,
92 TableCell::new()
93 .add_paragraph(Paragraph::new().add_run(Run::new()))
94 .width(6425, WidthType::Dxa)
95 .grid_span(2)
96 .vertical_merge(VMergeType::Restart)
97 .set_border(TableCellBorder::new(TableCellBorderPosition::Top))
98 .set_border(TableCellBorder::new(TableCellBorderPosition::Left).size(3))
99 .set_border(
100 TableCellBorder::new(TableCellBorderPosition::Bottom)
101 .size(4)
102 .border_type(BorderType::Double)
103 )
104 .set_border(
105 TableCellBorder::new(TableCellBorderPosition::InsideH)
106 .size(5)
107 .color("FF0000".to_owned())
108 )
109 );
110 }
111
112 #[test]
113 fn test_read_no_attr_vmerge() {
114 let c = r#"<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
115<w:tc>
116 <w:tcPr>
117 <w:tcW w:w="6425" w:type="dxa"/>
118 <w:vMerge />
119 </w:tcPr>
120 <w:p>
121 <w:r>
122 <w:rPr></w:rPr>
123 </w:r>
124 </w:p>
125</w:tc>
126</w:document>"#;
127 let mut parser = EventReader::new(c.as_bytes());
128 let cell = TableCell::read(&mut parser, &[]).unwrap();
129 assert_eq!(
130 cell,
131 TableCell::new()
132 .add_paragraph(Paragraph::new().add_run(Run::new()))
133 .width(6425, WidthType::Dxa)
134 .vertical_merge(VMergeType::Continue),
135 );
136 }
137
138 #[test]
139 fn test_read_valign() {
140 let c = r#"<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
141<w:tc>
142 <w:tcPr>
143 <w:tcW w:w="6425" w:type="dxa"/>
144 <w:vAlign w:val="bottom"/>
145 </w:tcPr>
146 <w:p>
147 <w:r>
148 <w:rPr></w:rPr>
149 </w:r>
150 </w:p>
151</w:tc>
152</w:document>"#;
153 let mut parser = EventReader::new(c.as_bytes());
154 let cell = TableCell::read(&mut parser, &[]).unwrap();
155 assert_eq!(
156 cell,
157 TableCell::new()
158 .add_paragraph(Paragraph::new().add_run(Run::new()))
159 .width(6425, WidthType::Dxa)
160 .vertical_align(VAlignType::Bottom),
161 );
162 }
163}