Route CLI format dispatch through shared registry

This commit is contained in:
Dylan M. Taylor committed 2026-11-13 01:42:51 -05:00
1 parent d373506feb
commit 44fd4aec60
6 files changed
+10 -6

No files matched your search

Generated
+2
View File
@@ -1675,6 +1675,7 @@ dependencies = [
name = "designcraft-cli"
version = "0.20.1"
dependencies = [
"craft-file-formats",
"designcraft-color",
"designcraft-compose",
"designcraft-doc",
@@ -1863,6 +1864,7 @@ dependencies = [
name = "designcraft-mcp"
version = "0.20.1"
dependencies = [
"craft-file-formats",
"designcraft-engine",
"designcraft-geom",
"designcraft-render",
+1
View File
@@ -22,5 +22,6 @@ designcraft-compose = { workspace = true }
designcraft-format = { workspace = true }
designcraft-pdf = { workspace = true }
designcraft-mcp = { workspace = true }
craft-file-formats = { workspace = true }
image = { workspace = true }
serde_json = { workspace = true }
+3 -3
View File
@@ -597,8 +597,8 @@ fn export(s: &mut Session, out: &str, page: usize, scale: f64) -> Result<(), Str
let img = r
.render_page(&st.doc, &s.cache, page, scale, true, &designcraft_render::RenderOptions { printing_only: true, ..Default::default() })
.ok_or("no such page")?;
let lower = out.to_lowercase();
let bytes = if lower.ends_with(".jpg") || lower.ends_with(".jpeg") { img.to_jpeg(90) } else { img.to_png() };
let jpeg = craft_file_formats::detect(out, &[]) == Some(craft_file_formats::Format::Jpeg);
let bytes = if jpeg { img.to_jpeg(90) } else { img.to_png() };
designcraft_engine::atomic::write_atomic(std::path::Path::new(out), &bytes).map_err(|e| format!("{out}: {e}"))?;
eprintln!("wrote {out} ({}×{}, {:.1} ms, {} glyphs)", img.width, img.height, t.elapsed().as_secs_f64() * 1000.0, r.stats.glyphs);
Ok(())
@@ -645,7 +645,7 @@ fn script(args: &[String]) -> Result<(), String> {
match a.as_str() {
"--in" => {
let p = val()?;
let cmd = if p.to_lowercase().ends_with(".idml") { "file.openIdml" } else { "file.open" };
let cmd = if craft_file_formats::detect(&p, &[]) == Some(craft_file_formats::Format::Idml) { "file.openIdml" } else { "file.open" };
setup.push((cmd.into(), json!({"path": p})));
}
"--sample" => setup.push(("file.newSample".into(), json!({}))),
+1 -1
View File
@@ -130,7 +130,7 @@ impl ChapterBatch {
fn writable_chapter(s: &Session, path: &str, command: &'static str) -> Result<()> {
use std::path::Path;
if Path::new(path).extension().and_then(std::ffi::OsStr::to_str).is_some_and(|ext| ext.eq_ignore_ascii_case("idml")) {
if Path::new(path).extension().and_then(std::ffi::OsStr::to_str).is_some_and(|ext| craft_file_formats::from_extension(ext) == Some(craft_file_formats::Format::Idml)) {
return Err(bad(command, format!("cannot change imported IDML chapter {path}; convert it to a native DesignCraft document first")));
}
let target = crate::io::canonicalize(path).map_err(|e| EngineError::Other(format!("{path}: {e}")))?;
+1
View File
@@ -12,6 +12,7 @@ workspace = true
designcraft-engine = { workspace = true }
designcraft-render = { workspace = true }
designcraft-tools = { workspace = true }
craft-file-formats = { workspace = true }
designcraft-geom = { workspace = true }
serde_json = { workspace = true }
log = { workspace = true }
+2 -2
View File
@@ -259,8 +259,8 @@ impl Headless {
.renderer
.render_page(&st.doc, &self.session.cache, page, scale, false, &RenderOptions { printing_only: true, ..Default::default() })
.ok_or_else(|| format!("no page {page}"))?;
let lower = path.to_ascii_lowercase();
let bytes = if lower.ends_with(".jpg") || lower.ends_with(".jpeg") { img.to_jpeg(90) } else { img.to_png() };
let jpeg = craft_file_formats::detect(path, &[]) == Some(craft_file_formats::Format::Jpeg);
let bytes = if jpeg { img.to_jpeg(90) } else { img.to_png() };
designcraft_engine::io::write_file(path, &bytes)?;
Ok(json!({"path": path, "width": img.width, "height": img.height}))
}