From d35952d37f4405e03f9b3d62c49c09fea96a0608 Mon Sep 17 00:00:00 2001 From: "duskmoon (Campbell He)" Date: Fri, 18 Jul 2025 22:31:14 +0800 Subject: [PATCH 1/2] Add --font-path to include additional fonts The args and logic are simply copied from typst-cli Fix #90 --- cli/src/args.rs | 23 +++++++++++++++++++++++ cli/src/convert.rs | 7 +++++++ cli/src/fonts.rs | 4 ++++ cli/src/main.rs | 8 +++++++- 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/cli/src/args.rs b/cli/src/args.rs index 7d666fd8..ceb9d5c7 100644 --- a/cli/src/args.rs +++ b/cli/src/args.rs @@ -1,6 +1,10 @@ use clap::{ArgAction, Parser, Subcommand}; use std::path::PathBuf; +/// The character typically used to separate path components +/// in environment variables. +const ENV_PATH_SEP: char = if cfg!(windows) { ';' } else { ':' }; + #[derive(Debug, Parser)] #[clap(about, version)] pub struct CliArguments { @@ -26,6 +30,10 @@ pub struct CliArguments { /// How much raster images of rasterized effects should be scaled up. #[clap(long, default_value = "1.5")] pub raster_scale: f32, + + /// Common font arguments. + #[command(flatten)] + pub font: FontsArgs, } // What to do. @@ -42,4 +50,19 @@ pub struct FontsCommand { /// Also lists style variants of each font family #[arg(long)] pub all: bool, + + /// Common font arguments. + #[command(flatten)] + pub font: FontsArgs, +} + +/// Common arguments to customize available fonts. +#[derive(Debug, Clone, Parser)] +pub struct FontsArgs { + /// Adds additional directories to search for fonts. + /// + /// If multiple paths are specified, they are separated by the system's path + /// separator (`:` on Unix-like systems and `;` on Windows). + #[arg(long = "font-path", value_name = "DIR", value_delimiter = ENV_PATH_SEP)] + pub font_paths: Vec, } diff --git a/cli/src/convert.rs b/cli/src/convert.rs index ce6d2b32..83e9f3b3 100644 --- a/cli/src/convert.rs +++ b/cli/src/convert.rs @@ -3,11 +3,14 @@ use std::path::{Path, PathBuf}; use std::sync::Arc; use svg2pdf::{ConversionOptions, PageOptions}; +use crate::args::FontsArgs; + pub fn convert_( input: &PathBuf, output: Option, conversion_options: ConversionOptions, page_options: PageOptions, + font_options: FontsArgs, ) -> Result<(), String> { if let Ok(()) = log::set_logger(&LOGGER) { log::set_max_level(log::LevelFilter::Warn); @@ -16,6 +19,10 @@ pub fn convert_( let mut fontdb = fontdb::Database::new(); fontdb.load_system_fonts(); + for font_path in &font_options.font_paths { + fontdb.load_fonts_dir(font_path); + } + fontdb.set_serif_family("Times New Roman"); fontdb.set_sans_serif_family("Arial"); fontdb.set_cursive_family("Comic Sans MS"); diff --git a/cli/src/fonts.rs b/cli/src/fonts.rs index a51da44f..159701b9 100644 --- a/cli/src/fonts.rs +++ b/cli/src/fonts.rs @@ -7,6 +7,10 @@ pub fn fonts(command: &FontsCommand) -> Result<(), String> { let mut fontdb = fontdb::Database::new(); fontdb.load_system_fonts(); + for font_path in &command.font.font_paths { + fontdb.load_fonts_dir(font_path); + } + // Collect the font famillies. let mut font_families: BTreeMap> = BTreeMap::new(); for face in fontdb.faces() { diff --git a/cli/src/main.rs b/cli/src/main.rs index cbb0fed5..66da8872 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -32,7 +32,13 @@ fn run() -> Result<(), String> { let page_options = PageOptions { dpi: args.dpi }; - return convert::convert_(&input, args.output, conversion_options, page_options); + return convert::convert_( + &input, + args.output, + conversion_options, + page_options, + args.font, + ); }; // Otherwise execute the command provided if any. From e0d5bc0baf26d22325e70e07ef583e22495d4b03 Mon Sep 17 00:00:00 2001 From: "duskmoon (Campbell He)" Date: Mon, 21 Jul 2025 19:41:42 +0800 Subject: [PATCH 2/2] Add --ignore-system-fonts --- cli/src/args.rs | 5 +++++ cli/src/convert.rs | 5 ++++- cli/src/fonts.rs | 5 ++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/cli/src/args.rs b/cli/src/args.rs index ceb9d5c7..bc4d9d18 100644 --- a/cli/src/args.rs +++ b/cli/src/args.rs @@ -65,4 +65,9 @@ pub struct FontsArgs { /// separator (`:` on Unix-like systems and `;` on Windows). #[arg(long = "font-path", value_name = "DIR", value_delimiter = ENV_PATH_SEP)] pub font_paths: Vec, + + /// Ensures system fonts won't be used, unless explicitly included via + /// `--font-path`. + #[arg(long)] + pub ignore_system_fonts: bool, } diff --git a/cli/src/convert.rs b/cli/src/convert.rs index 83e9f3b3..51b77a18 100644 --- a/cli/src/convert.rs +++ b/cli/src/convert.rs @@ -17,7 +17,10 @@ pub fn convert_( } let mut fontdb = fontdb::Database::new(); - fontdb.load_system_fonts(); + + if !font_options.ignore_system_fonts { + fontdb.load_system_fonts(); + } for font_path in &font_options.font_paths { fontdb.load_fonts_dir(font_path); diff --git a/cli/src/fonts.rs b/cli/src/fonts.rs index 159701b9..571616e4 100644 --- a/cli/src/fonts.rs +++ b/cli/src/fonts.rs @@ -5,7 +5,10 @@ use std::collections::BTreeMap; pub fn fonts(command: &FontsCommand) -> Result<(), String> { // Prepare the font database. let mut fontdb = fontdb::Database::new(); - fontdb.load_system_fonts(); + + if !command.font.ignore_system_fonts { + fontdb.load_system_fonts(); + } for font_path in &command.font.font_paths { fontdb.load_fonts_dir(font_path);