From a08a7f537e0c5e4ca826ece1f4dcfc21cca35bff Mon Sep 17 00:00:00 2001 From: CaffeineFueled Date: Mon, 13 Oct 2025 01:09:57 +0200 Subject: [PATCH 1/3] #11 ADD page creation for SHORT and links in main feed --- picopaper.py | 4 ++-- theme/default/templates/index.tmpl | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/picopaper.py b/picopaper.py index b7d5407..b3d69ff 100644 --- a/picopaper.py +++ b/picopaper.py @@ -211,9 +211,9 @@ class SSGGGenerator: for feed_name, posts in feeds.items(): self.generate_index(posts, feed_name) - # Generate individual pages for long posts and pages + # Generate individual pages for long posts, short posts, and pages for post in all_posts: - if post['type'] in ['long', 'page']: + if post['type'] in ['long', 'short', 'page']: self.generate_post_page(post) # Copy assets diff --git a/theme/default/templates/index.tmpl b/theme/default/templates/index.tmpl index 2519d4b..f1c1e01 100644 --- a/theme/default/templates/index.tmpl +++ b/theme/default/templates/index.tmpl @@ -11,7 +11,7 @@

- {% if post.type == 'long' %} + {% if post.type in ['long', 'short'] %} {{ post.title }} {% else %} {{ post.title }} From ae123ffe804fc56851f823bcc32460abaa3b130e Mon Sep 17 00:00:00 2001 From: CaffeineFueled Date: Mon, 13 Oct 2025 01:23:29 +0200 Subject: [PATCH 2/3] #9 - ADD automated anchors for headers - toc module for IDs and slugified header with python + ADD dummy content for display --- ...-10-06_long_your-first-article_tutorial.md | 12 +++++++++++ picopaper.py | 21 +++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/items/2025-10-06_long_your-first-article_tutorial.md b/items/2025-10-06_long_your-first-article_tutorial.md index 7a08a85..4a63b0e 100644 --- a/items/2025-10-06_long_your-first-article_tutorial.md +++ b/items/2025-10-06_long_your-first-article_tutorial.md @@ -3,3 +3,15 @@ This is a `long` form articles. In the main feed, it is a simple link to the rest of the content. Please check the [official documentation](https://git.uphillsecurity.com/cf7/picopaper) for more details. + +## This is a secondary header + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Massa porta accumsan eros aliquet consequat elit tincidunt imperdiet in adipiscing diam integer risus. Dapibus bibendum adipiscing rhoncus parturient fusce ultrices in accumsan phasellus tempus est senectus felis. Donec placerat porta lobortis magna consectetur hac pretium eleifend tempor cum nulla fusce aliquet. + +Primis amet nullam dictum ridiculus neque ipsum elit volutpat mauris posuere pellentesque euismod felis. Cum nunc ullamcorper dictum metus maecenas accumsan elit purus convallis vulputate mauris sollicitudin diam. Diam iaculis aliquet eleifend sociosqu nostra massa malesuada feugiat sit penatibus dolor montes purus. Porta vulputate dictumst sodales dolor ad euismod consequat interdum mus porttitor erat torquent consequat. + +## Third header + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Massa porta accumsan eros aliquet consequat elit tincidunt imperdiet in adipiscing diam integer risus. Dapibus bibendum adipiscing rhoncus parturient fusce ultrices in accumsan phasellus tempus est senectus felis. Donec placerat porta lobortis magna consectetur hac pretium eleifend tempor cum nulla fusce aliquet. + +Primis amet nullam dictum ridiculus neque ipsum elit volutpat mauris posuere pellentesque euismod felis. Cum nunc ullamcorper dictum metus maecenas accumsan elit purus convallis vulputate mauris sollicitudin diam. Diam iaculis aliquet eleifend sociosqu nostra massa malesuada feugiat sit penatibus dolor montes purus. Porta vulputate dictumst sodales dolor ad euismod consequat interdum mus porttitor erat torquent consequat. diff --git a/picopaper.py b/picopaper.py index b3d69ff..6b5f389 100644 --- a/picopaper.py +++ b/picopaper.py @@ -24,8 +24,8 @@ class SSGGGenerator: # Setup Jinja2 self.env = Environment(loader=FileSystemLoader(self.templates_dir)) - # Setup markdown - self.md = markdown.Markdown(extensions=['extra']) + # Setup markdown with toc extension for header anchors + self.md = markdown.Markdown(extensions=['extra', 'toc']) def parse_filename(self, filename): """Parse filename format: YYYY-MM-DD_type_name[_feed].md""" @@ -47,6 +47,20 @@ class SSGGGenerator: 'filename': filename } + def add_header_anchors(self, html_content): + """Add anchor links to headers with IDs""" + # Pattern to match headers with id attributes:

Text

+ def replace_header(match): + tag = match.group(1) + header_id = match.group(2) + text = match.group(3) + # Add anchor link with # symbol + return f'<{tag} id="{header_id}">{text} #' + + # Match h2-h6 tags with id attributes + pattern = r'<(h[2-6]) id="([^"]+)">([^<]+)<\/\1>' + return re.sub(pattern, replace_header, html_content) + def read_post(self, filepath): """Read markdown file and extract title and content""" with open(filepath, 'r', encoding='utf-8') as f: @@ -63,6 +77,9 @@ class SSGGGenerator: # Convert markdown to HTML html_content = self.md.convert(content) + # Add anchor links to headers + html_content = self.add_header_anchors(html_content) + return title, html_content def collect_posts(self): From 980392c51942d863ae0d4b8e501d50a24561c77e Mon Sep 17 00:00:00 2001 From: CaffeineFueled Date: Mon, 13 Oct 2025 01:27:39 +0200 Subject: [PATCH 3/3] CHANGE examples for headers + ADD information to features list --- README.md | 1 + items/2025-10-06_long_your-first-article_tutorial.md | 4 ++-- items/2025-10-09_short_features.md | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e07faba..1f79def 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ Show cases: - Static files - separate feeds (used for categories, tagging, etc) `/feed/{tag}` - exclusion of feeds from main feed (drafts or system notes) +- HTML anchors for headers **Ideas**: - RSS diff --git a/items/2025-10-06_long_your-first-article_tutorial.md b/items/2025-10-06_long_your-first-article_tutorial.md index 4a63b0e..0187ff1 100644 --- a/items/2025-10-06_long_your-first-article_tutorial.md +++ b/items/2025-10-06_long_your-first-article_tutorial.md @@ -4,13 +4,13 @@ This is a `long` form articles. In the main feed, it is a simple link to the res Please check the [official documentation](https://git.uphillsecurity.com/cf7/picopaper) for more details. -## This is a secondary header +## Second Header Lorem ipsum dolor sit amet, consectetur adipiscing elit. Massa porta accumsan eros aliquet consequat elit tincidunt imperdiet in adipiscing diam integer risus. Dapibus bibendum adipiscing rhoncus parturient fusce ultrices in accumsan phasellus tempus est senectus felis. Donec placerat porta lobortis magna consectetur hac pretium eleifend tempor cum nulla fusce aliquet. Primis amet nullam dictum ridiculus neque ipsum elit volutpat mauris posuere pellentesque euismod felis. Cum nunc ullamcorper dictum metus maecenas accumsan elit purus convallis vulputate mauris sollicitudin diam. Diam iaculis aliquet eleifend sociosqu nostra massa malesuada feugiat sit penatibus dolor montes purus. Porta vulputate dictumst sodales dolor ad euismod consequat interdum mus porttitor erat torquent consequat. -## Third header +## Third Header Lorem ipsum dolor sit amet, consectetur adipiscing elit. Massa porta accumsan eros aliquet consequat elit tincidunt imperdiet in adipiscing diam integer risus. Dapibus bibendum adipiscing rhoncus parturient fusce ultrices in accumsan phasellus tempus est senectus felis. Donec placerat porta lobortis magna consectetur hac pretium eleifend tempor cum nulla fusce aliquet. diff --git a/items/2025-10-09_short_features.md b/items/2025-10-09_short_features.md index ee6254c..e521d99 100644 --- a/items/2025-10-09_short_features.md +++ b/items/2025-10-09_short_features.md @@ -6,6 +6,7 @@ - separate feeds like [/feed/tutorial/](/feed/tutorial/) - excluding feeds in config file like [/feed/draft/](/feed/draft/) - static files like [/LICENSE](/LICENSE) +- html anchors for headers like [#second-header](/your-first-article/#second-header) Everything is **[open-source](https://git.uphillsecurity.com/cf7/picopaper)**!