From a6aea48860229c180bcec23b2da7a478c3dc88ef Mon Sep 17 00:00:00 2001 From: Emile Date: Thu, 24 Feb 2022 00:05:55 +0100 Subject: structops with support for analytics --- src/main.rs | 73 ++++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 22 deletions(-) diff --git a/src/main.rs b/src/main.rs index 55dd485..438a24a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,23 +4,49 @@ pub use std; use std::path::{Path, PathBuf}; -use std::io::{self, Read, Write}; +use std::io::{self, Read, Write, BufRead, BufReader}; use std::fs::{self, File}; -use std::time; +use std::{time}; +use structopt::StructOpt; + +#[derive(Debug, StructOpt)] +#[structopt(name = "vokobe", about = "A static site generator")] +struct Opt { + /// Input path + #[structopt(parse(from_os_str))] + in_path: PathBuf, + + /// Output path + #[structopt(parse(from_os_str))] + out_path: PathBuf, + + /// Site name (e.g. emile.space) + site_name: String, + + /// Activate sending analytics to stats.emile.space + // -a and --analytics will be generated + // analytics are sent to stats.emile.space + #[structopt(short, long)] + analytics: bool, +} fn main() -> std::io::Result<()> { - // the input and output pathes - let in_path = Path::new("../emile.space/in").to_path_buf(); - let out_path = Path::new("../emile.space/out").to_path_buf(); + let opt = Opt::from_args(); + + let in_path = opt.in_path; + let out_path = opt.out_path; println!("inpath: {}", in_path.display()); println!("outpath: {}", out_path.display()); // read the style - let mut style_file = File::open("./style.css")?; + let style_path = Path::new(&in_path).join("style.css"); + let mut style_file = File::open(style_path) + .expect("could not open style file"); let mut style = String::new(); - style_file.read_to_string(&mut style)?; + style_file.read_to_string(&mut style) + .expect("could not read style file to string"); // read all dirs in the input path let pathes = recursive_read_dir(&in_path, false)?; @@ -74,9 +100,9 @@ fn main() -> std::io::Result<()> { fs::create_dir_all(index_path)?; let mut file = File::create(&index_file)?; - write_header(&mut file, &style)?; - write_body_start(&mut file)?; - write_nav(&mut file, in_path.as_path(), raw_path)?; + write_header(&mut file, &opt.site_name, &style)?; + write_body_start(&mut file, &opt.site_name)?; + write_nav(&mut file, in_path.as_path(), raw_path, opt.analytics)?; write_same_level(&mut file, in_path.as_path(), raw_path)?; write_readme_content(&mut file, in_path.as_path(), raw_path)?; write_footer(&mut file)?; @@ -90,7 +116,7 @@ fn main() -> std::io::Result<()> { } /// Write the html header including the style file -fn write_header(file: &mut File, style: &String) -> std::io::Result<()>{ +fn write_header(file: &mut File, site_name: &String, style: &String) -> std::io::Result<()>{ // write the header including the style file file.write_all(format!(r#" @@ -99,36 +125,41 @@ fn write_header(file: &mut File, style: &String) -> std::io::Result<()>{ - emile.space + {} - "#, style).as_bytes())?; + "#, site_name, style).as_bytes())?; Ok(()) } -fn write_body_start(file: &mut File) -> std::io::Result<()>{ +fn write_body_start(file: &mut File, site_name: &String) -> std::io::Result<()>{ file.write_all(format!(r#"
- emile.space -
"#).as_bytes())?; + {} + "#, site_name).as_bytes())?; Ok(()) } /// Write the navigation section to the given file -fn write_nav(file: &mut File, in_path: &Path, raw_path: &Path) +fn write_nav(file: &mut File, in_path: &Path, raw_path: &Path, analytics: bool) -> std::io::Result<()> { - //////////////////////////////////////////////////////////////////////////// - file.write_all(format!(r#" + if analytics == true { + file.write_all(format!(r#" + +