docx_reader/reader/
numberings.rs

1use std::io::Read;
2use std::str::FromStr;
3use xml::reader::{EventReader, XmlEvent};
4
5use crate::reader::{FromXML, ReaderError};
6
7use super::*;
8
9impl FromXML for Numberings {
10	fn from_xml<R: Read>(reader: R) -> Result<Self, ReaderError> {
11		let mut parser = EventReader::new(reader);
12		let mut nums = Self::default();
13		loop {
14			let e = parser.next();
15			match e {
16				Ok(XmlEvent::StartElement {
17					attributes, name, ..
18				}) => {
19					let e = XMLElement::from_str(&name.local_name).unwrap();
20					match e {
21						XMLElement::AbstractNumbering => {
22							let mut id = 0;
23							for a in attributes {
24								let local_name = &a.name.local_name;
25								if local_name == "abstractNumId" {
26									id = usize::from_str(&a.value)?;
27								}
28							}
29							let mut abs_num = AbstractNumbering::new(id);
30							loop {
31								let e = parser.next();
32								match e {
33									Ok(XmlEvent::StartElement {
34										attributes, name, ..
35									}) => {
36										let e = XMLElement::from_str(&name.local_name).unwrap();
37										match e {
38											XMLElement::Level => {
39												let l = Level::read(&mut parser, &attributes)?;
40												abs_num = abs_num.add_level(l);
41											}
42											XMLElement::StyleLink => {
43												abs_num = abs_num.style_link(&attributes[0].value)
44											}
45											XMLElement::NumStyleLink => {
46												abs_num =
47													abs_num.num_style_link(&attributes[0].value)
48											}
49											_ => {}
50										}
51									}
52									Ok(XmlEvent::EndElement { name, .. }) => {
53										let e = XMLElement::from_str(&name.local_name).unwrap();
54										if let XMLElement::AbstractNumbering = e {
55											nums = nums.add_abstract_numbering(abs_num);
56											break;
57										}
58									}
59									_ => {}
60								}
61							}
62							continue;
63						}
64						XMLElement::Num => {
65							let mut id = 0;
66							for a in attributes {
67								let local_name = &a.name.local_name;
68								if local_name == "numId" {
69									id = usize::from_str(&a.value)?;
70								}
71							}
72							let mut abs_num_id = 0;
73							let mut level_overrides = vec![];
74
75							loop {
76								let e = parser.next();
77								match e {
78									Ok(XmlEvent::StartElement {
79										attributes, name, ..
80									}) => {
81										let e = XMLElement::from_str(&name.local_name).unwrap();
82										match e {
83											XMLElement::AbstractNumberingId => {
84												abs_num_id = usize::from_str(&attributes[0].value)?
85											}
86											XMLElement::LvlOverride => {
87												if let Ok(o) =
88													LevelOverride::read(&mut parser, &attributes)
89												{
90													level_overrides.push(o);
91												}
92											}
93											_ => {}
94										}
95									}
96									Ok(XmlEvent::EndElement { name, .. }) => {
97										let e = XMLElement::from_str(&name.local_name).unwrap();
98										if let XMLElement::Num = e {
99											let num = Numbering::new(id, abs_num_id);
100											nums =
101												nums.add_numbering(num.overrides(level_overrides));
102											break;
103										}
104									}
105									_ => {}
106								}
107							}
108							continue;
109						}
110						_ => {}
111					}
112				}
113				Ok(XmlEvent::EndElement { name, .. }) => {
114					let e = XMLElement::from_str(&name.local_name).unwrap();
115					if let XMLElement::Numbering = e {
116						break;
117					}
118				}
119				Ok(XmlEvent::EndDocument { .. }) => break,
120				Err(_) => return Err(ReaderError::XMLReadError),
121				_ => {}
122			}
123		}
124		Ok(nums)
125	}
126}