1use std::io::Read;
2use std::str::FromStr;
3use xml::attribute::OwnedAttribute;
4use xml::reader::EventReader;
5
6use crate::reader::ReaderError;
7
8#[derive(PartialEq, Debug, Clone)]
9pub enum XMLElement {
10 Body,
11 Paragraph,
12 ParagraphProperty,
13 Run,
14 RunProperty,
15 Color,
16 Underline,
17 RunFonts,
18 Size,
19 SizeCs,
20 Spacing,
21 Vanish,
22 SpecVanish,
23 TextBorder,
24 Italic,
25 ItalicCs,
26 Text,
27 FieldChar,
28 InstrText,
29 Hyperlink,
30 Highlight,
31 VertAlign,
32 Bold,
33 Caps,
34 RunStyle,
35 BoldCs,
36 Break,
37 Tab,
38 Tabs,
39 Sym,
40 ParagraphStyle,
41 ParagraphPropertyChange,
42 RunPropertyChange,
43 Indent,
44 Name,
45 BasedOn,
46 Link,
47 Alignment,
48 NumberingProperty,
49 IndentLevel,
50 NumberingId,
51 Justification,
52 OutlineLvl,
53 Insert,
54 KeepNext,
55 KeepLines,
56 PageBreakBefore,
57 WidowControl,
58 DivId,
59 Div,
60 DivsChild,
61 MarginLeft,
62 MarginRight,
63 MarginTop,
64 MarginBottom,
65 Delete,
66 DeleteText,
67 Property,
68 CommentsExtended,
69 VAlign,
70 Shading,
71 Strike,
72 TextDirection,
73 Table,
74 TableProperty,
75 TableRow,
76 TableRowHeight,
77 HeightRule,
78 TableCell,
79 TableCellProperty,
80 TableCellWidth,
81 TableCellBorders,
82 TableVMerge,
83 TableGridSpan,
84 TableWidth,
85 TableIndent,
86 TableBorders,
87 TableCellMargin,
88 TableStyle,
89 TableGridChange,
91 TablePropertyChange,
92 TableRowPropertyChange,
93 TableCellPropertyChange,
94 Top,
95 Right,
96 End,
97 Left,
98 Start,
99 Bottom,
100 InsideH,
101 InsideV,
102 Tl2br,
103 Tr2bl,
104 TableGrid,
105 GridCol,
106 GridAfter,
107 WidthAfter,
108 GridBefore,
109 WidthBefore,
110 Style,
111 Next,
112 Styles,
113 Relationship,
114 Relationships,
115 AbstractNumbering,
116 AbstractNumberingId,
117 LvlOverride,
118 StartOverride,
119 Level,
120 Numbering,
121 Settings,
122 Num,
123 NumberFormat,
124 Suffix,
125 IsLgl,
126 LevelText,
127 LevelJustification,
128 LevelRestart,
129 StyleLink,
130 NumStyleLink,
131 Drawing,
132 TxbxContent,
133 Pict,
134 DocId,
135 DocVars,
136 DocVar,
137 DocGrid,
138 DocDefaults,
139 DefaultTabStop,
140 RunPropertyDefault,
141 AdjustLineHeightInTable,
142 CharacterSpacingControl,
143 SectionProperty,
144 PageSize,
145 PageMargin,
146 WebSettings,
147 HeaderReference,
148 FooterReference,
149 TitlePg,
150 EvenAndOddHeaders,
151 StructuredDataTag,
152 Type,
153 Unsupported,
154}
155
156#[derive(PartialEq, Debug)]
157pub enum McXMLElement {
158 AlternateContent,
159 Choice,
160 Fallback,
161 Unsupported,
162}
163
164#[derive(PartialEq, Debug)]
165pub enum WpXMLElement {
166 Inline,
167 Anchor,
168 SimplePos,
169 PositionH,
170 PosOffset,
171 PositionV,
172 Extent,
173 EffectExtent,
174 WrapNone,
175 DocProperty,
176 Unsupported,
177}
178
179#[derive(PartialEq, Debug)]
180pub enum AXMLElement {
181 Graphic,
182 GraphicData,
183 Xfrm,
184 Blip,
185 Off,
186 Ext,
187 PrstGeom,
188 SolidFill,
189 Ln,
190 FontScheme,
191 MajorFont,
192 MinorFont,
193 Latin,
194 Ea,
195 Cs,
196 Font,
197 Unsupported,
198}
199
200#[derive(PartialEq, Debug)]
201pub enum WpsXMLElement {
202 Wsp,
203 CNvSpProperty,
204 SpProperty,
205 Style,
206 Txbx,
207 BodyPr,
208 Unsupported,
209}
210
211#[derive(PartialEq, Debug)]
212pub enum VXMLElement {
213 Rect,
214 Stroke,
215 Fill,
216 TextBox,
217 Shape,
218 ImageData,
219 Unsupported,
220}
221
222pub enum VtXMLElement {
223 Lpwstr,
224 Unsupported,
225}
226
227#[derive(PartialEq, Debug)]
228pub enum PicXMLElement {
229 Pic,
230 Unsupported,
231}
232
233impl FromStr for XMLElement {
234 type Err = ();
235 fn from_str(s: &str) -> Result<Self, Self::Err> {
236 match s {
237 "body" => Ok(XMLElement::Body),
238 "p" => Ok(XMLElement::Paragraph),
239 "pPr" => Ok(XMLElement::ParagraphProperty),
240 "r" => Ok(XMLElement::Run),
241 "rPr" => Ok(XMLElement::RunProperty),
242 "rPrChange" => Ok(XMLElement::RunPropertyChange),
243 "color" => Ok(XMLElement::Color),
244 "t" => Ok(XMLElement::Text),
245 "fldChar" => Ok(XMLElement::FieldChar),
246 "instrText" => Ok(XMLElement::InstrText),
247 "hyperlink" => Ok(XMLElement::Hyperlink),
248 "sz" => Ok(XMLElement::Size),
249 "szCs" => Ok(XMLElement::SizeCs),
250 "u" => Ok(XMLElement::Underline),
251 "pStyle" => Ok(XMLElement::ParagraphStyle),
252 "pPrChange" => Ok(XMLElement::ParagraphPropertyChange),
253 "highlight" => Ok(XMLElement::Highlight),
254 "rStyle" => Ok(XMLElement::RunStyle),
255 "b" => Ok(XMLElement::Bold),
256 "bCs" => Ok(XMLElement::BoldCs),
257 "caps" => Ok(XMLElement::Caps),
258 "i" => Ok(XMLElement::Italic),
259 "iCs" => Ok(XMLElement::ItalicCs),
260 "vanish" => Ok(XMLElement::Vanish),
261 "specVanish" => Ok(XMLElement::SpecVanish),
262 "italic" => Ok(XMLElement::Italic),
263 "name" => Ok(XMLElement::Name),
264 "tab" => Ok(XMLElement::Tab),
265 "tabs" => Ok(XMLElement::Tabs),
266 "br" => Ok(XMLElement::Break),
267 "ind" => Ok(XMLElement::Indent),
268 "numPr" => Ok(XMLElement::NumberingProperty),
269 "ilvl" => Ok(XMLElement::IndentLevel),
270 "numId" => Ok(XMLElement::NumberingId),
271 "jc" => Ok(XMLElement::Justification),
272 "ins" => Ok(XMLElement::Insert),
273 "del" => Ok(XMLElement::Delete),
274 "delText" => Ok(XMLElement::DeleteText),
275 "shd" => Ok(XMLElement::Shading),
276 "property" => Ok(XMLElement::Property),
277 "tbl" => Ok(XMLElement::Table),
278 "tblPr" => Ok(XMLElement::TableProperty),
279 "tr" => Ok(XMLElement::TableRow),
280 "trHeight" => Ok(XMLElement::TableRowHeight),
281 "hRule" => Ok(XMLElement::HeightRule),
282 "tc" => Ok(XMLElement::TableCell),
283 "tcPr" => Ok(XMLElement::TableCellProperty),
284 "tcW" => Ok(XMLElement::TableCellWidth),
285 "tcBorders" => Ok(XMLElement::TableCellBorders),
286 "vMerge" => Ok(XMLElement::TableVMerge),
287 "gridSpan" => Ok(XMLElement::TableGridSpan),
288 "gridAfter" => Ok(XMLElement::GridAfter),
289 "wAfter" => Ok(XMLElement::WidthAfter),
290 "gridBefore" => Ok(XMLElement::GridBefore),
291 "wBefore" => Ok(XMLElement::WidthBefore),
292 "textDirection" => Ok(XMLElement::TextDirection),
293 "tblW" => Ok(XMLElement::TableWidth),
294 "tblInd" => Ok(XMLElement::TableIndent),
295 "tblBorders" => Ok(XMLElement::TableBorders),
296 "tblCellMar" => Ok(XMLElement::TableCellMargin),
297 "tblStyle" => Ok(XMLElement::TableStyle),
298 "top" => Ok(XMLElement::Top),
299 "right" => Ok(XMLElement::Right),
300 "start" => Ok(XMLElement::Start),
301 "end" => Ok(XMLElement::End),
302 "left" => Ok(XMLElement::Left),
303 "bottom" => Ok(XMLElement::Bottom),
304 "insideH" => Ok(XMLElement::InsideH),
305 "insideV" => Ok(XMLElement::InsideV),
306 "tl2br" => Ok(XMLElement::Tl2br),
307 "tr2bl" => Ok(XMLElement::Tr2bl),
308 "tblGrid" => Ok(XMLElement::TableGrid),
309 "tblPrChange" => Ok(XMLElement::TablePropertyChange),
310 "trPrChange" => Ok(XMLElement::TableRowPropertyChange),
311 "tcPrChange" => Ok(XMLElement::TableCellPropertyChange),
312 "tblGridChange" => Ok(XMLElement::TableGridChange),
313 "gridCol" => Ok(XMLElement::GridCol),
314 "style" => Ok(XMLElement::Style),
315 "basedOn" => Ok(XMLElement::BasedOn),
316 "link" => Ok(XMLElement::Link),
317 "bdr" => Ok(XMLElement::TextBorder),
318 "next" => Ok(XMLElement::Next),
319 "vertAlign" => Ok(XMLElement::VertAlign),
320 "spacing" => Ok(XMLElement::Spacing),
321 "styles" => Ok(XMLElement::Styles),
322 "Relationships" => Ok(XMLElement::Relationships),
323 "Relationship" => Ok(XMLElement::Relationship),
324 "abstractNum" => Ok(XMLElement::AbstractNumbering),
325 "abstractNumId" => Ok(XMLElement::AbstractNumberingId),
326 "lvl" => Ok(XMLElement::Level),
327 "numbering" => Ok(XMLElement::Numbering),
328 "settings" => Ok(XMLElement::Settings),
329 "num" => Ok(XMLElement::Num),
330 "numFmt" => Ok(XMLElement::NumberFormat),
331 "suff" => Ok(XMLElement::Suffix),
332 "isLgl" => Ok(XMLElement::IsLgl),
333 "lvlText" => Ok(XMLElement::LevelText),
334 "lvlRestart" => Ok(XMLElement::LevelRestart),
335 "lvlJc" => Ok(XMLElement::LevelJustification),
336 "outlineLvl" => Ok(XMLElement::OutlineLvl),
337 "numStyleLink" => Ok(XMLElement::NumStyleLink),
338 "styleLink" => Ok(XMLElement::StyleLink),
339 "vAlign" => Ok(XMLElement::VAlign),
340 "drawing" => Ok(XMLElement::Drawing),
341 "txbxContent" => Ok(XMLElement::TxbxContent),
342 "pict" => Ok(XMLElement::Pict),
343 "lvlOverride" => Ok(XMLElement::LvlOverride),
344 "startOverride" => Ok(XMLElement::StartOverride),
345 "strike" => Ok(XMLElement::Strike),
346 "docId" => Ok(XMLElement::DocId),
347 "docVar" => Ok(XMLElement::DocVar),
348 "docVars" => Ok(XMLElement::DocVars),
349 "sectPr" => Ok(XMLElement::SectionProperty),
350 "pgSz" => Ok(XMLElement::PageSize),
351 "rFonts" => Ok(XMLElement::RunFonts),
352 "pgMar" => Ok(XMLElement::PageMargin),
353 "docDefaults" => Ok(XMLElement::DocDefaults),
354 "docGrid" => Ok(XMLElement::DocGrid),
355 "rPrDefault" => Ok(XMLElement::RunPropertyDefault),
356 "adjustLineHeightInTable" => Ok(XMLElement::AdjustLineHeightInTable),
357 "characterSpacingControl" => Ok(XMLElement::CharacterSpacingControl),
358 "defaultTabStop" => Ok(XMLElement::DefaultTabStop),
359 "divId" => Ok(XMLElement::DivId),
360 "div" => Ok(XMLElement::Div),
361 "divsChild" => Ok(XMLElement::DivsChild),
362 "marLeft" => Ok(XMLElement::MarginLeft),
363 "marRight" => Ok(XMLElement::MarginRight),
364 "marTop" => Ok(XMLElement::MarginTop),
365 "marBottom" => Ok(XMLElement::MarginBottom),
366 "sym" => Ok(XMLElement::Sym),
367 "webSettings" => Ok(XMLElement::WebSettings),
368 "keepNext" => Ok(XMLElement::KeepNext),
369 "keepLines" => Ok(XMLElement::KeepLines),
370 "pageBreakBefore" => Ok(XMLElement::PageBreakBefore),
371 "widowControl" => Ok(XMLElement::WidowControl),
372 "headerReference" => Ok(XMLElement::HeaderReference),
373 "footerReference" => Ok(XMLElement::FooterReference),
374 "titlePg" => Ok(XMLElement::TitlePg),
375 "evenAndOddHeaders" => Ok(XMLElement::EvenAndOddHeaders),
376 "sdt" => Ok(XMLElement::StructuredDataTag),
377 "type" => Ok(XMLElement::Type),
378 _ => Ok(XMLElement::Unsupported),
379 }
380 }
381}
382
383impl FromStr for McXMLElement {
384 type Err = ();
385 fn from_str(s: &str) -> Result<Self, Self::Err> {
386 match s {
387 "AlternateContent" => Ok(McXMLElement::AlternateContent),
388 "Choice" => Ok(McXMLElement::Choice),
389 "Fallback" => Ok(McXMLElement::Fallback),
390 _ => Ok(McXMLElement::Unsupported),
391 }
392 }
393}
394
395impl FromStr for WpXMLElement {
396 type Err = ();
397 fn from_str(s: &str) -> Result<Self, Self::Err> {
398 match s {
399 "anchor" => Ok(WpXMLElement::Anchor),
400 "inline" => Ok(WpXMLElement::Inline),
401 "simplePos" => Ok(WpXMLElement::SimplePos),
402 "positionH" => Ok(WpXMLElement::PositionH),
403 "posOffset" => Ok(WpXMLElement::PosOffset),
404 "positionV" => Ok(WpXMLElement::PositionV),
405 "extent" => Ok(WpXMLElement::Extent),
406 "effectExtent" => Ok(WpXMLElement::EffectExtent),
407 "wrapNone" => Ok(WpXMLElement::WrapNone),
408 "docPr" => Ok(WpXMLElement::DocProperty),
409 _ => Ok(WpXMLElement::Unsupported),
410 }
411 }
412}
413
414impl FromStr for AXMLElement {
415 type Err = ();
416 fn from_str(s: &str) -> Result<Self, Self::Err> {
417 match s {
418 "graphic" => Ok(AXMLElement::Graphic),
419 "graphicData" => Ok(AXMLElement::GraphicData),
420 "xfrm" => Ok(AXMLElement::Xfrm),
421 "blip" => Ok(AXMLElement::Blip),
422 "off" => Ok(AXMLElement::Off),
423 "ext" => Ok(AXMLElement::Ext),
424 "prstGeom" => Ok(AXMLElement::PrstGeom),
425 "solidFill" => Ok(AXMLElement::SolidFill),
426 "ln" => Ok(AXMLElement::Ln),
427 "fontScheme" => Ok(AXMLElement::FontScheme),
428 "majorFont" => Ok(AXMLElement::MajorFont),
429 "minorFont" => Ok(AXMLElement::MinorFont),
430 "latin" => Ok(AXMLElement::Latin),
431 "ea" => Ok(AXMLElement::Ea),
432 "cs" => Ok(AXMLElement::Cs),
433 "font" => Ok(AXMLElement::Font),
434 _ => Ok(AXMLElement::Unsupported),
435 }
436 }
437}
438
439impl FromStr for WpsXMLElement {
440 type Err = ();
441 fn from_str(s: &str) -> Result<Self, Self::Err> {
442 match s {
443 "wsp" => Ok(WpsXMLElement::Wsp),
444 "cNvSpPr" => Ok(WpsXMLElement::CNvSpProperty),
445 "spPr" => Ok(WpsXMLElement::SpProperty),
446 "style" => Ok(WpsXMLElement::Style),
447 "txbx" => Ok(WpsXMLElement::Txbx),
448 "bodyPr" => Ok(WpsXMLElement::BodyPr),
449 _ => Ok(WpsXMLElement::Unsupported),
450 }
451 }
452}
453
454impl FromStr for VXMLElement {
455 type Err = ();
456 fn from_str(s: &str) -> Result<Self, Self::Err> {
457 match s {
458 "rect" => Ok(VXMLElement::Rect),
459 "stroke" => Ok(VXMLElement::Stroke),
460 "fill" => Ok(VXMLElement::Fill),
461 "textbox" => Ok(VXMLElement::TextBox),
462 "shape" => Ok(VXMLElement::Shape),
463 "imagedata" => Ok(VXMLElement::ImageData),
464 _ => Ok(VXMLElement::Unsupported),
465 }
466 }
467}
468
469impl FromStr for VtXMLElement {
470 type Err = ();
471 fn from_str(s: &str) -> Result<Self, Self::Err> {
472 match s {
473 "lpwstr" => Ok(VtXMLElement::Lpwstr),
474 _ => Ok(VtXMLElement::Unsupported),
475 }
476 }
477}
478
479impl FromStr for PicXMLElement {
480 type Err = ();
481 fn from_str(s: &str) -> Result<Self, Self::Err> {
482 match s {
483 "pic" => Ok(PicXMLElement::Pic),
484 _ => Ok(PicXMLElement::Unsupported),
485 }
486 }
487}
488
489pub trait ElementReader {
490 fn read<R: Read>(r: &mut EventReader<R>, attrs: &[OwnedAttribute]) -> Result<Self, ReaderError>
491 where
492 Self: std::marker::Sized;
493}