diff options
-rw-r--r-- | Cargo.lock | 13 | ||||
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | riki.md | 36 | ||||
-rw-r--r-- | src/bin/riki.rs | 143 |
4 files changed, 108 insertions, 85 deletions
@@ -126,16 +126,16 @@ dependencies = [ [[package]] name = "clap" -version = "3.2.1" +version = "3.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a836566fa5f52f7ddf909a8a2f9029b9f78ca584cd95cf7e87f8073110f4c5c9" +checksum = "69c5a7f9997be616e47f0577ee38c91decb33392c5be4866494f34cdf329a9aa" dependencies = [ "atty", "bitflags", "clap_derive", "clap_lex", "indexmap", - "lazy_static", + "once_cell", "strsim 0.10.0", "termcolor", "textwrap 0.15.0", @@ -143,9 +143,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "3.2.1" +version = "3.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "986fd75d1dfd2c34eb8c9275ae38ad87ea9478c9b79e87f1801f7d866dfb1e37" +checksum = "759bf187376e1afa7b85b959e6a664a3e7a95203415dba952ad19139e798f902" dependencies = [ "heck 0.4.0", "proc-macro-error", @@ -923,6 +923,7 @@ name = "riki" version = "0.1.0" dependencies = [ "anyhow", + "clap 3.2.10", "fehler", "html-escape", "log", @@ -1172,7 +1173,7 @@ source = "git+https://gitlab.com/subplot/subplot.git#4aaaee39f84683034e26fd4841e dependencies = [ "anyhow", "base64", - "clap 3.2.1", + "clap 3.2.10", "env_logger 0.9.0", "file_diff", "git-testament", @@ -7,6 +7,7 @@ edition = "2021" [dependencies] anyhow = "1.0.52" +clap = { version = "3.2.10", features = ["derive"] } html-escape = "0.2.11" log = "0.4.17" pretty_env_logger = "0.4.0" @@ -38,7 +38,7 @@ be an empty HTML file._ ~~~scenario given an installed riki given file site/empty.mdwn from empty -when I run riki site output +when I run riki build site output then AST of site/empty.mdwn matches that of output/empty.html ~~~ @@ -54,7 +54,7 @@ be an HTML file with the same text, without extra elements._ ~~~scenario given an installed riki given file site/page.mdwn from para -when I run riki site output +when I run riki build site output then AST of site/page.mdwn matches that of output/page.html ~~~ @@ -74,7 +74,7 @@ output must have a blockquote element. ~~~scenario given an installed riki given file site/page.mdwn from blockquote -when I run riki site output +when I run riki build site output then AST of site/page.mdwn matches that of output/page.html ~~~ @@ -92,7 +92,7 @@ output must have a pre element. ~~~scenario given an installed riki given file site/page.mdwn from indented-code -when I run riki site output +when I run riki build site output then AST of site/page.mdwn matches that of output/page.html ~~~ @@ -110,7 +110,7 @@ output must have a pre element. ~~~scenario given an installed riki given file site/page.mdwn from fenced-code -when I run riki site output +when I run riki build site output then AST of site/page.mdwn matches that of output/page.html ~~~ @@ -131,7 +131,7 @@ must have an img element. ~~~scenario given an installed riki given file site/page.mdwn from image-link -when I run riki site output +when I run riki build site output then AST of site/page.mdwn matches that of output/page.html ~~~ @@ -148,7 +148,7 @@ in HTML output._ ~~~scenario given an installed riki given file site/page.mdwn from emph -when I run riki site output +when I run riki build site output then AST of site/page.mdwn matches that of output/page.html ~~~ @@ -165,7 +165,7 @@ strong element in HTML output._ ~~~scenario given an installed riki given file site/page.mdwn from strong -when I run riki site output +when I run riki build site output then AST of site/page.mdwn matches that of output/page.html ~~~ @@ -182,7 +182,7 @@ element in HTML output._ ~~~scenario given an installed riki given file site/page.mdwn from strike -when I run riki site output +when I run riki build site output then AST of site/page.mdwn matches that of output/page.html ~~~ @@ -201,7 +201,7 @@ supported._ ~~~scenario given an installed riki given file site/page.mdwn from headings -when I run riki site output +when I run riki build site output then AST of site/page.mdwn matches that of output/page.html ~~~ @@ -223,7 +223,7 @@ element in HTML output._ ~~~scenario given an installed riki given file site/page.mdwn from backticks -when I run riki site output +when I run riki build site output then AST of site/page.mdwn matches that of output/page.html ~~~ @@ -242,7 +242,7 @@ output._ ~~~ given an installed riki given file site/page.mdwn from table -when I run riki site output +when I run riki build site output then AST of site/page.mdwn matches that of output/page.html ~~~ @@ -261,7 +261,7 @@ HTML output._ ~~~scenario given an installed riki given file site/page.mdwn from rule -when I run riki site output +when I run riki build site output then AST of site/page.mdwn matches that of output/page.html ~~~ @@ -282,7 +282,7 @@ in HTML output._ ~~~scenario given an installed riki given file site/page.mdwn from ul -when I run riki site output +when I run riki build site output then AST of site/page.mdwn matches that of output/page.html ~~~ @@ -303,7 +303,7 @@ the same as the Markdown.*** ~~~ given an installed riki given file site/page.mdwn from ol -when I run riki site output +when I run riki build site output then AST of site/page.mdwn matches that of output/page.html ~~~ @@ -321,7 +321,7 @@ in HTML output._ ~~~scenario given an installed riki given file site/page.mdwn from tasklist -when I run riki site output +when I run riki build site output then AST of site/page.mdwn matches that of output/page.html ~~~ @@ -339,7 +339,7 @@ into the destination directory as-is._ ~~~scenario given an installed riki given file site/image.jpg from image -when I run riki site output +when I run riki build site output then files site/image.jpg and output/image.jpg match ~~~ @@ -359,7 +359,7 @@ directory._ given an installed riki given file site/foo/page.mdwn from image given file site/bar/image.jpg from para -when I run riki site output +when I run riki build site output then AST of site/foo/page.mdwn matches that of output/foo/page.html then files site/bar//image.jpg and output/bar/image.jpg match ~~~ diff --git a/src/bin/riki.rs b/src/bin/riki.rs index d3202c0..6a7db66 100644 --- a/src/bin/riki.rs +++ b/src/bin/riki.rs @@ -1,3 +1,4 @@ +use clap::Parser; use log::{debug, error, info, trace}; use riki::error::SiteError; use riki::html::{parse, Element, ElementTag, HtmlPage}; @@ -5,16 +6,9 @@ use riki::site::Site; use std::error::Error; use std::io::Write; use std::path::PathBuf; -use structopt::StructOpt; const ENVLOG: &str = "RIKI_LOG"; -#[derive(StructOpt)] -struct Opt { - srcdir: PathBuf, - destdir: PathBuf, -} - fn main() { if let Err(err) = real_main() { error!("ERROR: {}", err); @@ -35,69 +29,96 @@ fn real_main() -> Result<(), SiteError> { pretty_env_logger::init_custom_env(ENVLOG); info!("riki starts"); - let opt = Opt::from_args(); - - let srcdir = opt - .srcdir - .canonicalize() - .map_err(|e| SiteError::Canonicalize(opt.srcdir.clone(), e))?; - debug!("srcdir={}", srcdir.display()); - - let mut site = Site::new(&srcdir)?; - debug!("markdown file count: {}", site.markdowns().len()); - site.process()?; - - debug!("creating destdir {}", opt.destdir.display()); - std::fs::create_dir(&opt.destdir).map_err(|e| SiteError::CreateDir(opt.destdir.clone(), e))?; - - let destdir = opt - .destdir - .canonicalize() - .map_err(|e| SiteError::Canonicalize(opt.srcdir.clone(), e))?; - debug!("destdir={}", destdir.display()); - - for page in site.markdown_pages() { - let head = Element::new(ElementTag::Head); - let body = parse(page.markdown()); - let htmlpage = HtmlPage::new(head, body); - let html = htmlpage.serialize()?; - - let output = page.meta().destination_filename(&destdir); - debug!("writing: {}", output.display()); - if let Some(parent) = output.parent() { - trace!("parent: {}", parent.display()); - if !parent.exists() { - trace!("create parent {}", parent.display()); - std::fs::create_dir_all(parent) - .map_err(|e| SiteError::CreateDir(opt.destdir.clone(), e))?; - } - } - trace!("writing HTML: {}", output.display()); - let mut f = - std::fs::File::create(&output).map_err(|e| SiteError::CreateFile(output.clone(), e))?; - f.write_all(html.as_bytes()) - .map_err(|e| SiteError::FileWrite(output.clone(), e))?; + + let args = Args::parse(); + match args.command { + Command::Build(cmd) => cmd.run()?, } - for file in site.files() { - debug!("copying {}", file.display()); - if let Ok(relative) = file.strip_prefix(&srcdir) { - let output = destdir.join(relative); - debug!("copying: {}", output.display()); + info!("riki ends OK"); + Ok(()) +} + +#[derive(Parser)] +struct Args { + #[clap(subcommand)] + command: Command, +} + +#[derive(Parser)] +enum Command { + Build(Build), +} + +#[derive(Parser)] +struct Build { + srcdir: PathBuf, + destdir: PathBuf, +} + +impl Build { + fn run(&self) -> Result<(), SiteError> { + let srcdir = self + .srcdir + .canonicalize() + .map_err(|e| SiteError::Canonicalize(self.srcdir.clone(), e))?; + debug!("srcdir={}", srcdir.display()); + + let mut site = Site::new(&srcdir)?; + debug!("markdown file count: {}", site.markdowns().len()); + site.process()?; + + debug!("creating destdir {}", self.destdir.display()); + std::fs::create_dir(&self.destdir) + .map_err(|e| SiteError::CreateDir(self.destdir.clone(), e))?; + + let destdir = self + .destdir + .canonicalize() + .map_err(|e| SiteError::Canonicalize(self.srcdir.clone(), e))?; + debug!("destdir={}", destdir.display()); + + for page in site.markdown_pages() { + let head = Element::new(ElementTag::Head); + let body = parse(page.markdown()); + let htmlpage = HtmlPage::new(head, body); + let html = htmlpage.serialize()?; + + let output = page.meta().destination_filename(&destdir); + debug!("writing: {}", output.display()); if let Some(parent) = output.parent() { trace!("parent: {}", parent.display()); if !parent.exists() { trace!("create parent {}", parent.display()); std::fs::create_dir_all(parent) - .map_err(|e| SiteError::CreateDir(opt.destdir.clone(), e))?; + .map_err(|e| SiteError::CreateDir(self.destdir.clone(), e))?; } } - trace!("copying: {}", output.display()); - std::fs::copy(file, &output) - .map_err(|e| SiteError::CopyFile(file.into(), output.clone(), e))?; + trace!("writing HTML: {}", output.display()); + let mut f = std::fs::File::create(&output) + .map_err(|e| SiteError::CreateFile(output.clone(), e))?; + f.write_all(html.as_bytes()) + .map_err(|e| SiteError::FileWrite(output.clone(), e))?; } - } - info!("riki ends OK"); - Ok(()) + for file in site.files() { + debug!("copying {}", file.display()); + if let Ok(relative) = file.strip_prefix(&srcdir) { + let output = destdir.join(relative); + debug!("copying: {}", output.display()); + if let Some(parent) = output.parent() { + trace!("parent: {}", parent.display()); + if !parent.exists() { + trace!("create parent {}", parent.display()); + std::fs::create_dir_all(parent) + .map_err(|e| SiteError::CreateDir(self.destdir.clone(), e))?; + } + } + trace!("copying: {}", output.display()); + std::fs::copy(file, &output) + .map_err(|e| SiteError::CopyFile(file.into(), output.clone(), e))?; + } + } + Ok(()) + } } |