CQ
This commit is contained in:
parent
e961eeb5eb
commit
9a7312c585
1 changed files with 67 additions and 48 deletions
115
makesite.py
115
makesite.py
|
@ -53,6 +53,7 @@ FRENCH_MONTHS = ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin',
|
||||||
|
|
||||||
# initialize markdown
|
# initialize markdown
|
||||||
|
|
||||||
|
|
||||||
class HighlightRenderer(mistune.HTMLRenderer):
|
class HighlightRenderer(mistune.HTMLRenderer):
|
||||||
def block_code(self, code, info=None):
|
def block_code(self, code, info=None):
|
||||||
if info:
|
if info:
|
||||||
|
@ -61,6 +62,7 @@ class HighlightRenderer(mistune.HTMLRenderer):
|
||||||
return highlight(code, lexer, formatter)
|
return highlight(code, lexer, formatter)
|
||||||
return '<pre><code>' + mistune.escape(code) + '</code></pre>'
|
return '<pre><code>' + mistune.escape(code) + '</code></pre>'
|
||||||
|
|
||||||
|
|
||||||
markdown = mistune.create_markdown(renderer=HighlightRenderer())
|
markdown = mistune.create_markdown(renderer=HighlightRenderer())
|
||||||
|
|
||||||
|
|
||||||
|
@ -101,7 +103,9 @@ def read_headers(text):
|
||||||
def rfc_2822_format(date_str):
|
def rfc_2822_format(date_str):
|
||||||
"""Convert yyyy-mm-dd date string to RFC 2822 format date string."""
|
"""Convert yyyy-mm-dd date string to RFC 2822 format date string."""
|
||||||
d = datetime.datetime.strptime(date_str, "%Y-%m-%d")
|
d = datetime.datetime.strptime(date_str, "%Y-%m-%d")
|
||||||
return d.replace(tzinfo=datetime.timezone.utc).strftime('%a, %d %b %Y %H:%M:%S %z')
|
return d \
|
||||||
|
.replace(tzinfo=datetime.timezone.utc) \
|
||||||
|
.strftime('%a, %d %b %Y %H:%M:%S %z')
|
||||||
|
|
||||||
|
|
||||||
def slugify(value):
|
def slugify(value):
|
||||||
|
@ -111,7 +115,9 @@ def slugify(value):
|
||||||
trailing whitespace.
|
trailing whitespace.
|
||||||
"""
|
"""
|
||||||
value = (
|
value = (
|
||||||
unicodedata.normalize("NFKD", value).encode("ascii", "ignore").decode("ascii")
|
unicodedata.normalize("NFKD", value)
|
||||||
|
.encode("ascii", "ignore")
|
||||||
|
.decode("ascii")
|
||||||
)
|
)
|
||||||
value = re.sub(r"[^\w\s-]", "", value).strip().lower()
|
value = re.sub(r"[^\w\s-]", "", value).strip().lower()
|
||||||
return re.sub(r"[-\s]+", "-", value)
|
return re.sub(r"[-\s]+", "-", value)
|
||||||
|
@ -190,12 +196,12 @@ def render(template, **params):
|
||||||
|
|
||||||
|
|
||||||
def get_header_list_value(header_name, page_params):
|
def get_header_list_value(header_name, page_params):
|
||||||
l = []
|
header_list = []
|
||||||
if header_name in page_params:
|
if header_name in page_params:
|
||||||
for s in page_params[header_name].split(" "):
|
for s in page_params[header_name].split(" "):
|
||||||
if s.strip():
|
if s.strip():
|
||||||
l.append(s.strip())
|
header_list.append(s.strip())
|
||||||
return l
|
return header_list
|
||||||
|
|
||||||
|
|
||||||
def get_friendly_date(date_str):
|
def get_friendly_date(date_str):
|
||||||
|
@ -205,7 +211,8 @@ def get_friendly_date(date_str):
|
||||||
|
|
||||||
|
|
||||||
def make_posts(
|
def make_posts(
|
||||||
src, src_pattern, dst, layout, category_layout, comment_layout, comment_detail_layout, **params
|
src, src_pattern, dst, layout, category_layout,
|
||||||
|
comment_layout, comment_detail_layout, **params
|
||||||
):
|
):
|
||||||
"""Generate posts from posts directory."""
|
"""Generate posts from posts directory."""
|
||||||
items = []
|
items = []
|
||||||
|
@ -224,13 +231,18 @@ def make_posts(
|
||||||
page_params["date_path"] = page_params["date"].replace("-", "/")
|
page_params["date_path"] = page_params["date"].replace("-", "/")
|
||||||
page_params["friendly_date"] = get_friendly_date(page_params["date"])
|
page_params["friendly_date"] = get_friendly_date(page_params["date"])
|
||||||
page_params["year"] = page_params["date"].split("-")[0]
|
page_params["year"] = page_params["date"].split("-")[0]
|
||||||
page_params["post_url"] = page_params["year"] + "/" + page_params["slug"] + "/"
|
page_params["post_url"] = \
|
||||||
|
page_params["year"] \
|
||||||
|
+ "/" \
|
||||||
|
+ page_params["slug"] + "/"
|
||||||
|
|
||||||
# categories
|
# categories
|
||||||
categories = get_header_list_value("category", page_params)
|
categories = get_header_list_value("category", page_params)
|
||||||
out_cats = []
|
out_cats = []
|
||||||
for category in categories:
|
for category in categories:
|
||||||
out_cat = render(category_layout, category=category, url=slugify(category))
|
out_cat = render(category_layout,
|
||||||
|
category=category,
|
||||||
|
url=slugify(category))
|
||||||
out_cats.append(out_cat.strip())
|
out_cats.append(out_cat.strip())
|
||||||
page_params["categories"] = categories
|
page_params["categories"] = categories
|
||||||
page_params["category_label"] = "".join(out_cats)
|
page_params["category_label"] = "".join(out_cats)
|
||||||
|
@ -316,12 +328,12 @@ def make_notes(
|
||||||
page_params["header"] = ""
|
page_params["header"] = ""
|
||||||
page_params["footer"] = ""
|
page_params["footer"] = ""
|
||||||
page_params["friendly_date"] = ""
|
page_params["friendly_date"] = ""
|
||||||
page_params["category_label"] = ""
|
page_params["category_label"] = ""
|
||||||
page_params["post_url"] = "notes/" + page_params["slug"] + "/"
|
page_params["post_url"] = "notes/" + page_params["slug"] + "/"
|
||||||
|
|
||||||
content["post_url"] = page_params["post_url"]
|
content["post_url"] = page_params["post_url"]
|
||||||
content["friendly_date"] = page_params["friendly_date"]
|
content["friendly_date"] = page_params["friendly_date"]
|
||||||
content["category_label"] = page_params["category_label"]
|
content["category_label"] = page_params["category_label"]
|
||||||
items.append(content)
|
items.append(content)
|
||||||
|
|
||||||
dst_path = render(dst, **page_params)
|
dst_path = render(dst, **page_params)
|
||||||
|
@ -334,7 +346,8 @@ def make_notes(
|
||||||
|
|
||||||
|
|
||||||
def make_list(
|
def make_list(
|
||||||
posts, dst, list_layout, item_layout, header_layout, footer_layout, **params
|
posts, dst, list_layout, item_layout,
|
||||||
|
header_layout, footer_layout, **params
|
||||||
):
|
):
|
||||||
"""Generate list page for a blog."""
|
"""Generate list page for a blog."""
|
||||||
|
|
||||||
|
@ -375,6 +388,43 @@ def make_list(
|
||||||
fwrite(dst_path, output)
|
fwrite(dst_path, output)
|
||||||
|
|
||||||
|
|
||||||
|
def generate_rss(posts, params):
|
||||||
|
rss_xml = fread("layout/rss.xml")
|
||||||
|
rss_item_xml = fread("layout/rss_item.xml")
|
||||||
|
# Create main RSS feed for 10 last entries
|
||||||
|
nb_items = min(10, len(posts))
|
||||||
|
for filename in ("_site/rss.xml", "_site/index.xml"):
|
||||||
|
make_list(
|
||||||
|
posts[:nb_items],
|
||||||
|
filename,
|
||||||
|
rss_xml,
|
||||||
|
rss_item_xml,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
**params
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create RSS feed by tag
|
||||||
|
tag_post = {}
|
||||||
|
for post in posts:
|
||||||
|
for tag in post["tags"]:
|
||||||
|
if tag in tag_post:
|
||||||
|
tag_post[tag].append(post)
|
||||||
|
else:
|
||||||
|
tag_post[tag] = [post]
|
||||||
|
for tag in tag_post.keys():
|
||||||
|
params["tag"] = tag
|
||||||
|
make_list(
|
||||||
|
tag_post[tag],
|
||||||
|
"_site/rss." + slugify(tag) + ".xml",
|
||||||
|
rss_xml,
|
||||||
|
rss_item_xml,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
**params
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def main(param_file):
|
def main(param_file):
|
||||||
# Create a new _site directory from scratch.
|
# Create a new _site directory from scratch.
|
||||||
if os.path.isdir("_site"):
|
if os.path.isdir("_site"):
|
||||||
|
@ -409,8 +459,6 @@ def main(param_file):
|
||||||
category_layout = fread("layout/category.html")
|
category_layout = fread("layout/category.html")
|
||||||
comment_layout = fread("layout/comment.html")
|
comment_layout = fread("layout/comment.html")
|
||||||
comment_detail_layout = fread("layout/comment-detail.html")
|
comment_detail_layout = fread("layout/comment-detail.html")
|
||||||
rss_xml = fread("layout/rss.xml")
|
|
||||||
rss_item_xml = fread("layout/rss_item.xml")
|
|
||||||
sitemap_xml = fread("layout/sitemap.xml")
|
sitemap_xml = fread("layout/sitemap.xml")
|
||||||
sitemap_item_xml = fread("layout/sitemap_item.xml")
|
sitemap_item_xml = fread("layout/sitemap_item.xml")
|
||||||
note_layout = fread("layout/note.html")
|
note_layout = fread("layout/note.html")
|
||||||
|
@ -432,10 +480,11 @@ def main(param_file):
|
||||||
**params
|
**params
|
||||||
)
|
)
|
||||||
|
|
||||||
# Create blog list pages.
|
# Create blog list pages by 10.
|
||||||
page_size = 10
|
page_size = 10
|
||||||
chunk_posts = [
|
chunk_posts = [
|
||||||
blog_posts[i: i + page_size] for i in range(0, len(blog_posts), page_size)
|
blog_posts[i: i + page_size]
|
||||||
|
for i in range(0, len(blog_posts), page_size)
|
||||||
]
|
]
|
||||||
page = 1
|
page = 1
|
||||||
last_page = len(chunk_posts)
|
last_page = len(chunk_posts)
|
||||||
|
@ -500,38 +549,7 @@ def main(param_file):
|
||||||
**params
|
**params
|
||||||
)
|
)
|
||||||
|
|
||||||
# Create main RSS feed for 10 last entries
|
generate_rss(blog_posts, params)
|
||||||
nb_items = min(10, len(blog_posts))
|
|
||||||
for filename in ("_site/rss.xml", "_site/index.xml"):
|
|
||||||
make_list(
|
|
||||||
blog_posts[:nb_items],
|
|
||||||
filename,
|
|
||||||
rss_xml,
|
|
||||||
rss_item_xml,
|
|
||||||
None,
|
|
||||||
None,
|
|
||||||
**params
|
|
||||||
)
|
|
||||||
|
|
||||||
# Create RSS feed by tag
|
|
||||||
tag_post = {}
|
|
||||||
for post in blog_posts:
|
|
||||||
for tag in post["tags"]:
|
|
||||||
if tag in tag_post:
|
|
||||||
tag_post[tag].append(post)
|
|
||||||
else:
|
|
||||||
tag_post[tag] = [post]
|
|
||||||
for tag in tag_post.keys():
|
|
||||||
params["tag"] = tag
|
|
||||||
make_list(
|
|
||||||
tag_post[tag],
|
|
||||||
"_site/rss." + slugify(tag) + ".xml",
|
|
||||||
rss_xml,
|
|
||||||
rss_item_xml,
|
|
||||||
None,
|
|
||||||
None,
|
|
||||||
**params
|
|
||||||
)
|
|
||||||
|
|
||||||
# Create sitemap
|
# Create sitemap
|
||||||
make_list(
|
make_list(
|
||||||
|
@ -569,6 +587,7 @@ _test = None
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
parser = argparse.ArgumentParser(description='Makesite')
|
parser = argparse.ArgumentParser(description='Makesite')
|
||||||
parser.add_argument('--params', dest='param_file', type=str, default="params.json", help='Custom param file')
|
parser.add_argument('--params', dest='param_file', type=str,
|
||||||
|
default="params.json", help='Custom param file')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
main(args.param_file)
|
main(args.param_file)
|
||||||
|
|
Loading…
Add table
Reference in a new issue