docx_rs/reader/
xml_element.rs

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    // Change
102    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}