aboutsummaryrefslogtreecommitdiff
path: root/blog_experiment/blog
diff options
context:
space:
mode:
authoralex <alex@pdp7.net>2023-10-08 16:40:42 +0200
committeralex <alex@pdp7.net>2023-10-08 16:40:42 +0200
commit6a390b55041c60387b8afc5e5f6a69a5e494939f (patch)
tree406a4826643bf180f47aa1d2648c6603471d7f33 /blog_experiment/blog
parent63b0946233b06735b8403c2f67acc7b706195909 (diff)
Add RSS
Diffstat (limited to 'blog_experiment/blog')
-rw-r--r--blog_experiment/blog/__init__.py2
-rw-r--r--blog_experiment/blog/blog_pages.py34
-rw-r--r--blog_experiment/blog/html.py6
-rw-r--r--blog_experiment/blog/meta.py3
4 files changed, 39 insertions, 6 deletions
diff --git a/blog_experiment/blog/__init__.py b/blog_experiment/blog/__init__.py
index 4b1e0ba5..594d1a77 100644
--- a/blog_experiment/blog/__init__.py
+++ b/blog_experiment/blog/__init__.py
@@ -13,4 +13,6 @@ def handler(request: bicephalus.Request) -> bicephalus.Response:
blog_file = pathlib.Path("content") / (request.path[1:-1] + ".gmi")
if blog_file.exists():
return blog_pages.EntryPage(request, blog_file).response()
+ if request.path == "/feed/" and request.proto == bicephalus.Proto.HTTP:
+ return blog_pages.Root(request).feed()
return page.NotFound(request).response()
diff --git a/blog_experiment/blog/blog_pages.py b/blog_experiment/blog/blog_pages.py
index b6776ca5..a82857b1 100644
--- a/blog_experiment/blog/blog_pages.py
+++ b/blog_experiment/blog/blog_pages.py
@@ -3,11 +3,15 @@ import itertools
import pathlib
import textwrap
+import bs4
+
import bicephalus
import htmlgenerator as h
-from blog import html, page, gemtext
+from feedgen import feed
+
+from blog import html, page, gemtext, meta
class Entry:
@@ -113,10 +117,10 @@ class Root(page.BasePage):
posts = "\n".join([f"=> {e.uri} {e.posted} {e.title}" for e in self.entries()])
content = (
textwrap.dedent(
- """\
- # El blog es mío
+ f"""\
+ # {meta.TITLE}
- ## Hay otros como él, pero este es el mío
+ ## {meta.SUBTITLE}
____
"""
@@ -135,6 +139,28 @@ class Root(page.BasePage):
html.html_template(*itertools.chain(posts)),
)
+ def feed(self):
+ fg = feed.FeedGenerator()
+ fg.title(meta.TITLE)
+ fg.subtitle(meta.SUBTITLE)
+ fg.link(href=meta.BASE_URL, rel="self")
+
+ for entry in self.entries()[0:10]:
+ fe = fg.add_entry()
+ url = f"{meta.BASE_URL}{entry.uri}"
+ fe.link(href=url)
+ fe.updated(datetime.datetime.combine(entry.posted, datetime.datetime.min.time(), tzinfo=datetime.timezone.utc))
+ fe.title(entry.title)
+ html = h.render(h.BaseElement(*entry.html()), {})
+ html = bs4.BeautifulSoup(html, features="html.parser").prettify()
+ fe.content(html, type="html")
+
+ return bicephalus.Response(
+ status=bicephalus.Status.OK,
+ content_type="application/rss+xml",
+ content=fg.rss_str(pretty=True),
+ )
+
class EntryPage(page.BasePage):
def __init__(self, request, path):
diff --git a/blog_experiment/blog/html.py b/blog_experiment/blog/html.py
index 2ecf97a6..3478eb2f 100644
--- a/blog_experiment/blog/html.py
+++ b/blog_experiment/blog/html.py
@@ -1,6 +1,8 @@
import bs4
import htmlgenerator as h
+from blog import meta
+
def html_template(*content, page_title=None):
title = "El blog es mío"
@@ -10,8 +12,8 @@ def html_template(*content, page_title=None):
h.HTML(
h.HEAD(h.TITLE(title)),
h.BODY(
- h.H1("El blog es mío"),
- h.H2("Hay otros como él, pero este es el mío"),
+ h.H1(meta.TITLE),
+ h.H2(meta.SUBTITLE),
*content,
),
doctype="html",
diff --git a/blog_experiment/blog/meta.py b/blog_experiment/blog/meta.py
new file mode 100644
index 00000000..83081904
--- /dev/null
+++ b/blog_experiment/blog/meta.py
@@ -0,0 +1,3 @@
+TITLE = "El blog es mío"
+SUBTITLE = "Hay otros como él, pero este es el mío"
+BASE_URL = "https://alex.corcoles.net"