Add a prefix to footnote IDs.

This avoids a conflict with multiple blog posts rendering in the same stream.
This commit is contained in:
Tom Alexander
2023-12-19 17:51:35 -05:00
parent d4b290ebe6
commit 2e1c979127
7 changed files with 115 additions and 42 deletions

View File

@@ -86,7 +86,13 @@ render!(
let children = original
.original
.into_iter()
.map(|blog_post| RenderBlogStreamEntry::new(render_context.clone(), blog_post))
.enumerate()
.map(|(i, blog_post)| {
RenderBlogStreamEntry::new(
render_context.clone(),
&RenderBlogStreamEntryInput::new(blog_post, i),
)
})
.collect::<Result<Vec<_>, _>>()?;
let stream_pagination = if original.older_link.is_some() || original.newer_link.is_some() {
@@ -107,6 +113,18 @@ render!(
}
);
#[derive(Debug)]
pub(crate) struct RenderBlogStreamEntryInput<'a> {
original: &'a BlogPost,
offset: usize,
}
impl<'a> RenderBlogStreamEntryInput<'a> {
fn new(original: &'a BlogPost, offset: usize) -> RenderBlogStreamEntryInput<'a> {
RenderBlogStreamEntryInput { original, offset }
}
}
#[derive(Debug, Serialize)]
pub(crate) struct RenderBlogStreamEntry {
/// The title that will be shown visibly on the page.
@@ -119,37 +137,62 @@ pub(crate) struct RenderBlogStreamEntry {
footnotes: Vec<RenderRealFootnoteDefinition>,
}
render!(RenderBlogStreamEntry, BlogPost, original, render_context, {
let link_to_blog_post = get_web_path(
render_context.config,
render_context.output_directory,
render_context.output_file,
render_context
.config
.get_relative_path_to_post(&original.id),
)?;
render!(
RenderBlogStreamEntry,
RenderBlogStreamEntryInput,
original,
render_context,
{
let offset_string = original.offset.to_string();
let render_context = {
let mut render_context = render_context.clone();
render_context.id_addition = Some(offset_string.as_str());
render_context
};
let link_to_blog_post = get_web_path(
render_context.config,
render_context.output_directory,
render_context.output_file,
render_context
.config
.get_relative_path_to_post(&original.original.id),
)?;
// TODO: Should I guess an index page instead of erroring out?
let index_page = original
.get_index_page()
.ok_or_else(|| format!("Blog post {} needs an index page.", original.id))?;
// TODO: Should I guess an index page instead of erroring out?
let index_page = original
.original
.get_index_page()
.ok_or_else(|| format!("Blog post {} needs an index page.", original.original.id))?;
let title = index_page.title.clone();
let title = index_page.title.clone();
// TODO: Handle footnotes.
let children = index_page
.children
.iter()
.map(|child| RenderDocumentElement::new(render_context.clone(), child))
.collect::<Result<Vec<_>, _>>()?;
let children = index_page
.children
.iter()
.map(|child| RenderDocumentElement::new(render_context.clone(), child))
.collect::<Result<Vec<_>, _>>()?;
Ok(RenderBlogStreamEntry {
title,
self_link: Some(link_to_blog_post),
children,
footnotes: Vec::new(),
})
});
let footnotes = {
let mut ret = Vec::new();
for footnote in index_page.footnotes.iter() {
ret.push(RenderRealFootnoteDefinition::new(
render_context.clone(),
footnote,
)?);
}
ret
};
Ok(RenderBlogStreamEntry {
title,
self_link: Some(link_to_blog_post),
children,
footnotes,
})
}
);
#[derive(Debug, Serialize)]
pub(crate) struct RenderBlogStreamPagination {