From 1b8f77cb4b9179837f465e33acdfd72316c32abc Mon Sep 17 00:00:00 2001 From: CaffeineFueled Date: Thu, 23 Oct 2025 22:41:36 +0200 Subject: [PATCH] ADD feature 5 random posts at the end of a post #17 --- picopaper.py | 31 +++++++++++++++-------- theme/default/templates/post.tmpl | 2 ++ theme/default/templates/random_posts.tmpl | 23 +++++++++++++++++ 3 files changed, 46 insertions(+), 10 deletions(-) create mode 100644 theme/default/templates/random_posts.tmpl diff --git a/picopaper.py b/picopaper.py index 7576a38..f9184a1 100644 --- a/picopaper.py +++ b/picopaper.py @@ -24,6 +24,14 @@ class SSGGGenerator: # Setup Jinja2 self.env = Environment(loader=FileSystemLoader(self.templates_dir)) + # Add custom filter for random sampling + def random_sample(items, count): + import random + items_list = list(items) + return random.sample(items_list, min(count, len(items_list))) + + self.env.filters['random_sample'] = random_sample + # Setup markdown with toc extension for header anchors self.md = markdown.Markdown(extensions=['extra', 'toc']) @@ -118,7 +126,7 @@ class SSGGGenerator: return posts - def generate_index(self, posts, feed_name=None): + def generate_index(self, posts, feed_name=None, all_posts=None): """Generate index.html with all posts (or feed-specific index)""" template = self.env.get_template('index.tmpl') @@ -134,7 +142,8 @@ class SSGGGenerator: blog_title=self.blog_title, blog_description=self.blog_description, navbar_items=self.navbar_items, - posts=posts + posts=posts, + all_posts=all_posts or posts ) output_path.parent.mkdir(parents=True, exist_ok=True) @@ -143,7 +152,7 @@ class SSGGGenerator: print(f"✓ Generated {output_path}") - def generate_feeds_overview(self, feeds): + def generate_feeds_overview(self, feeds, all_posts=None): """Generate /feed/index.html with list of all non-excluded feeds""" template = self.env.get_template('feeds.tmpl') @@ -164,7 +173,8 @@ class SSGGGenerator: blog_title=self.blog_title, blog_description=self.blog_description, navbar_items=self.navbar_items, - feeds=feed_list + feeds=feed_list, + all_posts=all_posts or [] ) output_path.parent.mkdir(parents=True, exist_ok=True) @@ -173,7 +183,7 @@ class SSGGGenerator: print(f"✓ Generated {output_path}") - def generate_post_page(self, post): + def generate_post_page(self, post, all_posts=None): """Generate individual post page for 'long' posts""" template = self.env.get_template('post.tmpl') @@ -182,7 +192,8 @@ class SSGGGenerator: blog_title=self.blog_title, blog_description=self.blog_description, navbar_items=self.navbar_items, - post=post + post=post, + all_posts=all_posts or [] ) # Create directory for the post slug @@ -246,7 +257,7 @@ class SSGGGenerator: and p['feed'] not in self.exclude_feeds] # Generate main index with filtered feed posts - self.generate_index(feed_posts) + self.generate_index(feed_posts, all_posts=feed_posts) # Group posts by feed (include all posts, not just those in main feed) feeds = {} @@ -256,16 +267,16 @@ class SSGGGenerator: # Generate feed-specific pages for feed_name, posts in feeds.items(): - self.generate_index(posts, feed_name) + self.generate_index(posts, feed_name, all_posts=feed_posts) # Generate feeds overview page if feeds: - self.generate_feeds_overview(feeds) + self.generate_feeds_overview(feeds, all_posts=feed_posts) # Generate individual pages for long posts, short posts, and pages for post in all_posts: if post['type'] in ['long', 'short', 'page']: - self.generate_post_page(post) + self.generate_post_page(post, all_posts=feed_posts) # Copy assets self.copy_assets() diff --git a/theme/default/templates/post.tmpl b/theme/default/templates/post.tmpl index d1573bd..9191071 100644 --- a/theme/default/templates/post.tmpl +++ b/theme/default/templates/post.tmpl @@ -14,6 +14,8 @@ {{ post.content | safe }} + + {% include 'random_posts.tmpl' %} {% include 'footer.tmpl' %} diff --git a/theme/default/templates/random_posts.tmpl b/theme/default/templates/random_posts.tmpl new file mode 100644 index 0000000..f75e2f0 --- /dev/null +++ b/theme/default/templates/random_posts.tmpl @@ -0,0 +1,23 @@ +{% if all_posts %} +{# Filter out pages and current post, then randomly select 5 #} +{% set available_posts = all_posts | selectattr('type', 'ne', 'page') | list %} +{% if post %} + {% set available_posts = available_posts | rejectattr('slug', 'equalto', post.slug) | list %} +{% endif %} +{% if available_posts %} + {% set random_posts = available_posts | random_sample(5) %} + {% if random_posts %} +
+

More Posts

+ +
+ {% endif %} +{% endif %} +{% endif %}