summaryrefslogtreecommitdiff
path: root/blog/atom.py
diff options
context:
space:
mode:
authorDmitry Ilvokhin <d@ilvokhin.com>2025-04-19 21:43:53 +0100
committerDmitry Ilvokhin <d@ilvokhin.com>2025-04-19 21:43:53 +0100
commit96d437baab4a622eb540719feb90ea810fb01756 (patch)
tree8757d41e9e2c673965483b2466ae306c9a7b8368 /blog/atom.py
parentea523d411689338876abd7b87d85164009e7ec73 (diff)
downloadblog-96d437baab4a622eb540719feb90ea810fb01756.tar.gz
blog-96d437baab4a622eb540719feb90ea810fb01756.tar.bz2
blog-96d437baab4a622eb540719feb90ea810fb01756.zip
Add support for atom / rss feedHEADmaster
Date format was changed to support `updated` in ISO format. Now every post will require date and time, which might be a usability regression, but we'll see. Also, `updated` field was introduced in metadata. If there is no such field, them date field will be used instead.
Diffstat (limited to 'blog/atom.py')
-rw-r--r--blog/atom.py34
1 files changed, 34 insertions, 0 deletions
diff --git a/blog/atom.py b/blog/atom.py
new file mode 100644
index 0000000..e6d836c
--- /dev/null
+++ b/blog/atom.py
@@ -0,0 +1,34 @@
+import os
+import datetime
+import functools
+from typing import List
+
+from jinja2 import Template
+
+import render
+from post import Post, remove_drafts
+
+
+class Atom(object):
+ template: Template
+ posts: List[Post]
+
+ def __init__(self, template: Template, posts: List[Post]) -> None:
+ self.template = template
+ self.posts = remove_drafts(posts)
+
+ @staticmethod
+ def _now() -> datetime.datetime:
+ now = datetime.datetime.now(datetime.timezone.utc)
+ return now.replace(microsecond=0)
+
+ @functools.cached_property
+ def updated(self) -> datetime.datetime:
+ if not self.posts:
+ return self._now()
+ return self.posts[0].metadata.updated
+
+ def generate(self, basedir: str) -> None:
+ atom = os.path.join(basedir, "atom.xml")
+ rendered = self.template.render(updated=self.updated, posts=self.posts)
+ render.write_file_content(atom, rendered)