Skip to main content

docx_rs/reader/
xml_element.rs

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    // 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            "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}