Add a prefix to footnote IDs.
This avoids a conflict with multiple blog posts rendering in the same stream.
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user