use hard_xml::{XmlRead, XmlWrite};
use std::borrow::Cow;
use crate::{
__define_enum, __define_struct, __define_struct_vec, __setter, __xml_test_suites,
formatting::{Borders, Indent, Justification, NumberingProperty, Spacing, WidowControl},
};
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:pPr")]
pub struct ParagraphProperty<'a> {
#[xml(child = "w:pStyle")]
pub style_id: Option<ParagraphStyleId<'a>>,
#[xml(child = "w:keepNext")]
pub keep_next: Option<KeepNext>,
#[xml(child = "w:keepLines")]
pub keep_lines: Option<KeepLines>,
#[xml(child = "w:pageBreakBefore")]
pub page_break_before: Option<PageBreakBefore>,
#[xml(child = "w:widowControl")]
pub widow_control: Option<WidowControl>,
#[xml(child = "w:numPr")]
pub numbering: Option<NumberingProperty<'a>>,
#[xml(child = "w:suppressLineNumbers")]
pub suppress_line_numbers: Option<SuppressLineNumbers>,
#[xml(child = "w:pBdr")]
pub border: Option<Borders<'a>>,
#[xml(child = "w:shd")]
pub shading: Option<super::Shading<'a>>,
#[xml(child = "w:tabs")]
pub tabs: Option<CustomTabStopSet>,
#[xml(child = "w:suppressAutoHyphens")]
pub suppress_auto_hyphens: Option<SuppressAutoHyphens>,
#[xml(child = "w:kinsoku")]
pub kinsoku: Option<Kinsoku>,
#[xml(child = "w:wordWrap")]
pub word_wrap: Option<WordWrap>,
#[xml(child = "w:overflowPunct")]
pub overflow_punct: Option<OverflowPunct>,
#[xml(child = "w:topLinePunct")]
pub top_line_punct: Option<TopLinePunct>,
#[xml(child = "w:autoSpaceDE")]
pub auto_space_de: Option<AutoSpaceDE>,
#[xml(child = "w:autoSpaceDN")]
pub auto_space_dn: Option<AutoSpaceDN>,
#[xml(child = "w:bidi")]
pub bidi: Option<Bidi>,
#[xml(child = "w:adjustRightInd")]
pub adjust_right_ind: Option<AdjustRightInd>,
#[xml(child = "w:snapToGrid")]
pub snap_to_grid: Option<SnapToGrid>,
#[xml(child = "w:spacing")]
pub spacing: Option<Spacing>,
#[xml(child = "w:ind")]
pub indent: Option<Indent>,
#[xml(child = "w:contextualSpacing")]
pub contextual_spacing: Option<ContextualSpacing>,
#[xml(child = "w:mirrorIndents")]
pub mirror_indents: Option<MirrorIndents>,
#[xml(child = "w:suppressOverlap")]
pub suppress_overlap: Option<SuppressOverlap>,
#[xml(child = "w:jc")]
pub justification: Option<Justification>,
#[xml(child = "w:textDirection")]
pub text_direction: Option<super::TextDirection>,
#[xml(child = "w:textAlignment")]
pub text_alignment: Option<super::TextAlignment>,
#[xml(child = "w:textboxTightWrap")]
pub textbox_tight_wrap: Option<super::TextboxTightWrap>,
#[xml(child = "w:outlineLvl")]
pub outline_lvl: Option<OutlineLvl>,
#[xml(child = "w:divId")]
pub div_id: Option<DivId>,
#[xml(child = "w:cnfStyle")]
pub cnf_style: Option<CnfStyle<'a>>,
#[xml(child = "w:rPr")]
pub r_pr: Option<super::CharacterProperty<'a>>,
#[xml(child = "w:sectPr")]
pub section_property: Option<SectionProperty<'a>>,
#[xml(child = "w:pPrChange")]
pub p_pr_change: Option<RevisionParagraphProperty<'a>>,
}
impl<'a> ParagraphProperty<'a> {
__setter!(style_id: Option<ParagraphStyleId<'a>>);
__setter!(justification: Option<Justification>);
__setter!(border: Option<Borders<'a>>);
__setter!(numbering: Option<NumberingProperty<'a>>);
__setter!(spacing: Option<Spacing>);
__setter!(indent: Option<Indent>);
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:pStyle")]
pub struct ParagraphStyleId<'a> {
#[xml(attr = "w:val")]
pub value: Cow<'a, str>,
}
impl<'a, T: Into<Cow<'a, str>>> From<T> for ParagraphStyleId<'a> {
fn from(val: T) -> Self {
ParagraphStyleId { value: val.into() }
}
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:keepNext")]
pub struct KeepNext {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:keepLines")]
pub struct KeepLines {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:pageBreakBefore")]
pub struct PageBreakBefore {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:suppressLineNumbers")]
pub struct SuppressLineNumbers {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:suppressAutoHyphens")]
pub struct SuppressAutoHyphens {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:kinsoku")]
pub struct Kinsoku {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:wordWrap")]
pub struct WordWrap {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:overflowPunct")]
pub struct OverflowPunct {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:topLinePunct")]
pub struct TopLinePunct {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:autoSpaceDE")]
pub struct AutoSpaceDE {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:autoSpaceDN")]
pub struct AutoSpaceDN {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:bidi")]
pub struct Bidi {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:adjustRightInd")]
pub struct AdjustRightInd {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:snapToGrid")]
pub struct SnapToGrid {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:contextualSpacing")]
pub struct ContextualSpacing {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:mirrorIndents")]
pub struct MirrorIndents {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:suppressOverlap")]
pub struct SuppressOverlap {
#[xml(attr = "w:val")]
pub value: Option<bool>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:outlineLvl")]
pub struct OutlineLvl {
#[xml(attr = "w:val")]
pub value: isize,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:divId")]
pub struct DivId {
#[xml(attr = "w:val")]
pub value: isize,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:cnfStyle")]
pub struct CnfStyle<'a> {
#[xml(attr = "w:val")]
pub value: Cow<'a, str>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:pPrChange")]
pub struct RevisionParagraphProperty<'a> {
#[xml(attr = "w:id")]
pub id: isize,
#[xml(attr = "w:author")]
pub author: Cow<'a, str>,
#[xml(attr = "w:date")]
pub date: Option<Cow<'a, str>>,
#[xml(child = "w:pPr")]
pub previous_property: Option<PreviousParagraphProperty<'a>>,
}
#[derive(Debug, Default, XmlRead, XmlWrite, Clone)]
#[cfg_attr(test, derive(PartialEq))]
#[xml(tag = "w:pPr")]
pub struct PreviousParagraphProperty<'a> {
#[xml(child = "w:pStyle")]
pub style_id: Option<ParagraphStyleId<'a>>,
#[xml(child = "w:keepNext")]
pub keep_next: Option<KeepNext>,
#[xml(child = "w:keepLines")]
pub keep_lines: Option<KeepLines>,
#[xml(child = "w:pageBreakBefore")]
pub page_break_before: Option<PageBreakBefore>,
#[xml(child = "w:widowControl")]
pub widow_control: Option<WidowControl>,
#[xml(child = "w:numPr")]
pub numbering: Option<NumberingProperty<'a>>,
#[xml(child = "w:suppressLineNumbers")]
pub suppress_line_numbers: Option<SuppressLineNumbers>,
#[xml(child = "w:pBdr")]
pub border: Option<Borders<'a>>,
#[xml(child = "w:shd")]
pub shading: Option<super::Shading<'a>>,
#[xml(child = "w:tabs")]
pub tabs: Option<CustomTabStopSet>,
#[xml(child = "w:suppressAutoHyphens")]
pub suppress_auto_hyphens: Option<SuppressAutoHyphens>,
#[xml(child = "w:kinsoku")]
pub kinsoku: Option<Kinsoku>,
#[xml(child = "w:wordWrap")]
pub word_wrap: Option<WordWrap>,
#[xml(child = "w:overflowPunct")]
pub overflow_punct: Option<OverflowPunct>,
#[xml(child = "w:topLinePunct")]
pub top_line_punct: Option<TopLinePunct>,
#[xml(child = "w:autoSpaceDE")]
pub auto_space_de: Option<AutoSpaceDE>,
#[xml(child = "w:autoSpaceDN")]
pub auto_space_dn: Option<AutoSpaceDN>,
#[xml(child = "w:bidi")]
pub bidi: Option<Bidi>,
#[xml(child = "w:adjustRightInd")]
pub adjust_right_ind: Option<AdjustRightInd>,
#[xml(child = "w:snapToGrid")]
pub snap_to_grid: Option<SnapToGrid>,
#[xml(child = "w:spacing")]
pub spacing: Option<Spacing>,
#[xml(child = "w:ind")]
pub indent: Option<Indent>,
#[xml(child = "w:contextualSpacing")]
pub contextual_spacing: Option<ContextualSpacing>,
#[xml(child = "w:mirrorIndents")]
pub mirror_indents: Option<MirrorIndents>,
#[xml(child = "w:suppressOverlap")]
pub suppress_overlap: Option<SuppressOverlap>,
#[xml(child = "w:jc")]
pub justification: Option<Justification>,
#[xml(child = "w:textDirection")]
pub text_direction: Option<super::TextDirection>,
#[xml(child = "w:textAlignment")]
pub text_alignment: Option<super::TextAlignment>,
#[xml(child = "w:textboxTightWrap")]
pub textbox_tight_wrap: Option<super::TextboxTightWrap>,
#[xml(child = "w:outlineLvl")]
pub outline_lvl: Option<OutlineLvl>,
#[xml(child = "w:divId")]
pub div_id: Option<DivId>,
#[xml(child = "w:cnfStyle")]
pub cnf_style: Option<CnfStyle<'a>>,
}
__define_enum! {
TabStopType {
Clear = "clear", Left = "left", Center = "center", Right = "right", Decimal = "decimal", Bar = "bar", Num = "num", }
}
__define_enum! {
TabLeaderCharacter {
None = "none", Dot = "dot", Hyphen = "hyphen", Underscore = "underscore", Heavy = "heavy", MiddleDot = "middleDot", }
}
__define_struct! {
("w:tab", CustomTabStop) {
"w:val", tab_stop_type, TabStopType
"w:leader", leader, TabLeaderCharacter
"w:pos", pos, isize
}
}
__define_struct_vec! {
("w:tabs", CustomTabStopSet, CustomTabStopSetChoice) {} {
"w:tab", CustomTabStop
}
}
#[cfg(test)]
use crate::formatting::JustificationVal;
use super::SectionProperty;
__xml_test_suites!(
ParagraphProperty,
ParagraphProperty::default(),
r#"<w:pPr/>"#,
ParagraphProperty::default().style_id("id"),
r#"<w:pPr><w:pStyle w:val="id"/></w:pPr>"#,
ParagraphProperty::default().justification(JustificationVal::Start),
r#"<w:pPr><w:jc w:val="start"/></w:pPr>"#,
ParagraphProperty::default().border(Borders::default()),
r#"<w:pPr><w:pBdr/></w:pPr>"#,
ParagraphProperty::default().numbering(NumberingProperty::default()),
r#"<w:pPr><w:numPr/></w:pPr>"#,
);