From 0af89dbc799b37299054f3f298cb0a15a1adeb42 Mon Sep 17 00:00:00 2001 From: bokuweb Date: Mon, 16 Dec 2019 11:36:04 +0900 Subject: [PATCH] fix: numbering error on word online (#15) --- docx-core/src/documents/document.rs | 8 ++++++++ docx-core/src/documents/elements/paragraph.rs | 3 +++ docx-core/src/documents/elements/table.rs | 3 +++ docx-core/src/documents/elements/table_cell.rs | 10 +++++++++- docx-core/src/documents/elements/table_row.rs | 8 +++++++- docx-core/src/documents/mod.rs | 11 ++++++++++- docx-core/src/documents/numberings.rs | 2 +- docx-core/tests/lib.rs | 8 ++++---- 8 files changed, 45 insertions(+), 8 deletions(-) diff --git a/docx-core/src/documents/document.rs b/docx-core/src/documents/document.rs index bc5bacb..4e38dc6 100644 --- a/docx-core/src/documents/document.rs +++ b/docx-core/src/documents/document.rs @@ -6,6 +6,7 @@ use crate::xml_builder::*; pub struct Document { pub(crate) children: Vec, pub section_property: SectionProperty, + pub has_numbering: bool, } #[derive(Debug, Clone)] @@ -20,11 +21,17 @@ impl Document { } pub fn add_paragraph(mut self, p: Paragraph) -> Self { + if p.has_numbering { + self.has_numbering = true + } self.children.push(DocumentChild::Paragraph(p)); self } pub fn add_table(mut self, t: Table) -> Self { + if t.has_numbering { + self.has_numbering = true + } self.children.push(DocumentChild::Table(t)); self } @@ -35,6 +42,7 @@ impl Default for Document { Self { children: Vec::new(), section_property: SectionProperty::new(), + has_numbering: false, } } } diff --git a/docx-core/src/documents/elements/paragraph.rs b/docx-core/src/documents/elements/paragraph.rs index 1cf75f8..26439ed 100644 --- a/docx-core/src/documents/elements/paragraph.rs +++ b/docx-core/src/documents/elements/paragraph.rs @@ -7,6 +7,7 @@ use crate::xml_builder::*; pub struct Paragraph { pub children: Vec, pub property: ParagraphProperty, + pub has_numbering: bool, attrs: Vec<(String, String)>, } @@ -15,6 +16,7 @@ impl Default for Paragraph { Self { children: Vec::new(), property: ParagraphProperty::new(), + has_numbering: false, attrs: Vec::new(), } } @@ -121,6 +123,7 @@ impl Paragraph { pub fn numbering(mut self, id: NumberingId, level: IndentLevel) -> Self { self.property = self.property.numbering(id, level); + self.has_numbering = true; self } } diff --git a/docx-core/src/documents/elements/table.rs b/docx-core/src/documents/elements/table.rs index 0580158..baa256b 100644 --- a/docx-core/src/documents/elements/table.rs +++ b/docx-core/src/documents/elements/table.rs @@ -7,17 +7,20 @@ use crate::xml_builder::*; pub struct Table { pub rows: Vec, pub grid: Vec, + pub(crate) has_numbering: bool, property: TableProperty, } impl Table { pub fn new(rows: Vec) -> Table { let property = TableProperty::new(); + let has_numbering = rows.iter().any(|c| c.has_numbering); let grid = vec![]; Self { property, rows, grid, + has_numbering, } } diff --git a/docx-core/src/documents/elements/table_cell.rs b/docx-core/src/documents/elements/table_cell.rs index f53b94d..4e89e58 100644 --- a/docx-core/src/documents/elements/table_cell.rs +++ b/docx-core/src/documents/elements/table_cell.rs @@ -7,6 +7,7 @@ use crate::xml_builder::*; pub struct TableCell { pub contents: Vec, pub property: TableCellProperty, + pub has_numbering: bool, } #[derive(Debug, Clone)] @@ -18,10 +19,17 @@ impl TableCell { pub fn new() -> TableCell { let property = TableCellProperty::new(); let contents = vec![]; - Self { property, contents } + Self { + property, + contents, + has_numbering: false, + } } pub fn add_paragraph(mut self, p: Paragraph) -> TableCell { + if p.has_numbering { + self.has_numbering = true + } self.contents.push(TableCellContent::Paragraph(p)); self } diff --git a/docx-core/src/documents/elements/table_row.rs b/docx-core/src/documents/elements/table_row.rs index 9369dca..939098d 100644 --- a/docx-core/src/documents/elements/table_row.rs +++ b/docx-core/src/documents/elements/table_row.rs @@ -5,13 +5,19 @@ use crate::xml_builder::*; #[derive(Debug, Clone)] pub struct TableRow { pub cells: Vec, + pub(crate) has_numbering: bool, property: TableRowProperty, } impl TableRow { pub fn new(cells: Vec) -> TableRow { let property = TableRowProperty::new(); - Self { property, cells } + let has_numbering = cells.iter().any(|c| c.has_numbering); + Self { + property, + cells, + has_numbering, + } } } diff --git a/docx-core/src/documents/mod.rs b/docx-core/src/documents/mod.rs index 33d4ca2..05e19fa 100644 --- a/docx-core/src/documents/mod.rs +++ b/docx-core/src/documents/mod.rs @@ -76,11 +76,21 @@ impl Docx { } pub fn add_paragraph(mut self, p: Paragraph) -> Docx { + if p.has_numbering { + // If this document has numbering, set numberings.xml to document_rels. + // This is because numberings.xml without numbering cause an error on word online. + self.document_rels.has_numberings = true; + } self.document = self.document.add_paragraph(p); self } pub fn add_table(mut self, t: Table) -> Docx { + if t.has_numbering { + // If this document has numbering, set numberings.xml to document_rels. + // This is because numberings.xml without numbering cause an error on word online. + self.document_rels.has_numberings = true; + } self.document = self.document.add_table(t); self } @@ -151,7 +161,6 @@ impl Docx { } } } - _ => {} } } // If this document has comments, set comments.xml to document_rels. diff --git a/docx-core/src/documents/numberings.rs b/docx-core/src/documents/numberings.rs index 2485955..bcd8c6c 100644 --- a/docx-core/src/documents/numberings.rs +++ b/docx-core/src/documents/numberings.rs @@ -37,7 +37,7 @@ impl BuildXML for Numberings { } fn create_default_numbering() -> Numbering { - Numbering::new(0) + Numbering::new(1) .add_level( Level::new( 0, diff --git a/docx-core/tests/lib.rs b/docx-core/tests/lib.rs index e2b4f52..ae33d28 100644 --- a/docx-core/tests/lib.rs +++ b/docx-core/tests/lib.rs @@ -323,22 +323,22 @@ pub fn default_numbering() -> Result<(), DocxError> { .add_paragraph( Paragraph::new() .add_run(Run::new().add_text("Hello")) - .numbering(NumberingId::new(0), IndentLevel::new(0)), + .numbering(NumberingId::new(1), IndentLevel::new(0)), ) .add_paragraph( Paragraph::new() .add_run(Run::new().add_text("World!")) - .numbering(NumberingId::new(0), IndentLevel::new(1)), + .numbering(NumberingId::new(1), IndentLevel::new(1)), ) .add_paragraph( Paragraph::new() .add_run(Run::new().add_text("Foooo!")) - .numbering(NumberingId::new(0), IndentLevel::new(2)), + .numbering(NumberingId::new(1), IndentLevel::new(2)), ) .add_paragraph( Paragraph::new() .add_run(Run::new().add_text("Bar!")) - .numbering(NumberingId::new(0), IndentLevel::new(3)), + .numbering(NumberingId::new(1), IndentLevel::new(3)), ) .build() .pack(file)?;