Skip to main content

dais_core/
slide_group.rs

1/// A logical slide group — one or more PDF pages representing build steps
2/// of a single logical slide.
3#[derive(Debug, Clone)]
4pub struct SlideGroup {
5    /// 0-based logical slide index.
6    pub logical_index: usize,
7    /// Raw PDF page indices belonging to this group (ordered).
8    pub pages: Vec<usize>,
9    /// Markdown notes for this logical slide, if any.
10    pub notes: Option<String>,
11}
12
13/// How the grouping information was obtained.
14#[derive(Debug, Clone, Copy, PartialEq, Eq)]
15pub enum GroupingSource {
16    /// `Polylux`/touying/pdfpc LaTeX package metadata embedded in the PDF.
17    EmbeddedMetadata,
18    /// Explicit grouping from a `.pdfpc` sidecar file.
19    SidecarFile,
20    /// User-set via the manual grouping editor.
21    Manual,
22    /// No grouping — 1:1 page-to-slide mapping.
23    None,
24}
25
26/// Build a default 1:1 page-to-slide grouping for a document with `page_count` pages.
27pub fn default_grouping(page_count: usize) -> Vec<SlideGroup> {
28    (0..page_count).map(|i| SlideGroup { logical_index: i, pages: vec![i], notes: None }).collect()
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34
35    #[test]
36    fn default_grouping_creates_one_group_per_page() {
37        let groups = default_grouping(5);
38        assert_eq!(groups.len(), 5);
39        for (i, group) in groups.iter().enumerate() {
40            assert_eq!(group.logical_index, i);
41            assert_eq!(group.pages, vec![i]);
42            assert!(group.notes.is_none());
43        }
44    }
45
46    #[test]
47    fn default_grouping_empty_document() {
48        let groups = default_grouping(0);
49        assert!(groups.is_empty());
50    }
51}