pub(super) const MIN_PARAGRAPH_CHARS: usize = 10;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum PageBreakSignal {
Explicit,
Section,
Rendered,
None,
}
#[derive(Debug, Clone)]
pub(super) struct ParagraphEvent {
pub text: String,
pub signal: PageBreakSignal,
pub is_heading: bool,
pub heading_level: Option<u32>,
pub is_list: bool,
pub is_table: bool,
}
#[derive(Debug, Clone)]
pub(super) struct IndexedParagraph {
pub index: usize,
pub text: String,
pub is_heading: bool,
pub heading_level: Option<u32>,
pub is_list: bool,
pub is_table: bool,
}
pub(super) fn docx_heading_level(style: Option<&str>, outline: Option<u32>) -> Option<u32> {
if let Some(raw) = style {
let lower = raw.to_ascii_lowercase();
let prefixes: &[(&str, u32)] = &[
("heading", 1),
("titre", 1),
("überschrift", 1),
("title", 1),
];
for (prefix, default_level) in prefixes {
if let Some(rest) = lower.strip_prefix(prefix) {
let digits: String = rest.chars().take_while(|c| c.is_ascii_digit()).collect();
if let Ok(n) = digits.parse::<u32>() {
if n > 0 {
return Some(n);
}
}
return Some(*default_level);
}
}
}
outline.map(|n| n + 1)
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum DocxBlockKind {
Paragraph,
Table,
}
#[derive(Debug, Clone)]
pub(super) struct DocxBlock {
pub kind: DocxBlockKind,
pub text: String,
pub has_drawing: bool,
pub is_list: bool,
pub list_level: u8,
pub heading_style: Option<String>,
pub outline_level: Option<u32>,
pub page_break: bool,
pub section_break: bool,
pub rendered_page_break: bool,
pub image_alt: Option<String>,
pub image_rid: Option<String>,
pub images: Vec<(String, Option<String>)>,
pub footnote_refs: Vec<String>,
pub endnote_refs: Vec<String>,
pub num_id: Option<u32>,
pub hyperlinks: Vec<(String, String)>,
}