“Life is what happens while you are busy making other plans.”
With a further delay to the conclusion of my job search, I’ll skip past that and instead concentrate on the one thing that’s been occupying my mind this week, almost to a worrying degree. I mentioned in previous week notes my attempt to build a Micropub endpoint, and on Friday, I made it public. Christened IndieKit, I described it as:
…a Micropub endpoint that can be hosted on a service like Heroku, and configured via files stored on a GitHub repo before saving posts to that repo for publishing with a static site generator like Jekyll, Hugo or Eleventy. The software is fully documented and covered by tests, including tests that replicate those provided by the Micropub Rocks! validator.
A long term ambition is to build a tool that supports different publishing destinations, other social publishing specifications (Webmention, Microsub, ActivityPub etc.) and integrates with a range of content management systems.
This week saw me finalise support for creating posts (including the upload of any images attached to a request with
multipart/form-data), deleting posts and a source query that provides a Microformats representation of any given URL. I also spent a good deal of time writing the documentation. Having made it public, the response has been really positive, even spurring a discussion about collaborating over shared components, which I’m keen to follow up.
It hasn’t all be plain sailing of course. Promises and related
await functions have caused a great deal of hair pulling. They confused me last year when I was creating the service worker for this site, but this exercise has forced me to understand how they relate to each other. To explain my findings, a brief deviation via CSS.
When browsers first gave authors access to the advanced typographic features available in OpenType fonts, they did so via the
font-feature-settings property. If you wanted to turn-off a font’s ligatures and use tabular numbers in tables, for example, you would write the following:
font-feature-settings: "liga" 0, "tnum";
This isn’t particularly nice to read, not least because it uses a syntax for its values unlike anything else in CSS (to the best of my knowledge). However, it does provide direct access to a low-level browser feature. Thankfully, new properties have been added meaning today we can write:
font-variant: no-common-ligatures tabular-nums;
In a way,
font-feature-settings is to
Promise (with its associated
reject arguments), as
font-variant is to
await functions (with which you can use
catch statements). The newer syntax allows you to write code using a more familiar synchronous syntax, with the former there if you need to dive a bit deeper.
Before I start sounding too clever, let it be known that I spent much of Saturday trying to work out why images uploaded to GitHub via its REST API were appearing as text strings; this morning I realised I was encoding them as Base64 strings… before doing the same again in a later function. Oh, and there was another evening where I began writing a regex to convert a template literal into another regex and then back into a template literal. Thankfully, on the IndieWebCamp chat, Rosemary Orchard suggested I use a simple JSON file to store and retrieve values instead, which of course made much more sense!
Anyway, after several weeks telling potential employers that I wouldn’t class myself a programmer, I’m wondering if I should update that statement: I’m a novice programmer.
Websites I’ve frequented over the last seven days:
Decisions, decisions, decisions.
“I can’t wait to see this video Dave”