From b464873e68a2b66ebb783a1081008a913615f033 Mon Sep 17 00:00:00 2001 From: bokuweb Date: Fri, 12 Jun 2020 17:42:16 +0900 Subject: [PATCH] fix: ignore change property to import diff docx (#85) --- docx-core/src/reader/ignore.rs | 20 ++++++++++++++++++++ docx-core/src/reader/mod.rs | 1 + docx-core/src/reader/paragraph.rs | 3 +++ docx-core/src/reader/table.rs | 4 ++++ docx-core/src/reader/table_cell.rs | 7 +++++++ docx-core/src/reader/table_row.rs | 3 +++ docx-core/src/reader/xml_element.rs | 13 ++++++++++++- 7 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 docx-core/src/reader/ignore.rs diff --git a/docx-core/src/reader/ignore.rs b/docx-core/src/reader/ignore.rs new file mode 100644 index 0000000..6b958f9 --- /dev/null +++ b/docx-core/src/reader/ignore.rs @@ -0,0 +1,20 @@ +use std::io::Read; +use std::str::FromStr; + +use xml::reader::{EventReader, XmlEvent}; + +use super::*; + +pub(crate) fn ignore_element(el: XMLElement, ignore: XMLElement, r: &mut EventReader) { + if ignore == el { + loop { + let e = r.next(); + if let Ok(XmlEvent::EndElement { name, .. }) = e { + let e = XMLElement::from_str(&name.local_name).unwrap(); + if e == ignore { + break; + } + } + } + } +} diff --git a/docx-core/src/reader/mod.rs b/docx-core/src/reader/mod.rs index a30e6a7..52e0961 100644 --- a/docx-core/src/reader/mod.rs +++ b/docx-core/src/reader/mod.rs @@ -7,6 +7,7 @@ mod document_rels; mod drawing; mod errors; mod from_xml; +mod ignore; mod insert; mod level; mod level_override; diff --git a/docx-core/src/reader/paragraph.rs b/docx-core/src/reader/paragraph.rs index c10bc8c..a460fe9 100644 --- a/docx-core/src/reader/paragraph.rs +++ b/docx-core/src/reader/paragraph.rs @@ -22,6 +22,9 @@ impl ElementReader for Paragraph { attributes, name, .. }) => { let e = XMLElement::from_str(&name.local_name).unwrap(); + + ignore::ignore_element(e.clone(), XMLElement::ParagraphPropertyChange, r); + match e { XMLElement::Run => { let run = Run::read(r, attrs)?; diff --git a/docx-core/src/reader/table.rs b/docx-core/src/reader/table.rs index 6d4a5e2..a311c94 100644 --- a/docx-core/src/reader/table.rs +++ b/docx-core/src/reader/table.rs @@ -18,6 +18,10 @@ impl ElementReader for Table { attributes, name, .. }) => { let e = XMLElement::from_str(&name.local_name).unwrap(); + + ignore::ignore_element(e.clone(), XMLElement::TablePropertyChange, r); + ignore::ignore_element(e.clone(), XMLElement::TableGridChange, r); + match e { XMLElement::TableRow => { t = t.add_row(TableRow::read(r, &attributes)?); diff --git a/docx-core/src/reader/table_cell.rs b/docx-core/src/reader/table_cell.rs index e252837..28c4026 100644 --- a/docx-core/src/reader/table_cell.rs +++ b/docx-core/src/reader/table_cell.rs @@ -30,6 +30,13 @@ impl ElementReader for TableCell { attributes, name, .. }) => { let e = XMLElement::from_str(&name.local_name).unwrap(); + + ignore::ignore_element( + e.clone(), + XMLElement::TableCellPropertyChange, + r, + ); + match e { XMLElement::TableCellWidth => { let mut w = 0; diff --git a/docx-core/src/reader/table_row.rs b/docx-core/src/reader/table_row.rs index e6f6333..f54e29d 100644 --- a/docx-core/src/reader/table_row.rs +++ b/docx-core/src/reader/table_row.rs @@ -16,6 +16,9 @@ impl ElementReader for TableRow { attributes, name, .. }) => { let e = XMLElement::from_str(&name.local_name).unwrap(); + + ignore::ignore_element(e.clone(), XMLElement::TableRowPropertyChange, r); + if let XMLElement::TableCell = e { cells.push(TableCell::read(r, &attributes)?); continue; diff --git a/docx-core/src/reader/xml_element.rs b/docx-core/src/reader/xml_element.rs index 274dc6d..e6240f3 100644 --- a/docx-core/src/reader/xml_element.rs +++ b/docx-core/src/reader/xml_element.rs @@ -6,7 +6,7 @@ use xml::reader::EventReader; use crate::reader::ReaderError; -#[derive(PartialEq, Debug)] +#[derive(PartialEq, Debug, Clone)] pub enum XMLElement { Body, Paragraph, @@ -26,6 +26,7 @@ pub enum XMLElement { Break, Tab, ParagraphStyle, + ParagraphPropertyChange, Indent, Name, Alignment, @@ -53,6 +54,11 @@ pub enum XMLElement { TableWidth, TableIndent, TableBorders, + // Change + TableGridChange, + TablePropertyChange, + TableRowPropertyChange, + TableCellPropertyChange, Top, Right, Left, @@ -158,6 +164,7 @@ impl FromStr for XMLElement { "szCs" => Ok(XMLElement::SizeCs), "u" => Ok(XMLElement::Underline), "pStyle" => Ok(XMLElement::ParagraphStyle), + "pPrChange" => Ok(XMLElement::ParagraphPropertyChange), "highlight" => Ok(XMLElement::Highlight), "b" => Ok(XMLElement::Bold), "bCs" => Ok(XMLElement::BoldCs), @@ -200,6 +207,10 @@ impl FromStr for XMLElement { "insideV" => Ok(XMLElement::InsideV), "tblCellMar" => Ok(XMLElement::TableCellMargin), "tblGrid" => Ok(XMLElement::TableGrid), + "tblPrChange" => Ok(XMLElement::TablePropertyChange), + "trPrChange" => Ok(XMLElement::TableRowPropertyChange), + "tcPrChange" => Ok(XMLElement::TableCellPropertyChange), + "tblGridChange" => Ok(XMLElement::TableGridChange), "gridCol" => Ok(XMLElement::GridCol), "style" => Ok(XMLElement::Style), "basedOn" => Ok(XMLElement::BasedOn),