diff --git a/src/app/args/structure.rs b/src/app/args/structure.rs index f01201a..df619c4 100644 --- a/src/app/args/structure.rs +++ b/src/app/args/structure.rs @@ -16,7 +16,10 @@ pub enum ShellArg { #[derive(Subcommand)] pub enum CommandArg { /// Builds the documentation into a dist folder - Build, + Build { + #[arg(short, long)] + offline_reveal: bool, + }, /// Checks if everything required for docki is installed Health, /// Helper command for installing asciidoctor-reveal-js diff --git a/src/app/build/asciidoctor.rs b/src/app/build/asciidoctor.rs index 9b90f1a..1b44433 100644 --- a/src/app/build/asciidoctor.rs +++ b/src/app/build/asciidoctor.rs @@ -28,10 +28,14 @@ fn asciidoctor_docs(in_path: &str, out_path: &str) -> process::Command { return command; } -fn asciidoctor_slides(in_path: &str, out_path: &str) -> process::Command { +fn asciidoctor_slides(in_path: &str, out_path: &str, offline_reveal: bool) -> process::Command { let mut command = process::Command::new(format!("asciidoctor-revealjs")); let out_dir = parent_path(out_path); - let revealjs_path = path_between(out_dir.to_string(), "./dist/slides/revealjs".to_string()); + let revealjs_path = if offline_reveal { + path_between(out_dir.to_string(), "./dist/slides/revealjs".to_string()) + } else { + "https://cdn.jsdelivr.net/npm/reveal.js@5.2.1".to_string() + }; command .arg(format!("{in_path}")) @@ -101,8 +105,8 @@ pub fn build_doc(in_path: &str, out_path: &str) -> Result<(), String> { return exec_command(&mut command); } -pub fn build_slide(in_path: &str, out_path: &str) -> Result<(), String> { - let mut command = asciidoctor_slides(in_path, out_path); +pub fn build_slide(in_path: &str, out_path: &str, offline_reveal: bool) -> Result<(), String> { + let mut command = asciidoctor_slides(in_path, out_path, offline_reveal); return exec_command(&mut command); } diff --git a/src/app/build/mod.rs b/src/app/build/mod.rs index 7071c99..f3d72f9 100644 --- a/src/app/build/mod.rs +++ b/src/app/build/mod.rs @@ -6,12 +6,12 @@ use super::fs_util; pub mod asciidoctor; -pub fn docki_build(in_path: &str) -> DockiBuildResult { +pub fn docki_build(in_path: &str, offline_reveal: bool) -> DockiBuildResult { let out_path = in_path.replace("/docs/", "/dist/"); let convert_out_path = out_path.replace(".adoc", ".html"); if in_path.starts_with("./docs/slides/") && in_path.ends_with(".adoc") { - if let Err(err) = build_slide(&in_path, &convert_out_path) { + if let Err(err) = build_slide(&in_path, &convert_out_path, offline_reveal) { return DockiBuildResult::Err(err); } @@ -23,6 +23,10 @@ pub fn docki_build(in_path: &str) -> DockiBuildResult { DockiBuildResult::Doc(convert_out_path) } else { + if in_path.starts_with("./docs/slides/revealjs") && !offline_reveal { + return DockiBuildResult::Silent; + } + if let Err(err) = copy(&in_path, &out_path) { return DockiBuildResult::Err(err); } @@ -46,4 +50,5 @@ pub enum DockiBuildResult { Doc(String), Copy(String), Err(String), + Silent, } diff --git a/src/app/commands/build.rs b/src/app/commands/build.rs index c3fe698..ce31e40 100644 --- a/src/app/commands/build.rs +++ b/src/app/commands/build.rs @@ -1,6 +1,6 @@ use super::executions::build_execution::BuildExecution; -pub async fn build() -> () { +pub async fn build(offline_reveal: bool) -> () { let mut build_execution = BuildExecution::new(); - build_execution.execute().await.expect("build failed") + build_execution.execute(offline_reveal).await.expect("build failed") } diff --git a/src/app/commands/executions/build_execution.rs b/src/app/commands/executions/build_execution.rs index 37f3041..8107ea8 100644 --- a/src/app/commands/executions/build_execution.rs +++ b/src/app/commands/executions/build_execution.rs @@ -21,7 +21,7 @@ impl BuildExecution { }; } - pub async fn execute(&mut self) -> Result<(), String> { + pub async fn execute(&mut self, offline_reveal: bool) -> Result<(), String> { let path = "./docs/".to_string(); if !fs_util::directory_exists(&path) { @@ -30,21 +30,25 @@ impl BuildExecution { ); } - if let Err(error) = Self::prepare().await { + if let Err(error) = Self::prepare(offline_reveal).await { return Err(error); } - return self.build_dir(&path); + return self.build_dir(&path, offline_reveal); } - async fn prepare() -> Result<(), String> { + async fn prepare(offline_reveal: bool) -> Result<(), String> { + if !offline_reveal { + return Ok(()) + } + let reveal_version = "5.2.1"; let target = format!("https://github.com/hakimel/reveal.js/archive/{reveal_version}.zip"); create_dir_recursive("./docs/slides"); - let response = reqwest::get(target.clone()).await.unwrap(); + reqwest::get(target.clone()).await.unwrap(); let Ok(response) = reqwest::get(target).await else { return Err("could not downlaod revealjs".to_string()) }; @@ -62,7 +66,7 @@ impl BuildExecution { return Ok(()); } - fn build_dir(&mut self, path: &str) -> Result<(), String> { + fn build_dir(&mut self, path: &str, offline_reveal: bool) -> Result<(), String> { let result = fs_util::fetch_paths_recursive(&path); let Ok(paths) = result else { @@ -72,7 +76,7 @@ impl BuildExecution { for (index, in_path) in paths.iter().enumerate() { self.progress = index + 1; self.goal = paths.len(); - let result = docki_build(&in_path); + let result = docki_build(&in_path, offline_reveal); match result { DockiBuildResult::Err(err) => { @@ -81,7 +85,8 @@ impl BuildExecution { }, DockiBuildResult::Copy(out_path) => self.display_building_status("Copy", &in_path, &out_path), DockiBuildResult::Slide(out_path) => self.display_building_status("Slide", &in_path, &out_path), - DockiBuildResult::Doc(out_path) => self.display_building_status("Doc", &in_path, &out_path) + DockiBuildResult::Doc(out_path) => self.display_building_status("Doc", &in_path, &out_path), + DockiBuildResult::Silent => () } } diff --git a/src/app/commands/serve.rs b/src/app/commands/serve.rs index 4a7e74e..a15f2be 100644 --- a/src/app/commands/serve.rs +++ b/src/app/commands/serve.rs @@ -11,7 +11,7 @@ use crate::app::{ watcher::watcher, build::{docki_build, DockiBuildResult}, comm pub async fn serve(port: Option) { - build().await; + build(false).await; tokio::join!(watch_and_build(), start_server(port)); } @@ -65,7 +65,7 @@ fn build_file(paths: Vec) { .expect(invalid_path_message); let in_path = format!("./{}", in_path); - let result = docki_build(&in_path); + let result = docki_build(&in_path, false); match result { DockiBuildResult::Slide(out_path) => display_rebuilding_status("Slide", &in_path, &out_path), @@ -75,6 +75,7 @@ fn build_file(paths: Vec) { display_rebuilding_status("Error", &in_path, ""); println!("{}", err); }, + DockiBuildResult::Silent => () } } diff --git a/src/app/mod.rs b/src/app/mod.rs index 0ba9bfb..1b33424 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -23,7 +23,7 @@ impl App { Self::setup_environment_variables(); match args.command { - CommandArg::Build => build().await, + CommandArg::Build { offline_reveal } => build(offline_reveal).await, CommandArg::Health => health(), CommandArg::InstallReveal => install_reveal().await, CommandArg::Serve { port } => serve(port).await,