Hugo-based levitation.wales initial commit
This commit is contained in:
Executable
+49
@@ -0,0 +1,49 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Fetch CSL-JSON citation metadata for every DOI listed in
|
||||
# data/publications.yaml and cache it under data/citations/.
|
||||
#
|
||||
# The cache is committed to the repo so the site builds offline and
|
||||
# reproducibly. Re-run this only when you add or change a DOI:
|
||||
#
|
||||
# make citations # fetch any not yet cached
|
||||
# make citations FORCE=1 # re-fetch everything (refresh)
|
||||
#
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
SRC=data/publications.yaml
|
||||
OUT=data/citations
|
||||
mkdir -p "$OUT"
|
||||
|
||||
# Same slug rule as the Hugo template: lowercase, non-alphanumerics -> "_".
|
||||
slug() { printf '%s' "$1" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/_/g'; }
|
||||
|
||||
mapfile -t dois < <(grep -oP '^\s*-\s*doi:\s*"\K[^"]+' "$SRC")
|
||||
|
||||
if [[ ${#dois[@]} -eq 0 ]]; then
|
||||
echo "No DOIs found in $SRC" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for doi in "${dois[@]}"; do
|
||||
out="$OUT/$(slug "$doi").json"
|
||||
if [[ -f "$out" && "${FORCE:-}" != "1" ]]; then
|
||||
echo "cached $doi"
|
||||
continue
|
||||
fi
|
||||
echo "fetch $doi"
|
||||
tmp=$(mktemp)
|
||||
if curl -fsSL --retry 3 --retry-delay 2 \
|
||||
-H "Accept: application/vnd.citationstyles.csl+json" \
|
||||
"https://doi.org/$doi" -o "$tmp" \
|
||||
&& python3 -c "import json,sys; json.load(open(sys.argv[1]))" "$tmp" 2>/dev/null; then
|
||||
mv "$tmp" "$out"
|
||||
else
|
||||
rm -f "$tmp"
|
||||
echo " !! failed to fetch valid CSL-JSON for $doi" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
echo "Done. Cached ${#dois[@]} citation(s) in $OUT/"
|
||||
Reference in New Issue
Block a user