use std::fs;
pub fn create_figure(
content: &str,
dest_folder_path: &str,
file_name: &str,
offset: usize,
font_size: Option<usize>,
show_line_number: bool,
) -> String {
let (dest_md_path, dest_png_path) = get_dest_md_and_png_path(file_name, dest_folder_path);
fs::write(&dest_md_path, content).unwrap();
take_silicon_snapshot(
&dest_md_path,
&dest_png_path,
offset,
font_size,
show_line_number,
);
fs::remove_file(dest_md_path).unwrap();
dest_png_path
}
fn get_dest_md_and_png_path(file_name: &str, dest_folder_path: &str) -> (String, String) {
(
format!("{dest_folder_path}/{file_name}.md"),
format!("{dest_folder_path}/{file_name}.png"),
)
}
fn take_silicon_snapshot(
source_md_path: &str,
dest_png_path: &str,
offset: usize,
font_size: Option<usize>,
show_line_number: bool,
) {
let offset = format!("{}", offset);
let font = if let Some(size) = font_size {
format!("Hack={size}")
} else {
"Hack=20".to_string()
};
let mut args = vec![
"--no-window-controls",
"--language",
"Rust",
"--line-offset",
offset.as_str(),
"--theme",
"Dracula",
"--pad-horiz",
"10",
"--pad-vert",
"10",
"--background",
"#282a36",
"--font",
font.as_str(),
"--output",
dest_png_path,
source_md_path,
];
if !show_line_number {
args.insert(1, "--no-line-number")
}
let mut child = std::process::Command::new("silicon")
.args(args)
.spawn()
.unwrap();
child.wait().unwrap();
}
pub fn delete_png_file(path: String) {
fs::remove_file(path).unwrap();
}
pub fn check_silicon_installed() -> bool {
let output = std::process::Command::new("silicon")
.args(["--version"])
.output();
match output {
Ok(_) => true,
Err(_) => false,
}
}