Compare commits
2 Commits
e543a5db74
...
2b6f86d4e9
Author | SHA1 | Date | |
---|---|---|---|
![]() |
2b6f86d4e9 | ||
![]() |
dc233d26b1 |
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -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",
|
||||
|
@ -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"] }
|
||||
|
@ -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())
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
|
@ -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())
|
||||
}
|
||||
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
@ -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(())
|
||||
|
Loading…
x
Reference in New Issue
Block a user