#!/bin/bash SITE="https://volpeon.ink/" CONTENT_DIR="content/" FILTERS_DIR="filters/" METADATA_DIR="metadata/" TEMPLATES_DIR="templates/" OUTPUT_DIR="output/" get_filters() { filters_args="" mapfile -d $'\0' filters < <(find $FILTERS_DIR \ -type f \ -name "*.lua" ! -name ".*" \ -print0) for file in "${filters[@]}"; do filters_args="$filters_args --lua-filter $file" done echo $filters_args } FILTERS=$(get_filters) target_filename() { filename=$1 filename=${filename#"$CONTENT_DIR"} if [ "${filename##*.}" = "md" ]; then filename="${filename%.md}.html" fi echo "$OUTPUT_DIR$filename" } target_url_rel() { basedir=$1 filename=$2 ext=$3 filename=$(realpath --relative-to="$basedir" "$filename") filename="${filename%.md}.$ext" filename=${filename%index.html} echo "$filename" } target_url_abs() { echo "/$(target_url_rel "$CONTENT_DIR" "$1" "$2")" } metadata() { pandoc "$1" \ -f markdown \ -t plain \ --template scripts/metadata_tpl.json } get_section() { filename=$1 filename=${filename#"$CONTENT_DIR"} filename=${filename%.md} filename=$(echo "$filename" | cut -f1 -d /) echo "$filename" } get_subpages_basedir() { filename=$1 if [ "${filename##*/}" = "index.md" ]; then filename=$(dirname "$filename") fi echo "$filename" } get_subpages_meta() { basedir=$(get_subpages_basedir "$1") child_pages=() if [ -d "$basedir" ]; then mapfile -d $'\0' child_pages_1 < <(find $basedir/ \ -type f \ -name "*.md" ! -name "index.md" \ -maxdepth 1 \ -print0) mapfile -d $'\0' child_pages_2 < <(find $basedir/ \ -type f \ -name "index.md" \ -mindepth 2 \ -maxdepth 2 \ -print0) child_pages=("${child_pages_1[@]}" "${child_pages_2[@]}") fi pages=$(echo "{}" | jq ". + { \ all: [], \ by_year: {}, \ not_empty: false \ }") if [ ${#child_pages[@]} -ne 0 ]; then #echo -e "\033[0;90m[////////]\033[0m Child pages:" pages=$(echo "$pages" | jq ".not_empty = true") for file in "${child_pages[@]}"; do #echo -e "\033[0;90m[////////]\033[0m - $file" metadata=$(metadata "$file") url_rel=$(target_url_rel "$basedir" "$file" "html") url_abs=$(target_url_abs "$file" "html") url_full="${SITE%/}$url_abs" date=$(echo "$metadata" | jq -r .date) date_rfc3339="" if [ "$date" != "" ]; then date_rfc3339=$(date -d "$date" --rfc-3339=seconds | sed 's/ /T/') fi metadata=$(echo "$metadata" | jq ". * { \ date: { \ yyyy_mm_dd: \"$date\", \ rfc3339: \"$date_rfc3339\" \ }, \ url: { \ rel: \"$url_rel\", \ abs: \"$url_abs\", \ full: \"$url_full\" \ } \ }") pages=$(echo "$pages" | jq ".all += [ $metadata ]") if [ "$date" != "" ]; then date_year=$(date -d "$date" +%Y) #date_month=$(date -d "$date" +%m) #date_day=$(date -d "$date" +%d) pages=$(echo "$pages" | jq ".by_year.\"$date_year\" += [ $metadata ]") fi done pages=$(echo "$pages" \ | jq ".all |= (sort_by(.date) | reverse) \ | .by_year |= (to_entries | sort_by(.key) | reverse \ | .[].value |= (sort_by(.date) | reverse))") fi echo "{}" | jq ". + { \ pages: $pages \ }" } handle () { target_file=$(target_filename "$1") mkdir -p $(dirname "$target_file") if [ "${1#*.}" = "md" ]; then echo -e "\033[0;32m[COMPILE ]\033[0m $1 -> $target_file" meta_file=$(mktemp) metadata=$(metadata "$file") metadata=$(echo "[ \ $metadata, \ $(get_subpages_meta "$1") \ ]" | jq ".[0] * .[1]") url_abs=$(target_url_abs "$1" "html") url_full="${SITE%/}$url_abs" section=$(get_section "$1") is_home=false if [ "$target_file" = "${OUTPUT_DIR}index.html" ]; then is_home=true fi metadata=$(echo "$metadata" | jq ". * { \ url: { \ abs: \"$url_abs\", \ full: \"$url_full\" \ }, \ section: { \ id: \"$section\", \ is_$section: true \ }, \ is_home: $is_home \ }") create_feed=$(echo "$metadata" | jq -r ".create_feed") if [ "$create_feed" = "true" ]; then feed_target_file="${target_file%.html}.xml" feed_url_abs="$(target_url_abs "$1" "xml")" feed_url_full="${SITE%/}$feed_url_abs" last_update=$(echo "$metadata" | jq -r ".pages.all[0].date") metadata=$(echo "$metadata" | jq ". * { \ feed: { \ last_update: $last_update, \ url: { \ abs: \"$feed_url_abs\", \ full: \"$feed_url_full\" \ } \ } \ }") echo "$metadata" > "$meta_file" pandoc "$1" \ -f markdown \ -t html5 \ --template "${TEMPLATES_DIR}feed.xml" \ -o "$feed_target_file" \ --metadata-file metadata/metadata.yaml \ --metadata-file "$meta_file" \ $FILTERS fi echo "$metadata" > "$meta_file" pandoc "$1" \ -f markdown \ -t html5 \ --template "${TEMPLATES_DIR}base.html" \ -o "$target_file" \ --metadata-file metadata/metadata.yaml \ --metadata-file "$meta_file" \ $FILTERS rm "$meta_file" # echo $(pandoc "$1" \ # -f markdown \ # -t json) else echo -e "\033[0;32m[COPY ]\033[0m $1 -> $target_file" cp "$1" "$target_file" fi } if [ -z "$1" ]; then find "$CONTENT_DIR" \ -type f \ | while read file do handle "$file" done elif [ "$1" = "all_md" ]; then find "$CONTENT_DIR" \ -type f \ -name "*.md" \ | while read file do handle "$file" done elif [ "$1" = "single" ]; then if [ -z "$2" ]; then echo -e "\033[0;31m[ERROR ]\033[0m \"single\" operation requires file argument" else handle "$2" fi elif [ "$1" = "delete" ]; then if [ -z "$2" ]; then echo -e "\033[0;31m[ERROR ]\033[0m \"delete\" operation requires file argument" else target_file=$(target_filename "$2") echo -e "\033[0;32m[DELETE ]\033[0m $2 -> $target_file" rm -rf $target_file fi else echo -e "\033[0;31m[ERROR ]\033[0m Unknown operation: \"$1\"" fi