From 8c9bb7b72dfd969c2716b4f0823f66b7ab09152a Mon Sep 17 00:00:00 2001 From: bokuweb Date: Sat, 27 Nov 2021 19:12:06 +0900 Subject: [PATCH] impl first and even header/footer with rust/JS (#374) * fix: header structure * fix: footer structure * fix: Support first and even header / footer with rust * fix: Support js interface * fix: test --- docx-core/examples/even_header.rs | 17 ++ docx-core/examples/first_header.rs | 17 ++ docx-core/src/documents/document.rs | 28 +++- .../documents/elements/section_property.rs | 157 ++++++++++++++++-- docx-core/src/documents/mod.rs | 123 ++++++++++---- docx-core/src/documents/settings.rs | 11 ++ docx-core/src/documents/xml_docx.rs | 4 +- docx-core/src/xml_builder/elements.rs | 2 + docx-core/src/zipper/mod.rs | 12 +- .../snapshots/lib__reader__line_spacing.snap | 2 +- .../snapshots/lib__reader__read_bom.snap | 2 +- .../snapshots/lib__reader__read_bookmark.snap | 2 +- .../snapshots/lib__reader__read_comment.snap | 2 +- .../lib__reader__read_decoration.snap | 2 +- .../lib__reader__read_extended_comments.snap | 2 +- .../snapshots/lib__reader__read_from_doc.snap | 2 +- .../snapshots/lib__reader__read_hello.snap | 2 +- ..._reader__read_highlight_and_underline.snap | 2 +- .../snapshots/lib__reader__read_history.snap | 2 +- .../lib__reader__read_indent_word_online.snap | 2 +- .../lib__reader__read_insert_table.snap | 2 +- .../lib__reader__read_lvl_override.snap | 2 +- .../lib__reader__read_numbering.snap | 2 +- .../lib__reader__read_tab_and_break.snap | 2 +- .../lib__reader__read_table_docx.snap | 2 +- ...eader__read_table_merged_libre_office.snap | 2 +- .../snapshots/lib__reader__read_textbox.snap | 2 +- .../tests/snapshots/reader__line_spacing.snap | 2 +- .../tests/snapshots/reader__read_bom.snap | 2 +- .../snapshots/reader__read_bookmark.snap | 2 +- .../tests/snapshots/reader__read_comment.snap | 2 +- .../snapshots/reader__read_decoration.snap | 2 +- .../reader__read_extended_comments.snap | 2 +- .../snapshots/reader__read_from_doc.snap | 2 +- .../tests/snapshots/reader__read_hello.snap | 2 +- .../reader__read_highlight_and_underline.snap | 2 +- .../tests/snapshots/reader__read_history.snap | 2 +- .../reader__read_indent_word_online.snap | 2 +- .../snapshots/reader__read_insert_table.snap | 2 +- .../snapshots/reader__read_lvl_override.snap | 2 +- .../snapshots/reader__read_numbering.snap | 2 +- .../snapshots/reader__read_tab_and_break.snap | 2 +- .../snapshots/reader__read_table_docx.snap | 2 +- ...eader__read_table_merged_libre_office.snap | 2 +- .../tests/snapshots/reader__read_textbox.snap | 2 +- docx-wasm/js/index.ts | 32 ++++ docx-wasm/js/section-property.ts | 24 +++ docx-wasm/src/doc.rs | 20 +++ .../test/__snapshots__/index.test.js.snap | 84 +++------- 49 files changed, 449 insertions(+), 154 deletions(-) create mode 100644 docx-core/examples/even_header.rs create mode 100644 docx-core/examples/first_header.rs diff --git a/docx-core/examples/even_header.rs b/docx-core/examples/even_header.rs new file mode 100644 index 0000000..4544a18 --- /dev/null +++ b/docx-core/examples/even_header.rs @@ -0,0 +1,17 @@ +use docx_rs::*; + +pub fn main() -> Result<(), DocxError> { + let path = std::path::Path::new("./output/even_header.docx"); + let file = std::fs::File::create(&path).unwrap(); + let header = + Header::new().add_paragraph(Paragraph::new().add_run(Run::new().add_text("Hello"))); + let even_header = + Header::new().add_paragraph(Paragraph::new().add_run(Run::new().add_text("Even"))); + Docx::new() + .header(header) + .even_header(even_header) + .add_paragraph(Paragraph::new().add_run(Run::new().add_text("World"))) + .build() + .pack(file)?; + Ok(()) +} diff --git a/docx-core/examples/first_header.rs b/docx-core/examples/first_header.rs new file mode 100644 index 0000000..c9549cb --- /dev/null +++ b/docx-core/examples/first_header.rs @@ -0,0 +1,17 @@ +use docx_rs::*; + +pub fn main() -> Result<(), DocxError> { + let path = std::path::Path::new("./output/first_header.docx"); + let file = std::fs::File::create(&path).unwrap(); + let header = + Header::new().add_paragraph(Paragraph::new().add_run(Run::new().add_text("Hello"))); + let first_header = + Header::new().add_paragraph(Paragraph::new().add_run(Run::new().add_text("First"))); + Docx::new() + .header(header) + .first_header(first_header) + .add_paragraph(Paragraph::new().add_run(Run::new().add_text("World"))) + .build() + .pack(file)?; + Ok(()) +} diff --git a/docx-core/src/documents/document.rs b/docx-core/src/documents/document.rs index c980aed..374cd38 100644 --- a/docx-core/src/documents/document.rs +++ b/docx-core/src/documents/document.rs @@ -150,13 +150,33 @@ impl Document { self } - pub fn header_reference(mut self, r: HeaderReference) -> Self { - self.section_property = self.section_property.header_reference(r); + pub fn header(mut self, h: Header, rid: &str) -> Self { + self.section_property = self.section_property.header(h, rid); self } - pub fn footer_reference(mut self, r: FooterReference) -> Self { - self.section_property = self.section_property.footer_reference(r); + pub fn first_header(mut self, h: Header, rid: &str) -> Self { + self.section_property = self.section_property.first_header(h, rid); + self + } + + pub fn even_header(mut self, h: Header, rid: &str) -> Self { + self.section_property = self.section_property.even_header(h, rid); + self + } + + pub fn footer(mut self, h: Footer, rid: &str) -> Self { + self.section_property = self.section_property.footer(h, rid); + self + } + + pub fn first_footer(mut self, h: Footer, rid: &str) -> Self { + self.section_property = self.section_property.first_footer(h, rid); + self + } + + pub fn even_footer(mut self, h: Footer, rid: &str) -> Self { + self.section_property = self.section_property.even_footer(h, rid); self } } diff --git a/docx-core/src/documents/elements/section_property.rs b/docx-core/src/documents/elements/section_property.rs index 1edf199..1c0428f 100644 --- a/docx-core/src/documents/elements/section_property.rs +++ b/docx-core/src/documents/elements/section_property.rs @@ -2,19 +2,44 @@ use super::*; use crate::documents::BuildXML; use crate::types::*; use crate::xml_builder::*; +use crate::{Footer, Header}; use serde::Serialize; #[derive(Debug, Clone, PartialEq, Serialize)] #[serde(rename_all = "camelCase")] pub struct SectionProperty { - page_size: PageSize, - page_margin: PageMargin, - columns: usize, - doc_grid: DocGrid, - header_reference: Option, - footer_reference: Option, - section_type: Option, + pub page_size: PageSize, + pub page_margin: PageMargin, + pub columns: usize, + pub title_pg: bool, + pub doc_grid: DocGrid, + #[serde(skip_serializing_if = "Option::is_none")] + pub header_reference: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub header: Option
, + #[serde(skip_serializing_if = "Option::is_none")] + pub first_header_reference: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub first_header: Option
, + #[serde(skip_serializing_if = "Option::is_none")] + pub even_header_reference: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub even_header: Option
, + #[serde(skip_serializing_if = "Option::is_none")] + pub footer_reference: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub footer: Option