I came across the idea of microblogs from Manton Reece's blog. The idea is that instead of just using the blog for long content, you can post short Tweet like items there also. Needless to say you can just use Twitter for this but it's more fun to do something unneccessarily complicated! I have form here - like using Octopress for a blog instead of WordPress.
Basically, instead of using Twitter to publish short notifications, you can post them to your own site and if necessary to the likes of Twitter from there. Having control of your own content gives you independence from third party sites - if Twitter shut down tomorrow then my posts would still be available here. If I'm putting content on the web then ideally I would like it to be on my site under my own domain name. I've decided to add them first to my chess site and then if they work out there, try to port them to Octopress.
That blog is written using Middleman, which has the ability to use data files.
Any yaml file in the data folder is available to the Middleman app using a data.filename.foo
like syntax.
This means that I can create a yaml file containing the microblog posts and then use that to generate the appropriate html pages.
I have a microposts.yml file with each entry having text and date entries. This is sufficient for the moment but also yaml is flexible enough that I can add more attributes later.
yml
- text: here is another post
date: 2016-11-19
- text: here is a post
date: 2016-11-20
I use the Middleman blog extension to generate the blog portion of the site.
I want to keep using this as it handles rss, tags, archive pages, pagination etc.
It works by generating posts from files in a source folder. In order to integrate with this, I want to generate a file per micropost in the correct location.
Under the source folder I split out my posts into two folders manual
and automated
.
I updated the regex in config.rb to handle this blog.sources = "posts/{type}/{year}-{month}-{day}-{title}.html"
.
Middleman will process these equally but now I can check what type the post is by using data["type"]
.
In the config.rb I delete the contents of the automated folder on each build.
I tried using before_build
hooks but they were being called too late - the Middleman data structures were already created with the previous contents of the automated folder.
This lead to build errors and issues with sitemaps etc.
So I just perform the File operations directly in the config.rb. This ensurs that they are executed before the blog extension processes the posts folder.
Then I iterate through the micropost data from the yaml file and create the appropriate file in the automated folder.
# config.rb - Clear out automated posts folder
automated_posts_folder = "#{config[:source]}/posts/automated"
FileUtils.rmtree(automated_posts_folder)
FileUtils.mkdir(automated_posts_folder)
post_counter = 1
data.microposts.each do |micropost|
post_content = "---\n"
post_content += "title: mp#{post_counter}\n"
post_content += "date: #{micropost.date}\n"
post_content += "tags: microposts\n"
post_content += "micropost: true\n"
post_content += "---\n"
post_content += "#{micropost.text}"
File.write("#{automated_posts_folder}/#{micropost.date}-mp#{post_counter}.html.md", post_content)
post_counter += 1
end
I've added micropost: true
metadata to each of my generated files so that I can check if the post is a micropost using if data["micropost"]
.
This allows me to customize how I display these posts - in particular I don't show a title for these posts.
Speaking of titles, some special handling is required for these as the Middleman blog extension uses these for the generated html file names.
I added an attribute display_title
to the BlogArticle
class which will return an empty string if the post is a micropost.
This allows me to specify a fake title for each micropost using an incrementing ID counter.
The blog extension can use this fake title as normal but it will never be seen by the viewer of the blog.
Instead anywhere that a title is required in html markup I can change it to use the display_title
attribute.
The fact that Ruby has open classes makes adding this very easy - I can do it in the config.rb file and don't need to go mucking about in the Blog extension code.
# config.rb
module Middleman
module Blog
module BlogArticle
def display_title
data["micropost"] ? "" : data["title"]
end
end
end
end
This means that I can display these microposts just using the main text and not displaying a title. They interleave nicely with longer form blog posts.
Using the Middleman Blog Extension means that I also get RSS integration for these posts. I edited the xml templates to remove the title if the post is a micropost. Now in my RSS reader, they show up with the body text as the title instead of the fake title needed to make the extension work.
This current implementation is basic enough and I have a few ideas of how to improve it in future.
→ posted on November 20, 2016development