I’ve been hard at work on a bunch of projects at once, so this is partly just a personal check-in on how things are going. Thanks for being my therapist of sorts. So here’s what’s up with current projects, including Marked 3, Howzit, Apex, and more.

  • Table of Contents

Marked 3

The Marked beta continues. It’s going really well, and I believe I’ve fixed all crashes and made a bunch of improvements. One thing the next release will feature is better large document handling. This was important for dealing with BlogBook (see below) exports, but is also a vital quality of life improvement. Now the loading doesn’t hang while reading 1MB+ files, and the rendering is faster for all processors.

I added full tab handling (finally), with the option to open new documents in tabs. Plus a Quick Open feature that lets you hit ++O and quickly type or use the arrow keys to jump to a window, tab, or recent document.

I also included a CLI that makes accessing all of Marked’s URL scheme methods easy from the command line. It can’t yet automate a full export, but it’s still useful. I’ve refactored the whole export system to eventually allow full automation, but that’s going to be a 3.1 feature, not something that holds up the 3.0 release.

BlogBook

This is a new app I’m publishing as a complement to Marked 3. It generates a “Book” from WordPress, Micro.blog, or Ghost blogs. You can filter posts by author, categories, tags, date ranges, and more, then export a Markdown document (or collection of documents with an index file) which you can open in any Markdown editor. If you open it in Marked 3, special syntax like Table of Contents and page breaks will be rendered, and you can output to PDF, HTML, EPUB, and more.

This will be a great tool for people who have been blogging for a few (or a lot of) years who want a more permanent record of their work. Websites are known to disappear, but a good EPUB on your backup drive means your content will never be lost. Store your content as text, PDF, or EPUB for posterity, and/or distribute (or sell) a PDF/Ebook version of your writings. The filtering means you can easily export just a certain type of post, export only a certain date range, and you can even have the export split by year or month for making smaller books.

Check out the documentation at blogbook.my to see what it looks like. If you’re interested in helping me test, a TestFlight build will be available soon. It will be invite-only, so if you’re interested and have a WordPress, Micro.blog, or Ghost blog, contact me directly for an invite.

Apex

The last few releases of Apex have mostly addressed issues, but I added a couple new things.

First, I added support for Leanpub index syntax: {i: term}, {i: "term"}, and {i: "Main!sub"} for hierarchical entries under headings. This won’t be of use to anyone but Leanpub authors, but adding it to the existing handling of mmark and TextIndex syntax was fairly trivial.

Second, a feature I really like: if you add a @2x attribute anywhere in image attributes, e.g. ![ALT](/image.png @2x), it will generate an image with a srcset containing the original image at 1x, and then the image with @2x appended before the extension for retina displays. I also added support for @3x, which will generate srcset entries for 1x, 2x, and 3x variants of the same path.

This srcset feature is one I’ve always wanted, as I almost always provide @2x assets but Markdown never made it easy to generate the appropriate markup for these. I’m doing my best not to add arbitrary syntax to Apex that doesn’t exist anywhere else, but this one I really needed.

I also did my first real-world conversion of a build system to Apex. The Marked documentation has always used MultiMarkdown, with a build script that manually converts a bunch of Liquid-style tags (like my kbd plugin and one that generates menu item notations that open Settings panes in Marked). I converted the whole thing to use Apex, and wrote project-level plugins for all of the custom syntax I wanted to handle. It worked perfectly and required no changes to my existing documentation. So I can vouch that Apex is a great tool for this kind of thing.

I haven’t pulled the trigger on integrating Apex into Marked yet, but thanks to some reported Issues, I’ve got the Xcode integration working well. Apex is on the verge of a 1.0 release, at which point I will be converting Marked to use it. If you’re a Mac or iOS developer of a Markdown app and are willing to try it out, I’d love to help you integrate Apex and am very interested in getting some traction via inclusion in Mac/iOS apps. It’s pure C, so if you’re developing on other platforms, it will work just about anywhere, I just have the most interest in Apple platforms.

Apex Fixes

  • TextIndex [term]{^} no longer includes the closing bracket in the index entry (e.g. “fresh” instead of “fresh]”).
  • Reference-style image attributes (width, height, style, classes, id) are correctly applied in Unified, MultiMarkdown, and GFM modes, even when mixed with inline images and fenced div/figure blocks

Howzit

I made a simple update to Howzit to allow some interesting shell integration.

The --test-search command just returns a zero exit code if:

  1. A build note file is found (build*.{md,txt})
  2. The search string given matches at least one topic, based on configured search type

If either of those fails, then it returns a non-zero exit code.

This means you can have a Fish or Zsh function for handling unknown commands by testing for a matching topic and executing that if the command isn’t found and a matching build note topic exists. So if I have a “Run Tests” topic in my build notes, and I run runt on the command line, the unknown command function will execute and will run howzit -r runt, which will match the “Run Tests” topic (if fuzzy matching is enabled).

WordPress Plugins

I also added some localization to the WordPress plugins I shared the other day. No major changes to functionality, just language files for German, Spanish, French, and Italian. These were generated with AI, so I can’t vouch for their accuracy. If any speakers of these languages care to look through the various PO files for bt-downloads and bt-keyboard-shortcuts, feel free to let me know (and I’ll credit you in the documentation). Eventually when I get these published to the WordPress directory1, this will be especially useful.

I should probably at least add Simplified Chinese, too. I’ll think about that. Any other language suggestions?

On Multitasking

That pretty well sums up what I’m working on right now. My sleep cycle is still only allowing me about 5 hours of sleep per night, and I’m usually up coding by 3:30AM. And when I’m really tired I have this weird ability to focus better while simultaneously multitasking, so most mornings I have 3 or 4 projects open at once and switch between them while one compiles or run tests or I just get bored. That part is kind of cool, though I’d rather be sleeping, were that an option.

The reason I keep adding to Howzit is because it’s how I manage to jump between projects. With identically-named topics between the projects, when switching contexts I don’t have to remember which build system I’m supposed to use, I just use Howzit to develop, run tests, build/compile, and deploy. And taking copious notes in my build notes files means I can quickly query a topic and remember what exactly I was doing.

And then there’s Doing, which I have attached to git hooks in every repo. Every time I make a commit, it adds a Doing entry for me, so if at 4am I suddenly blank on what I was doing at 3:30, I can just run doing since 3:30am to see what I’ve been working on. It’s super handy, and since I’m constantly committing to my git repos, I don’t even have to worry about making manual Doing entries.

Hopefully something in this update was of interest to you. Please keep me posted on what you’re using (join us in the forum!), what questions/issues/requests you have, and, as we we always say on Overtired, get some sleep, if you can.

  1. My BT-SVG-Viewer plugin has been stuck in review for what feels like months, and you can only submit one plugin at a time.