As I mentioned in my last post, Pelican is the tool I now use to generate all the static HTML files that make up this site. Pelican allows me to write posts using either Markdown or reStructuredText and can utilize a large variety of plugins written in Python. There are a number of blogging platform similar to Pelican like Octopress and Jekyll (upon which Octopress is based), but Pelican was the most fully-featured platform that is also written in a language I'm very comfortable with.
One of the benefits to writing posts as raw text files is that there is a
plethora of utilities to edit text files on Linux/BSD/Darwin (and other *nix)
platforms. For instance, I can use sed
to do bulk replacements in posts,
grep
to search them, and I can use any combinantion of commands by combining
them in a bash
script. In fact, after importing my WordPress blog, I used
this short script to organize the files in subdirectories based on their post
date:
find ./posts -name "*.md" | xargs -n 1 \
python -c " \
import sys; \
path = sys.argv[1]; \
date_line = open(path,'r').read().split('\n')[1]; \
(year, month, day) = date_line.split()[1].split('-'); \
print 'mkdir -p ./posts/%s/%s; mv %s ./posts/%s/%s/%s' % \
(year, month, path, year, month, path.lstrip('./posts/'))" \
| sh
Ok, I guess it isn't that short and I probably could have done it all in Python, but it worked pretty well for me as a one-off command.
Pelican is very easily extensible. Right now, I'm using the
pelican-octopress-theme as my blog theme. It's a nice theme, but I felt it
was lacking some features. Thankfully, the template files are easy to modify
so I was able to quickly change them to meet my needs. First, I changed how
article URLs are generated on the Archives page. In the original version, the
generated links were relative to the web path of the Archives page. With the
default page "save as" and "URL" options, this is fine, but it doesn't work if
you change them. To fix this, I prefixed the article.url variable with the
SITEURL
variable (among a few smaller changes). I also fixed the problem
where the "Read On" button would display in the post index even if the article
wasn't summarized. To do that, I just added a check to make sure the button was
only displayed when the article.content didn't equal the article.summary.
Finally, because I use FeedBurner, I added some FeedBurner integration. All I
did was add an additional FEED_FEEDBURNER
option to specify the FeedBurner
URL and disable displaying the raw feed URLs on the page itself.
My changes were merged into the upstream pelican-octopress-theme repository as
of commit bd5468f
, so you can benefit from these new features, too!