Files
blog-src/blog/blog.py
2025-07-17 18:12:51 +02:00

117 lines
3.9 KiB
Python

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
class Blog:
def __init__(self, conf: Config):
""" """
self.conf = conf
self.pages = dict()
def make(self, draft: bool = False):
"""Convertit les pages en un site html"""
self.pages = dict()
self._load_pages(self.conf.inbox)
if draft:
self._load_pages(self.conf.draft)
env = Environment(loader=FileSystemLoader(self.conf.theme))
page_template = env.get_template("page.html.j2")
index_template = env.get_template("index.html.j2")
self._copy_css()
self._build_all_pages(page_template)
self._build_index(index_template)
self._build_atom()
def _load_pages(self, path: Path):
"""Charge tous les fichiers .md dans le dossier inbox"""
files_list = glob.glob(f"{path}/*.md")
for file in files_list:
self.pages[Path(file).stem] = Page(Path(file))
def _build_all_pages(self, template: Template):
"""Convertit les pages markdown dans conf.inbox en html dans conf.outbox"""
outbox_path = Path(f"{self.conf.outbox}/pages")
if not outbox_path.is_dir():
outbox_path.mkdir()
for filename in self.pages:
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)
def _build_index(self, template: Template):
"""Crée l'index du blog."""
html_content = template.render(
pages=self.pages, title=self.conf.title, presentation=self.conf.presentation
)
with open(f"{self.conf.outbox}/index.html", "w+") as html_file:
html_file.write(html_content)
def _build_atom(self):
""" """
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"""\
<entry>
<title>{self.pages[filename].title}</title>
<link href="{self.conf.url}/pages/{filename}.html"/>
<updated>{date}T00:00:00Z</updated>
<id>urn:uuid:{self.pages[filename].id}</id>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
{self.pages[filename].html()}
</div>
</content>
</entry>
"""),
" ")
header = textwrap.dedent(f""" <?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>{self.conf.title}</title>
<subtitle>{self.conf.presentation}</subtitle>
<link href="{self.conf.url}/atom.xml" rel="self"/>
<link href="{self.conf.url}/index.html"/>
<updated>{updated}T00:00:00Z</updated>
<author>
<name>{self.conf.author_name}</name>
<email>{self.conf.author_mail}</email>
</author>
<id>urn:uuid:{self.conf.id}</id>
""")
footer = "</feed>"
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"""
css_path = Path(self.conf.theme) / "css"
dest_path = Path(self.conf.outbox) / "css"
if not dest_path.exists():
dest_path.mkdir()
for css_file in css_path.glob("*.css"):
dest_file = dest_path / css_file.name
shutil.copy(css_file, dest_file)