import re import os import yaml import jinja2 import textwrap import markdown import subprocess from pathlib import Path from datetime import date, datetime # from bs4 import BeautifulSoup as bs def new_page(title: str): """Crée un nouvel article à partir du titre de celui ci.""" today = date.today().strftime("%Y-%m-%d") filename = "./inbox/" + re.sub("[^a-zA-Z0-9-]", "_", title) + ".md" content = textwrap.dedent( f"""\ --- date: {today} title: {title} category: tags: - --- # {title} """ ) if not os.path.exists(filename): with open(filename, "w") as file: file.write(content) subprocess.run(["nvim", "+normal G$", "+startinsert", filename]) class Page: meta = dict() md_content = "" filename = "" 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): if name not in self.meta: raise AttributeError(f"L'attribut '{name}' n'existe pas.") # if name == date: # return datetime(self.meta['date'], "%Y-%m-%d") 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, 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=markdown.markdown( self.md_content, extensions=["codehilite", "fenced_code"] ), )