Add support for unlisted posts.
This commit is contained in:
parent
0420f58d02
commit
fa8753077a
5
TODO.org
5
TODO.org
@ -1,4 +1,4 @@
|
||||
* Things to do [5/14]
|
||||
* Things to do [6/17]
|
||||
** DONE If the paragraph only contains an image, text-align center
|
||||
** DONE Syntax highlighting for code blocks
|
||||
** TODO Render gnuplot
|
||||
@ -16,3 +16,6 @@
|
||||
*** TODO gnuplot
|
||||
https://github.com/dpezto/tree-sitter-gnuplot is not on crates.io so I'd have to add a git dependency to use it. This would prevent publishing this crate to crates.io.
|
||||
** DONE Bug: carry over highlight starts when breaking lines
|
||||
** TODO Add dates to posts
|
||||
** DONE Add support for unlisted posts (posts that do not show up on the homepage).
|
||||
** TODO Add support for showing file name where we currently show language
|
||||
|
@ -18,6 +18,7 @@ use crate::error::CustomError;
|
||||
use crate::intermediate::get_web_path;
|
||||
use crate::intermediate::BlogPost;
|
||||
use crate::intermediate::IPage;
|
||||
use crate::intermediate::PublishStatus;
|
||||
use crate::render::DusterRenderer;
|
||||
use crate::render::RendererIntegration;
|
||||
use crate::walk_fs::walk_fs;
|
||||
@ -155,7 +156,21 @@ impl SiteRenderer {
|
||||
|
||||
// Sort blog posts by date, newest first.
|
||||
let sorted_blog_posts = {
|
||||
let mut sorted_blog_posts: Vec<_> = self.blog_posts.iter().collect();
|
||||
let mut sorted_blog_posts: Vec<_> = self
|
||||
.blog_posts
|
||||
.iter()
|
||||
.filter(|blog_post| {
|
||||
match blog_post
|
||||
.get_index_page()
|
||||
.expect("Blog posts should have an index page.")
|
||||
.natter_publish
|
||||
{
|
||||
PublishStatus::Full => true,
|
||||
PublishStatus::Unlisted => false,
|
||||
PublishStatus::Unpublished => false,
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
sorted_blog_posts
|
||||
.sort_by_key(|blog_post| (blog_post.get_date(), blog_post.id.as_str()));
|
||||
sorted_blog_posts.reverse();
|
||||
|
@ -48,6 +48,16 @@ pub(crate) struct BlogPostPage {
|
||||
pub(crate) children: Vec<IDocumentElement>,
|
||||
|
||||
pub(crate) footnotes: Vec<IRealFootnoteDefinition>,
|
||||
|
||||
pub(crate) natter_publish: PublishStatus,
|
||||
}
|
||||
|
||||
#[derive(Debug, Default)]
|
||||
pub(crate) enum PublishStatus {
|
||||
#[default]
|
||||
Full,
|
||||
Unlisted,
|
||||
Unpublished,
|
||||
}
|
||||
|
||||
intermediate!(
|
||||
@ -93,6 +103,7 @@ intermediate!(
|
||||
date: get_date(original.document),
|
||||
children,
|
||||
footnotes,
|
||||
natter_publish: get_publish_status(original.document).unwrap_or_default(),
|
||||
})
|
||||
}
|
||||
);
|
||||
@ -129,3 +140,25 @@ pub(crate) fn get_date(document: &organic::types::Document<'_>) -> Option<String
|
||||
.last()
|
||||
.map(|kw| kw.value.to_owned())
|
||||
}
|
||||
|
||||
pub(crate) fn get_publish_status(document: &organic::types::Document<'_>) -> Option<PublishStatus> {
|
||||
let publish_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("natter_publish") =>
|
||||
{
|
||||
Some(kw)
|
||||
}
|
||||
_ => None,
|
||||
})
|
||||
.last()
|
||||
.map(|kw| kw.value);
|
||||
match publish_string {
|
||||
Some("full") => Some(PublishStatus::Full),
|
||||
Some("unlisted") => Some(PublishStatus::Unlisted),
|
||||
Some("unpublished") => Some(PublishStatus::Unpublished),
|
||||
Some(status) => panic!("Unrecognized publish status: {}", status),
|
||||
None => None,
|
||||
}
|
||||
}
|
||||
|
@ -74,6 +74,7 @@ pub(crate) use babel_call::IBabelCall;
|
||||
pub(crate) use blog_post::get_org_files;
|
||||
pub(crate) use blog_post::BlogPost;
|
||||
pub(crate) use blog_post_page::BlogPostPage;
|
||||
pub(crate) use blog_post_page::PublishStatus;
|
||||
pub(crate) use bold::IBold;
|
||||
pub(crate) use center_block::ICenterBlock;
|
||||
pub(crate) use citation::ICitation;
|
||||
|
Loading…
x
Reference in New Issue
Block a user