Ajoute la gestion des brouillons

This commit is contained in:
2025-06-24 19:58:56 +02:00
parent ee19286ee8
commit 8c4cb8dad2
6 changed files with 52 additions and 46 deletions

View File

@@ -1,6 +1,7 @@
theme: './theme/default' theme: './theme/default'
inbox: './inbox' inbox: './inbox'
outbox: './outbox' outbox: './outbox'
draft: './draft'
url: 'https://blog.example.com' url: 'https://blog.example.com'
title: 'Blog title' title: 'Blog title'
presentation: 'Blog presentation.' presentation: 'Blog presentation.'

1
.gitignore vendored
View File

@@ -15,3 +15,4 @@ main.spec
inbox/ inbox/
outbox/ outbox/
themes/ themes/
draft/

View File

@@ -4,7 +4,7 @@ from pathlib import Path
from blog.page import Page from blog.page import Page
from blog.config import Config from blog.config import Config
from jinja2 import Environment, FileSystemLoader, Template from jinja2 import Environment, FileSystemLoader, Template
from rss import RssFeed
class Blog: class Blog:
@@ -13,18 +13,14 @@ class Blog:
self.conf = conf self.conf = conf
self.pages = dict() self.pages = dict()
def load_pages(self): def make(self, draft: bool = False):
"""Charge tous les fichiers .md dans le dossier inbox""" """Convertit les pages en un site html"""
files_list = glob.glob(f"{self.conf.inbox}/*.md")
self.pages = dict() self.pages = dict()
for file in files_list: self._load_pages(self.conf.inbox)
self.pages[Path(file).stem] = Page(Path(file))
def make(self): if draft:
"""Convertit les pages en un site html""" self._load_pages(self.conf.draft)
if not self.pages:
self.load_pages()
env = Environment(loader=FileSystemLoader(self.conf.theme)) env = Environment(loader=FileSystemLoader(self.conf.theme))
@@ -34,7 +30,12 @@ class Blog:
self._copy_css() self._copy_css()
self._build_all_pages(page_template) self._build_all_pages(page_template)
self._build_index(index_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): def _build_all_pages(self, template: Template):
"""Convertit les pages markdown dans conf.inbox en html dans conf.outbox""" """Convertit les pages markdown dans conf.inbox en html dans conf.outbox"""
@@ -56,20 +57,8 @@ class Blog:
with open(f"{self.conf.outbox}/index.html", "w+") as html_file: with open(f"{self.conf.outbox}/index.html", "w+") as html_file:
html_file.write(html_content) 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): def _copy_css(self):
"""Copie les fichiers CSS du theme vers l'export"""
css_path = Path(self.conf.theme) / "css" css_path = Path(self.conf.theme) / "css"
dest_path = Path(self.conf.outbox) / "css" dest_path = Path(self.conf.outbox) / "css"

View File

@@ -5,7 +5,15 @@ from pathlib import Path
class Config: class Config:
_conf = dict() _conf = dict()
_list_valid_parameters = {"inbox", "outbox", "theme", "title", "presentation", "url"} _list_valid_parameters = {
"inbox",
"outbox",
"theme",
"title",
"presentation",
"url",
"draft",
}
def __init__(self, config_file: Path): def __init__(self, config_file: Path):
"""Constructeur : charge les paramètres depuis le fichier de configuration""" """Constructeur : charge les paramètres depuis le fichier de configuration"""

View File

@@ -4,19 +4,16 @@ import yaml
import jinja2 import jinja2
import textwrap import textwrap
import markdown import markdown
import subprocess
from pathlib import Path from pathlib import Path
from datetime import date from datetime import date
# from bs4 import BeautifulSoup as bs
def new_page(title: str, path: Path) -> Path:
def new_page(title: str):
"""Crée un nouvel article à partir du titre de celui ci.""" """Crée un nouvel article à partir du titre de celui ci."""
today = date.today().strftime("%Y-%m-%d") today = date.today().strftime("%Y-%m-%d")
filename = "./inbox/" + re.sub("[^a-zA-Z0-9-]", "_", title) + ".md" filename = path + '/' + re.sub("[^a-zA-Z0-9-]", "_", title) + ".md"
content = textwrap.dedent( content = textwrap.dedent(
f"""\ f"""\
@@ -27,7 +24,6 @@ def new_page(title: str):
tags: tags:
- -
--- ---
# {title}
""" """
) )
@@ -36,7 +32,7 @@ def new_page(title: str):
with open(filename, "w") as file: with open(filename, "w") as file:
file.write(content) file.write(content)
subprocess.run(["nvim", "+normal G$", "+startinsert", filename]) return filename
class Page: class Page:
@@ -63,9 +59,6 @@ class Page:
if name not in self.meta: if name not in self.meta:
raise AttributeError(f"L'attribut '{name}' n'existe pas.") raise AttributeError(f"L'attribut '{name}' n'existe pas.")
# if name == date:
# return datetime(self.meta['date'], "%Y-%m-%d")
return self.meta[name] return self.meta[name]
def _extract_meta_and_markdown(self, content: str) -> list: def _extract_meta_and_markdown(self, content: str) -> list:

36
main.py
View File

@@ -2,6 +2,7 @@
import os import os
import argparse import argparse
import subprocess
from pathlib import Path from pathlib import Path
from blog.page import new_page from blog.page import new_page
from blog.config import Config from blog.config import Config
@@ -18,35 +19,42 @@ def load_args():
parser = argparse.ArgumentParser(description="Gestion du blog") parser = argparse.ArgumentParser(description="Gestion du blog")
parser.add_argument("action", choices=actions_list, help="L'action a réaliser.") parser.add_argument("action", choices=actions_list, help="L'action a réaliser.")
parser.add_argument( parser.add_argument(
"-c",
"--config", "--config",
default=".blog", default=".blog",
help="Chemin vers le fichier de configuration", help="Chemin vers le fichier de configuration",
) )
parser.add_argument( parser.add_argument(
"-i",
"--inbox", "--inbox",
default="./inbox", default="./inbox",
help="Chemin vers les fichiers markdown du blog", help="Chemin vers les fichiers markdown du blog",
) )
parser.add_argument("all", nargs=argparse.REMAINDER) parser.add_argument(
"-d",
action="store_true",
help="Construit le blog avec les brouillons si spécifié.",
)
parser.add_argument(
"--draft",
default="./draft",
help="Chemin vers les brouillons",
)
parser.add_argument("all", nargs=argparse.REMAINDER, help=argparse.SUPPRESS)
return vars(parser.parse_args()) return vars(parser.parse_args())
def load_make_args(args: str) -> dict: def load_make_args(args: str) -> dict:
"""Charge les paramêtres spécifiques à l'action make""" """Charge les paramêtres spécifiques à l'action make"""
parser = argparse.ArgumentParser(description="Compile le blog") parser = argparse.ArgumentParser(description="Compile le blog")
parser.add_argument( parser.add_argument(
"-t",
"--theme", "--theme",
default="./themes/default", default="./themes/default",
help="Chemin vers le theme utilisé pour exporter le blog", help="Chemin vers le theme utilisé",
) )
parser.add_argument( parser.add_argument(
"-o",
"--output", "--output",
default="./output", default="./output",
help="Nom du dossier ou sera exporté le blog en html", help="Nom du dossier où sera exporté le blog en html",
) )
return vars(parser.parse_args(args)) return vars(parser.parse_args(args))
@@ -65,15 +73,21 @@ def main():
match args["action"]: match args["action"]:
case "new": case "new":
page_title = " ".join(args["all"]) page_title = " ".join(args["all"])
new_page(page_title)
path = conf.inbox
if args["d"]:
path = conf.draft
subprocess.run(
["nvim", "+normal G$", "+startinsert", new_page(page_title, path)]
)
os._exit(0) os._exit(0)
case "make": case "make":
args = load_make_args(args["all"]) make_args = load_make_args(args["all"])
conf.overload(args) conf.overload(make_args)
blog = Blog(conf) blog = Blog(conf)
blog.make() blog.make(draft=args["d"])
os._exit(0) os._exit(0)