From af75b6a41ceeedd60222028976929b11cf888894 Mon Sep 17 00:00:00 2001 From: bokuweb Date: Fri, 15 Nov 2019 13:33:59 +0900 Subject: [PATCH] feat: fix core props --- docx-core/src/documents/doc_props/core.rs | 160 +++++++++++----------- docx-core/src/documents/doc_props/mod.rs | 6 +- docx-core/src/documents/mod.rs | 14 +- docx-wasm/src/lib.rs | 2 +- 4 files changed, 89 insertions(+), 93 deletions(-) diff --git a/docx-core/src/documents/doc_props/core.rs b/docx-core/src/documents/doc_props/core.rs index 057f27f..9dcc6b6 100644 --- a/docx-core/src/documents/doc_props/core.rs +++ b/docx-core/src/documents/doc_props/core.rs @@ -2,30 +2,30 @@ use crate::documents::BuildXML; use crate::xml_builder::*; #[derive(Debug)] -pub struct CoreProps { - config: CorePropsConfig, +pub struct CoreProps<'a> { + config: CorePropsConfig<'a>, } #[derive(Debug)] -pub struct CorePropsConfig { - created: Option, - creator: Option, - description: Option, - language: Option, - last_modified_by: Option, - modified: Option, +pub struct CorePropsConfig<'a> { + created: Option<&'a str>, + creator: Option<&'a str>, + description: Option<&'a str>, + language: Option<&'a str>, + last_modified_by: Option<&'a str>, + modified: Option<&'a str>, revision: Option, - subject: Option, - title: Option, + subject: Option<&'a str>, + title: Option<&'a str>, } -impl CoreProps { - pub(crate) fn new(config: CorePropsConfig) -> CoreProps { +impl<'a> CoreProps<'a> { + pub(crate) fn new(config: CorePropsConfig<'a>) -> CoreProps { CoreProps { config } } } -impl CorePropsConfig { +impl<'a> CorePropsConfig<'a> { pub fn new() -> Self { CorePropsConfig { created: None, @@ -41,7 +41,7 @@ impl CorePropsConfig { } } -impl BuildXML for CoreProps { +impl<'a> BuildXML for CoreProps<'a> { fn build(&self) -> Vec { let b = XMLBuilder::new(); let base = b.declaration(Some(true)).open_core_properties( @@ -53,37 +53,39 @@ impl BuildXML for CoreProps { ); let convert = |v: usize| format!("{}", v); - let default = || ""; - - // base.dcterms_created( - // "dcterms:W3CDTF", - // c.created.as_ref().map_or_else(default, |v| v), - // ) - // .dc_creator(c.creator.as_ref().map_or_else(default, |v| v)) - // .dc_description(c.description.as_ref().map_or_else(default, |v| v)) - // .dc_language(c.language.as_ref().map_or_else(default, |v| v)) - // .cp_last_modified_by(c.last_modified_by.as_ref().map_or_else(default, |v| v)) - // .dcterms_modified( - // "dcterms:W3CDTF", - // c.modified.as_ref().map_or_else(default, |v| v), - // ) - // .cp_revision(&c.revision.map_or_else(|| "".to_owned(), convert)) - // .dc_subject(c.subject.as_ref().map_or_else(default, |v| v)) - // .dc_title(c.title.as_ref().map_or_else(default, |v| v)) - // .close() - // .build() - - base.dcterms_created("dcterms:W3CDTF", "2019-09-13T19:25:28Z") - .dc_creator("unknown") - .dc_description("") - .dc_language("") - .cp_last_modified_by("unknown") - .dcterms_modified("dcterms:W3CDTF", "2019-09-13T19:25:28Z") - .cp_revision("1") - .dc_subject("") - .dc_title("") - .close() - .build() + let mut base = base + .dcterms_created( + "dcterms:W3CDTF", + self.config + .created + .map_or_else(|| "1970-01-01T00:00:00Z", |v| v), + ) + .dc_creator(self.config.creator.map_or_else(|| "unknown", |v| v)) + .cp_last_modified_by( + self.config + .last_modified_by + .map_or_else(|| "unknown", |v| v), + ) + .dcterms_modified( + "dcterms:W3CDTF", + self.config + .modified + .map_or_else(|| "1970-01-01T00:00:00Z", |v| v), + ) + .cp_revision(&self.config.revision.map_or_else(|| "1".to_owned(), convert)); + if let Some(v) = self.config.description { + base = base.dc_description(v); + } + if let Some(v) = self.config.language { + base = base.dc_language(v); + } + if let Some(v) = self.config.subject { + base = base.dc_subject(v); + } + if let Some(v) = self.config.title { + base = base.dc_title(v); + } + base.close().build() } } @@ -96,7 +98,7 @@ mod tests { use std::str; #[test] - fn test_default_doc_props_core_build() { + fn test_default_doc_props_core() { let c = CoreProps::new(CorePropsConfig { created: None, creator: None, @@ -113,49 +115,43 @@ mod tests { str::from_utf8(&b).unwrap(), r#" - 2019-09-13T19:25:28Z + 1970-01-01T00:00:00Z unknown - - unknown - 2019-09-13T19:25:28Z + 1970-01-01T00:00:00Z 1 - - "# ); } - /* - #[test] - fn test_configured_doc_props_core_build() { - let c = CoreProps::new(CorePropsConfig { - created: Some("2019-01-01".to_owned()), - creator: Some("foo".to_owned()), - description: Some("bar".to_owned()), - language: Some("en".to_owned()), - last_modified_by: Some("go".to_owned()), - modified: Some("2019-01-01".to_owned()), - revision: Some(1), - subject: Some("subject".to_owned()), - title: Some("title".to_owned()), - }); - let b = c.build(); - assert_eq!( + #[test] + fn test_configured_doc_props_core_build() { + let c = CoreProps::new(CorePropsConfig { + created: Some("2019-01-01"), + creator: Some("foo"), + description: Some("bar"), + language: Some("en"), + last_modified_by: Some("go"), + modified: Some("2019-01-01"), + revision: Some(1), + subject: Some("subject"), + title: Some("title"), + }); + let b = c.build(); + assert_eq!( str::from_utf8(&b).unwrap(), r#" - - 2019-01-01 - foo - bar - en - go - 2019-01-01 - 1 - subject - title - "# + + 2019-01-01 + foo + go + 2019-01-01 + 1 + bar + en + subject + title +"# ); - } - */ + } } diff --git a/docx-core/src/documents/doc_props/mod.rs b/docx-core/src/documents/doc_props/mod.rs index 8301a6f..cbcd2f5 100644 --- a/docx-core/src/documents/doc_props/mod.rs +++ b/docx-core/src/documents/doc_props/mod.rs @@ -6,12 +6,12 @@ pub use self::core::*; use crate::documents::BuildXML; #[derive(Debug)] -pub(crate) struct DocProps { +pub(crate) struct DocProps<'a> { app: AppProps, - core: CoreProps, + core: CoreProps<'a>, } -impl DocProps { +impl<'a> DocProps<'a> { pub(crate) fn new(core_config: CorePropsConfig) -> DocProps { let app = AppProps::new(); let core = CoreProps::new(core_config); diff --git a/docx-core/src/documents/mod.rs b/docx-core/src/documents/mod.rs index f2b513f..03be5b3 100644 --- a/docx-core/src/documents/mod.rs +++ b/docx-core/src/documents/mod.rs @@ -24,18 +24,18 @@ pub use styles::*; pub use xml_docx::*; #[derive(Debug)] -pub struct Docx { +pub struct Docx<'a> { content_type: ContentTypes, rels: Rels, document_rels: DocumentRels, - doc_props: DocProps, + doc_props: DocProps<'a>, styles: Styles, document: Document, settings: Settings, font_table: FontTable, } -impl Default for Docx { +impl<'a> Default for Docx<'a> { fn default() -> Self { let content_type = ContentTypes::new(); let rels = Rels::new(); @@ -58,17 +58,17 @@ impl Default for Docx { } } -impl Docx { - pub fn new() -> Docx { +impl<'a> Docx<'a> { + pub fn new() -> Docx<'a> { Default::default() } - pub fn add_paragraph(mut self, p: Paragraph) -> Docx { + pub fn add_paragraph(mut self, p: Paragraph) -> Docx<'a> { self.document = self.document.add_paragraph(p); self } - pub fn add_table(mut self, t: Table) -> Docx { + pub fn add_table(mut self, t: Table) -> Docx<'a> { self.document = self.document.add_table(t); self } diff --git a/docx-wasm/src/lib.rs b/docx-wasm/src/lib.rs index 2c6c7ee..a5f536e 100644 --- a/docx-wasm/src/lib.rs +++ b/docx-wasm/src/lib.rs @@ -3,7 +3,7 @@ use wasm_bindgen::prelude::*; #[wasm_bindgen] #[derive(Debug)] -pub struct Docx(docx_core::Docx); +pub struct Docx(docx_core::Docx<'static>); #[wasm_bindgen] #[allow(non_snake_case)]