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