Add a build for regular non-blog-post pages from org source.

This commit is contained in:
Tom Alexander
2023-12-23 16:37:19 -05:00
parent 424a970014
commit 8905c9356b
9 changed files with 357 additions and 53 deletions

View File

@@ -1,39 +1,21 @@
use std::path::PathBuf;
use crate::error::CustomError;
use super::blog_post_page::get_date;
use super::blog_post_page::get_title;
use super::footnote_definition::IRealFootnoteDefinition;
use super::macros::intermediate;
use super::IDocumentElement;
use super::IHeading;
use super::ISection;
use crate::error::CustomError;
use std::path::PathBuf;
#[derive(Debug)]
pub(crate) struct BlogPostPageInput<'b, 'parse> {
path: PathBuf,
document: &'b organic::types::Document<'parse>,
}
impl<'b, 'parse> BlogPostPageInput<'b, 'parse> {
pub(crate) fn new<P: Into<PathBuf>>(
path: P,
document: &'b organic::types::Document<'parse>,
) -> BlogPostPageInput<'b, 'parse> {
BlogPostPageInput {
path: path.into(),
document,
}
}
}
#[derive(Debug)]
pub(crate) struct BlogPostPage {
/// Relative path from the root of the blog post.
pub(crate) struct IPage {
/// Relative path from the root of the pages directory.
pub(crate) path: PathBuf,
pub(crate) title: Option<String>,
#[allow(dead_code)]
pub(crate) date: Option<String>,
pub(crate) children: Vec<IDocumentElement>,
@@ -42,8 +24,8 @@ pub(crate) struct BlogPostPage {
}
intermediate!(
BlogPostPage,
BlogPostPageInput<'orig, 'parse>,
IPage,
PageInput<'orig, 'parse>,
original,
intermediate_context,
{
@@ -77,7 +59,7 @@ intermediate!(
ret
};
Ok(BlogPostPage {
Ok(IPage {
path: original.path,
title: get_title(original.document),
date: get_date(original.document),
@@ -87,8 +69,8 @@ intermediate!(
}
);
impl BlogPostPage {
/// Get the output path relative to the post directory.
impl IPage {
/// Get the output path relative to the pages directory.
pub(crate) fn get_output_path(&self) -> PathBuf {
let mut ret = self.path.clone();
ret.set_extension("html");
@@ -96,26 +78,20 @@ impl BlogPostPage {
}
}
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())
#[derive(Debug)]
pub(crate) struct PageInput<'b, 'parse> {
path: PathBuf,
document: &'b organic::types::Document<'parse>,
}
fn get_date(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("date") => Some(kw),
_ => None,
})
.last()
.map(|kw| kw.value.to_owned())
impl<'b, 'parse> PageInput<'b, 'parse> {
pub(crate) fn new<P: Into<PathBuf>>(
path: P,
document: &'b organic::types::Document<'parse>,
) -> PageInput<'b, 'parse> {
PageInput {
path: path.into(),
document,
}
}
}