#!/bin/bash source "site.defaults.conf" get_filters() { local 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) get_filename_out() { local filename=$1 filename=${filename#"$CONTENT_DIR"} echo "$OUTPUT_DIR$filename" } get_metadata() { pandoc "$1" \ -f markdown \ -t plain \ --metadata content_dir="$CONTENT_DIR" \ --metadata output_dir="$OUTPUT_DIR" \ --metadata file_in="$1" \ --metadata-file metadata/metadata.yaml \ --no-highlight \ --template scripts/metadata_tpl.json \ --lua-filter scripts/metadata_filter.lua } get_content() { pandoc "$1" \ -f markdown \ -t markdown \ --metadata content_dir="$CONTENT_DIR" \ --metadata output_dir="$OUTPUT_DIR" \ --metadata file_in="$1" \ --metadata-file metadata/metadata.yaml \ --no-highlight \ --lua-filter scripts/metadata_filter.lua } get_subpages_basedir() { local filename=$1 filename=${filename%.md} if [ "${filename##*/}" = "index" ]; then filename=${filename%/index} fi echo "$filename" } get_subpages_metadata() { local base_dir_in=$(get_subpages_basedir "$1") local child_pages=() if [ -d "$base_dir_in" ]; then mapfile -d $'\0' child_pages < <(find "$base_dir_in" \ -maxdepth 2 \ -type f \ -name "*.md" \ ! -name "_*.md" \ ! -wholename "$base_dir_in/index.md" \ \( -wholename "$base_dir_in/*/index.md" -o ! -wholename "$base_dir_in/*/*.md" \) \ -print0) fi local pages="[]" for file_in in "${child_pages[@]}"; do local content=$(get_content "$file_in" | sed -z 's/\\/\\\\/g;s/\n/\\n/g;s/"/\\"/g') local metadata=$(get_metadata "$file_in" | jq "{ \ file_out: .file_out, \ author: .author, \ title: .title, \ date: .date, \ last_update: .last_update, \ category: .category, \ content: \"$content\" \ } | del(.[] | nulls)") pages=$(echo "$pages" | jq ". += [ $metadata ]") done echo "{ \"pages\": $pages }" } handle () { if [ "${1#*.}" = "md" ]; then local included_metadata=$(get_metadata "$1") local file_out=$(echo "$included_metadata" | jq -r .file_out) local create_feed=$(echo "$included_metadata" | jq -r .create_feed) mkdir -p $(dirname "$file_out") echo -e "\033[0;32m[COMPILE ]\033[0m $1 -> $file_out" echo -e "\033[0;90m[COMPILE ]\033[0m Getting subpages" local added_metadata=$(get_subpages_metadata "$1") local meta_file=$(mktemp) 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 \ --no-highlight \ --template "${TEMPLATES_DIR}feed.xml" \ -o "${file_out%.html}.xml" \ --metadata content_dir="$CONTENT_DIR" \ --metadata output_dir="$OUTPUT_DIR" \ --metadata file_in="$1" \ --metadata page_type=feed \ --metadata-file metadata/metadata.yaml \ --metadata-file "$meta_file" \ --lua-filter scripts/metadata_filter.lua fi echo -e "\033[0;90m[COMPILE ]\033[0m Creating page" pandoc "$1" \ -f markdown \ -t html5 \ --no-highlight \ --template "${TEMPLATES_DIR}base.html" \ -o "$file_out" \ --metadata content_dir="$CONTENT_DIR" \ --metadata output_dir="$OUTPUT_DIR" \ --metadata file_in="$1" \ --metadata-file metadata/metadata.yaml \ --metadata-file "$meta_file" \ --lua-filter scripts/metadata_filter.lua \ $FILTERS # echo "$(pandoc "$1" \ # -f markdown \ # -t plain \ # --no-highlight \ # --template scripts/metadata_tpl.json \ # --metadata content_dir="$CONTENT_DIR" \ # --metadata output_dir="$OUTPUT_DIR" \ # --metadata file_in="$1" \ # --metadata-file metadata/metadata.yaml \ # --metadata-file "$meta_file" \ # --lua-filter scripts/metadata_filter.lua \ # $FILTERS)" rm "$meta_file" echo -e "\033[0;90m[COMPILE ]\033[0m Done" else local file_out=$(get_filename_out "$1") mkdir -p $(dirname "$file_out") echo -e "\033[0;32m[COPY ]\033[0m $1 -> $file_out" cp "$1" "$file_out" fi } mdfilter="" if [ "$LIVE" != true ]; then mdfilter="! -name _*.md" fi if [ -z "$1" ]; then find "$CONTENT_DIR" \ -type f \ $mdfilter \ | while read file_in do handle "$file_in" done elif [ "$1" = "all_md" ]; then find "$CONTENT_DIR" \ -type f \ -name "*.md" \ $mdfilter \ | while read file_in do handle "$file_in" done elif [ "$1" = "single" ]; then if [ -z "$2" ]; then echo -e "\033[0;31m[ERROR ]\033[0m \"single\" operation requires file argument" else filename=$(basename "$2") if [ "${filename:0:1}" != "_" ]; then handle "$2" fi fi elif [ "$1" = "delete" ]; then if [ -z "$2" ]; then echo -e "\033[0;31m[ERROR ]\033[0m \"delete\" operation requires file argument" else file_out=$(get_filename_out "$2") if [ -f "$file_out" ] || [ -d "$file_out" ]; then echo -e "\033[0;32m[DELETE ]\033[0m $2 -> $file_out" rm -rf $file_out fi fi else echo -e "\033[0;31m[ERROR ]\033[0m Unknown operation: \"$1\"" fi