From d22331c60f3c7518fdb7d9c861805a0bdc240da0 Mon Sep 17 00:00:00 2001 From: aiongg <67543387+aiongg@users.noreply.github.com> Date: Thu, 5 Nov 2026 07:50:55 +0000 Subject: [PATCH] Apply review fixes - crates/engine/src/cmd/datamerge.rs --- crates/engine/src/cmd/datamerge.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/crates/engine/src/cmd/datamerge.rs b/crates/engine/src/cmd/datamerge.rs index e834127fd..28c3be75f 100644 --- a/crates/engine/src/cmd/datamerge.rs +++ b/crates/engine/src/cmd/datamerge.rs @@ -434,7 +434,7 @@ fn overset_count(doc: &Document) -> usize { .count() } -fn add_placeholder(d: &mut Document, sel: &Selection, p: &Value, name: &str) -> Result { +fn add_placeholder(d: &mut Document, sel: &mut Selection, p: &Value, name: &str) -> Result { let (source_id, field) = { let source = d.data_merge.sources.first().ok_or_else(|| bad("data.placeholder.add", "select a data source"))?; let field = @@ -490,10 +490,21 @@ fn add_placeholder(d: &mut Document, sel: &Selection, p: &Value, name: &str) -> if role != PlaceholderRole::Text { return Err(bad("data.placeholder.add", "a hyperlink field can't go in a table cell; insert it as text")); } + if name.contains(['<', '>', '\n']) { + return Err(bad("data.placeholder.add", "this field's name can't be used in a table cell")); + } let marker = format!("<<{name}>>"); - let st = d.text_story_mut(t.story, t.cell).ok_or_else(|| bad("data.placeholder.add", "no table cell there"))?; + let cell = t.cell.map(|c| { + d.story(t.story).and_then(|st| st.tables.get(&c.table)).map_or(c, |tb| { + let (row, col) = tb.owner(c.row, c.col); + designcraft_doc::CellAddr { row, col, ..c } + }) + }); + let st = d.text_story_mut(t.story, cell).ok_or_else(|| bad("data.placeholder.add", "no table cell there"))?; let at = designcraft_doc::floor_char_boundary(&st.text, t.range().start.min(st.text.len())); st.replace(at..at, &marker); + let caret = at + marker.len(); + *sel = Selection::text(designcraft_doc::TextSel { anchor: caret, focus: caret, cell, ..t }); return Ok(json!({"cell": true, "marker": marker})); } let (story, at, end) = text_target(p, sel).ok_or_else(|| bad("data.placeholder.add", "select text or a frame"))?;