109 lines
2.8 KiB
Rust
109 lines
2.8 KiB
Rust
use crate::documents::{BuildXML, LevelJc, LevelText, NumberFormat, ParagraphProperty, Start};
|
|
use crate::types::*;
|
|
use crate::xml_builder::*;
|
|
|
|
use serde::Serialize;
|
|
|
|
#[derive(Debug, Clone, PartialEq, Serialize)]
|
|
#[serde(rename_all = "camelCase")]
|
|
pub struct Level {
|
|
pub level: usize,
|
|
pub start: Start,
|
|
pub format: NumberFormat,
|
|
pub text: LevelText,
|
|
pub jc: LevelJc,
|
|
pub pstyle: Option<String>,
|
|
pub paragraph_property: ParagraphProperty,
|
|
}
|
|
|
|
impl Level {
|
|
pub fn new(
|
|
level: usize,
|
|
start: Start,
|
|
format: NumberFormat,
|
|
text: LevelText,
|
|
jc: LevelJc,
|
|
) -> Level {
|
|
Self {
|
|
level,
|
|
start,
|
|
format,
|
|
text,
|
|
jc,
|
|
pstyle: None,
|
|
paragraph_property: ParagraphProperty::new(),
|
|
}
|
|
}
|
|
|
|
pub fn indent(
|
|
mut self,
|
|
left: usize,
|
|
special_indent: Option<SpecialIndentType>,
|
|
end: Option<usize>,
|
|
) -> Self {
|
|
self.paragraph_property = self.paragraph_property.indent(left, special_indent, end);
|
|
self
|
|
}
|
|
|
|
pub fn paragraph_style(mut self, style_id: impl Into<String>) -> Self {
|
|
self.pstyle = Some(style_id.into());
|
|
self
|
|
}
|
|
}
|
|
|
|
impl BuildXML for Level {
|
|
fn build(&self) -> Vec<u8> {
|
|
XMLBuilder::new()
|
|
.open_level(&format!("{}", self.level))
|
|
.add_child(&self.start)
|
|
.add_child(&self.format)
|
|
.add_child(&self.text)
|
|
.add_child(&self.jc)
|
|
.add_child(&self.paragraph_property)
|
|
.close()
|
|
.build()
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
|
|
use super::*;
|
|
#[cfg(test)]
|
|
use pretty_assertions::assert_eq;
|
|
use std::str;
|
|
|
|
#[test]
|
|
fn test_level() {
|
|
let b = Level::new(
|
|
1,
|
|
Start::new(1),
|
|
NumberFormat::new("decimal"),
|
|
LevelText::new("%4."),
|
|
LevelJc::new("left"),
|
|
)
|
|
.build();
|
|
assert_eq!(
|
|
str::from_utf8(&b).unwrap(),
|
|
r#"<w:lvl w:ilvl="1"><w:start w:val="1" /><w:numFmt w:val="decimal" /><w:lvlText w:val="%4." /><w:lvlJc w:val="left" /><w:pPr><w:pStyle w:val="Normal" /><w:rPr /></w:pPr></w:lvl>"#
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn test_level_indent() {
|
|
let b = Level::new(
|
|
1,
|
|
Start::new(1),
|
|
NumberFormat::new("decimal"),
|
|
LevelText::new("%4."),
|
|
LevelJc::new("left"),
|
|
)
|
|
.indent(320, Some(SpecialIndentType::Hanging(200)), None)
|
|
.build();
|
|
assert_eq!(
|
|
str::from_utf8(&b).unwrap(),
|
|
r#"<w:lvl w:ilvl="1"><w:start w:val="1" /><w:numFmt w:val="decimal" /><w:lvlText w:val="%4." /><w:lvlJc w:val="left" /><w:pPr><w:pStyle w:val="Normal" /><w:rPr /><w:ind w:left="320" w:right="0" w:hanging="200" /></w:pPr></w:lvl>"#
|
|
);
|
|
}
|
|
}
|