Skip to main content

docx_rs/reader/
table_cell.rs

1use 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}