use crate::ooxml::error::Result;
use crate::ooxml::opc::packuri::PackURI;
use crate::ooxml::opc::OpcPackage;
use crate::ooxml::pptx::parts::{PresentationPart, SlideMasterPart, SlidePart};
use crate::ooxml::pptx::slide::{Slide, SlideMaster};
pub struct Presentation<'a> {
part: PresentationPart<'a>,
package: &'a OpcPackage,
}
impl<'a> Presentation<'a> {
#[inline]
pub(crate) fn new(part: PresentationPart<'a>, package: &'a OpcPackage) -> Self {
Self { part, package }
}
pub fn slide_count(&self) -> Result<usize> {
self.part.slide_count()
}
pub fn slide_width(&self) -> Result<Option<i64>> {
self.part.slide_width()
}
pub fn slide_height(&self) -> Result<Option<i64>> {
self.part.slide_height()
}
pub fn slides(&self) -> Result<Vec<Slide<'a>>> {
let slide_rids = self.part.slide_rids()?;
let mut slides = Vec::with_capacity(slide_rids.len());
let pres_part = self.part.part();
for rid in slide_rids {
let target_ref = pres_part.target_ref(&rid)?;
let base_uri = pres_part.partname().base_uri();
let target_partname = PackURI::from_rel_ref(base_uri, target_ref)
.map_err(crate::ooxml::error::OoxmlError::InvalidFormat)?;
let related_part = self.package.get_part(&target_partname)?;
let slide_part = SlidePart::from_part(related_part)?;
slides.push(Slide::new(slide_part));
}
Ok(slides)
}
pub fn slide_masters(&self) -> Result<Vec<SlideMaster<'a>>> {
let master_rids = self.part.slide_master_rids()?;
let mut masters = Vec::with_capacity(master_rids.len());
let pres_part = self.part.part();
for rid in master_rids {
let target_ref = pres_part.target_ref(&rid)?;
let base_uri = pres_part.partname().base_uri();
let target_partname = PackURI::from_rel_ref(base_uri, target_ref)
.map_err(crate::ooxml::error::OoxmlError::InvalidFormat)?;
let related_part = self.package.get_part(&target_partname)?;
let master_part = SlideMasterPart::from_part(related_part)?;
masters.push(SlideMaster::new(master_part));
}
Ok(masters)
}
#[inline]
pub fn part(&self) -> &PresentationPart<'a> {
&self.part
}
#[inline]
pub fn package(&self) -> &'a OpcPackage {
self.package
}
}
#[cfg(test)]
mod tests {
}