From 4c49d4e96a976fcc29941f77c4eb878387a8c759 Mon Sep 17 00:00:00 2001 From: Florestan Bredow Date: Thu, 17 Jul 2025 18:12:51 +0200 Subject: [PATCH] Ajoute le flux atom --- .blog.template | 14 +++++++----- blog/blog.py | 60 ++++++++++++++++++++++++++++++++++++++------------ blog/config.py | 3 +++ blog/page.py | 19 +++++++++++----- 4 files changed, 71 insertions(+), 25 deletions(-) diff --git a/.blog.template b/.blog.template index 348f8b3..923bd59 100644 --- a/.blog.template +++ b/.blog.template @@ -1,7 +1,11 @@ -theme: './theme/default' -inbox: './inbox' -outbox: './outbox' +author_name: 'Firstname Name' +author_mail: 'name@example.com' draft: './draft' -url: 'https://blog.example.com' +# python -m uuid -u uuid4 +id: 'a06cd9a6-3a48-479b-bf7f-40ddcdde7982' +inbox: './inbox' +theme: './theme/default' title: 'Blog title' -presentation: 'Blog presentation.' +url: 'https://blog.example.com' +outbox: './outbox' +presentation: 'Blog presentation.' \ No newline at end of file diff --git a/blog/blog.py b/blog/blog.py index e275d58..190446c 100644 --- a/blog/blog.py +++ b/blog/blog.py @@ -1,10 +1,11 @@ import glob import shutil +import datetime +import textwrap from pathlib import Path from blog.page import Page from blog.config import Config from jinja2 import Environment, FileSystemLoader, Template -from rss import RssFeed class Blog: @@ -30,7 +31,7 @@ class Blog: self._copy_css() self._build_all_pages(page_template) self._build_index(index_template) - self._build_rss() + self._build_atom() def _load_pages(self, path: Path): """Charge tous les fichiers .md dans le dossier inbox""" @@ -46,7 +47,7 @@ class Blog: outbox_path.mkdir() for filename in self.pages: - html_content = self.pages[filename].html(template) + html_content = self.pages[filename].html_template(template) with open(f"{self.conf.outbox}/pages/{filename}.html", "w+") as html_file: html_file.write(html_content) @@ -58,18 +59,49 @@ class Blog: with open(f"{self.conf.outbox}/index.html", "w+") as html_file: html_file.write(html_content) - def _build_rss(self): + def _build_atom(self): """ """ - feed = RssFeed(language="fr-fr", title=self.conf.title, link=self.conf.url, description=self.conf.presentation ) - for page in self.pages: - feed.add_item( - title = self.pages[page].meta["title"], - link = Path(self.conf.url) / 'pages' / (page + '.html'), - description = "Ma description a moi !", - pubdate = self.pages[page].meta["date"] - ) - with open(Path(self.conf.outbox) / "flux.rss", 'w+') as rss_file: - feed.write(rss_file, 'utf-8') + updated = datetime.date(1970, 1, 1) + + articles = "" + for filename in self.pages: + date = self.pages[filename].date + if updated < date: + updated = date + articles += textwrap.indent( + textwrap.dedent(f"""\ + + {self.pages[filename].title} + + {date}T00:00:00Z + urn:uuid:{self.pages[filename].id} + +
+ {self.pages[filename].html()} +
+
+
+ """), + " ") + + header = textwrap.dedent(f""" + + {self.conf.title} + {self.conf.presentation} + + + {updated}T00:00:00Z + + {self.conf.author_name} + {self.conf.author_mail} + + urn:uuid:{self.conf.id} + """) + + footer = "" + + with open(Path(self.conf.outbox) / "atom.xml", 'w+') as rss_file: + rss_file.write(header + articles + footer) def _copy_css(self): """Copie les fichiers CSS du theme vers l'export""" diff --git a/blog/config.py b/blog/config.py index 6b1b18a..7e37bd3 100644 --- a/blog/config.py +++ b/blog/config.py @@ -13,6 +13,9 @@ class Config: "presentation", "url", "draft", + "author_name", + "author_mail", + "id" } def __init__(self, config_file: Path): diff --git a/blog/page.py b/blog/page.py index 6652ea1..ce4a260 100644 --- a/blog/page.py +++ b/blog/page.py @@ -1,6 +1,7 @@ import re import os import yaml +import uuid import jinja2 import textwrap import markdown @@ -14,12 +15,13 @@ def new_page(title: str, path: Path) -> Path: today = date.today().strftime("%Y-%m-%d") filename = path + '/' + re.sub("[^a-zA-Z0-9-]", "_", title) + ".md" - + id = uuid.uuid4() content = textwrap.dedent( f"""\ --- date: {today} title: {title} + id: {id} category: tags: - @@ -55,7 +57,7 @@ class Page: if "date" not in self.meta or type(self.meta["date"]) is not date: self.meta["date"] = date(1970, 1, 1) - def __getattr__(self, name): + def __getattr__(self, name: str): if name not in self.meta: raise AttributeError(f"L'attribut '{name}' n'existe pas.") @@ -80,14 +82,19 @@ class Page: meta += line + "\n" return meta, markdown - def html(self, template: jinja2.Template) -> str: + def html(self) -> str: + """Convertit le markdown en html""" + return markdown.markdown( + self.md_content, extensions=["codehilite", "fenced_code"] + ) + + + def html_template(self, template: jinja2.Template) -> str: """Convertit la page en html a partir d'un template jinja2""" title = self.meta["title"] or "Sans titre" date = self.meta["date"] or None return template.render( title=title, date=date, - content=markdown.markdown( - self.md_content, extensions=["codehilite", "fenced_code"] - ), + content=self.html(), )