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