#!/usr/bin/env python3
""" Adds a new blog """
import os
import subprocess
import sys
import markdown
from bs4 import BeautifulSoup as bs
CHARACTER_MAP = {"/": "_", " ": "-", "?": "_", "#": "_", "<": "_", ">": "_", "\\": "_"}
BLOG_MARKDOWN_TEMPLATE = """# %s
%s | [back](..) | [home](/) | [git](/git)
%s"""
BLOG_HTML_TEMPLATE = """
Ari::web -> Blog
%s
"""
HOME_PAGE_HTML_TEMPLATE = """
Ari::web -> Blog
My blogs
%s
"""
def sanitise_title(title: str) -> str:
"""
This function takes a title and uses CHARACTER_MAP to
make the title path and netlify compatiple
"""
final = title
for character, replacement in CHARACTER_MAP.items():
final = final.replace(character, replacement)
return final[0:50]
def main() -> int:
"""Main function"""
open("/tmp/blog.md", "w", encoding="utf-8").close()
blog_title = input("Blog title: ")
sanitised_blog_title = sanitise_title(blog_title)
input(
"""Now this script will open your editor, enter the markdown you want
in your blog there. press enter to continue"""
)
if os.getenv("EDITOR"):
os.system(f"{os.getenv('EDITOR')} /tmp/blog.md")
else:
os.system(f"{input('What editor should I use?: ')} /tmp/blog.md")
with open("/tmp/blog.md", "r") as f:
blog_content = f.read()
date = subprocess.check_output(["date", "+%F %T %Z"]).decode().rstrip("\n")
content = BLOG_MARKDOWN_TEMPLATE % (date, blog_title, blog_content)
with open(f"./page/blog/blogs/{sanitised_blog_title}.html", "w") as f:
f.write(BLOG_HTML_TEMPLATE % (date, blog_title, markdown.markdown(content)))
with open("./page/blog/index.md", "a") as f:
f.write(f"\n* [{blog_title}](/page/blog/blogs/{sanitised_blog_title}.html)")
with open("./page/blog/index.html", "w") as f:
with open("./page/blog/index.md", "r") as md:
f.write(HOME_PAGE_HTML_TEMPLATE % markdown.markdown(md.read()))
# Pretify the blog and the index page
with open("./page/blog/index.html", "r") as f:
index_page = f.read()
with open("./page/blog/index.html", "w") as f:
soup = bs(index_page, features="lxml")
f.write(soup.prettify())
with open(f"./page/blog/blogs/{sanitised_blog_title}.html", "r") as f:
blog_page = f.read()
with open(f"./page/blog/blogs/{sanitised_blog_title}.html", "w") as f:
soup = bs(blog_page, features="lxml")
f.write(soup.prettify())
return 0
if __name__ == "__main__":
assert main.__annotations__.get("return") is int, "main() should return an integer"
sys.exit(main())