Files
blog-src/blog/page.py
2025-06-03 17:37:55 +02:00

101 lines
2.5 KiB
Python

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"]
),
)