Tooling

Some tools I wrote to help make my usage of this repo easier.

Backends

mdbook-api

mdbook-api is an mdbook backend I wrote to directly publish the markdown files (after post-processing), for use as consuming an api. While it’s still used, I have yet to get around to writing any usable client tooling for this.

Post-Processors

mdbook-chapter-path

mdbook-chapter-path is an mdbook postprocessor I wrote to better facilitate linking within this repository. This avoids the issue of breaking links whenever I reorganize the pages here. For example, when linking to the astronomy page, instead of writing [Astronomy](/astronomy/index.md), I can write [Astronomy]({ {#path_for astronomy} }) (note: spaces between the two { is deliberate to illustrate what the raw text is). This way, the mdbook-chapter-path will search for and insert the /astronomy/index.md text as the target for me. This even supports linking to anchor tags in the target document as well.

mdbook-git-atom

mdbook-git-atom is an mdbook postprocessor to automatically generate an atom feed from an mdbook repository, using the git log to note when posts were updated. I wrote this initially for the Coz-E build, which, due to the linear nature of the build, follows a more chronological style, but it’s also used here.

mdbook-section-validator

In an effort to avoid accidentally writing information that can become false in the future, I wrote mdbook-section-validator. This postprocessor examines a list of links and adds a warning message if all of those links are invalid (i.e. github tickets are all closed). This is currently only used in a couple places.

Because this is written as an mdbook postprocessor, it does mean that this check is only written when the repository is re-built.

Other Tooling

mdbook-generate-summary

mdbook-generate-summary is a tool I wrote to automatically generate a top-level SUMMARY.md from a directory structure. It’s not a plug-in for mdbook, as it’s supposed to be invoked prior to mdbook being invoked (because mdbook will throw an error if a SUMMARY.md file is not in the appropriate place).

⚠️ This is only valid while younata/mdbook-generate-summary#1 is open

It has some rough edges. For example, if you don’t give each directory a README.md file (with the name of the section), then the generated SUMMARY.md file will not be correctly organized. But, it works well enough for my use case, so long as I keep that limitation in mind.

Last-updated Annotations

This is simply a script that runs in CI which appends the date of the commit that last updated the file, which has the following contents:

#!/bin/bash

set -e

while IFS= read -r -d '' -u 9
do
    if [[ "${REPLY}" =~ ^.+\.md$ ]]; then
        LAST_MODIFY_DATE=`git --no-pager log -n 1 --pretty=format:%ci "${REPLY}"`
        LAST_HASH=`git --no-pager log -n 1 --pretty=format:%H "${REPLY}"`
        printf "\n\nLast updated: [${LAST_MODIFY_DATE}](https://github.com/younata/personal_knowledge/commit/${LAST_HASH})" >> "${REPLY}"
    fi
done 9< <( find src -type f -exec printf '%s\0' {} + )

Third-party Tooling

The third-party tooling used to enhance this.

Spellcheck

I use the markdown-spellcheck package to spellcheck all the markdown files.

HTML-Proofer

In CI, I use the html-proofer gem to validate the generated html of this project. The command looks like:

DOMAIN="https://knowledge.rachelbrindle.com"
FILE_IGNORES="./print.html,./404.html" # Ignore the 404 page and especially the print page. Print page is simply a all pages consolidated, and it's better to catch broken links as close to the original file as possible
URL_IGNORES: "/github.com\\/younata\\/personal_knowledge/" # Don't error if a link to a not-yet-there file is published.

/usr/local/bundle/bin/htmlproofer \
    --assume-extension \
    --check-img-http \
    --enforce-https \
    --only_4xx \
    --http-status-ignore "401,402,403,415" \
    --file-ignore "$FILE_IGNORES" \
    --url-ignore "$URL_IGNORES" \
    --internal-domains "$DOMAIN" "./book/html"

Which is why, if you view source, all of the links to http sites have the data-proofer-ignore attribute in their anchor tag.

Last updated: 2022-08-15 23:32:04 -0700