docx_reader/reader/
xml_element.rs

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