docx_reader/reader/
numberings.rs1use 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}