Merge PR #1075: Indent table rows in outline export so they stay on their slide

This commit is contained in:
aiongg
2026-10-24 06:17:37 +00:00
+31
View File
@@ -661,6 +661,7 @@ pub fn slides_to_outline(p: &Presentation) -> String {
if let ShapeKind::Table(t) = &sh.kind {
for row in &t.rows {
let cells: Vec<String> = row.cells.iter().map(|c| c.text.text().replace(['\u{b}', '\n'], " ")).collect();
out.push('\t');
out.push_str(&cells.join("\t"));
out.push('\n');
}
@@ -1100,3 +1101,33 @@ mod tests {
assert!(out.contains("Cell A2\tCell B2"), "{out}");
}
}
#[test]
fn outline_table_rows_are_indented_and_do_not_become_slides() {
use deckcraft_model::table::{Cell, Row, Table};
use deckcraft_model::{Shape, ShapeKind, Xfrm};
let mut p = defaults::new_presentation(None);
let layout = defaults::layout_of_kind(&p, LayoutType::TitleAndContent).unwrap();
let mut s = defaults::new_slide(&mut p, layout).expect("slide");
for sh in s.shapes.iter_mut().filter(|sh| sh.ph_type().is_some_and(|k| k.is_title())) {
sh.text = Some(TextBody::from_text("Slide title"));
}
let mut table = Table { cols: vec![200.0, 200.0], ..Default::default() };
for texts in [["A1", "B1"], ["A2", "B2"]] {
let cells: Vec<Cell> = texts.iter().map(|t| Cell { text: TextBody::from_text(t), ..Default::default() }).collect();
table.rows.push(Row { height: 30.0, cells });
}
let mut tbl = Shape { xfrm: Some(Xfrm::new(0.0, 100.0, 400.0, 60.0)), ..Default::default() };
tbl.kind = ShapeKind::Table(table);
s.shapes.push(tbl);
p.slides = vec![std::sync::Arc::new(s)];
let out = slides_to_outline(&p);
let mut q = defaults::new_presentation(None);
q.slides.clear();
assert_eq!(outline_to_slides(&mut q, &out), 1, "table rows became slides: {out:?}");
assert_eq!(q.slides.len(), 1, "{out:?}");
let body = q.slides[0].shapes.iter().filter_map(|sh| sh.text.as_ref()).map(|t| t.text()).collect::<Vec<_>>().join("\n");
assert!(body.contains("A1\tB1"), "{body:?}");
assert!(body.contains("A2\tB2"), "{body:?}");
}