use crate::model::dimension::{Dimension, Twips};
use super::formatting::{
Alignment, CnfStyle, HeightRule, ParagraphBorders, Shading, TabStop, TableAnchor, TableXAlign,
TableYAlign, TextAlignment,
};
use super::identifiers::{ParagraphRevisionIds, StyleId};
use super::run_properties::RunProperties;
use super::content::Inline;
#[derive(Clone, Debug)]
pub struct Paragraph {
pub style_id: Option<StyleId>,
pub properties: ParagraphProperties,
pub mark_run_properties: Option<RunProperties>,
pub content: Vec<Inline>,
pub rsids: ParagraphRevisionIds,
}
#[derive(Clone, Debug, Default)]
pub struct ParagraphProperties {
pub alignment: Option<Alignment>,
pub indentation: Option<Indentation>,
pub spacing: Option<ParagraphSpacing>,
pub numbering: Option<NumberingReference>,
pub tabs: Vec<TabStop>,
pub borders: Option<ParagraphBorders>,
pub shading: Option<Shading>,
pub keep_next: Option<bool>,
pub keep_lines: Option<bool>,
pub widow_control: Option<bool>,
pub page_break_before: Option<bool>,
pub suppress_auto_hyphens: Option<bool>,
pub contextual_spacing: Option<bool>,
pub bidi: Option<bool>,
pub word_wrap: Option<bool>,
pub outline_level: Option<OutlineLevel>,
pub text_alignment: Option<TextAlignment>,
pub cnf_style: Option<CnfStyle>,
pub frame_properties: Option<FrameKind>,
pub auto_space_de: Option<bool>,
pub auto_space_dn: Option<bool>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum FrameKind {
DropCap {
style: DropCap,
lines: u32,
h_space: Option<Dimension<Twips>>,
},
TextBox(TextBoxPositioning),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum DropCap {
Drop,
Margin,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
pub struct TextBoxPositioning {
pub width: Option<Dimension<Twips>>,
pub height: Option<Dimension<Twips>>,
pub height_rule: Option<HeightRule>,
pub h_space: Option<Dimension<Twips>>,
pub v_space: Option<Dimension<Twips>>,
pub wrap: Option<FrameWrap>,
pub h_anchor: Option<TableAnchor>,
pub v_anchor: Option<TableAnchor>,
pub x: Option<Dimension<Twips>>,
pub x_align: Option<TableXAlign>,
pub y: Option<Dimension<Twips>>,
pub y_align: Option<TableYAlign>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum FrameWrap {
Auto,
NotBeside,
Around,
Tight,
Through,
None,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct OutlineLevel(u8);
impl OutlineLevel {
pub fn new(level: u8) -> Self {
assert!((1..=9).contains(&level), "outline level must be 1..=9");
Self(level)
}
pub fn from_ooxml(val: u8) -> Option<Self> {
if val <= 8 {
Some(Self(val + 1))
} else {
None
}
}
pub fn value(self) -> u8 {
self.0
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
pub struct Indentation {
pub start: Option<Dimension<Twips>>,
pub end: Option<Dimension<Twips>>,
pub first_line: Option<FirstLineIndent>,
pub mirror: Option<bool>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum FirstLineIndent {
None,
FirstLine(Dimension<Twips>),
Hanging(Dimension<Twips>),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
pub struct ParagraphSpacing {
pub before: Option<Dimension<Twips>>,
pub after: Option<Dimension<Twips>>,
pub line: Option<LineSpacing>,
pub before_auto_spacing: Option<bool>,
pub after_auto_spacing: Option<bool>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum LineSpacing {
Auto(Dimension<Twips>),
Exact(Dimension<Twips>),
AtLeast(Dimension<Twips>),
}
#[derive(Clone, Copy, Debug)]
pub struct NumberingReference {
pub num_id: i64,
pub level: u8,
}