2023-10-22 15:31:45 -04:00
|
|
|
use serde::Serialize;
|
|
|
|
|
2023-12-19 15:42:37 -05:00
|
|
|
use super::render_context::RenderContext;
|
2025-02-08 18:13:55 -05:00
|
|
|
use crate::context::macros::push_file;
|
2023-12-19 15:42:37 -05:00
|
|
|
use crate::error::CustomError;
|
|
|
|
use crate::intermediate::get_web_path;
|
|
|
|
use crate::intermediate::BlogPost;
|
|
|
|
use crate::intermediate::BlogPostPage;
|
|
|
|
|
2023-10-29 15:50:09 -04:00
|
|
|
use super::footnote_definition::RenderRealFootnoteDefinition;
|
2023-12-19 15:42:37 -05:00
|
|
|
use super::macros::render;
|
2023-10-23 23:49:35 -04:00
|
|
|
use super::GlobalSettings;
|
2023-12-17 14:30:17 -05:00
|
|
|
use super::PageHeader;
|
2023-10-24 00:01:40 -04:00
|
|
|
use super::RenderDocumentElement;
|
2023-10-23 21:51:15 -04:00
|
|
|
|
2023-12-19 15:42:37 -05:00
|
|
|
#[derive(Debug)]
|
|
|
|
pub(crate) struct RenderBlogPostPageInput<'a> {
|
2023-12-23 06:38:23 -05:00
|
|
|
#[allow(dead_code)]
|
2023-12-19 15:42:37 -05:00
|
|
|
post: &'a BlogPost,
|
|
|
|
page: &'a BlogPostPage,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> RenderBlogPostPageInput<'a> {
|
|
|
|
pub(crate) fn new(post: &'a BlogPost, page: &'a BlogPostPage) -> RenderBlogPostPageInput<'a> {
|
|
|
|
RenderBlogPostPageInput { post, page }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-10-22 15:31:45 -04:00
|
|
|
#[derive(Debug, Serialize)]
|
|
|
|
#[serde(tag = "type")]
|
2023-10-23 20:30:43 -04:00
|
|
|
#[serde(rename = "blog_post_page")]
|
|
|
|
pub(crate) struct RenderBlogPostPage {
|
2023-10-23 21:51:15 -04:00
|
|
|
global_settings: GlobalSettings,
|
|
|
|
|
2023-12-17 14:30:17 -05:00
|
|
|
page_header: Option<PageHeader>,
|
|
|
|
|
2023-10-23 21:51:15 -04:00
|
|
|
/// The title that will be shown visibly on the page.
|
2023-10-23 20:30:43 -04:00
|
|
|
title: Option<String>,
|
2023-10-23 22:38:00 -04:00
|
|
|
|
|
|
|
self_link: Option<String>,
|
2023-10-24 00:01:40 -04:00
|
|
|
|
|
|
|
children: Vec<RenderDocumentElement>,
|
2023-10-29 15:50:09 -04:00
|
|
|
|
|
|
|
footnotes: Vec<RenderRealFootnoteDefinition>,
|
2023-10-23 16:03:37 -04:00
|
|
|
}
|
|
|
|
|
2023-12-19 15:42:37 -05:00
|
|
|
render!(
|
|
|
|
RenderBlogPostPage,
|
|
|
|
RenderBlogPostPageInput,
|
|
|
|
original,
|
|
|
|
render_context,
|
|
|
|
{
|
2025-02-08 18:13:55 -05:00
|
|
|
push_file!(render_context, &original.page.src, {
|
2025-02-08 18:01:59 -05:00
|
|
|
let css_files = vec![
|
|
|
|
get_web_path(
|
|
|
|
render_context.config,
|
|
|
|
render_context.output_root_directory,
|
|
|
|
render_context.output_file,
|
|
|
|
"stylesheet/reset.css",
|
|
|
|
)?,
|
|
|
|
get_web_path(
|
|
|
|
render_context.config,
|
|
|
|
render_context.output_root_directory,
|
|
|
|
render_context.output_file,
|
|
|
|
"stylesheet/main.css",
|
|
|
|
)?,
|
|
|
|
];
|
|
|
|
let js_files = vec![get_web_path(
|
2023-12-19 18:06:52 -05:00
|
|
|
render_context.config,
|
|
|
|
render_context.output_root_directory,
|
|
|
|
render_context.output_file,
|
2025-02-08 18:01:59 -05:00
|
|
|
"blog_post.js",
|
|
|
|
)?];
|
|
|
|
let global_settings =
|
|
|
|
GlobalSettings::new(original.page.title.clone(), css_files, js_files);
|
|
|
|
let page_header = PageHeader::new(
|
|
|
|
render_context.config.get_site_title().map(str::to_string),
|
|
|
|
Some(get_web_path(
|
|
|
|
render_context.config,
|
|
|
|
render_context.output_root_directory,
|
|
|
|
render_context.output_file,
|
|
|
|
"",
|
|
|
|
)?),
|
|
|
|
);
|
|
|
|
let link_to_blog_post = get_web_path(
|
2023-12-19 15:42:37 -05:00
|
|
|
render_context.config,
|
2023-12-19 18:03:59 -05:00
|
|
|
render_context.output_root_directory,
|
2023-12-19 15:42:37 -05:00
|
|
|
render_context.output_file,
|
2025-02-08 18:01:59 -05:00
|
|
|
render_context
|
|
|
|
.output_file
|
|
|
|
.strip_prefix(render_context.output_root_directory)?,
|
|
|
|
)?;
|
|
|
|
|
|
|
|
let children = {
|
|
|
|
let mut children = Vec::new();
|
|
|
|
|
|
|
|
for child in original.page.children.iter() {
|
|
|
|
children.push(RenderDocumentElement::new(render_context.clone(), child)?);
|
|
|
|
}
|
|
|
|
|
|
|
|
children
|
|
|
|
};
|
|
|
|
|
|
|
|
let footnotes = {
|
|
|
|
let mut ret = Vec::new();
|
|
|
|
|
|
|
|
for footnote in original.page.footnotes.iter() {
|
|
|
|
ret.push(RenderRealFootnoteDefinition::new(
|
|
|
|
render_context.clone(),
|
|
|
|
footnote,
|
|
|
|
)?);
|
|
|
|
}
|
|
|
|
|
|
|
|
ret
|
|
|
|
};
|
|
|
|
|
|
|
|
let ret = RenderBlogPostPage {
|
|
|
|
global_settings,
|
|
|
|
page_header: Some(page_header),
|
|
|
|
title: original.page.title.clone(),
|
|
|
|
self_link: Some(link_to_blog_post),
|
|
|
|
children,
|
|
|
|
footnotes,
|
|
|
|
};
|
|
|
|
Ok(ret)
|
2025-02-08 18:13:55 -05:00
|
|
|
})
|
2023-10-23 16:03:37 -04:00
|
|
|
}
|
2023-12-19 15:42:37 -05:00
|
|
|
);
|