docx_reader/reader/
paragraph.rs1use std::io::Read;
2use std::str::FromStr;
3use xml::attribute::OwnedAttribute;
4use xml::reader::{EventReader, XmlEvent};
5
6use super::*;
7
8impl ElementReader for Paragraph {
9 fn read<R: Read>(
10 r: &mut EventReader<R>,
11 attrs: &[OwnedAttribute],
12 ) -> Result<Self, ReaderError> {
13 let mut p = Paragraph::new();
14 if let Some(para_id) = read(attrs, "paraId") {
15 p = p.id(para_id);
16 }
17 loop {
18 let e = r.next();
19 match e {
20 Ok(XmlEvent::StartElement {
21 attributes, name, ..
22 }) => {
23 let e = XMLElement::from_str(&name.local_name).unwrap();
24
25 match e {
26 XMLElement::Run => {
27 let run = Run::read(r, &attributes)?;
28 p = p.add_run(run);
29 continue;
30 }
31 XMLElement::Hyperlink => {
32 let link = Hyperlink::read(r, &attributes)?;
33 p = p.add_hyperlink(link);
34 continue;
35 }
36 XMLElement::Insert => {
37 let ins = Insert::read(r, &attributes)?;
38 p = p.add_insert(ins);
39 continue;
40 }
41 XMLElement::Delete => {
42 let del = Delete::read(r, &attributes)?;
43 p = p.add_delete(del);
44 continue;
45 }
46 XMLElement::ParagraphProperty => {
47 if let Ok(pr) = ParagraphProperty::read(r, &attributes) {
48 p.has_numbering = pr.numbering_property.is_some();
49 p.property = pr;
50 }
51 continue;
52 }
53 _ => {}
54 }
55 }
56 Ok(XmlEvent::EndElement { name, .. }) => {
57 let e = XMLElement::from_str(&name.local_name).unwrap();
58 if e == XMLElement::Paragraph {
59 return Ok(p);
60 }
61 }
62 Err(_) => return Err(ReaderError::XMLReadError),
63 _ => {}
64 }
65 }
66 }
67}