Refactoring: split big main function

This commit is contained in:
Yax 2025-09-27 16:05:25 +02:00
parent 9a7312c585
commit 65bf5524a2

View file

@ -51,8 +51,6 @@ FRENCH_WEEKDAYS = ['lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.', 'dim.']
FRENCH_MONTHS = ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', FRENCH_MONTHS = ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin',
'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'] 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.']
# initialize markdown
class HighlightRenderer(mistune.HTMLRenderer): class HighlightRenderer(mistune.HTMLRenderer):
def block_code(self, code, info=None): def block_code(self, code, info=None):
@ -388,14 +386,136 @@ def make_list(
fwrite(dst_path, output) fwrite(dst_path, output)
def generate_rss(posts, params): def create_blog(page_layout, list_in_page_layout, params):
banner_layout = fread("layout/banner.html")
paging_layout = fread("layout/paging.html")
post_layout = fread("layout/post.html")
post_layout = render(page_layout, content=post_layout)
comment_layout = fread("layout/comment.html")
comment_detail_layout = fread("layout/comment-detail.html")
category_layout = fread("layout/category.html")
item_layout = fread("layout/item.html")
posts = make_posts(
"posts",
"**/*.md",
"_site/{{ post_url }}/index.html",
post_layout,
category_layout,
comment_layout,
comment_detail_layout,
**params
)
# Create blog list pages by 10.
page_size = 10
chunk_posts = [
posts[i: i + page_size]
for i in range(0, len(posts), page_size)
]
page = 1
last_page = len(chunk_posts)
for chunk in chunk_posts:
params["page"] = page
if page == last_page:
params["next_page"] = ""
else:
params["next_page"] = "/page" + str(page + 1) + "/"
if page == 1:
params["previous_page"] = ""
make_list(
chunk,
"_site/index.html",
list_in_page_layout,
item_layout,
banner_layout,
paging_layout,
**params
)
else:
params["previous_page"] = "/page" + str(page - 1) + "/"
make_list(
chunk,
"_site/page" + str(page) + "/index.html",
list_in_page_layout,
item_layout,
banner_layout,
paging_layout,
**params
)
page = page + 1
return posts
def generate_categories(list_in_page_layout, item_nosummary_layout,
posts, params):
category_title_layout = fread("layout/category_title.html")
cat_post = {}
for post in posts:
for cat in post["categories"]:
if cat in cat_post:
cat_post[cat].append(post)
else:
cat_post[cat] = [post]
for cat in cat_post.keys():
params["category"] = cat
make_list(
cat_post[cat],
"_site/" + slugify(cat) + "/index.html",
list_in_page_layout,
item_nosummary_layout,
category_title_layout,
None,
**params
)
def generate_archives(blog_posts, list_in_page_layout, item_nosummary_layout,
archive_title_layout, params):
make_list(
blog_posts,
"_site/archives/index.html",
list_in_page_layout,
item_nosummary_layout,
archive_title_layout,
None,
**params
)
def generate_notes(page_layout, archive_title_layout,
list_in_page_layout, params):
note_layout = fread("layout/note.html")
item_note_layout = fread("layout/item_note.html")
note_layout = render(page_layout, content=note_layout)
notes = make_notes(
"notes",
"**/*.md",
"_site/{{ post_url }}/index.html",
note_layout,
**params
)
make_list(
notes,
"_site/notes/index.html",
list_in_page_layout,
item_note_layout,
archive_title_layout,
None,
**params
)
def generate_rss_feeds(posts, params):
rss_xml = fread("layout/rss.xml") rss_xml = fread("layout/rss.xml")
rss_item_xml = fread("layout/rss_item.xml") rss_item_xml = fread("layout/rss_item.xml")
# Create main RSS feed for 10 last entries
nb_items = min(10, len(posts)) # Create main RSS feed for 10 last entries
for filename in ("_site/rss.xml", "_site/index.xml"): for filename in ("_site/rss.xml", "_site/index.xml"):
make_list( make_list(
posts[:nb_items], posts[:10],
filename, filename,
rss_xml, rss_xml,
rss_item_xml, rss_item_xml,
@ -425,12 +545,21 @@ def generate_rss(posts, params):
) )
def main(param_file): def generate_sitemap(posts, params):
# Create a new _site directory from scratch. sitemap_xml = fread("layout/sitemap.xml")
if os.path.isdir("_site"): sitemap_item_xml = fread("layout/sitemap_item.xml")
shutil.rmtree("_site") make_list(
shutil.copytree("static", "_site") posts,
"_site/sitemap.xml",
sitemap_xml,
sitemap_item_xml,
None,
None,
**params
)
def get_params(param_file):
# Default parameters. # Default parameters.
params = { params = {
"title": "Blog", "title": "Blog",
@ -444,146 +573,44 @@ def main(param_file):
log("use params from " + param_file) log("use params from " + param_file)
if os.path.isfile(param_file): if os.path.isfile(param_file):
params.update(json.loads(fread(param_file))) params.update(json.loads(fread(param_file)))
return params
def clean_site():
if os.path.isdir("_site"):
shutil.rmtree("_site")
shutil.copytree("static", "_site")
def main(param_file):
params = get_params(param_file)
# Create a new _site directory from scratch.
clean_site()
# Load layouts. # Load layouts.
banner_layout = fread("layout/banner.html")
paging_layout = fread("layout/paging.html")
archive_title_layout = fread("layout/archives.html")
page_layout = fread("layout/page.html") page_layout = fread("layout/page.html")
post_layout = fread("layout/post.html")
list_layout = fread("layout/list.html") list_layout = fread("layout/list.html")
item_layout = fread("layout/item.html") list_in_page_layout = render(page_layout, content=list_layout)
archive_title_layout = fread("layout/archives.html")
item_nosummary_layout = fread("layout/item_nosummary.html") item_nosummary_layout = fread("layout/item_nosummary.html")
item_note_layout = fread("layout/item_note.html")
category_title_layout = fread("layout/category_title.html")
category_layout = fread("layout/category.html")
comment_layout = fread("layout/comment.html")
comment_detail_layout = fread("layout/comment-detail.html")
sitemap_xml = fread("layout/sitemap.xml")
sitemap_item_xml = fread("layout/sitemap_item.xml")
note_layout = fread("layout/note.html")
# Combine layouts to form final layouts. blog_posts = create_blog(page_layout, list_in_page_layout, params)
post_layout = render(page_layout, content=post_layout)
list_layout = render(page_layout, content=list_layout)
note_layout = render(page_layout, content=note_layout)
# Create blogs. generate_categories(list_in_page_layout, item_nosummary_layout,
blog_posts = make_posts( blog_posts, params)
"posts",
"**/*.md",
"_site/{{ post_url }}/index.html",
post_layout,
category_layout,
comment_layout,
comment_detail_layout,
**params
)
# Create blog list pages by 10. generate_archives(blog_posts, list_in_page_layout, item_nosummary_layout,
page_size = 10 archive_title_layout, params)
chunk_posts = [
blog_posts[i: i + page_size]
for i in range(0, len(blog_posts), page_size)
]
page = 1
last_page = len(chunk_posts)
for chunk in chunk_posts:
params["page"] = page
if page == last_page:
params["next_page"] = ""
else:
params["next_page"] = "/page" + str(page + 1) + "/"
if page == 1:
params["previous_page"] = ""
make_list(
chunk,
"_site/index.html",
list_layout,
item_layout,
banner_layout,
paging_layout,
**params
)
else:
params["previous_page"] = "/page" + str(page - 1) + "/"
make_list(
chunk,
"_site/page" + str(page) + "/index.html",
list_layout,
item_layout,
banner_layout,
paging_layout,
**params
)
page = page + 1
# Create category pages generate_notes(page_layout, archive_title_layout,
cat_post = {} list_in_page_layout, params)
for post in blog_posts:
for cat in post["categories"]:
if cat in cat_post:
cat_post[cat].append(post)
else:
cat_post[cat] = [post]
for cat in cat_post.keys():
params["category"] = cat
make_list(
cat_post[cat],
"_site/" + slugify(cat) + "/index.html",
list_layout,
item_nosummary_layout,
category_title_layout,
None,
**params
)
# Create archive page generate_rss_feeds(blog_posts, params)
make_list(
blog_posts,
"_site/archives/index.html",
list_layout,
item_nosummary_layout,
archive_title_layout,
None,
**params
)
generate_rss(blog_posts, params) generate_sitemap(blog_posts, params)
# Create sitemap
make_list(
blog_posts,
"_site/sitemap.xml",
sitemap_xml,
sitemap_item_xml,
None,
None,
**params
)
# Create notes.
notes = make_notes(
"notes",
"**/*.md",
"_site/{{ post_url }}/index.html",
note_layout,
**params
)
make_list(
notes,
"_site/notes/index.html",
list_layout,
item_note_layout,
archive_title_layout,
None,
**params
)
# Test parameter to be set temporarily by unit tests.
_test = None
if __name__ == "__main__": if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Makesite') parser = argparse.ArgumentParser(description='Makesite')