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 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 "fitText" => Ok(XMLElement::FitText),
361 "styles" => Ok(XMLElement::Styles),
362 "Relationships" => Ok(XMLElement::Relationships),
363 "Relationship" => Ok(XMLElement::Relationship),
364 "abstractNum" => Ok(XMLElement::AbstractNumbering),
365 "abstractNumId" => Ok(XMLElement::AbstractNumberingId),
366 "lvl" => Ok(XMLElement::Level),
367 "numbering" => Ok(XMLElement::Numbering),
368 "settings" => Ok(XMLElement::Settings),
369 "num" => Ok(XMLElement::Num),
370 "numFmt" => Ok(XMLElement::NumberFormat),
371 "suff" => Ok(XMLElement::Suffix),
372 "isLgl" => Ok(XMLElement::IsLgl),
373 "lvlText" => Ok(XMLElement::LevelText),
374 "lvlRestart" => Ok(XMLElement::LevelRestart),
375 "lvlJc" => Ok(XMLElement::LevelJustification),
376 "outlineLvl" => Ok(XMLElement::OutlineLvl),
377 "numStyleLink" => Ok(XMLElement::NumStyleLink),
378 "styleLink" => Ok(XMLElement::StyleLink),
379 "vAlign" => Ok(XMLElement::VAlign),
380 "drawing" => Ok(XMLElement::Drawing),
381 "txbxContent" => Ok(XMLElement::TxbxContent),
382 "pict" => Ok(XMLElement::Pict),
383 "lvlOverride" => Ok(XMLElement::LvlOverride),
384 "startOverride" => Ok(XMLElement::StartOverride),
385 "strike" => Ok(XMLElement::Strike),
386 "dstrike" => Ok(XMLElement::Dstrike),
387 "docId" => Ok(XMLElement::DocId),
388 "docVar" => Ok(XMLElement::DocVar),
389 "docVars" => Ok(XMLElement::DocVars),
390 "sectPr" => Ok(XMLElement::SectionProperty),
391 "pgSz" => Ok(XMLElement::PageSize),
392 "rFonts" => Ok(XMLElement::RunFonts),
393 "pgMar" => Ok(XMLElement::PageMargin),
394 "docDefaults" => Ok(XMLElement::DocDefaults),
395 "docGrid" => Ok(XMLElement::DocGrid),
396 "rPrDefault" => Ok(XMLElement::RunPropertyDefault),
397 "adjustLineHeightInTable" => Ok(XMLElement::AdjustLineHeightInTable),
398 "characterSpacingControl" => Ok(XMLElement::CharacterSpacingControl),
399 "defaultTabStop" => Ok(XMLElement::DefaultTabStop),
400 "divId" => Ok(XMLElement::DivId),
401 "div" => Ok(XMLElement::Div),
402 "divsChild" => Ok(XMLElement::DivsChild),
403 "marLeft" => Ok(XMLElement::MarginLeft),
404 "marRight" => Ok(XMLElement::MarginRight),
405 "marTop" => Ok(XMLElement::MarginTop),
406 "marBottom" => Ok(XMLElement::MarginBottom),
407 "sym" => Ok(XMLElement::Sym),
408 "webSettings" => Ok(XMLElement::WebSettings),
409 "snapToGrid" => Ok(XMLElement::SnapToGrid),
410 "keepNext" => Ok(XMLElement::KeepNext),
411 "keepLines" => Ok(XMLElement::KeepLines),
412 "pageBreakBefore" => Ok(XMLElement::PageBreakBefore),
413 "widowControl" => Ok(XMLElement::WidowControl),
414 "headerReference" => Ok(XMLElement::HeaderReference),
415 "footerReference" => Ok(XMLElement::FooterReference),
416 "titlePg" => Ok(XMLElement::TitlePg),
417 "evenAndOddHeaders" => Ok(XMLElement::EvenAndOddHeaders),
418 "sdt" => Ok(XMLElement::StructuredDataTag),
419 "pgNumType" => Ok(XMLElement::PageNumType),
420 "framePr" => Ok(XMLElement::FrameProperty),
421 "textAlignment" => Ok(XMLElement::TextAlignment),
422 "adjustRightInd" => Ok(XMLElement::AdjustRightInd),
423 "h" => Ok(XMLElement::H),
424 "hAnchor" => Ok(XMLElement::HAnchor),
425 "hSpace" => Ok(XMLElement::HSpace),
426 "vAnchor" => Ok(XMLElement::VAnchor),
427 "vSpace" => Ok(XMLElement::VSpace),
428 "w" => Ok(XMLElement::W),
429 "wrap" => Ok(XMLElement::Wrap),
430 "x" => Ok(XMLElement::X),
431 "xAlign" => Ok(XMLElement::XAlign),
432 "y" => Ok(XMLElement::Y),
433 "yAlign" => Ok(XMLElement::YAlign),
434 "type" => Ok(XMLElement::Type),
435 _ => Ok(XMLElement::Unsupported),
436 }
437 }
438}
439
440impl FromStr for McXMLElement {
441 type Err = ();
442 fn from_str(s: &str) -> Result<Self, Self::Err> {
443 match s {
444 "AlternateContent" => Ok(McXMLElement::AlternateContent),
445 "Choice" => Ok(McXMLElement::Choice),
446 "Fallback" => Ok(McXMLElement::Fallback),
447 _ => Ok(McXMLElement::Unsupported),
448 }
449 }
450}
451
452impl FromStr for WpXMLElement {
453 type Err = ();
454 fn from_str(s: &str) -> Result<Self, Self::Err> {
455 match s {
456 "anchor" => Ok(WpXMLElement::Anchor),
457 "inline" => Ok(WpXMLElement::Inline),
458 "simplePos" => Ok(WpXMLElement::SimplePos),
459 "positionH" => Ok(WpXMLElement::PositionH),
460 "posOffset" => Ok(WpXMLElement::PosOffset),
461 "positionV" => Ok(WpXMLElement::PositionV),
462 "extent" => Ok(WpXMLElement::Extent),
463 "effectExtent" => Ok(WpXMLElement::EffectExtent),
464 "wrapNone" => Ok(WpXMLElement::WrapNone),
465 "docPr" => Ok(WpXMLElement::DocProperty),
466 _ => Ok(WpXMLElement::Unsupported),
467 }
468 }
469}
470
471impl FromStr for AXMLElement {
472 type Err = ();
473 fn from_str(s: &str) -> Result<Self, Self::Err> {
474 match s {
475 "graphic" => Ok(AXMLElement::Graphic),
476 "graphicData" => Ok(AXMLElement::GraphicData),
477 "xfrm" => Ok(AXMLElement::Xfrm),
478 "blip" => Ok(AXMLElement::Blip),
479 "off" => Ok(AXMLElement::Off),
480 "ext" => Ok(AXMLElement::Ext),
481 "prstGeom" => Ok(AXMLElement::PrstGeom),
482 "solidFill" => Ok(AXMLElement::SolidFill),
483 "ln" => Ok(AXMLElement::Ln),
484 "fontScheme" => Ok(AXMLElement::FontScheme),
485 "majorFont" => Ok(AXMLElement::MajorFont),
486 "minorFont" => Ok(AXMLElement::MinorFont),
487 "latin" => Ok(AXMLElement::Latin),
488 "ea" => Ok(AXMLElement::Ea),
489 "cs" => Ok(AXMLElement::Cs),
490 "font" => Ok(AXMLElement::Font),
491 _ => Ok(AXMLElement::Unsupported),
492 }
493 }
494}
495
496impl FromStr for WpsXMLElement {
497 type Err = ();
498 fn from_str(s: &str) -> Result<Self, Self::Err> {
499 match s {
500 "wsp" => Ok(WpsXMLElement::Wsp),
501 "cNvSpPr" => Ok(WpsXMLElement::CNvSpProperty),
502 "spPr" => Ok(WpsXMLElement::SpProperty),
503 "style" => Ok(WpsXMLElement::Style),
504 "txbx" => Ok(WpsXMLElement::Txbx),
505 "bodyPr" => Ok(WpsXMLElement::BodyPr),
506 _ => Ok(WpsXMLElement::Unsupported),
507 }
508 }
509}
510
511impl FromStr for VXMLElement {
512 type Err = ();
513 fn from_str(s: &str) -> Result<Self, Self::Err> {
514 match s {
515 "rect" => Ok(VXMLElement::Rect),
516 "stroke" => Ok(VXMLElement::Stroke),
517 "fill" => Ok(VXMLElement::Fill),
518 "textbox" => Ok(VXMLElement::TextBox),
519 "shape" => Ok(VXMLElement::Shape),
520 "imagedata" => Ok(VXMLElement::ImageData),
521 _ => Ok(VXMLElement::Unsupported),
522 }
523 }
524}
525
526impl FromStr for VtXMLElement {
527 type Err = ();
528 fn from_str(s: &str) -> Result<Self, Self::Err> {
529 match s {
530 "lpwstr" => Ok(VtXMLElement::Lpwstr),
531 _ => Ok(VtXMLElement::Unsupported),
532 }
533 }
534}
535
536impl FromStr for PicXMLElement {
537 type Err = ();
538 fn from_str(s: &str) -> Result<Self, Self::Err> {
539 match s {
540 "pic" => Ok(PicXMLElement::Pic),
541 _ => Ok(PicXMLElement::Unsupported),
542 }
543 }
544}
545
546pub trait ElementReader {
547 fn read<R: Read>(r: &mut EventReader<R>, attrs: &[OwnedAttribute]) -> Result<Self, ReaderError>
548 where
549 Self: std::marker::Sized;
550}