Simple Static Blogging Engine in Python

A static site generator is usually a program for taking some kind of text input, and converting it into HTML files which can be used to make a website. I decided I wanted to use one to create my blog. It seems like there are thousands of them available, and I'm bad at making decisions. So obviously, I just went ahead and made my own! My requirements are simple - I just want to be able to write posts in Markdown, and have them rendered to static HTML files suitable for hosting on Github Pages, or anywhere else I might want to put them. The other reason I made my own is that I hate reading documentation 😂.

I chose to write this project in Python, since that's what I'm most comfortable with (I'll leave the x86 assembly rewrite for another project...). This certainly isn't the best code I've ever written, but I'm mainly just publising it to show how easy it can be to get a simple project up-and-running with Python. The main structure of the project looks like this:

l4ur3n.github.io/
    posts/
        2017-11-30-hello-world.md
        2017-12-01-simple-blogging-engine.md
    blog/
        hello-world.html               # generated
        simple-blogging-engine.html    # generated
    static/
        main.css
    template.html
    index.html       # generated
    render.py

posts/ is where I can write posts in Markdown. Note that the date is embedded into the filename, along with the "slug". template.html contains the main web design for the site, which I also made from scratch.

Here's the main code (I put it in a gist in case I update the code in the repo later):

When I run ./render.py, the first thing it does is iterate through all the Markdown files in the posts/ directory using the glob module. As the documentation says, this module is for "Unix style pathname pattern expansion". That might sound complicated, but it's really quite simple once you get used to it. In my code, I use glob("posts/*.md"). This means "Find all files in the posts/ directory which end in .md" - the star character effectively means "any letters can go here".

Then, for each file, it parses the file name using some really horrible code in order to extract the date and slug information from it. Then it reads the file, extracts the title, and then runs it through the mistune Python module. This renders the markdown markup to an HTML file (using the template I made) and puts it in the blog/ directory.

Finally, the index.html page is generated, which will contain links to each individual blog post. This is the page that visitors should see when they first visit the blog.

As you might have noticed by now, you are currently reading a blog post which was created with the code above! You can see the current status of the code here: https://github.com/l4ur3n/l4ur3n.github.io

Thanks for reading my first blog post! If you have any feedback, you can open a github issue or contact me on twitter.