Compare commits

...

2 Commits

Author SHA1 Message Date
Tom Alexander
2b6f86d4e9
Switch to rendering blog post pages instead of blog posts. 2023-10-23 20:30:43 -04:00
Tom Alexander
dc233d26b1
Store the title in BlogPostPage. 2023-10-23 18:39:54 -04:00
8 changed files with 59 additions and 21 deletions

2
Cargo.lock generated
View File

@ -336,8 +336,6 @@ dependencies = [
[[package]]
name = "organic"
version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3f0f8a2a6d31c3cac7ebf543d8cb2e8f648300462fc2f6b1a09cac10daf0387"
dependencies = [
"nom 7.1.3",
"walkdir",

View File

@ -9,7 +9,9 @@ edition = "2021"
clap = { version = "4.4.6", default-features = false, features = ["std", "color", "help", "derive"] }
duster = { git = "https://code.fizz.buzz/talexander/duster.git", branch = "master" }
include_dir = "0.7.3"
organic = "0.1.12"
# TODO: This is temporary to work on the latest organic code. Eventually switch back to using the published crate.
organic = { path = "../organic" }
# organic = "0.1.12"
serde = { version = "1.0.189", default-features = false, features = ["std", "derive"] }
serde_json = "1.0.107"
tokio = { version = "1.30.0", default-features = false, features = ["rt", "rt-multi-thread", "fs", "io-util"] }

View File

@ -1,6 +1,10 @@
use super::render_context::RenderBlogPost;
use super::render_context::RenderBlogPostPage;
use super::BlogPost;
use super::BlogPostPage;
pub(crate) fn convert_blog_post_to_render_context(post: &BlogPost) -> RenderBlogPost {
RenderBlogPost::new(post.id.clone())
pub(crate) fn convert_blog_post_page_to_render_context(
_post: &BlogPost,
page: &BlogPostPage,
) -> RenderBlogPostPage {
RenderBlogPostPage::new(page.title.clone())
}

View File

@ -11,7 +11,7 @@ use super::BlogPostPage;
#[derive(Debug)]
pub(crate) struct BlogPost {
pub(crate) id: String,
pages: Vec<BlogPostPage>,
pub(crate) pages: Vec<BlogPostPage>,
}
impl BlogPost {

View File

@ -2,6 +2,6 @@ mod convert;
mod definition;
mod page;
mod render_context;
pub(crate) use convert::convert_blog_post_to_render_context;
pub(crate) use convert::convert_blog_post_page_to_render_context;
pub(crate) use definition::BlogPost;
pub(crate) use page::BlogPostPage;

View File

@ -5,9 +5,9 @@ use crate::error::CustomError;
#[derive(Debug)]
pub(crate) struct BlogPostPage {
/// Relative path from the root of the blog post.
path: PathBuf,
pub(crate) path: PathBuf,
title: String,
pub(crate) title: Option<String>,
}
impl BlogPostPage {
@ -18,7 +18,27 @@ impl BlogPostPage {
let path = path.into();
Ok(BlogPostPage {
path,
title: "".to_owned(),
title: get_title(&document),
})
}
/// Get the output path relative to the post directory.
pub(crate) fn get_output_path(&self) -> PathBuf {
let mut ret = self.path.clone();
ret.set_extension("html");
ret
}
}
fn get_title(document: &organic::types::Document<'_>) -> Option<String> {
organic::types::AstNode::from(document)
.iter_all_ast_nodes()
.filter_map(|node| match node {
organic::types::AstNode::Keyword(kw) if kw.key.eq_ignore_ascii_case("title") => {
Some(kw)
}
_ => None,
})
.last()
.map(|kw| kw.value.to_owned())
}

View File

@ -2,13 +2,13 @@ use serde::Serialize;
#[derive(Debug, Serialize)]
#[serde(tag = "type")]
#[serde(rename = "blog_post")]
pub(crate) struct RenderBlogPost {
id: String,
#[serde(rename = "blog_post_page")]
pub(crate) struct RenderBlogPostPage {
title: Option<String>,
}
impl RenderBlogPost {
pub(crate) fn new(id: String) -> RenderBlogPost {
RenderBlogPost { id }
impl RenderBlogPostPage {
pub(crate) fn new(title: Option<String>) -> RenderBlogPostPage {
RenderBlogPostPage { title }
}
}

View File

@ -4,7 +4,7 @@ use std::path::PathBuf;
use include_dir::include_dir;
use include_dir::Dir;
use crate::blog_post::convert_blog_post_to_render_context;
use crate::blog_post::convert_blog_post_page_to_render_context;
use crate::blog_post::BlogPost;
use crate::error::CustomError;
use crate::render::DusterRenderer;
@ -56,9 +56,23 @@ impl SiteRenderer {
}
for blog_post in &self.blog_posts {
let render_context = convert_blog_post_to_render_context(blog_post);
for blog_post_page in &blog_post.pages {
let output_path = self
.output_directory
.join("posts")
.join(&blog_post.id)
.join(blog_post_page.get_output_path());
println!("Output path: {:?}", output_path);
let render_context =
convert_blog_post_page_to_render_context(blog_post, blog_post_page);
let rendered_output = renderer_integration.render(render_context)?;
println!("Rendered: {}", rendered_output);
let parent_directory = output_path
.parent()
.ok_or("Output file should have a containing directory.")?;
tokio::fs::create_dir_all(parent_directory).await?;
tokio::fs::write(output_path, rendered_output).await?;
}
}
Ok(())