Merge branch 'main' into rss

This commit is contained in:
2025-07-13 19:49:03 +02:00
7 changed files with 60 additions and 31 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.'

2
.gitignore vendored
View File

@@ -5,6 +5,7 @@ build/
dist/ dist/
wheels/ wheels/
*.egg-info *.egg-info
main.spec
# Virtual environments # Virtual environments
.venv .venv
@@ -14,3 +15,4 @@ wheels/
inbox/ inbox/
outbox/ outbox/
themes/ themes/
draft/

View File

@@ -1,3 +1,4 @@
default: build
.PHONY: build install-tools install-dep init clean .PHONY: build install-tools install-dep init clean
init: install-dep install-tools init: install-dep install-tools
@@ -15,3 +16,10 @@ install-dep:
clean: clean:
@rm -r ./dist ./build @rm -r ./dist ./build
install:
ifeq ($(USER), root)
@cp ./dist/main /usr/local/bin/blog
else
@cp ./dist/main ~/.local/bin/blog
endif

View File

@@ -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))
@@ -36,6 +32,12 @@ class Blog:
self._build_index(index_template) self._build_index(index_template)
self._build_rss() 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"""
@@ -70,6 +72,7 @@ class Blog:
feed.write(rss_file, 'utf-8') 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)