novel_cli/renderer/
mod.rs1mod mdbook;
2mod pandoc;
3
4use std::path::Path;
5use std::{fs, thread};
6
7use color_eyre::eyre::{self, Result};
8use image::DynamicImage;
9
10pub use self::mdbook::*;
11pub use self::pandoc::*;
12use crate::utils;
13use crate::utils::{Content, Novel};
14
15#[must_use]
16fn image_markdown_str<T>(path: T) -> String
17where
18 T: AsRef<str>,
19{
20 format!("", path.as_ref())
21}
22
23fn cover_image_name(cover_image: &DynamicImage) -> Result<String> {
24 let image_ext = utils::new_image_ext(cover_image);
25
26 match image_ext {
27 Ok(image_ext) => Ok(format!("cover.{image_ext}")),
28 Err(error) => eyre::bail!("{error}"),
29 }
30}
31
32fn new_image_name(image: &DynamicImage, image_index: u16) -> Result<String> {
33 Ok(format!(
34 "{}.{}",
35 utils::num_to_str(image_index),
36 utils::new_image_ext(image)?
37 ))
38}
39
40fn save_image<T>(novel: &Novel, image_dir_path: T) -> Result<()>
41where
42 T: AsRef<Path>,
43{
44 let image_dir_path = image_dir_path.as_ref();
45 if !image_dir_path.exists() {
46 fs::create_dir_all(image_dir_path)?;
47 }
48
49 if let Some(cover_image) = &novel.cover_image {
50 let image_ext = utils::new_image_ext(cover_image);
51
52 if let Ok(image_ext) = image_ext {
53 let image_path = image_dir_path.join(format!("cover.{image_ext}"));
54
55 if image_ext == "webp" {
56 novel_api::save_as_webp(cover_image, 75.0, image_path).unwrap_or_else(|err| {
57 tracing::error!("Failed to save cover image: {err}");
58 });
59 } else {
60 cover_image.save(image_path).unwrap_or_else(|err| {
61 tracing::error!("Failed to save image: {err}");
62 });
63 }
64 }
65 }
66
67 let mut images = Vec::new();
68 for volume in &novel.volumes {
69 for chapter in &volume.chapters {
70 if let Some(contents) = &chapter.contents {
71 for content in contents {
72 if let Content::Image(image) = content {
73 images.push(image);
74 }
75 }
76 }
77 }
78 }
79
80 thread::scope(|s| {
81 let mut image_index = 1;
82
83 for image in images {
84 let image_ext = utils::new_image_ext(image);
85
86 if let Ok(image_ext) = image_ext {
87 let image_name = format!("{}.{}", utils::num_to_str(image_index), image_ext);
88 image_index += 1;
89
90 let image_path = image_dir_path.join(image_name);
91
92 if image_ext == "webp" {
93 s.spawn(|| {
94 novel_api::save_as_webp(image, 75.0, image_path).unwrap_or_else(|err| {
95 tracing::error!("Failed to save cover image: {err}");
96 });
97 });
98 } else {
99 s.spawn(|| {
100 image.save(image_path).unwrap_or_else(|err| {
101 tracing::error!("Failed to save image: {err}");
102 });
103 });
104 }
105 }
106 }
107 });
108
109 Ok(())
110}