117 lines
3.9 KiB
Python
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)
|