summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2022-07-25 08:13:52 +0300
committerLars Wirzenius <liw@liw.fi>2022-07-25 08:45:22 +0300
commitbd08b37b8bd429e0e5c5817fb912fbc22566dcbf (patch)
treedae3a480a633cd4ce8bb5297ab795bae4d7727a7
parentb08f50789bec1f9f0d7b4aa45177838b3bd2d24c (diff)
downloadriki-bd08b37b8bd429e0e5c5817fb912fbc22566dcbf.tar.gz
feat: "riki list" to list source files for a site
Sponsored-by: author
-rw-r--r--riki.md24
-rw-r--r--src/bin/riki.rs21
-rw-r--r--src/site.rs7
3 files changed, 52 insertions, 0 deletions
diff --git a/riki.md b/riki.md
index fa982b2..00637dc 100644
--- a/riki.md
+++ b/riki.md
@@ -445,3 +445,27 @@ then file output/index.html contains "<img src="img.jpg""
~~~{#jpeg .file}
This is a dummy JPEG image.
~~~
+
+## Source file tree
+
+### Listing source files
+
+_Requirement: source files can be listed._
+
+~~~scenario
+given an installed riki
+given file site/index.mdwn from empty
+given file site/img.jpg from empty
+when I run riki list site
+then stdout contains "img.jpg"
+then stdout contains "index.mdwn"
+~~~
+
+### Exclude unusual files
+
+_Requirement: files and directories that aren't meant to be part of
+the site content should be excluded._
+
+~~~scenario
+given an installed riki
+~~~
diff --git a/src/bin/riki.rs b/src/bin/riki.rs
index 9749e3b..1455b45 100644
--- a/src/bin/riki.rs
+++ b/src/bin/riki.rs
@@ -32,6 +32,7 @@ fn real_main() -> Result<(), SiteError> {
let args = Args::parse();
match args.command {
Command::Build(cmd) => cmd.run()?,
+ Command::List(cmd) => cmd.run()?,
}
info!("riki ends OK");
@@ -47,6 +48,7 @@ struct Args {
#[derive(Parser)]
enum Command {
Build(Build),
+ List(List)
}
#[derive(Parser)]
@@ -92,3 +94,22 @@ impl Build {
Ok(())
}
}
+
+#[derive(Parser)]
+struct List {
+ srcdir: PathBuf,
+}
+
+impl List {
+ fn run(&self) -> Result<(), SiteError> {
+ let srcdir = canonicalize(&self.srcdir)?;
+ let mut site = Site::new(&srcdir, &srcdir);
+ site.scan()?;
+ let mut filenames = site.included_files().to_vec();
+ filenames.sort_unstable();
+ for filename in filenames {
+ println!("{}", filename.display());
+ }
+ Ok(())
+ }
+}
diff --git a/src/site.rs b/src/site.rs
index 1a58801..1d1de60 100644
--- a/src/site.rs
+++ b/src/site.rs
@@ -13,6 +13,7 @@ pub struct Site {
unprocessed_pages: Vec<UnprocessedPage>,
markdown_pages: Vec<MarkdownPage>,
files: Vec<PathBuf>,
+ included_files: Vec<PathBuf>,
patterns: TokenPatterns,
srcdir: PathBuf,
destdir: PathBuf,
@@ -29,6 +30,7 @@ impl Site {
unprocessed_pages: vec![],
markdown_pages: vec![],
files: vec![],
+ included_files: vec![],
patterns: TokenPatterns::default(),
srcdir: srcdir.as_ref().into(),
destdir: destdir.as_ref().into(),
@@ -38,6 +40,7 @@ impl Site {
pub fn scan(&mut self) -> Result<(), SiteError> {
for filename in Self::all_files(&self.srcdir)? {
+ self.included_files.push(make_path_relative_to(&self.srcdir, &filename));
if Self::is_markdown(&filename) {
let page = WikitextPage::read(&self.srcdir, &filename)?;
self.add_wikitextpage(page);
@@ -104,6 +107,10 @@ impl Site {
&self.files
}
+ pub fn included_files(&self) -> &[PathBuf] {
+ &self.included_files
+ }
+
pub fn input_filename(&self, filename: &Path) -> Result<PathBuf, SiteError> {
Ok(join_subpath(&self.srcdir, filename))
}