aboutsummaryrefslogtreecommitdiff
path: root/scripts/assert-content.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/assert-content.sh')
-rwxr-xr-xscripts/assert-content.sh99
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