Colorizing Terminal Output
Friday May 23 2025 • 12:00 PM
Jekyll has support for drafts in the form of a dedicated _drafts
directory. The files in this directory won’t have a date in the filename, and to see these drafts when running a local server, the Jekyll process has to be launched with the drafts flag.
$ jekyll serve --drafts
I’ve gotten into the habit of “drafting” by adding a published: false
property directly in a post’s front matter. This saves time by not having to rename files or move them between directories.
I modified my Rakefile to output the status of each post.
Most of the update is contained within a new method called get_post_status(file)
which looks like this:
def get_post_status(file) content = File.read(file) if content =~ /\A---\s*\n(.*?)\n---\s*\n/m front_matter = YAML.safe_load($1, permitted_classes: [Time]) status_text = front_matter["published"] == false ? "unpublished" : "published" padded = status_text.ljust(11) return status_text == "published" ? "\e[0;32m#{padded}\e[0m" : "\e[0;33m#{padded}\e[0m" else "unknown".ljust(11) end end
RegEx
\A---\s*\n(.*?)\n---\s*\nA RegEx for capturing Jekyll Front Matter
The RegEx above (courtesy of an LLM) is designed to match the formatting of a Jekyll front matter block.
The \A
anchors the match to the very start of the string. The first ---\s*\n
matches the opening YAML delimiter (---
) possibly followed by spaces and a newline. The core of the expression, (.*?)\n
, is a non-greedy match that captures everything up to the first newline before the closing delimiter, allowing it to extract the contents of the front matter. The final part, ---\s*\n
, matches the closing YAML delimiter (again allowing optional spaces) followed by a newline. The m
modifier at the end enables multiline mode so that .
in (.*?)
can match newline characters as well.
ANSI Color Codes
I found this GitHub Gist with ANSI Color Codes. Adding these to the published / unpublished strings changed the space padding around the post status, so I refactored the method to pad the string prior to adding the color code.
Output Ruby String Format
For the final output, I added another item to the format string.
POST_FILES.each_with_index do |file, index| post_status = get_post_status(file) # published, unpublished puts "%02d. | %s | %s" % [index + 1, post_status, file] end