Compare commits
No commits in common. "eb0f4cf5a5e19e7e574d451c0b927a8987491ca1" and "af2f80032179d45a68d7239c1a850415eec80a91" have entirely different histories.
eb0f4cf5a5
...
af2f800321
5 changed files with 10 additions and 48 deletions
|
|
@ -24,7 +24,6 @@ Show cases:
|
||||||
- separate feeds (used for categories, tagging, etc) `/feed/{tag}`
|
- separate feeds (used for categories, tagging, etc) `/feed/{tag}`
|
||||||
- exclusion of feeds from main feed (drafts or system notes)
|
- exclusion of feeds from main feed (drafts or system notes)
|
||||||
- HTML anchors for headers
|
- HTML anchors for headers
|
||||||
- list random posts at the bottom
|
|
||||||
|
|
||||||
**Ideas**:
|
**Ideas**:
|
||||||
- RSS
|
- RSS
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@
|
||||||
- excluding feeds in config file like [/feed/draft/](/feed/draft/)
|
- excluding feeds in config file like [/feed/draft/](/feed/draft/)
|
||||||
- static files like [/LICENSE](/LICENSE)
|
- static files like [/LICENSE](/LICENSE)
|
||||||
- html anchors for headers like [#second-header](/your-first-article/#second-header)
|
- html anchors for headers like [#second-header](/your-first-article/#second-header)
|
||||||
- show random posts at the end of the page
|
|
||||||
|
|
||||||
Everything is **[open-source](https://git.uphillsecurity.com/cf7/picopaper)**!
|
Everything is **[open-source](https://git.uphillsecurity.com/cf7/picopaper)**!
|
||||||
|
|
||||||
|
|
|
||||||
31
picopaper.py
31
picopaper.py
|
|
@ -24,14 +24,6 @@ class SSGGGenerator:
|
||||||
# Setup Jinja2
|
# Setup Jinja2
|
||||||
self.env = Environment(loader=FileSystemLoader(self.templates_dir))
|
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
|
# Setup markdown with toc extension for header anchors
|
||||||
self.md = markdown.Markdown(extensions=['extra', 'toc'])
|
self.md = markdown.Markdown(extensions=['extra', 'toc'])
|
||||||
|
|
||||||
|
|
@ -126,7 +118,7 @@ class SSGGGenerator:
|
||||||
|
|
||||||
return posts
|
return posts
|
||||||
|
|
||||||
def generate_index(self, posts, feed_name=None, all_posts=None):
|
def generate_index(self, posts, feed_name=None):
|
||||||
"""Generate index.html with all posts (or feed-specific index)"""
|
"""Generate index.html with all posts (or feed-specific index)"""
|
||||||
template = self.env.get_template('index.tmpl')
|
template = self.env.get_template('index.tmpl')
|
||||||
|
|
||||||
|
|
@ -142,8 +134,7 @@ class SSGGGenerator:
|
||||||
blog_title=self.blog_title,
|
blog_title=self.blog_title,
|
||||||
blog_description=self.blog_description,
|
blog_description=self.blog_description,
|
||||||
navbar_items=self.navbar_items,
|
navbar_items=self.navbar_items,
|
||||||
posts=posts,
|
posts=posts
|
||||||
all_posts=all_posts or posts
|
|
||||||
)
|
)
|
||||||
|
|
||||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
@ -152,7 +143,7 @@ class SSGGGenerator:
|
||||||
|
|
||||||
print(f"✓ Generated {output_path}")
|
print(f"✓ Generated {output_path}")
|
||||||
|
|
||||||
def generate_feeds_overview(self, feeds, all_posts=None):
|
def generate_feeds_overview(self, feeds):
|
||||||
"""Generate /feed/index.html with list of all non-excluded feeds"""
|
"""Generate /feed/index.html with list of all non-excluded feeds"""
|
||||||
template = self.env.get_template('feeds.tmpl')
|
template = self.env.get_template('feeds.tmpl')
|
||||||
|
|
||||||
|
|
@ -173,8 +164,7 @@ class SSGGGenerator:
|
||||||
blog_title=self.blog_title,
|
blog_title=self.blog_title,
|
||||||
blog_description=self.blog_description,
|
blog_description=self.blog_description,
|
||||||
navbar_items=self.navbar_items,
|
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)
|
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
@ -183,7 +173,7 @@ class SSGGGenerator:
|
||||||
|
|
||||||
print(f"✓ Generated {output_path}")
|
print(f"✓ Generated {output_path}")
|
||||||
|
|
||||||
def generate_post_page(self, post, all_posts=None):
|
def generate_post_page(self, post):
|
||||||
"""Generate individual post page for 'long' posts"""
|
"""Generate individual post page for 'long' posts"""
|
||||||
template = self.env.get_template('post.tmpl')
|
template = self.env.get_template('post.tmpl')
|
||||||
|
|
||||||
|
|
@ -192,8 +182,7 @@ class SSGGGenerator:
|
||||||
blog_title=self.blog_title,
|
blog_title=self.blog_title,
|
||||||
blog_description=self.blog_description,
|
blog_description=self.blog_description,
|
||||||
navbar_items=self.navbar_items,
|
navbar_items=self.navbar_items,
|
||||||
post=post,
|
post=post
|
||||||
all_posts=all_posts or []
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Create directory for the post slug
|
# Create directory for the post slug
|
||||||
|
|
@ -257,7 +246,7 @@ class SSGGGenerator:
|
||||||
and p['feed'] not in self.exclude_feeds]
|
and p['feed'] not in self.exclude_feeds]
|
||||||
|
|
||||||
# Generate main index with filtered feed posts
|
# Generate main index with filtered feed posts
|
||||||
self.generate_index(feed_posts, all_posts=feed_posts)
|
self.generate_index(feed_posts)
|
||||||
|
|
||||||
# Group posts by feed (include all posts, not just those in main feed)
|
# Group posts by feed (include all posts, not just those in main feed)
|
||||||
feeds = {}
|
feeds = {}
|
||||||
|
|
@ -267,16 +256,16 @@ class SSGGGenerator:
|
||||||
|
|
||||||
# Generate feed-specific pages
|
# Generate feed-specific pages
|
||||||
for feed_name, posts in feeds.items():
|
for feed_name, posts in feeds.items():
|
||||||
self.generate_index(posts, feed_name, all_posts=feed_posts)
|
self.generate_index(posts, feed_name)
|
||||||
|
|
||||||
# Generate feeds overview page
|
# Generate feeds overview page
|
||||||
if feeds:
|
if feeds:
|
||||||
self.generate_feeds_overview(feeds, all_posts=feed_posts)
|
self.generate_feeds_overview(feeds)
|
||||||
|
|
||||||
# Generate individual pages for long posts, short posts, and pages
|
# Generate individual pages for long posts, short posts, and pages
|
||||||
for post in all_posts:
|
for post in all_posts:
|
||||||
if post['type'] in ['long', 'short', 'page']:
|
if post['type'] in ['long', 'short', 'page']:
|
||||||
self.generate_post_page(post, all_posts=feed_posts)
|
self.generate_post_page(post)
|
||||||
|
|
||||||
# Copy assets
|
# Copy assets
|
||||||
self.copy_assets()
|
self.copy_assets()
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,6 @@
|
||||||
{{ post.content | safe }}
|
{{ post.content | safe }}
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
{% include 'random_posts.tmpl' %}
|
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
{% include 'footer.tmpl' %}
|
{% include 'footer.tmpl' %}
|
||||||
|
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
{% 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 %}
|
|
||||||
<div class="random-posts">
|
|
||||||
<h3>More Posts</h3>
|
|
||||||
<ul>
|
|
||||||
{% for p in random_posts %}
|
|
||||||
<li>
|
|
||||||
<a href="{{ p.url }}">{{ p.title }}</a>
|
|
||||||
<span class="date">{{ p.date }}</span>
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue