2024-01-28 12:18:40 -06:00
|
|
|
use std::{io::Cursor, path::PathBuf};
|
2024-01-25 21:17:50 -06:00
|
|
|
|
|
|
|
use path_slash::PathBufExt as _;
|
2024-01-30 09:12:16 -06:00
|
|
|
use tempfile::TempDir;
|
2024-01-25 21:17:50 -06:00
|
|
|
|
2024-01-28 12:18:40 -06:00
|
|
|
use crate::{misc, GenerationError, Warning, WARNINGS};
|
|
|
|
|
2024-01-25 21:17:50 -06:00
|
|
|
/// Converts a given path to windows style if needed.
|
|
|
|
pub fn convert_path_to_os_specific(path: PathBuf) -> PathBuf {
|
|
|
|
// If target os is windows.
|
|
|
|
#[cfg(target_os = "windows")] {
|
|
|
|
return PathBuf::from_slash_lossy(path.into_os_string());
|
|
|
|
}
|
|
|
|
|
|
|
|
// If target os is not windows.
|
|
|
|
#[cfg(not(target_os = "windows"))] {
|
|
|
|
return PathBuf::from_backslash_lossy(path.into_os_string());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Remove chars that are illegal to be used in filenames on both unix & windows.
|
|
|
|
pub fn remove_illegal_chars(mut string: String) -> String {
|
|
|
|
const ILLEGAL_CHARS: [char; 9] = ['/', '\u{005C}', '<', '>', ':', '\u{0022}', '|', '?', '*'];
|
|
|
|
|
|
|
|
for char in ILLEGAL_CHARS {
|
|
|
|
string = string.replace(char, " ");
|
|
|
|
}
|
|
|
|
|
|
|
|
return string;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Setup html2xhtml in the operating system's temp directory.
|
2024-01-28 12:18:40 -06:00
|
|
|
pub fn setup_html2xhtml() -> Result<TempDir, GenerationError> {
|
2024-01-26 12:59:54 -06:00
|
|
|
#[cfg(target_os = "windows")] {
|
2024-01-26 12:58:55 -06:00
|
|
|
const HTML2XHTML: &[u8; 245025] = include_bytes!("../html2xhtml-windows.zip"); // This will not compile on windows due to this and no I don't give a shit.
|
2024-01-26 10:17:48 -06:00
|
|
|
// Compile it on linux for windows like a sane person.
|
2024-01-30 09:12:16 -06:00
|
|
|
let html2xhtml_temp_dir = match TempDir::new() {
|
2024-01-26 09:44:19 -06:00
|
|
|
Ok(temp_dir) => temp_dir,
|
2024-01-28 12:18:40 -06:00
|
|
|
Err(error) => return Err(GenerationError::TempDirCreationError {error}),
|
2024-01-26 09:44:19 -06:00
|
|
|
};
|
|
|
|
|
2024-01-28 12:18:40 -06:00
|
|
|
match zip_extract::extract(Cursor::new(HTML2XHTML), html2xhtml_temp_dir.path(), true) {
|
2024-01-26 09:44:19 -06:00
|
|
|
Ok(_) => (),
|
2024-01-28 12:18:40 -06:00
|
|
|
Err(error) => return Err(GenerationError::Html2XhtmlExtractionError {error}),
|
2024-01-26 09:44:19 -06:00
|
|
|
}
|
|
|
|
|
2024-01-28 12:18:40 -06:00
|
|
|
return Ok(html2xhtml_temp_dir);
|
2024-01-25 21:17:50 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(target_os = "linux")] {
|
2024-01-26 09:44:19 -06:00
|
|
|
const HTML2XHTML: &[u8; 186938] = include_bytes!("../html2xhtml-linux.zip");
|
2024-01-30 09:12:16 -06:00
|
|
|
let html2xhtml_temp_dir = match TempDir::new() {
|
2024-01-26 09:44:19 -06:00
|
|
|
Ok(temp_dir) => temp_dir,
|
2024-01-28 12:18:40 -06:00
|
|
|
Err(error) => return Err(GenerationError::TempDirCreationError {error}),
|
2024-01-26 09:44:19 -06:00
|
|
|
};
|
|
|
|
|
2024-01-28 12:18:40 -06:00
|
|
|
match zip_extract::extract(Cursor::new(HTML2XHTML), html2xhtml_temp_dir.path(), true) {
|
2024-01-26 09:44:19 -06:00
|
|
|
Ok(_) => (),
|
2024-01-28 12:18:40 -06:00
|
|
|
Err(error) => return Err(GenerationError::Html2XhtmlExtractionError {error}),
|
2024-01-26 09:44:19 -06:00
|
|
|
}
|
|
|
|
|
2024-01-28 12:18:40 -06:00
|
|
|
return Ok(html2xhtml_temp_dir);
|
2024-01-25 21:17:50 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(target_os = "macos")] {
|
2024-01-28 12:18:40 -06:00
|
|
|
Err(GenerationError::OsUnsupportedError {os: misc::Oses::MacOs})
|
2024-01-25 21:17:50 -06:00
|
|
|
}
|
2024-01-28 12:18:40 -06:00
|
|
|
|
|
|
|
// In the event the OS is unknown.
|
|
|
|
#[allow(unreachable_code)]
|
|
|
|
Err(GenerationError::OsUnsupportedError {os: misc::Oses::OtherUnknownOs})
|
2024-01-25 21:17:50 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Delete html2xhtml from the operating system's temp directory.
|
2024-01-26 09:44:19 -06:00
|
|
|
pub fn delete_html2xhtml(html2xhtml_dir: TempDir) {
|
2024-01-28 12:18:40 -06:00
|
|
|
let temp_dir_path = html2xhtml_dir.path().to_path_buf();
|
|
|
|
|
2024-01-26 09:44:19 -06:00
|
|
|
match html2xhtml_dir.close() {
|
|
|
|
Ok(_) => (),
|
|
|
|
Err(warning) => {
|
2024-01-28 12:18:40 -06:00
|
|
|
let warning = Warning::TempDirDeletionError {
|
|
|
|
warning_msg: "Unable to close and delete temp directory".to_string(),
|
|
|
|
temp_directory_path: temp_dir_path,
|
|
|
|
error: warning
|
|
|
|
};
|
|
|
|
WARNINGS.lock().unwrap().add_warning(warning);
|
2024-01-26 09:44:19 -06:00
|
|
|
}
|
|
|
|
}
|
2024-01-25 21:17:50 -06:00
|
|
|
}
|