Compare commits
3 Commits
945aa6e57b
...
4321429dbf
Author | SHA1 | Date | |
---|---|---|---|
4321429dbf | |||
8c4cb8dad2 | |||
![]() |
ee19286ee8 |
@@ -1,5 +1,7 @@
|
|||||||
theme: './theme/default'
|
theme: './theme/default'
|
||||||
inbox: './inbox'
|
inbox: './inbox'
|
||||||
outbox: './outbox'
|
outbox: './outbox'
|
||||||
|
draft: './draft'
|
||||||
|
url: 'https://blog.example.com'
|
||||||
title: 'Blog title'
|
title: 'Blog title'
|
||||||
presentation: 'Blog presentation.'
|
presentation: 'Blog presentation.'
|
||||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -15,3 +15,4 @@ main.spec
|
|||||||
inbox/
|
inbox/
|
||||||
outbox/
|
outbox/
|
||||||
themes/
|
themes/
|
||||||
|
draft/
|
||||||
|
1
Makefile
1
Makefile
@@ -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
|
||||||
|
21
blog/blog.py
21
blog/blog.py
@@ -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))
|
||||||
|
|
||||||
@@ -35,6 +31,12 @@ class Blog:
|
|||||||
self._build_all_pages(page_template)
|
self._build_all_pages(page_template)
|
||||||
self._build_index(index_template)
|
self._build_index(index_template)
|
||||||
|
|
||||||
|
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,6 +58,7 @@ class Blog:
|
|||||||
html_file.write(html_content)
|
html_file.write(html_content)
|
||||||
|
|
||||||
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"
|
||||||
|
|
||||||
|
@@ -5,7 +5,15 @@ from pathlib import Path
|
|||||||
class Config:
|
class Config:
|
||||||
|
|
||||||
_conf = dict()
|
_conf = dict()
|
||||||
_list_valid_parameters = {"inbox", "outbox", "theme", "title", "presentation"}
|
_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"""
|
||||||
|
13
blog/page.py
13
blog/page.py
@@ -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
36
main.py
@@ -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)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user