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