From 2bfdf9bc2b77e84c6fb11beb3e1fcd333ed8cdf3 Mon Sep 17 00:00:00 2001 From: bokuweb Date: Wed, 13 Nov 2019 18:50:15 +0900 Subject: [PATCH] feat: Add document relation ship --- docx-core/src/documents/document_rels.rs | 66 ++++++++++++++++++++++++ docx-core/src/documents/mod.rs | 6 +++ docx-core/src/documents/rels.rs | 6 +-- docx-core/src/documents/xml_docx.rs | 1 + docx-core/src/zipper/mod.rs | 2 +- docx-core/tests/lib.rs | 2 +- 6 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 docx-core/src/documents/document_rels.rs diff --git a/docx-core/src/documents/document_rels.rs b/docx-core/src/documents/document_rels.rs new file mode 100644 index 0000000..98109d0 --- /dev/null +++ b/docx-core/src/documents/document_rels.rs @@ -0,0 +1,66 @@ +use crate::documents::BuildXML; +use crate::xml_builder::*; + +#[derive(Debug)] +pub struct DocumentRels {} + +impl DocumentRels { + pub fn new() -> DocumentRels { + DocumentRels {} + } +} + +impl BuildXML for DocumentRels { + fn build(&self) -> Vec { + let b = XMLBuilder::new(); + b.declaration(None) + .open_relationships("http://schemas.openxmlformats.org/package/2006/relationships") + .relationship( + "rId1", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles", + "styles.xml", + ) + .relationship( + "rId2", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable", + "fontTable.xml", + ) + .relationship( + "rId3", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings", + "settings.xml", + ) + .relationship( + "rId4", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/tag", + "tag.xml", + ) + .close() + .build() + } +} + +#[cfg(test)] +mod tests { + + use super::*; + #[cfg(test)] + use pretty_assertions::assert_eq; + use std::str; + + #[test] + fn test_build() { + let c = DocumentRels::new(); + let b = c.build(); + assert_eq!( + str::from_utf8(&b).unwrap(), + r#" + + + + + +"# + ); + } +} diff --git a/docx-core/src/documents/mod.rs b/docx-core/src/documents/mod.rs index 1a99abb..2dae6a3 100644 --- a/docx-core/src/documents/mod.rs +++ b/docx-core/src/documents/mod.rs @@ -2,6 +2,7 @@ mod build_xml; mod content_types; mod doc_props; mod document; +mod document_rels; mod elements; mod rels; mod styles; @@ -12,6 +13,7 @@ pub(crate) use build_xml::*; pub use content_types::*; pub use doc_props::*; pub use document::*; +pub use document_rels::*; pub use elements::*; pub use rels::*; pub use styles::*; @@ -21,6 +23,7 @@ pub use xml_docx::*; pub struct Docx { content_type: ContentTypes, rels: Rels, + document_rels: DocumentRels, doc_props: DocProps, styles: Styles, document: Document, @@ -33,12 +36,14 @@ impl Default for Docx { let doc_props = DocProps::new(None, None /* TODO: */); let styles = Styles::new(); let document = Document::new(); + let document_rels = DocumentRels::new(); Docx { content_type, rels, doc_props, styles, document, + document_rels, } } } @@ -65,6 +70,7 @@ impl Docx { doc_props: self.doc_props.build(), styles: self.styles.build(), document: self.document.build(), + document_rels: self.document_rels.build(), } } } diff --git a/docx-core/src/documents/rels.rs b/docx-core/src/documents/rels.rs index c03b53b..752cae2 100644 --- a/docx-core/src/documents/rels.rs +++ b/docx-core/src/documents/rels.rs @@ -22,13 +22,13 @@ impl BuildXML for Rels { ) .relationship( "rId2", - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties", "docProps/app.xml" ) .relationship( "rId3", - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", - "word/document.xml" + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", + "word/document.xml" ) .close() .build() diff --git a/docx-core/src/documents/xml_docx.rs b/docx-core/src/documents/xml_docx.rs index 2c07793..28df056 100644 --- a/docx-core/src/documents/xml_docx.rs +++ b/docx-core/src/documents/xml_docx.rs @@ -11,6 +11,7 @@ pub struct XMLDocx { pub doc_props: XMLDocProps, pub styles: Vec, pub document: Vec, + pub document_rels: Vec, } impl XMLDocx { diff --git a/docx-core/src/zipper/mod.rs b/docx-core/src/zipper/mod.rs index d1b92b7..7eccde5 100644 --- a/docx-core/src/zipper/mod.rs +++ b/docx-core/src/zipper/mod.rs @@ -28,7 +28,7 @@ where zip.start_file("docProps/core.xml", options)?; zip.write_all(&xml.doc_props.core)?; zip.start_file("word/_rels/document.xml.rels", options)?; - zip.write_all(&xml.rels)?; + zip.write_all(&xml.document_rels)?; zip.start_file("word/document.xml", options)?; zip.write_all(&xml.document)?; zip.start_file("word/styles.xml", options)?; diff --git a/docx-core/tests/lib.rs b/docx-core/tests/lib.rs index 0964f08..79822fe 100644 --- a/docx-core/tests/lib.rs +++ b/docx-core/tests/lib.rs @@ -202,7 +202,7 @@ pub fn custom_attr_paragraph() -> Result<(), DocxError> { .add_paragraph( Paragraph::new() .add_run(Run::new().add_text("Hello")) - .add_custom_attr("w:customId", "1234-5678"), + .add_attr("w:customId", "1234-5678"), ) .build() .pack(file)?;