diff --git a/capsule/.gitignore b/capsule/.gitignore index 2747379..4651ceb 100644 --- a/capsule/.gitignore +++ b/capsule/.gitignore @@ -1 +1,3 @@ .certificates +content/logs/loglog.gmi +tmp-build-loglog-* diff --git a/capsule/build_loglog.sh b/capsule/build_loglog.sh new file mode 100755 index 0000000..12c8af8 --- /dev/null +++ b/capsule/build_loglog.sh @@ -0,0 +1,131 @@ +#!/bin/bash + +TMP="tmp-build-loglog-$(date +%s%N)" +LOGLOG="content/logs/loglog.gmi" +LOGLOG_HEADER="loglog-header.gmi" + +new_filename() +{ + DATE="$1" + mkdir -p "$TMP/$DATE" + N=0 + while [[ -f "$TMP/$DATE/$N" ]]; do + N=$(( N + 1 )) + done + echo "$TMP/$DATE/$N" +} + +read_log_to_tmp() +{ + LOGPATH="$1" + LOG="$(echo $LOGPATH | sed "s/.*\///g" | sed "s/\.gmi//g")" + CURRENT_POST_HEADING="" + CURRENT_POST_FILENAME="" + while read line; do + if [[ -z "$CURRENT_POST_FILENAME" ]]; then + if [[ "$line" =~ (\#+)\ *([0-9]{4}-[0-9]{2}-[0-9]{2})\ * ]]; then + CURRENT_POST_HEADING="${BASH_REMATCH[1]}" + DATE="${BASH_REMATCH[2]}" + CURRENT_POST_FILENAME="$(new_filename $DATE)" + elif [[ "$line" =~ \=\>\ +([^\ ]+)\ +([0-9]{4}-[0-9]{2}-[0-9]{2})\ +(.*) ]]; then + HREF="${BASH_REMATCH[1]}" + DATE="${BASH_REMATCH[2]}" + NAME="${BASH_REMATCH[3]}" + FILENAME="$(new_filename $DATE)" + echo " +=> $HREF $DATE $NAME + +From my gemlog. + +=> /gemlog My $LOG" \ + >> "$FILENAME" + fi + else + if [[ "$line" =~ (\#+)\ *([0-9]{4}-[0-9]{2}-[0-9]{2})\ * ]]; then + echo "From my $LOG. + +=> /$LOG My $LOG" \ + >> "$CURRENT_POST_FILENAME" + CURRENT_POST_HEADING="${BASH_REMATCH[1]}" + DATE="${BASH_REMATCH[2]}" + CURRENT_POST_FILENAME="$(new_filename $DATE)" + elif [[ "$line" =~ \#.* ]] && ! [[ "$line" =~ ${CURRENT_POST_HEADING}\#.* ]]; then + echo "From my $LOG. + +=> /$LOG My $LOG" \ + >> "$CURRENT_POST_FILENAME" + CURRENT_POST_HEADING="" + DATE="" + CURRENT_POST_FILENAME="" + else + echo "$line" >> "$CURRENT_POST_FILENAME" + fi + fi + done <$LOGPATH +} + +trim_entries() +{ + ENTRY_DIR="$1" + for entry in $ENTRY_DIR/*; do + while [[ -z "$(head -n 1 "$entry")" && "$(wc -l "$entry" | cut -c1)" -ne 0 ]]; do + tail -n +2 "$entry" | tee "$entry" 1>0 + done + while [[ -z "$(tail -n 1 "$entry")" && "$(wc -l "$entry" | cut -c1)" -ne 0 ]]; do + head -n -1 "$entry" | tee "$entry" 1>0 + done + if [[ -z "$(cat "$entry")" ]]; then + echo "Removing entry $entry: $(cat $entry)" + rm "$entry" + fi + done + if [[ "$(ls "$ENTRY_DIR" | wc -l)" -eq 0 ]]; then + rmdir "$ENTRY_DIR" + fi +} + +append_entries_for_date() +{ + DATE_DIR="$1" + DATE="$(echo "$DATE" | sed "s/.*\///g")" + echo "## $DATE +" >> "$LOGLOG" + ENTRY_COUNT="$(ls $DATE_DIR | wc -l)" + LAST_ENTRY="$(ls $DATE_DIR | tail -n 1)" + for entry in $DATE_DIR/*; do + cat "$entry" >> "$LOGLOG" + echo "" >> "$LOGLOG" + if [[ "$ENTRY_COUNT" -gt 1 && "$entry" != "$DATE_DIR/$LAST_ENTRY" ]]; then + echo \ +------------------------------------------------------------------------ >> "$LOGLOG" + echo "" >> "$LOGLOG" + fi + done +} + +echo "Cleaning existing loglog..." +rm -f "$LOGLOG" + +echo "Reading logs to temporary files..." +for log in content/logs/*log.gmi; do + read_log_to_tmp "$log" +done + +echo "Trimming entries in temporary files..." +for date in $TMP/*; do + trim_entries "$date" +done + +echo "Copying loglog header..." +cp "$LOGLOG_HEADER" "$LOGLOG" + +echo "Appending entries to loglog..." +dates=($TMP/*) +for ((i=${#dates[@]}-1; i>=0; i--)); do + append_entries_for_date "${dates[i]}" +done + +echo "Cleaning up temporary files..." +rm -rd "$TMP" + +echo "Done." diff --git a/capsule/loglog-header.gmi b/capsule/loglog-header.gmi new file mode 100644 index 0000000..0a5f401 --- /dev/null +++ b/capsule/loglog-header.gmi @@ -0,0 +1,4 @@ +# joeac's loglog + +Hi! I'm Joe Carstairs, and you've found my loglog; my log of logs; all my posts of every description, all gathered into one place. If you're really that interested in my posts, I would encourage you to strongly consider the benefits of touching grass. +