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