import re import os import yaml import uuid import jinja2 import textwrap import markdown from pathlib import Path from datetime import date def new_page(title: str, path: Path) -> Path: """Crée un nouvel article à partir du titre de celui ci.""" 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: - --- """ ) if not os.path.exists(filename): with open(filename, "w") as file: file.write(content) return filename class Page: meta = dict() md_content = "" filename = "" _cache = "" def __init__(self, filename: Path): """Constructeur : nouvelle page""" self.filename = filename with open(filename) as file: meta, self.md_content = self._extract_meta_and_markdown(file.read()) self.meta = yaml.safe_load(meta) if "title" not in self.meta: self.meta["title"] = Path(filename).stem 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: str): if name not in self.meta: raise AttributeError(f"L'attribut '{name}' n'existe pas.") return self.meta[name] def _extract_meta_and_markdown(self, content: str) -> list: """ """ is_meta = False is_markdown = False meta = "" markdown = "" for line in content.splitlines(): if line == "---": if not is_meta: is_meta = True else: is_markdown = True else: if is_markdown: markdown += line + "\n" elif is_meta: meta += line + "\n" return meta, markdown def html(self) -> str: """Convertit le markdown en html""" if not self._cache: self._cache = markdown.markdown( self.md_content, extensions=["codehilite", "fenced_code"] ) return self._cache 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=self.html(), )