#!/bin/bash source "site.defaults.conf" if [ -f "site.conf" ]; then source "site.conf" fi 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) CATEGORIES=$(cat "$METADATA_DIR/categories.json") get_target_filename() { filename=$1 filename=${filename#"$CONTENT_DIR"} if [ "${filename##*.}" = "md" ]; then filename="${filename%.md}.html" fi echo "$OUTPUT_DIR$filename" } get_url_rel() { basedir=$1 filename=$2 ext=$3 filename=$(realpath --relative-to="$basedir" "$filename") filename="${filename%.md}.$ext" if [ "${filename##*/}" = "index.html" ]; then filename=${filename%index.html} fi echo "$filename" } get_url_abs() { echo "/$(get_url_rel "$CONTENT_DIR" "$1" "$2")" } get_metadata() { pandoc "$1" \ -f markdown \ -t plain \ --template scripts/metadata_tpl.json } get_content() { pandoc "$1" \ -f markdown \ -t plain } get_section() { filename=$1 filename=${filename#"$CONTENT_DIR"} filename=${filename%.md} filename=$(echo "$filename" | cut -f1 -d /) echo "$filename" } get_subpages_basedir() { filename=$1 filename=${filename%.md} if [ "${filename##*/}" = "index" ]; then filename=${filename%index} fi echo "$filename" } get_subpages_meta() { basedir=$(get_subpages_basedir "$1") child_pages=() if [ -d "$basedir" ]; then mapfile -d $'\0' child_pages < <(find $basedir/ \ -type f \ -name "*.md" \ ! -wholename "$basedir/index.md" \ -maxdepth 2 \ -print0) fi pages=$(echo "{}" | jq ". + { \ all: [], \ by_year: {}, \ }") categories="{}" if [ ${#child_pages[@]} -ne 0 ]; then #echo -e "\033[0;90m[////////]\033[0m Child pages:" for file in "${child_pages[@]}"; do #echo -e "\033[0;90m[////////]\033[0m - $file" metadata=$(get_metadata "$file") # content=$(get_content "$file") section=$(get_section "$file") url_rel=$(get_url_rel "$basedir" "$file" "html") url_abs=$(get_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 category=$(echo "$metadata" | jq -r .category) category_name="" if [ "$section" != "" ] && [ "$category" != "" ]; then category_name=$(echo "$CATEGORIES" | jq -r .$section.$category) fi # metadata=$(echo "$metadata" | jq ". + { \ # content: { \ # plain: \"$(echo "$content" | sed -z 's/\\/\\\\/g;s/\n/\\n/g;s/"/\"/g')\", \ # }, \ # }") 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 if [ "$category" != "" ]; then categories=$(echo "$categories" | jq ".$category = { name: \"$category_name\", count: (.$category.count + 1) } ") fi done fi 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 | { by_id: (. | sort_by(.key)), by_count: (. | sort_by(.value.count) | reverse) }") echo "{}" | jq ". + { \ pages: $pages, \ categories: $categories }" } handle () { target_file=$(get_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) echo -e "\033[0;90m[COMPILE ]\033[0m Getting metadata" included_metadata=$(get_metadata "$1") create_feed=$(echo "$included_metadata" | jq -r ".create_feed") url_abs=$(get_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 added_metadata=$(echo "$(get_subpages_meta "$1")" | jq ". + { \ url: { \ abs: \"$url_abs\", \ full: \"$url_full\" \ }, \ section: { \ id: \"$section\", \ is_$section: true \ }, \ is_home: $is_home \ }") if [ "$create_feed" = "true" ]; then feed_url_abs="$(get_url_abs "$1" "xml")" feed_url_full="${SITE%/}$feed_url_abs" last_update=$(echo "$added_metadata" | jq -r ".pages.all[0].date") added_metadata=$(echo "$added_metadata" | jq ". + { \ feed: { \ last_update: $last_update, \ url: { \ abs: \"$feed_url_abs\", \ full: \"$feed_url_full\" \ } \ } \ }") fi echo "$added_metadata" > "$meta_file" if [ "$create_feed" = "true" ]; then echo -e "\033[0;90m[COMPILE ]\033[0m Creating feed" pandoc "$1" \ -f markdown \ -t html5 \ --template "${TEMPLATES_DIR}feed.xml" \ -o "${target_file%.html}.xml" \ --metadata-file metadata/metadata.yaml \ --metadata-file "$meta_file" \ $FILTERS fi echo -e "\033[0;90m[COMPILE ]\033[0m Creating page" 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) echo -e "\033[0;90m[COMPILE ]\033[0m Done" 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=$(get_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