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"""\ {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""" 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)