diff --git a/drafts/bob_0-1-0.md b/drafts/bob_0-1-0.md deleted file mode 100644 index e69de29..0000000 diff --git a/drafts/published/AWK_static_blog_generator.md b/drafts/published/AWK_static_blog_generator.md new file mode 100644 index 0000000..0446683 --- /dev/null +++ b/drafts/published/AWK_static_blog_generator.md @@ -0,0 +1,138 @@ +# Bob, a static blog generator + +## The blog engine + +Starting from my markdown AWK parser, which was litterally done to achieve this blog engine, I've added an extra layer to turn it into a statis blog generator +Of course the parser is only one of the several components required for a blog generator, but I shall start from the beginning. +Initially I wanted to blog for me, and as described [here](https://simonpetit.top/posts/awk_for_static_site_generation.html), it was to mostly talk about tech. +The desire to make everything from scratch and reinvent the wheel is very strong, but we'll see how this evolve in the future. + +Now that I have my markdown to HTML converter I don't lack much to turn in into `bob` my blog generator. + +## the boilerplate + +After thinking about it, I did want to rely on git to store my drafts and posts, and have a CI listening to my blog repository that would do all the publishing work on the actual webserver. Hence the need for a self hosted git instance, and CI (reinventing the wheel I said). +Maybe I shall post about `gitea` and `drone CI` later on. + +For this to happend, `bob` shall be a simple CLI, and screw it, a docker image as well. + +I also wanted to only handle the markdown file, and let the html build itself. + +I came up with a very simple folder architecture : + +- a `css` folder containing...css files +- a `draft` folder containing...drafts written in markdown. These shall not be published yet. +- a `draft/published` subfolder, where all the published posts shall be, still in the markdown format +- a `posts` folder containing the actual HTML files generated from the posts in `draft/published` + +The idea is as simple as it gets : I write my drafts in the folder of the same name, when I want to publish them, I simply move them into the `published` subfolder and `bob` and the CI handle the rest. + +But the markdown converter does not create a full html page, so here comes the need for boilerplating : +I made an `index.html` template, for the home page, and a `post.html` one, for the actual articles. + +Once again this is very simple : the post page template's body looks like this : + + +

simpet

+
+ {{article}} + +
+ + + +and I use `awk` to replace `{{article}}` with the actual content of the posts, like so : + + publish_one() + { + # Storing the path of the post/article to publish + # The path is supposed to have this format "./drafts/published/
.* + article_path=$1 + + # from the relative path, only retrieving the name of the article (without file extension) + article_name=$(echo $article_path | cut -d '/' -f 4 | cut -d '.' -f 1) + + # Convert the markdown draft into an html article and storing it locally + post=$(awk -f ${BOB_LIB}/markdown.awk ./$article_path) + + # Retrieving the html article template + template="${BOB_LIB}/template/post.html" + + # Escaping the & for next step to not confuse awk + escaped_post=$(echo "$post" | sed 's/&/\\&/g') + + # In the template, replacing the string {{article}} by the actual content parsed above + awk -v content="$escaped_post" '{gsub(/\{\{article\}\}/, content); print}' "$template" > "./posts/$article_name.html" + } + +The home page template is similar : + + +

simpet

+ {{articles}} + + +and updated this way : + + update_index() + { + # Listing all posts and making an html list (with there link) out of them + posts=$(ls -t ./posts | awk ' + BEGIN { + print "" + }') + + # retrieving the template for the index.html + template="${BOB_LIB}/template/index.html" + + # replacing {{articles}} in the template with the actual list of articles from above + awk -v content="$posts" '{gsub(/{{articles}}/, content); print}' "$template" > "./index.html" + + } + +Whenever an new article is added or removed of the `drafts/published` folder, the `update_index()` will adjust the home page, because call by this function : + + publish_all() + { + # List all drafts to be published + published=$(ls -1 ./drafts/published) + + # turning it into an array + published_array=($published) + + # Remove all html articles in case a previously published one was removed + rm ./posts/*.html + + # Publish them one by one (ie turning md into html) + for file in "${published_array[@]}"; do + publish_one ./drafts/published/$file + done + + # updating the index.html as new articles are supposedly present and some may be removed + update_index + } + +which basically only reads the ready to be published posts and turn them into an html file, using the template, and then update the `index.html` + +That's it ! + +## To sum up + +I've made a very simple, not very customisable static blog generator, mostly using awk. It clearly is not optimized as it regenerated all the articles everytime, but awk is quite efficient, and for a few posts, I don't think it really matters. + +The real benefit is that I only handle markdown files, the CI and `bob` do the rest... + +Also, a statis site is blazing fast as loading in the browser, and since I do not use images (yet) nor javascript, I get a very very fast blog. + +To be continued... diff --git a/drafts/published/awk_for_static_site_generation.md b/drafts/published/awk_to_parse_markdown.md similarity index 99% rename from drafts/published/awk_for_static_site_generation.md rename to drafts/published/awk_to_parse_markdown.md index 4f13d62..722674e 100644 --- a/drafts/published/awk_for_static_site_generation.md +++ b/drafts/published/awk_to_parse_markdown.md @@ -1,4 +1,4 @@ -# A static site generator +# Markdown to HTML using AWK when I decided to start blogging, it was mostly for me to learn and remember all tech thing I learnt throughout time. I also want to explore a wide diversity of technology, not focus on a particular one.