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