diff options
Diffstat (limited to 'scripts/assert-content.sh')
-rwxr-xr-x | scripts/assert-content.sh | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/scripts/assert-content.sh b/scripts/assert-content.sh new file mode 100755 index 0000000..f9ea345 --- /dev/null +++ b/scripts/assert-content.sh @@ -0,0 +1,99 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +JSON="${1:-}" +[[ -z "${JSON}" ]] && { + echo 'Missing input JSON file.' + exit 2 +} + +contains-element() { + local e match="$1" + shift + for e; do [[ "$e" == "$match" ]] && return 0; done + return 1 +} + +fail-attr() { + ATTRIBUTE="${1}" + URL="${2}" + red "Undefined '${ATTRIBUTE}' for ${URL}." >&2 + exit 1 +} + +get-lang() { + echo "${1}" | base64 --decode | jq -r .lang +} + +get-ref() { + echo "${1}" | base64 --decode | jq -r .ref +} + +get-url() { + echo "${1}" | base64 --decode | jq -r .url +} + +get-date() { + echo "${1}" | base64 --decode | jq -r .date +} + +LANGS=(en pt) +assert-frontmatter() { + F="${1}" + LANG="$(get-lang "$F")" + REF="$(get-ref "$F")" + URL="$(get-url "$F")" + [[ -z "${LANG}" ]] && fail-attr 'lang' "${URL}" + [[ -z "${REF}" ]] && fail-attr 'ref' "${URL}" + if ! contains-element "${LANG}" "${LANGS[@]}"; then + red "Invalid lang '${LANG}' in ${URL}." >&2 + exit 1 + fi +} + +echo Linting posts... >&2 +for post in $(jq -r '.posts[] | @base64' "${JSON}"); do + assert-frontmatter "$post" + DATE="$(get-date "$post" | awk '{print $1}')" + URL="$(basename "$(get-url "$post")")" + FILE="_posts/${DATE}-${URL%.html}.md" + + [[ -f "${FILE}" ]] || { + red "date/filename mismatch: '${FILE}' does not exist." + exit 1 + } +done + +echo Linting pages... >&2 +IGNORED_PAGES=(/site.json /sitemap.xml /rss.xml /atom.xml /feed.atom /feed.xml /feed.all.atom /feed.en.atom /feed.pt.atom) +for page in $(jq -r '.pages[] | @base64' "${JSON}"); do + URL="$(get-url "$page")" + if ! contains-element "${URL}" "${IGNORED_PAGES[@]}"; then + assert-frontmatter "${page}" + fi +done + +echo Linting pastebins... >&2 +for pastebin in $(jq -r '.pastebins[] | @base64' "${JSON}"); do + assert-frontmatter "$pastebin" +done + +echo Asserting unique refs... >&2 +KNOWN_IDS=() +for page in $(jq -r '.pages[] | @base64' "${JSON}"); do + URL="$(get-url "$page")" + if ! contains-element "${URL}" "${IGNORED_PAGES[@]}"; then + LANG="$(get-lang "$page")" + REF="$(get-ref "$page")" + ID="${LANG}:${REF}" + + if contains-element "${ID}" "${KNOWN_IDS[@]}"; then + red "Duplicated lang:ref match: '${ID}'." >&2 + exit 1 + fi + + KNOWN_IDS+=("${ID}") # printf '%s\n' "${KNOWN_IDS[@]}" + fi +done + +echo Done. >&2 |