docx_reader/reader/
paragraph.rs

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