94 lines
2.3 KiB
Python
94 lines
2.3 KiB
Python
import re
|
|
import os
|
|
import yaml
|
|
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"
|
|
|
|
content = textwrap.dedent(
|
|
f"""\
|
|
---
|
|
date: {today}
|
|
title: {title}
|
|
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 = ""
|
|
|
|
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.")
|
|
|
|
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"]
|
|
),
|
|
)
|