This commit is contained in:
Brandon Thomas
2026-10-14 22:05:13 -04:00
3 changed files with 18 additions and 2 deletions
+1 -1
View File
@@ -384,7 +384,7 @@ impl Document {
return Ok(vec![]);
}
let n = self.page_count();
let at = after.map_or(0, |a| (a + 1).min(n));
let at = after.map_or(0, |a| a.saturating_add(1).min(n));
let template = self.page(at.saturating_sub(1).min(n.saturating_sub(1))).cloned();
let (cols, gutter, margins) =
template.as_ref().map(|t| (t.columns.count, t.columns.gutter, t.margins)).unwrap_or((1, 12.0, Margins::uniform(36.0)));
+1 -1
View File
@@ -88,7 +88,7 @@ pub fn specs() -> Vec<CommandSpec> {
let count = p.get("count").and_then(Value::as_u64).unwrap_or(1).clamp(1, 9999) as usize;
let st = s.doc()?;
let n = st.doc.page_count();
let after = p.get("after").and_then(Value::as_u64).map(|v| v as usize).unwrap_or(n - 1);
let after = p.get("after").and_then(Value::as_u64).map(|v| usize::try_from(v).unwrap_or(usize::MAX)).unwrap_or(n.saturating_sub(1));
let parent = parent_ref(&st.doc, p.get("parent")).unwrap_or_else(|| st.doc.parents.first().map(|x| x.id));
s.edit(|d, _| {
let ids = d.insert_pages(Some(after), count, parent)?;
@@ -0,0 +1,16 @@
//! `layout.pages.insert` clamps an out-of-range `after` to the end instead of overflowing.
use designcraft_engine::Session;
use serde_json::json;
#[test]
fn insert_after_u64_max_appends_at_the_end() {
let mut s = Session::new();
s.execute("file.new", &json!({"pages":2})).unwrap();
let before: Vec<_> = s.doc().unwrap().doc.pages().map(|(_, _, p)| p.id).collect();
let out = s.execute("layout.pages.insert", &json!({"after": u64::MAX, "count": 2})).unwrap();
assert_eq!(out["total"], 4);
let after: Vec<_> = s.doc().unwrap().doc.pages().map(|(_, _, p)| p.id).collect();
assert_eq!(after.len(), 4);
assert_eq!(after[..2], before[..], "the original pages must stay first; new pages go at the end");
assert!(after[2..].iter().all(|id| !before.contains(id)));
}