Blog posting software planning
In comments on "Done Since 2018-07-15" we started having a discussion of mirroring and cross-posting DW blog entries, and in particular what my plans are for implementing personal blog sites that mirror all or some of a -- this -- Dreamwidth journal.
Non-techie readers might conceivably want to skip this post.
Where I am now:
Right now, my blog posting process is, well, let's just say
idiosyncratic. Up until sometime late last year, I was posting
using an Emacs major mode called lj-update-mode
; it was
pretty good. It had only two significant problems:
- It could only create one post at a time, and there was no good way to save a draft and come back to it later. I could live with that.
- It stopped working when DW switched to all HTTPS. It was using an obsolete http library, and noone was maintaining either of them.
My current system is much better.
- I run a command, either
make draft
or, if I'm pretty sure I'm going to post immediately,make entry
. I pass the filename, without the yyyy/mm/dd prefix, along with an optional title. If I don't pass the title I can add it later. The draft gets checked in with git; I can find out when I started by usinggit log
. - I edit the draft. It can sit around for days or months; doesn't matter. It' an ordinary html file except that it has an email-like header with the metadata in it.
- When I'm done, I
make post
. Done. If I'm posting a draft I have to pass the filename again to tell it which draft;make entry
makes a symlink to the entry, which is already in a file calledyyyy/mm/dd-filename.html
. It gets posted, and committed in git with a suitable commit message.
You can see the code in MakeStuff/blogging on GitHub. It depends on a Python client called
charm
,
which I forked to add the Location: header and some sane defaults like not
auto-formatting. Charm is mostly useless -- it does almost everything
using a terminal-based text editor. Really? But it does have a
"quick-post" mode that takes metadata on the command line, and a "sync"
mode that you can use to sync your journal with an archive. Posts in the
archive are almost, but not quite, in the same format as the MakeStuff
archive; the main difference is that the filenames look like
yyyy/mm/dd_HHMM
. Close, but not quite there.
There's another advantage that isn't apparent in the code: you can add
custom make targets that set up your draft using a template. For example,
my "Done since ..." posts are started with make done
,
and my "Computer
Curmudgeon" posts are started with make curmudgeon
.
There are other shortcuts for River and S4S posts. I also have multiple
directories for drafts, separated roughly by subject, but all posting into
the same archive.
Where I want to go:
Here's what I want next:
- The ability to post in either HTML or markdown -- markdown has a great toolchain, including the ability to syntax-color your code blocks.
- The ability to edit posts by editing the archived post and uploading it. Right now it's a real pain to keep them in sync.
- A unified archive, with actual URLs in the metadata rather than just the date and time in the filename.
- The ability to put all or part of my blog on different sites. I really want the computer-related posts to go on Stephen.Savitzky.net (usually shortened to S.S.net in my notes), and a complete mirror on steve.savitzky.net (s.s.net).
- Cross-links in both directions between my sites and DW.
How to get there:
Here's a very brief sketch of what needs to be done. It's only vaguely in sequence, and I've undoubtedly left parts out. But it's a start.
Posting, editing, and archiving
- Posting in HTML or markdown is a pretty easy one; I can do that just by
modifying the makefiles and (probably) changing the final extension
from
.html
to.posted
so that make can apply its usual dependency-inference magic. - Editing and a unified archive will both require a new
command-line client. There aren't any. There are libraries,
in Ruby, Haskell, and Javascript, that I can wrap a program around.
(The Python code in
charm
doesn't look worth saving.) I wanted to learn Ruby anyway. - The unified archive will also require a program that can go back in
time and match up archived posts with the right URLs, reconcile the two
file naming conventions, and remove the duplicates that are due to
archiving posts both in
charm
andMakeStuff
. Not too hard, and it only has to be done once. - It would be nice to be able to archive comments, too. The old
ljbackup
program can do it, so it's feasible. It's in Perl, so it might be a good place to start.
Mirror, mirror, on the server...
This is a separate section because it's mostly orthogonal to the posting, archiving, etc.
- The only part of the posting section that really needs to be done first
is the first one, changing the extension of archived posts to
.posted
. (That's becausemake
uses extensions to figure out what rules to apply to get from one to another. Remind me to post aboutmake
some time.) - The post archive may want to have its own git repository.
- Templating and styling. My websites are starting to show their age; there's nothing really wrong with a retro look, but they also aren't responsive (to different screen sizes -- that's important when most people are reading websites on their phones), or accessible (screen-reader friendly and navigable by keyboard; having different font sizes helps here, too). Any respectable static site generator can do it -- you may remember this post on The Joy of Static Sites -- but the way I'm formatting my metadata will require some custom work. Blosxom and nanoblogger are probably the closest, but they're ancient. I probably ought to resist the temptation to roll my own.
Yeah. Right.