From e543a5db741902bc31fab32fa3be75f0860cfdd6 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Mon, 23 Oct 2023 16:03:37 -0400 Subject: [PATCH] Starting to introduce a BlogPostPage struct. Blog posts are going to be constructed of multiple documents each forming their own page. This will allow me to link to supporting documents without having to promote them to their own pages. --- src/blog_post/convert.rs | 4 +--- src/blog_post/definition.rs | 16 ++++++++++++++++ src/blog_post/mod.rs | 2 ++ src/blog_post/page.rs | 24 ++++++++++++++++++++++++ src/blog_post/render_context.rs | 8 +++++++- src/error/error.rs | 7 +++++++ 6 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 src/blog_post/page.rs diff --git a/src/blog_post/convert.rs b/src/blog_post/convert.rs index 128dd04..a2de168 100644 --- a/src/blog_post/convert.rs +++ b/src/blog_post/convert.rs @@ -2,7 +2,5 @@ use super::render_context::RenderBlogPost; use super::BlogPost; pub(crate) fn convert_blog_post_to_render_context(post: &BlogPost) -> RenderBlogPost { - RenderBlogPost { - id: post.id.clone(), - } + RenderBlogPost::new(post.id.clone()) } diff --git a/src/blog_post/definition.rs b/src/blog_post/definition.rs index 087beef..7589986 100644 --- a/src/blog_post/definition.rs +++ b/src/blog_post/definition.rs @@ -6,9 +6,12 @@ use walkdir::WalkDir; use crate::error::CustomError; +use super::BlogPostPage; + #[derive(Debug)] pub(crate) struct BlogPost { pub(crate) id: String, + pages: Vec, } impl BlogPost { @@ -39,8 +42,21 @@ impl BlogPost { ret }; + let pages = { + let mut ret = Vec::new(); + for (real_path, _contents, parsed_document) in parsed_org_files { + let relative_to_post_dir_path = real_path.strip_prefix(post_dir)?; + ret.push(BlogPostPage::new( + relative_to_post_dir_path, + parsed_document, + )?); + } + ret + }; + Ok(BlogPost { id: post_id.to_string_lossy().into_owned(), + pages, }) } inner(root_dir.as_ref(), post_dir.as_ref()).await diff --git a/src/blog_post/mod.rs b/src/blog_post/mod.rs index 0962dda..9ec4e23 100644 --- a/src/blog_post/mod.rs +++ b/src/blog_post/mod.rs @@ -1,5 +1,7 @@ mod convert; mod definition; +mod page; mod render_context; pub(crate) use convert::convert_blog_post_to_render_context; pub(crate) use definition::BlogPost; +pub(crate) use page::BlogPostPage; diff --git a/src/blog_post/page.rs b/src/blog_post/page.rs new file mode 100644 index 0000000..21e7c3f --- /dev/null +++ b/src/blog_post/page.rs @@ -0,0 +1,24 @@ +use std::path::PathBuf; + +use crate::error::CustomError; + +#[derive(Debug)] +pub(crate) struct BlogPostPage { + /// Relative path from the root of the blog post. + path: PathBuf, + + title: String, +} + +impl BlogPostPage { + pub(crate) fn new>( + path: P, + document: organic::types::Document<'_>, + ) -> Result { + let path = path.into(); + Ok(BlogPostPage { + path, + title: "".to_owned(), + }) + } +} diff --git a/src/blog_post/render_context.rs b/src/blog_post/render_context.rs index 27fe4e4..9163d90 100644 --- a/src/blog_post/render_context.rs +++ b/src/blog_post/render_context.rs @@ -4,5 +4,11 @@ use serde::Serialize; #[serde(tag = "type")] #[serde(rename = "blog_post")] pub(crate) struct RenderBlogPost { - pub(crate) id: String, + id: String, +} + +impl RenderBlogPost { + pub(crate) fn new(id: String) -> RenderBlogPost { + RenderBlogPost { id } + } } diff --git a/src/error/error.rs b/src/error/error.rs index 1311682..9707bdb 100644 --- a/src/error/error.rs +++ b/src/error/error.rs @@ -14,6 +14,7 @@ pub(crate) enum CustomError { FromUtf8(FromUtf8Error), DusterCompile(duster::renderer::CompileError), DusterRender(duster::renderer::RenderError), + PathStripPrefix(std::path::StripPrefixError), } impl From for CustomError { @@ -81,3 +82,9 @@ impl From for CustomError { CustomError::DusterRender(value) } } + +impl From for CustomError { + fn from(value: std::path::StripPrefixError) -> Self { + CustomError::PathStripPrefix(value) + } +}