use std::collections::HashMap;
use crate::docx::{Block, NoteKind, ParaStyle, Section};
pub struct Blocks<'a> {
pub blocks: Vec<&'a Block>,
}
impl<'a> Blocks<'a> {
pub fn of(blocks: &'a [Block]) -> Blocks<'a> {
Blocks { blocks: blocks.iter().collect() }
}
pub fn len(&self) -> usize {
self.blocks.len()
}
pub fn is_empty(&self) -> bool {
self.blocks.is_empty()
}
pub fn get(&self, i: usize) -> Option<&'a Block> {
self.blocks.get(i).copied()
}
pub fn neighbours(&self, i: usize) -> (Option<&'a ParaStyle>, Option<&'a ParaStyle>) {
let style = |b: Option<&&'a Block>| match b {
Some(Block::Para(p)) => Some(&*p.style),
_ => None,
};
(if i > 0 { style(self.blocks.get(i - 1)) } else { None }, style(self.blocks.get(i + 1)))
}
}
pub struct SectionNode<'a> {
pub index: usize,
pub section: &'a Section,
pub blocks: Blocks<'a>,
}
#[derive(Clone, Copy)]
pub struct Notes<'a> {
pub footnotes: &'a HashMap<i64, Vec<Block>>,
pub endnotes: &'a HashMap<i64, Vec<Block>>,
pub separators: &'a HashMap<String, Vec<Block>>,
}
impl<'a> Notes<'a> {
pub fn blocks(&self, kind: NoteKind, id: i64) -> Option<&'a Vec<Block>> {
match kind {
NoteKind::Foot => self.footnotes.get(&id),
NoteKind::End => self.endnotes.get(&id),
}
}
}