diff --git a/docx-core/src/documents/elements/text.rs b/docx-core/src/documents/elements/text.rs index 1bc14a0..289d5fc 100644 --- a/docx-core/src/documents/elements/text.rs +++ b/docx-core/src/documents/elements/text.rs @@ -5,18 +5,21 @@ use crate::xml_builder::*; #[derive(Debug)] pub struct Text { text: String, + preserve_space: bool, } impl Text { pub fn new(text: impl Into) -> Text { - Text { text: text.into() } + Text { + text: text.into(), + preserve_space: true, + } } } impl BuildXML for Text { fn build(&self) -> Vec { - let b = XMLBuilder::new(); - b.text(&self.text).build() + XMLBuilder::new().text(&self.text, true).build() } } diff --git a/docx-core/src/lib.rs b/docx-core/src/lib.rs index 741acd8..a2e6d33 100644 --- a/docx-core/src/lib.rs +++ b/docx-core/src/lib.rs @@ -11,7 +11,11 @@ pub fn simple() { let path = std::path::Path::new("./test.docx"); let file = std::fs::File::create(&path).unwrap(); Docx::new() - .add_paragraph(Paragraph::new().add_run(Run::new("Hello"))) + .add_paragraph( + Paragraph::new() + .add_run(Run::new("Hello")) + .add_run(Run::new(" World")), + ) .build() .pack(file); } diff --git a/docx-core/src/xml_builder/elements.rs b/docx-core/src/xml_builder/elements.rs new file mode 100644 index 0000000..740a65a --- /dev/null +++ b/docx-core/src/xml_builder/elements.rs @@ -0,0 +1,130 @@ +use super::XMLBuilder; +use super::XmlEvent; +use crate::types::*; + +impl XMLBuilder { + // i.e. + opened_el!(open_body, "w:body"); + // i.e. + only_str_val_el!(based_on, "w:basedOn"); + // i.e. + // i.e. + pub(crate) fn text(mut self, text: &str, preserve_space: bool) -> Self { + let space = if preserve_space { + "preserve" + } else { + "default" + }; + self.writer + .write(XmlEvent::start_element("w:t").attr("xml:space", space)) + .expect("should write to buf"); + self.writer.write(text).expect("should write to buf"); + self.close() + } + // i.e. + opened_el!(open_run, "w:r"); + opened_el!(open_run_property, "w:rPr"); + opened_el!(open_run_property_default, "w:rPrDefault"); + // i.e. + closed_el!(q_format, "w:qFormat"); + // i.e. + opened_el!(open_paragraph, "w:p"); + opened_el!(open_paragraph_property, "w:pPr"); + opened_el!(open_doc_defaults, "w:docDefaults"); + // i.e. + only_str_val_el!(name, "w:name"); + // i.e. + pub(crate) fn sz(mut self, val: usize) -> Self { + self.writer + .write(XmlEvent::start_element("w:sz").attr("w:val", &format!("{}", val))) + .expect("should write to buf"); + self.close() + } + // Build w:style element + // i.e. + pub(crate) fn open_style(mut self, style_type: StyleType, id: &str) -> Self { + self.writer + .write( + XmlEvent::start_element("w:style") + .attr("w:type", &style_type.to_string()) + .attr("w:styleId", id), + ) + .expect("should write to buf"); + self + } + // i.e. + pub(crate) fn next(mut self, val: &str) -> Self { + self.writer + .write(XmlEvent::start_element("w:next").attr("w:val", val)) + .expect("should write to buf"); + self.close() + } + + // i.e. + pub(crate) fn color(mut self, val: &str) -> Self { + self.writer + .write(XmlEvent::start_element("w:color").attr("w:val", val)) + .expect("should write to buf"); + self.close() + } +} + +#[cfg(test)] +mod tests { + + use super::*; + #[cfg(test)] + use pretty_assertions::assert_eq; + use std::str; + + #[test] + fn test_sz() { + let b = XMLBuilder::new(); + let r = b.sz(20).build(); + assert_eq!(str::from_utf8(&r).unwrap(), r#""#); + } + + #[test] + fn test_declaration() { + let b = XMLBuilder::new(); + let r = b + .open_style(StyleType::Paragraph, "Heading") + .close() + .build(); + assert_eq!( + str::from_utf8(&r).unwrap(), + r#""# + ); + } + + #[test] + fn test_next() { + let b = XMLBuilder::new(); + let r = b.next("Normal").build(); + assert_eq!(str::from_utf8(&r).unwrap(), r#""#); + } + + #[test] + fn test_name() { + let b = XMLBuilder::new(); + let r = b.name("Heading").build(); + assert_eq!(str::from_utf8(&r).unwrap(), r#""#); + } + + #[test] + fn test_color() { + let b = XMLBuilder::new(); + let r = b.color("2E74B5").build(); + assert_eq!(str::from_utf8(&r).unwrap(), r#""#); + } + + #[test] + fn test_based_on() { + let b = XMLBuilder::new(); + let r = b.based_on("Normal").build(); + assert_eq!( + str::from_utf8(&r).unwrap(), + r#""# + ); + } +} diff --git a/docx-core/src/xml_builder/elements/based_on.rs b/docx-core/src/xml_builder/elements/based_on.rs deleted file mode 100644 index 6147bb7..0000000 --- a/docx-core/src/xml_builder/elements/based_on.rs +++ /dev/null @@ -1,26 +0,0 @@ -use super::XMLBuilder; -use super::XmlEvent; - -impl XMLBuilder { - // i.e. - only_str_val_el!(based_on, "w:basedOn"); -} - -#[cfg(test)] -mod tests { - - use super::*; - #[cfg(test)] - use pretty_assertions::assert_eq; - use std::str; - - #[test] - fn test_based_on() { - let b = XMLBuilder::new(); - let r = b.based_on("Normal").build(); - assert_eq!( - str::from_utf8(&r).unwrap(), - r#""# - ); - } -} diff --git a/docx-core/src/xml_builder/elements/body.rs b/docx-core/src/xml_builder/elements/body.rs deleted file mode 100644 index ba55518..0000000 --- a/docx-core/src/xml_builder/elements/body.rs +++ /dev/null @@ -1,7 +0,0 @@ -use super::XMLBuilder; -use super::XmlEvent; - -impl XMLBuilder { - // i.e. - opened_el!(open_body, "w:body"); -} diff --git a/docx-core/src/xml_builder/elements/color.rs b/docx-core/src/xml_builder/elements/color.rs deleted file mode 100644 index 03fa1fb..0000000 --- a/docx-core/src/xml_builder/elements/color.rs +++ /dev/null @@ -1,28 +0,0 @@ -use super::XMLBuilder; -use super::XmlEvent; - -impl XMLBuilder { - // i.e. - pub(crate) fn color(mut self, val: &str) -> Self { - self.writer - .write(XmlEvent::start_element("w:color").attr("w:val", val)) - .expect("should write to buf"); - self.close() - } -} - -#[cfg(test)] -mod tests { - - use super::*; - #[cfg(test)] - use pretty_assertions::assert_eq; - use std::str; - - #[test] - fn test_color() { - let b = XMLBuilder::new(); - let r = b.color("2E74B5").build(); - assert_eq!(str::from_utf8(&r).unwrap(), r#""#); - } -} diff --git a/docx-core/src/xml_builder/elements/doc_defaults.rs b/docx-core/src/xml_builder/elements/doc_defaults.rs deleted file mode 100644 index 75bc2df..0000000 --- a/docx-core/src/xml_builder/elements/doc_defaults.rs +++ /dev/null @@ -1,6 +0,0 @@ -use super::super::XmlEvent; -use crate::xml_builder::*; - -impl XMLBuilder { - opened_el!(open_doc_defaults, "w:docDefaults"); -} diff --git a/docx-core/src/xml_builder/elements/macros.rs b/docx-core/src/xml_builder/elements/macros.rs deleted file mode 100644 index 3aed0cf..0000000 --- a/docx-core/src/xml_builder/elements/macros.rs +++ /dev/null @@ -1,21 +0,0 @@ -macro_rules! only_str_val_el { - ($name: ident, $el_name: expr) => { - pub(crate) fn $name(mut self, val: &str) -> Self { - self.writer - .write(XmlEvent::start_element($el_name).attr("w:val", val)) - .expect("should write to buf"); - self.close() - } - }; -} - -macro_rules! only_usize_val_el { - ($name: ident, $el_name: expr) => { - pub(crate) fn $name(mut self, val: usize) -> Self { - self.writer - .write(XmlEvent::start_element($el_name).attr("w:val", val)) - .expect("should write to buf"); - self.close() - } - }; -} diff --git a/docx-core/src/xml_builder/elements/mod.rs b/docx-core/src/xml_builder/elements/mod.rs deleted file mode 100644 index 7a01cd7..0000000 --- a/docx-core/src/xml_builder/elements/mod.rs +++ /dev/null @@ -1,20 +0,0 @@ -#[macro_use] -mod macros; - -pub mod based_on; -pub mod body; -pub mod color; -pub mod doc_defaults; -pub mod name; -pub mod next; -pub mod paragraph; -pub mod paragraph_property; -pub mod q_format; -pub mod run; -pub mod run_property; -pub mod run_property_default; -pub mod style; -pub mod sz; -pub mod text; - -use super::{XMLBuilder, XmlEvent}; diff --git a/docx-core/src/xml_builder/elements/name.rs b/docx-core/src/xml_builder/elements/name.rs deleted file mode 100644 index ff04b9d..0000000 --- a/docx-core/src/xml_builder/elements/name.rs +++ /dev/null @@ -1,25 +0,0 @@ -use std::fmt; - -use super::XMLBuilder; -use super::XmlEvent; - -impl XMLBuilder { - // i.e. - only_str_val_el!(name, "w:name"); -} - -#[cfg(test)] -mod tests { - - use super::*; - #[cfg(test)] - use pretty_assertions::assert_eq; - use std::str; - - #[test] - fn test_name() { - let b = XMLBuilder::new(); - let r = b.name("Heading").build(); - assert_eq!(str::from_utf8(&r).unwrap(), r#""#); - } -} diff --git a/docx-core/src/xml_builder/elements/next.rs b/docx-core/src/xml_builder/elements/next.rs deleted file mode 100644 index 6cd8c42..0000000 --- a/docx-core/src/xml_builder/elements/next.rs +++ /dev/null @@ -1,28 +0,0 @@ -use super::XMLBuilder; -use super::XmlEvent; - -impl XMLBuilder { - // i.e. - pub(crate) fn next(mut self, val: &str) -> Self { - self.writer - .write(XmlEvent::start_element("w:next").attr("w:val", val)) - .expect("should write to buf"); - self.close() - } -} - -#[cfg(test)] -mod tests { - - use super::*; - #[cfg(test)] - use pretty_assertions::assert_eq; - use std::str; - - #[test] - fn test_next() { - let b = XMLBuilder::new(); - let r = b.next("Normal").build(); - assert_eq!(str::from_utf8(&r).unwrap(), r#""#); - } -} diff --git a/docx-core/src/xml_builder/elements/paragraph.rs b/docx-core/src/xml_builder/elements/paragraph.rs deleted file mode 100644 index a801f41..0000000 --- a/docx-core/src/xml_builder/elements/paragraph.rs +++ /dev/null @@ -1,7 +0,0 @@ -use super::XMLBuilder; -use super::XmlEvent; - -impl XMLBuilder { - // i.e. - opened_el!(open_paragraph, "w:p"); -} diff --git a/docx-core/src/xml_builder/elements/paragraph_property.rs b/docx-core/src/xml_builder/elements/paragraph_property.rs deleted file mode 100644 index bc8bff3..0000000 --- a/docx-core/src/xml_builder/elements/paragraph_property.rs +++ /dev/null @@ -1,6 +0,0 @@ -use super::super::XmlEvent; -use crate::xml_builder::*; - -impl XMLBuilder { - opened_el!(open_paragraph_property, "w:pPr"); -} diff --git a/docx-core/src/xml_builder/elements/q_format.rs b/docx-core/src/xml_builder/elements/q_format.rs deleted file mode 100644 index 5100997..0000000 --- a/docx-core/src/xml_builder/elements/q_format.rs +++ /dev/null @@ -1,23 +0,0 @@ -use super::XMLBuilder; -use super::XmlEvent; - -impl XMLBuilder { - // i.e. - closed_el!(q_format, "w:qFormat"); -} - -#[cfg(test)] -mod tests { - - use super::*; - #[cfg(test)] - use pretty_assertions::assert_eq; - use std::str; - - #[test] - fn test_q_format() { - let b = XMLBuilder::new(); - let r = b.q_format().build(); - assert_eq!(str::from_utf8(&r).unwrap(), r#""#); - } -} diff --git a/docx-core/src/xml_builder/elements/run.rs b/docx-core/src/xml_builder/elements/run.rs deleted file mode 100644 index 5fec490..0000000 --- a/docx-core/src/xml_builder/elements/run.rs +++ /dev/null @@ -1,7 +0,0 @@ -use super::XMLBuilder; -use super::XmlEvent; - -impl XMLBuilder { - // i.e. - opened_el!(open_run, "w:r"); -} diff --git a/docx-core/src/xml_builder/elements/run_property.rs b/docx-core/src/xml_builder/elements/run_property.rs deleted file mode 100644 index f50a7ed..0000000 --- a/docx-core/src/xml_builder/elements/run_property.rs +++ /dev/null @@ -1,6 +0,0 @@ -use super::super::XmlEvent; -use crate::xml_builder::*; - -impl XMLBuilder { - opened_el!(open_run_property, "w:rPr"); -} diff --git a/docx-core/src/xml_builder/elements/run_property_default.rs b/docx-core/src/xml_builder/elements/run_property_default.rs deleted file mode 100644 index f6e4fb3..0000000 --- a/docx-core/src/xml_builder/elements/run_property_default.rs +++ /dev/null @@ -1,6 +0,0 @@ -use super::super::XmlEvent; -use crate::xml_builder::*; - -impl XMLBuilder { - opened_el!(open_run_property_default, "w:rPrDefault"); -} diff --git a/docx-core/src/xml_builder/elements/style.rs b/docx-core/src/xml_builder/elements/style.rs deleted file mode 100644 index 6359256..0000000 --- a/docx-core/src/xml_builder/elements/style.rs +++ /dev/null @@ -1,39 +0,0 @@ -use super::{XMLBuilder, XmlEvent}; -use crate::StyleType; - -impl XMLBuilder { - // Build w:style element - // i.e. - pub(crate) fn open_style(mut self, style_type: StyleType, id: &str) -> Self { - self.writer - .write( - XmlEvent::start_element("w:style") - .attr("w:type", &style_type.to_string()) - .attr("w:styleId", id), - ) - .expect("should write to buf"); - self - } -} - -#[cfg(test)] -mod tests { - - use super::*; - #[cfg(test)] - use pretty_assertions::assert_eq; - use std::str; - - #[test] - fn test_declaration() { - let b = XMLBuilder::new(); - let r = b - .open_style(StyleType::Paragraph, "Heading") - .close() - .build(); - assert_eq!( - str::from_utf8(&r).unwrap(), - r#""# - ); - } -} diff --git a/docx-core/src/xml_builder/elements/sz.rs b/docx-core/src/xml_builder/elements/sz.rs deleted file mode 100644 index 806f883..0000000 --- a/docx-core/src/xml_builder/elements/sz.rs +++ /dev/null @@ -1,28 +0,0 @@ -use super::XMLBuilder; -use super::XmlEvent; - -impl XMLBuilder { - // i.e. - pub(crate) fn sz(mut self, val: usize) -> Self { - self.writer - .write(XmlEvent::start_element("w:sz").attr("w:val", &format!("{}", val))) - .expect("should write to buf"); - self.close() - } -} - -#[cfg(test)] -mod tests { - - use super::*; - #[cfg(test)] - use pretty_assertions::assert_eq; - use std::str; - - #[test] - fn test_name() { - let b = XMLBuilder::new(); - let r = b.sz(20).build(); - assert_eq!(str::from_utf8(&r).unwrap(), r#""#); - } -} diff --git a/docx-core/src/xml_builder/elements/text.rs b/docx-core/src/xml_builder/elements/text.rs deleted file mode 100644 index 1bee6b5..0000000 --- a/docx-core/src/xml_builder/elements/text.rs +++ /dev/null @@ -1,7 +0,0 @@ -use super::XMLBuilder; -use super::XmlEvent; - -impl XMLBuilder { - // i.e. - closed_el_with_child!(text, "w:t"); -} diff --git a/docx-core/src/xml_builder/macros.rs b/docx-core/src/xml_builder/macros.rs index 1a1caff..ee15e77 100644 --- a/docx-core/src/xml_builder/macros.rs +++ b/docx-core/src/xml_builder/macros.rs @@ -130,3 +130,25 @@ macro_rules! closed_el { } }; } + +macro_rules! only_str_val_el { + ($name: ident, $el_name: expr) => { + pub(crate) fn $name(mut self, val: &str) -> Self { + self.writer + .write(XmlEvent::start_element($el_name).attr("w:val", val)) + .expect("should write to buf"); + self.close() + } + }; +} + +macro_rules! only_usize_val_el { + ($name: ident, $el_name: expr) => { + pub(crate) fn $name(mut self, val: usize) -> Self { + self.writer + .write(XmlEvent::start_element($el_name).attr("w:val", val)) + .expect("should write to buf"); + self.close() + } + }; +}