summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2022-07-12 20:35:47 +0300
committerLars Wirzenius <liw@liw.fi>2022-07-12 20:35:47 +0300
commitc04613ffb66895db81f71b1ad6e5293567c8ba95 (patch)
tree5be314cc7ac442296119778eb830271afa94d4e2
parent627a942fe649d8f2ac4bd30143e7e51336622f19 (diff)
downloadriki-c04613ffb66895db81f71b1ad6e5293567c8ba95.tar.gz
feat! add subcommand "build"
This will open the chance of other subcommands in the future. Sponsored-by: author
-rw-r--r--Cargo.lock13
-rw-r--r--Cargo.toml1
-rw-r--r--riki.md36
-rw-r--r--src/bin/riki.rs143
4 files changed, 108 insertions, 85 deletions
diff --git a/Cargo.lock b/Cargo.lock
index f889703..37b136e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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",
diff --git a/Cargo.toml b/Cargo.toml
index f8b9bfd..47a6f04 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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"
diff --git a/riki.md b/riki.md
index 4aca1f0..23f430e 100644
--- a/riki.md
+++ b/riki.md
@@ -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(())
+ }
}