#!/bin/bash CONTENT_DIR="content/" FILTERS_DIR="filters/" METADATA_DIR="metadata/" TEMPLATES_DIR="templates/" OUTPUT_DIR="output/" CATEGORY_MAP=$(cat "$METADATA_DIR/categories.json") 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 filename=$(realpath --relative-to="$basedir" "$filename") filename="${filename%.md}.html" if [ "${filename##*/}" = "index.html" ]; then filename=${filename%index.html} fi echo "$filename" } target_url_abs() { echo "/$(target_url_rel "$CONTENT_DIR" "$1")" } 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_metadata() { 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 if [ ${#child_pages[@]} -ne 0 ]; then #echo -e "\033[0;90m[////////]\033[0m Child pages:" pages=$(echo "{}" | jq ". + { \ all: [], \ by_year: {} \ }") categories="{}" for file in "${child_pages[@]}"; do #echo -e "\033[0;90m[////////]\033[0m - $file" url_rel=$(target_url_rel "$basedir" "$file") url_abs=$(target_url_abs "$file") metadata=$(pandoc "$file" \ -f markdown \ -t plain \ --template scripts/metadata_tpl.json) date=$(echo "$metadata" | jq -r .date) category=$(echo "$metadata" | jq -r .category) category_name=$(echo "$CATEGORY_MAP" | jq -r .$category) metadata=$(echo "$metadata" | jq ". + { \ url_rel: \"$url_rel\", \ url_abs: \"$url_abs\" \ }") pages=$(echo "$pages" | jq ".all += [ $metadata ]") if [ "$category" != "" ]; then categories=$(echo "$categories" | jq ". + { $category: \"$category_name\" }") fi 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))") categories=$(echo "$categories" | jq ". | to_entries | sort_by(.key)") echo "{}" | jq ". + { \ pages: $pages, \ categories: $categories \ }" fi } handle () { target=$(target_filename "$1") mkdir -p $(dirname "$target") if [ "${1#*.}" = "md" ]; then echo -e "\033[0;32m[COMPILE ]\033[0m $1 -> $target" is_home=false section=$(get_section "$1") if [ "$target" = "${OUTPUT_DIR}index.html" ]; then is_home=true fi subpages_meta_file=$(mktemp) # echo "$(get_metadata "$1")" echo "$(get_metadata "$1")" > "$subpages_meta_file" # echo $(pandoc "$1" \ # -f markdown \ # -t json) pandoc "$1" \ -f markdown \ -t html5 \ --template "${TEMPLATES_DIR}base.html" \ -o "$target" \ --metadata "ishome"=$is_home \ --metadata section=$section \ --metadata "is$section" \ --metadata-file metadata/metadata.yaml \ --metadata-file "$subpages_meta_file" \ $FILTERS # --lua-filter "filters/add_refs.lua" rm "$subpages_meta_file" else echo -e "\033[0;32m[COPY ]\033[0m $1 -> $target" cp "$1" "$target" 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=$(target_filename "$2") echo -e "\033[0;32m[DELETE ]\033[0m $2 -> $TARGET" rm -rf $TARGET fi else echo -e "\033[0;31m[ERROR ]\033[0m Unknown operation: \"$1\"" fi