From 3e335d1b375f24f5288f7377f12f88ceda42fbf4 Mon Sep 17 00:00:00 2001 From: Mara Bos Date: Wed, 1 Jun 2022 15:07:20 +0200 Subject: [PATCH 1/3] Show links to blogs and their latest post. --- src/main.rs | 42 +++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/main.rs b/src/main.rs index 08842086f..5e9a0e077 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,6 +18,7 @@ struct Generator<'a> { handlebars: Handlebars<'a>, blogs: Vec, out_directory: PathBuf, + file_url: String, } #[derive(Debug, Serialize)] @@ -57,10 +58,23 @@ impl<'a> Generator<'a> { handlebars.register_templates_directory(".hbs", "templates")?; handlebars.register_helper("month_name", Box::new(hb_month_name_helper)); + let file_url = format!( + "file:///{}/", + out_directory + .as_ref() + .canonicalize() + .unwrap_or(out_directory.as_ref().to_owned()) + .display() + .to_string() + .trim_start_matches('/') + .replace(' ', "%20") + ); + Ok(Generator { handlebars, blogs: crate::blogs::load(posts_directory.as_ref())?, out_directory: out_directory.as_ref().into(), + file_url, }) } @@ -103,16 +117,24 @@ impl<'a> Generator<'a> { fn render_blog(&self, blog: &Blog) -> Result<(), Box> { std::fs::create_dir_all(self.out_directory.join(blog.prefix()))?; - self.render_index(blog)?; + let path = self.render_index(blog)?; + + println!("{}: {}{}", blog.title(), self.file_url, path.display()); + self.render_feed(blog)?; self.render_releases_feed(blog)?; - for post in blog.posts() { - self.render_post(blog, post)?; + + for (i, post) in blog.posts().iter().enumerate() { + let path = self.render_post(blog, post)?; + if i == 0 { + println!("└─ Latest post: {}{}\n", self.file_url, path.display()); + } } + Ok(()) } - fn render_index(&self, blog: &Blog) -> Result<(), Box> { + fn render_index(&self, blog: &Blog) -> Result> { let other_blogs: Vec<_> = self .blogs .iter() @@ -132,11 +154,12 @@ impl<'a> Generator<'a> { "other_blogs": other_blogs, "root": blog.path_back_to_root(), }); - self.render_template(blog.prefix().join("index.html"), "index", data)?; - Ok(()) + let path = blog.prefix().join("index.html"); + self.render_template(&path, "index", data)?; + Ok(path) } - fn render_post(&self, blog: &Blog, post: &Post) -> Result<(), Box> { + fn render_post(&self, blog: &Blog, post: &Post) -> Result> { let path = blog .prefix() .join(format!("{:04}", &post.year)) @@ -156,8 +179,9 @@ impl<'a> Generator<'a> { "root": blog.path_back_to_root().join("../../../"), }); - self.render_template(path.join(filename), &post.layout, data)?; - Ok(()) + let path = path.join(filename); + self.render_template(&path, &post.layout, data)?; + Ok(path) } fn render_feed(&self, blog: &Blog) -> Result<(), Box> { From d4b8712542f0f052c253da3ed8ca76b669ee30c1 Mon Sep 17 00:00:00 2001 From: Mara Bos Date: Mon, 20 Jun 2022 14:42:08 +0200 Subject: [PATCH 2/3] Hack the file urls into something that might work on Windows. --- src/main.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 5e9a0e077..a02d12110 100644 --- a/src/main.rs +++ b/src/main.rs @@ -63,11 +63,13 @@ impl<'a> Generator<'a> { out_directory .as_ref() .canonicalize() - .unwrap_or(out_directory.as_ref().to_owned()) + .unwrap_or_else(|_| out_directory.as_ref().to_owned()) .display() .to_string() .trim_start_matches('/') .replace(' ', "%20") + .replace("\\\\?\\", "") + .replace(std::path::MAIN_SEPARATOR, "/") ); Ok(Generator { From 095a454b0663d9bc3b218747defed810b4ec3dce Mon Sep 17 00:00:00 2001 From: Mara Bos Date: Tue, 21 Jun 2022 22:33:32 +0200 Subject: [PATCH 3/3] Fix file urls on Windows. --- src/main.rs | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/main.rs b/src/main.rs index a02d12110..11b958a39 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,7 +18,6 @@ struct Generator<'a> { handlebars: Handlebars<'a>, blogs: Vec, out_directory: PathBuf, - file_url: String, } #[derive(Debug, Serialize)] @@ -58,28 +57,29 @@ impl<'a> Generator<'a> { handlebars.register_templates_directory(".hbs", "templates")?; handlebars.register_helper("month_name", Box::new(hb_month_name_helper)); - let file_url = format!( - "file:///{}/", - out_directory - .as_ref() - .canonicalize() - .unwrap_or_else(|_| out_directory.as_ref().to_owned()) - .display() - .to_string() - .trim_start_matches('/') - .replace(' ', "%20") - .replace("\\\\?\\", "") - .replace(std::path::MAIN_SEPARATOR, "/") - ); - Ok(Generator { handlebars, blogs: crate::blogs::load(posts_directory.as_ref())?, out_directory: out_directory.as_ref().into(), - file_url, }) } + fn file_url(&self, path: &Path) -> String { + format!( + "file:///{}/{}", + self.out_directory + .canonicalize() + .unwrap_or_else(|_| self.out_directory.to_owned()) + .display() + .to_string() + .trim_start_matches('/') + .replace(' ', "%20") + .replace("\\\\?\\", ""), + path.display() + ) + .replace(std::path::MAIN_SEPARATOR, "/") + } + fn render(&self) -> Result<(), Box> { // make sure our output directory exists fs::create_dir_all(&self.out_directory)?; @@ -121,7 +121,7 @@ impl<'a> Generator<'a> { let path = self.render_index(blog)?; - println!("{}: {}{}", blog.title(), self.file_url, path.display()); + println!("{}: {}", blog.title(), self.file_url(&path)); self.render_feed(blog)?; self.render_releases_feed(blog)?; @@ -129,7 +129,7 @@ impl<'a> Generator<'a> { for (i, post) in blog.posts().iter().enumerate() { let path = self.render_post(blog, post)?; if i == 0 { - println!("└─ Latest post: {}{}\n", self.file_url, path.display()); + println!("└─ Latest post: {}\n", self.file_url(&path)); } }