import glob import shutil 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: 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_rss() 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) 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_rss(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') 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)