feat: Add doc app props
parent
3e154d6904
commit
490efa47c2
|
@ -1,2 +1,12 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><Template></Template><TotalTime>0</TotalTime><Application>LibreOffice/6.0.7.3$Linux_X86_64 LibreOffice_project/00m0$Build-3</Application><Pages>1</Pages><Words>1</Words><Characters>5</Characters><CharactersWithSpaces>5</CharactersWithSpaces><Paragraphs>1</Paragraphs></Properties>
|
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"
|
||||||
|
xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
|
||||||
|
<Template></Template>
|
||||||
|
<TotalTime>0</TotalTime>
|
||||||
|
<Application>LibreOffice/6.0.7.3$Linux_X86_64 LibreOffice_project/00m0$Build-3</Application>
|
||||||
|
<Pages>1</Pages>
|
||||||
|
<Words>1</Words>
|
||||||
|
<Characters>5</Characters>
|
||||||
|
<CharactersWithSpaces>5</CharactersWithSpaces>
|
||||||
|
<Paragraphs>1</Paragraphs>
|
||||||
|
</Properties>
|
|
@ -1,2 +1,16 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dcterms:created xsi:type="dcterms:W3CDTF">2019-09-13T19:32:17Z</dcterms:created><dc:creator></dc:creator><dc:description></dc:description><dc:language>ja-JP</dc:language><cp:lastModifiedBy></cp:lastModifiedBy><dcterms:modified xsi:type="dcterms:W3CDTF">2019-09-13T19:32:34Z</dcterms:modified><cp:revision>1</cp:revision><dc:subject></dc:subject><dc:title></dc:title></cp:coreProperties>
|
<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties"
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:dcterms="http://purl.org/dc/terms/"
|
||||||
|
xmlns:dcmitype="http://purl.org/dc/dcmitype/"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<dcterms:created xsi:type="dcterms:W3CDTF">2019-09-13T19:32:17Z</dcterms:created>
|
||||||
|
<dc:creator></dc:creator>
|
||||||
|
<dc:description></dc:description>
|
||||||
|
<dc:language>ja-JP</dc:language>
|
||||||
|
<cp:lastModifiedBy></cp:lastModifiedBy>
|
||||||
|
<dcterms:modified xsi:type="dcterms:W3CDTF">2019-09-13T19:32:34Z</dcterms:modified>
|
||||||
|
<cp:revision>1</cp:revision>
|
||||||
|
<dc:subject></dc:subject>
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cp:coreProperties>
|
|
@ -9,7 +9,7 @@ impl ContentTypes {
|
||||||
|
|
||||||
pub fn build(&self) -> Vec<u8> {
|
pub fn build(&self) -> Vec<u8> {
|
||||||
let b = XMLBuilder::new();
|
let b = XMLBuilder::new();
|
||||||
b.declaration()
|
b.declaration(None)
|
||||||
.open_types("http://schemas.openxmlformats.org/package/2006/content-types")
|
.open_types("http://schemas.openxmlformats.org/package/2006/content-types")
|
||||||
.add_override(
|
.add_override(
|
||||||
"/_rels/.rels",
|
"/_rels/.rels",
|
||||||
|
|
|
@ -0,0 +1,113 @@
|
||||||
|
use crate::xml_builder::*;
|
||||||
|
|
||||||
|
pub struct AppProps {
|
||||||
|
config: Option<AppPropsConfig>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct AppPropsConfig {
|
||||||
|
template: Option<&'static str>,
|
||||||
|
total_time: Option<usize>,
|
||||||
|
application: Option<&'static str>,
|
||||||
|
pages: Option<usize>,
|
||||||
|
words: Option<usize>,
|
||||||
|
characters: Option<usize>,
|
||||||
|
characters_with_spaces: Option<usize>,
|
||||||
|
paragraphs: Option<usize>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AppProps {
|
||||||
|
pub fn new(config: Option<AppPropsConfig>) -> AppProps {
|
||||||
|
AppProps { config }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn build(&self) -> Vec<u8> {
|
||||||
|
let b = XMLBuilder::new();
|
||||||
|
let base = b.declaration(Some(true)).open_properties(
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties",
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes",
|
||||||
|
);
|
||||||
|
|
||||||
|
let convert = |v: usize| format!("{}", v);
|
||||||
|
let default = || "".to_owned();
|
||||||
|
|
||||||
|
if let Some(c) = &self.config {
|
||||||
|
base.template(c.template.map_or_else(|| "", |v| v))
|
||||||
|
.total_time(&c.total_time.map_or_else(default, convert))
|
||||||
|
.application(c.application.map_or_else(|| "", |v| v))
|
||||||
|
.pages(&c.pages.map_or_else(default, convert))
|
||||||
|
.words(&c.words.map_or_else(default, convert))
|
||||||
|
.characters(&c.characters.map_or_else(default, convert))
|
||||||
|
.characters_with_spaces(&c.characters_with_spaces.map_or_else(default, convert))
|
||||||
|
.paragraphs(&c.paragraphs.map_or_else(default, convert))
|
||||||
|
.close()
|
||||||
|
.build()
|
||||||
|
} else {
|
||||||
|
base.template("")
|
||||||
|
.total_time("")
|
||||||
|
.application("")
|
||||||
|
.pages("")
|
||||||
|
.words("")
|
||||||
|
.characters("")
|
||||||
|
.characters_with_spaces("")
|
||||||
|
.paragraphs("")
|
||||||
|
.close()
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
use std::str;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_default_doc_props_app_build() {
|
||||||
|
let c = AppProps::new(None);
|
||||||
|
let b = c.build();
|
||||||
|
assert_eq!(
|
||||||
|
str::from_utf8(&b).unwrap(),
|
||||||
|
r#"<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
|
||||||
|
<Template></Template>
|
||||||
|
<TotalTime></TotalTime>
|
||||||
|
<Application></Application>
|
||||||
|
<Pages></Pages>
|
||||||
|
<Words></Words>
|
||||||
|
<Characters></Characters>
|
||||||
|
<CharactersWithSpaces></CharactersWithSpaces>
|
||||||
|
<Paragraphs></Paragraphs>
|
||||||
|
</Properties>"#
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_configured_doc_props_app_build() {
|
||||||
|
let c = AppProps::new(Some(AppPropsConfig {
|
||||||
|
template: Some("temp"),
|
||||||
|
total_time: Some(10),
|
||||||
|
application: Some("Lawgue beta1.0"),
|
||||||
|
pages: Some(1),
|
||||||
|
words: Some(20),
|
||||||
|
characters: Some(10),
|
||||||
|
characters_with_spaces: Some(22),
|
||||||
|
paragraphs: Some(30),
|
||||||
|
}));
|
||||||
|
let b = c.build();
|
||||||
|
assert_eq!(
|
||||||
|
str::from_utf8(&b).unwrap(),
|
||||||
|
r#"<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
|
||||||
|
<Template>temp</Template>
|
||||||
|
<TotalTime>10</TotalTime>
|
||||||
|
<Application>Lawgue beta1.0</Application>
|
||||||
|
<Pages>1</Pages>
|
||||||
|
<Words>20</Words>
|
||||||
|
<Characters>10</Characters>
|
||||||
|
<CharactersWithSpaces>22</CharactersWithSpaces>
|
||||||
|
<Paragraphs>30</Paragraphs>
|
||||||
|
</Properties>"#
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
mod app;
|
||||||
|
|
||||||
|
pub use app::*;
|
||||||
|
|
||||||
|
pub(crate) struct DocProps {
|
||||||
|
app: AppProps,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DocProps {
|
||||||
|
pub(crate) fn new(appConfig: Option<AppPropsConfig>) -> DocProps {
|
||||||
|
let app = AppProps::new(appConfig);
|
||||||
|
DocProps { app }
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,19 +1,27 @@
|
||||||
mod content_types;
|
mod content_types;
|
||||||
|
mod doc_props;
|
||||||
mod rels;
|
mod rels;
|
||||||
mod xml_document;
|
mod xml_document;
|
||||||
|
|
||||||
use content_types::*;
|
use content_types::*;
|
||||||
|
use doc_props::*;
|
||||||
use rels::*;
|
use rels::*;
|
||||||
|
|
||||||
pub(crate) struct Document {
|
pub(crate) struct Document {
|
||||||
content_type: ContentTypes,
|
content_type: ContentTypes,
|
||||||
rels: Rels,
|
rels: Rels,
|
||||||
|
doc_props: DocProps,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Document {
|
impl Document {
|
||||||
pub fn new() -> Document {
|
pub fn new() -> Document {
|
||||||
let content_type = ContentTypes::new();
|
let content_type = ContentTypes::new();
|
||||||
let rels = Rels::new();
|
let rels = Rels::new();
|
||||||
Document { content_type, rels }
|
let doc_props = DocProps::new(None /* TODO: */);
|
||||||
|
Document {
|
||||||
|
content_type,
|
||||||
|
rels,
|
||||||
|
doc_props,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ impl Rels {
|
||||||
|
|
||||||
pub fn build(&self) -> Vec<u8> {
|
pub fn build(&self) -> Vec<u8> {
|
||||||
let b = XMLBuilder::new();
|
let b = XMLBuilder::new();
|
||||||
b.declaration()
|
b.declaration(None)
|
||||||
.open_relationships("http://schemas.openxmlformats.org/package/2006/relationships")
|
.open_relationships("http://schemas.openxmlformats.org/package/2006/relationships")
|
||||||
.relationship(
|
.relationship(
|
||||||
"rId1",
|
"rId1",
|
||||||
|
|
|
@ -3,12 +3,12 @@ use super::XMLBuilder;
|
||||||
impl XMLBuilder {
|
impl XMLBuilder {
|
||||||
// Build XML declaration
|
// Build XML declaration
|
||||||
// i.e. <?xml version="1.0" encoding="UTF-8"?>
|
// i.e. <?xml version="1.0" encoding="UTF-8"?>
|
||||||
pub(crate) fn declaration(mut self) -> Self {
|
pub(crate) fn declaration(mut self, standalone: Option<bool>) -> Self {
|
||||||
self.writer
|
self.writer
|
||||||
.write(super::XmlEvent::StartDocument {
|
.write(super::XmlEvent::StartDocument {
|
||||||
version: super::XmlVersion::Version10,
|
version: super::XmlVersion::Version10,
|
||||||
encoding: Some("UTF-8"),
|
encoding: Some("UTF-8"),
|
||||||
standalone: None,
|
standalone,
|
||||||
})
|
})
|
||||||
.expect("should write to buf");
|
.expect("should write to buf");
|
||||||
self
|
self
|
||||||
|
@ -24,7 +24,7 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_declaration() {
|
fn test_declaration() {
|
||||||
let b = XMLBuilder::new();
|
let b = XMLBuilder::new();
|
||||||
let r = b.declaration().build();
|
let r = b.declaration(None).build();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
str::from_utf8(&r).unwrap(),
|
str::from_utf8(&r).unwrap(),
|
||||||
r#"<?xml version="1.0" encoding="UTF-8"?>"#
|
r#"<?xml version="1.0" encoding="UTF-8"?>"#
|
||||||
|
|
|
@ -7,6 +7,61 @@ macro_rules! opened_el {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
($name: ident, $el_name: expr, $attr0: expr, $attr1: expr) => {
|
||||||
|
pub(crate) fn $name(mut self, arg0: &str, arg1: &str) -> Self {
|
||||||
|
self.writer
|
||||||
|
.write(super::XmlEvent::start_element($el_name).attr($attr0, arg0).attr($attr1, arg1))
|
||||||
|
.expect("should write to buf");
|
||||||
|
self
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! closed_el_with_child {
|
||||||
|
($name: ident, $el_name: expr) => {
|
||||||
|
pub(crate) fn $name(mut self, child: &str) -> Self {
|
||||||
|
self.writer
|
||||||
|
.write(super::XmlEvent::start_element($el_name))
|
||||||
|
.expect("should write to buf");
|
||||||
|
self.writer
|
||||||
|
.write(child)
|
||||||
|
.expect("should write to buf");
|
||||||
|
self.close()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
($name: ident, $el_name: expr, $attr0: expr) => {
|
||||||
|
pub(crate) fn $name(mut self, arg0: &str, child: &str) -> Self {
|
||||||
|
self.writer
|
||||||
|
.write(super::XmlEvent::start_element($el_name).attr($attr0, arg0))
|
||||||
|
.expect("should write to buf");
|
||||||
|
self.writer
|
||||||
|
.write(child)
|
||||||
|
.expect("should write to buf");
|
||||||
|
self.close()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
($name: ident, $el_name: expr, $attr0: expr, $attr1: expr) => {
|
||||||
|
pub(crate) fn $name(mut self, arg0: &str, arg1: &str, child: &str) -> Self {
|
||||||
|
self.writer
|
||||||
|
.write(super::XmlEvent::start_element($el_name).attr($attr0, arg0).attr($attr1, arg1))
|
||||||
|
.expect("should write to buf");
|
||||||
|
self.writer
|
||||||
|
.write(child)
|
||||||
|
.expect("should write to buf");
|
||||||
|
self.close()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
($name: ident, $el_name: expr, $attr0: expr, $attr1: expr, $attr2: expr) => {
|
||||||
|
pub(crate) fn $name(mut self, arg0: &str, arg1: &str, arg2: &str, child: &str) -> Self {
|
||||||
|
self.writer
|
||||||
|
.write(super::XmlEvent::start_element($el_name).attr($attr0, arg0).attr($attr1, arg1).attr($attr2, arg2))
|
||||||
|
.expect("should write to buf");
|
||||||
|
self.writer
|
||||||
|
.write(child)
|
||||||
|
.expect("should write to buf");
|
||||||
|
self.close()
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! closed_el {
|
macro_rules! closed_el {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
mod macros;
|
mod macros;
|
||||||
mod declaration;
|
mod declaration;
|
||||||
|
mod properties;
|
||||||
mod relationship;
|
mod relationship;
|
||||||
|
|
||||||
use xml::common::XmlVersion;
|
use xml::common::XmlVersion;
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
use super::XMLBuilder;
|
||||||
|
|
||||||
|
impl XMLBuilder {
|
||||||
|
// Build Properties element
|
||||||
|
// i.e. <Properties xmlns:vt="http://schemas.openxmlformats.org/package/2006/relationships">
|
||||||
|
opened_el!(open_properties, "Properties", "xmlns", "xmlns:vt");
|
||||||
|
|
||||||
|
closed_el_with_child!(template, "Template");
|
||||||
|
closed_el_with_child!(total_time, "TotalTime");
|
||||||
|
closed_el_with_child!(application, "Application");
|
||||||
|
closed_el_with_child!(pages, "Pages");
|
||||||
|
closed_el_with_child!(words, "Words");
|
||||||
|
closed_el_with_child!(characters, "Characters");
|
||||||
|
closed_el_with_child!(characters_with_spaces, "CharactersWithSpaces");
|
||||||
|
closed_el_with_child!(paragraphs, "Paragraphs");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
|
||||||
|
use super::XMLBuilder;
|
||||||
|
use std::str;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_properties() {
|
||||||
|
let b = XMLBuilder::new();
|
||||||
|
let r = b
|
||||||
|
.open_properties("http://example", "http://example2")
|
||||||
|
.text("child")
|
||||||
|
.close()
|
||||||
|
.build();
|
||||||
|
assert_eq!(
|
||||||
|
str::from_utf8(&r).unwrap(),
|
||||||
|
r#"<Properties xmlns="http://example" xmlns:vt="http://example2">child</Properties>"#
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_template() {
|
||||||
|
let b = XMLBuilder::new();
|
||||||
|
let r = b.template("0").build();
|
||||||
|
assert_eq!(str::from_utf8(&r).unwrap(), r#"<Template>0</Template>"#);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_application() {
|
||||||
|
let b = XMLBuilder::new();
|
||||||
|
let r = b.template("Lawgue").build();
|
||||||
|
assert_eq!(
|
||||||
|
str::from_utf8(&r).unwrap(),
|
||||||
|
r#"<Application>Lawgue</Application>"#
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue