use crate::common::Result;
use crate::presentation::{Presentation, Slide};
use super::config::MarkdownOptions;
use super::traits::ToMarkdown;
use super::writer::MarkdownWriter;
impl ToMarkdown for Presentation {
fn to_markdown_with_options(&self, options: &MarkdownOptions) -> Result<String> {
let mut writer = MarkdownWriter::new(options.clone());
let slides = self.slides()?;
for (i, slide) in slides.iter().enumerate() {
if i > 0 {
writer.push_str("\n\n---\n\n");
}
let slide_title = extract_slide_title(slide)?;
let header_text = if slide_title.is_empty() {
format!("# Slide {}", i + 1)
} else {
format!("# Slide {} {}", i + 1, slide_title)
};
writer.write_fmt(format_args!("{}\n", header_text))?;
writer.push('\n');
write_slide_content(&mut writer, slide, options)?;
}
Ok(writer.finish())
}
}
fn extract_slide_title(slide: &Slide) -> Result<String> {
match slide {
Slide::Ppt(_) => {
let text = slide.text()?;
let first_line = text.lines().next().unwrap_or("");
Ok(first_line.to_string())
}
Slide::Pptx(pptx_data) => {
Ok(pptx_data.name.clone().unwrap_or_default())
}
}
}
fn write_slide_content(writer: &mut MarkdownWriter, slide: &Slide, _options: &MarkdownOptions) -> Result<()> {
match slide {
Slide::Ppt(_) => {
let text = slide.text()?;
if !text.is_empty() {
writer.push_str(&text);
writer.push_str("\n\n");
}
}
Slide::Pptx(_) => {
let text = slide.text()?;
if !text.is_empty() {
writer.push_str(&text);
writer.push_str("\n\n");
}
}
}
Ok(())
}
impl ToMarkdown for Slide {
fn to_markdown_with_options(&self, _options: &MarkdownOptions) -> Result<String> {
self.text()
}
}