forked from HPR/hpr-tools
		
	
		
			
	
	
		
			253 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			253 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#!/bin/bash -
							 | 
						||
| 
								 | 
							
								#===============================================================================
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#         FILE: build_AOB
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#        USAGE: ./build_AOB [date]
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#  DESCRIPTION: Build the AOB files for a particular month
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#      OPTIONS: ---
							 | 
						||
| 
								 | 
							
								# REQUIREMENTS: ---
							 | 
						||
| 
								 | 
							
								#         BUGS: ---
							 | 
						||
| 
								 | 
							
								#        NOTES: ---
							 | 
						||
| 
								 | 
							
								#       AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
							 | 
						||
| 
								 | 
							
								#      VERSION: 0.0.12
							 | 
						||
| 
								 | 
							
								#      CREATED: 2021-04-15 17:36:22
							 | 
						||
| 
								 | 
							
								#     REVISION: 2024-03-15 09:50:02
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#===============================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set -o nounset                              # Treat unset variables as an error
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								SCRIPT=${0##*/}
							 | 
						||
| 
								 | 
							
								BASEDIR=${0%/*}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								VERSION="0.0.12"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								STDOUT="/dev/fd/2"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Make sure we're in the working directory
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								cd "$BASEDIR" || exit 1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Load library functions
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								LIB="$HOME/bin/function_lib.sh"
							 | 
						||
| 
								 | 
							
								[ -e "$LIB" ] || { echo "$SCRIPT: Unable to source functions"; exit 1; }
							 | 
						||
| 
								 | 
							
								# shellcheck disable=SC1090
							 | 
						||
| 
								 | 
							
								source "$LIB"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# {{{ -- Functions usage and _DEBUG
							 | 
						||
| 
								 | 
							
								#===  FUNCTION  ================================================================
							 | 
						||
| 
								 | 
							
								#         NAME: _usage
							 | 
						||
| 
								 | 
							
								#  DESCRIPTION: Report usage
							 | 
						||
| 
								 | 
							
								#   PARAMETERS: None
							 | 
						||
| 
								 | 
							
								#      RETURNS: Nothing
							 | 
						||
| 
								 | 
							
								#===============================================================================
							 | 
						||
| 
								 | 
							
								_usage () {
							 | 
						||
| 
								 | 
							
								    cat >$STDOUT <<-endusage
							 | 
						||
| 
								 | 
							
								Usage: ./${SCRIPT} [-h] [-D] [date]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Version: $VERSION
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Converts the AOB in Markdown format for a particular month to HTML and to text
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Options:
							 | 
						||
| 
								 | 
							
								  -h                    Print this help
							 | 
						||
| 
								 | 
							
								  -D                    Select debug mode (works the same; more output)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Arguments (optional):
							 | 
						||
| 
								 | 
							
								    date                Specifies the month to build the AOB for. The default
							 | 
						||
| 
								 | 
							
								                        is the current month. The format can be YYYY-MM (e.g.
							 | 
						||
| 
								 | 
							
								                        2022-05) or any date format that the 'date' command
							 | 
						||
| 
								 | 
							
								                        can parse, so 2022-04-01 or 01-Apr-2022 and so on. If
							 | 
						||
| 
								 | 
							
								                        the date cannot be parsed an error will be reported.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Examples
							 | 
						||
| 
								 | 
							
								  ./${SCRIPT} -h
							 | 
						||
| 
								 | 
							
								  ./${SCRIPT} -D 01-February-2021
							 | 
						||
| 
								 | 
							
								  ./${SCRIPT} 2021-02
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								endusage
							 | 
						||
| 
								 | 
							
								    exit
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#===  FUNCTION  ================================================================
							 | 
						||
| 
								 | 
							
								#         NAME: _DEBUG
							 | 
						||
| 
								 | 
							
								#  DESCRIPTION: Writes a message if in DEBUG mode
							 | 
						||
| 
								 | 
							
								#   PARAMETERS: List of messages
							 | 
						||
| 
								 | 
							
								#      RETURNS: Nothing
							 | 
						||
| 
								 | 
							
								#===============================================================================
							 | 
						||
| 
								 | 
							
								_DEBUG () {
							 | 
						||
| 
								 | 
							
								    [ "$DEBUG" == 0 ] && return
							 | 
						||
| 
								 | 
							
								    for msg in "$@"; do
							 | 
						||
| 
								 | 
							
								        printf 'D> %s\n' "$msg"
							 | 
						||
| 
								 | 
							
								    done
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# }}}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Base and database directories
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								PARENT="$HOME/HPR"
							 | 
						||
| 
								 | 
							
								BASEDIR="$PARENT/Community_News"
							 | 
						||
| 
								 | 
							
								cd "$BASEDIR" || {
							 | 
						||
| 
								 | 
							
								    echo "Failed to cd to $BASEDIR";
							 | 
						||
| 
								 | 
							
								    exit 1;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								# IADIR="$PARENT/InternetArchive"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Option defaults
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								DEBUG=0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Process options
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								while getopts :hdD opt
							 | 
						||
| 
								 | 
							
								do
							 | 
						||
| 
								 | 
							
								    case "${opt}" in
							 | 
						||
| 
								 | 
							
								        h) _usage;;
							 | 
						||
| 
								 | 
							
								        D) DEBUG=1;;
							 | 
						||
| 
								 | 
							
								        ?) echo "$SCRIPT: Invalid option; aborting"; exit 1;;
							 | 
						||
| 
								 | 
							
								    esac
							 | 
						||
| 
								 | 
							
								done
							 | 
						||
| 
								 | 
							
								shift $((OPTIND - 1))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Handle the optional argument
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								if [[ $# -eq 1 ]]; then
							 | 
						||
| 
								 | 
							
								    startdate="$1"
							 | 
						||
| 
								 | 
							
								    # Normalise a YYYY-MM date so 'date' will not complain
							 | 
						||
| 
								 | 
							
								    if [[ $startdate =~ ^[0-9]{4}-[0-9]{2}$ ]]; then
							 | 
						||
| 
								 | 
							
								        startdate+='-01'
							 | 
						||
| 
								 | 
							
								    fi
							 | 
						||
| 
								 | 
							
								    # Validate the date and standardise it if it's OK
							 | 
						||
| 
								 | 
							
								    tmp="$(date -d "$startdate" +%Y-%m)" || {
							 | 
						||
| 
								 | 
							
								        echo "Use a date such as $(date +%Y-%m)"
							 | 
						||
| 
								 | 
							
								        exit 1
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    startdate="$tmp"
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
								    startdate="$(date +%Y-%m)"
							 | 
						||
| 
								 | 
							
								fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_DEBUG "Date used: $startdate"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# We added a new field in 2022, 'item_last_updated' which is taken from the IA
							 | 
						||
| 
								 | 
							
								# (which we discovered was being maintained). It is a Unix date field, but the
							 | 
						||
| 
								 | 
							
								# view 'episodes_view' converts it.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# TODO: Since query3 was added it has made query1 and query2 obsolete. We
							 | 
						||
| 
								 | 
							
								# generate a per-month table with query3 which is turned into HTML using awk
							 | 
						||
| 
								 | 
							
								# and used in the AOB report. The code below that uses these queries and their
							 | 
						||
| 
								 | 
							
								# results could now be removed (or commented out).
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#query1="select count(*) from episodes where id between 871 and 2429 and with_derived = 1"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								##query1="select count(*) from episodes_view where id between 871 and 2429 and \
							 | 
						||
| 
								 | 
							
								##item_last_updated between '${startdate}-01' and \
							 | 
						||
| 
								 | 
							
								##date('${startdate}-01','+1 month') and with_derived = 1"
							 | 
						||
| 
								 | 
							
								##
							 | 
						||
| 
								 | 
							
								##query2='select count(*) from episodes where id between 871 and 2429 and with_derived = 0'
							 | 
						||
| 
								 | 
							
								##
							 | 
						||
| 
								 | 
							
								##query3=$(cat <<ENDOFQ3
							 | 
						||
| 
								 | 
							
								##SELECT
							 | 
						||
| 
								 | 
							
								##    strftime('%Y-%m',item_last_updated) AS month,
							 | 
						||
| 
								 | 
							
								##    count(*) AS count
							 | 
						||
| 
								 | 
							
								##FROM episodes_view
							 | 
						||
| 
								 | 
							
								##WHERE id BETWEEN 871 AND 2429
							 | 
						||
| 
								 | 
							
								##AND item_last_updated IS NOT NULL
							 | 
						||
| 
								 | 
							
								##AND item_last_updated < date('${startdate}-01','+1 month')
							 | 
						||
| 
								 | 
							
								##GROUP BY strftime('%Y-%m',item_last_updated);
							 | 
						||
| 
								 | 
							
								##ENDOFQ3
							 | 
						||
| 
								 | 
							
								##)
							 | 
						||
| 
								 | 
							
								##
							 | 
						||
| 
								 | 
							
								##_DEBUG "Query used (1): $query1"
							 | 
						||
| 
								 | 
							
								##_DEBUG "Query used (2): $query2"
							 | 
						||
| 
								 | 
							
								##_DEBUG "Query used (3): $query3"
							 | 
						||
| 
								 | 
							
								##
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# The database
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								##IADB="$IADIR/ia.db"
							 | 
						||
| 
								 | 
							
								##
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Collect the values
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								##UPLOADS=$(echo "$query1" | sqlite3 -list "$IADB")
							 | 
						||
| 
								 | 
							
								##REMAINING=$(echo "$query2" | sqlite3 -list "$IADB")
							 | 
						||
| 
								 | 
							
								##TABLE=$(echo "$query3" | sqlite3 -list "$IADB")
							 | 
						||
| 
								 | 
							
								##
							 | 
						||
| 
								 | 
							
								##_DEBUG "Uploads=$UPLOADS (query 1)"
							 | 
						||
| 
								 | 
							
								##_DEBUG "Remaining=$REMAINING (query 2)"
							 | 
						||
| 
								 | 
							
								##_DEBUG "Table=$TABLE"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Files we need to build the AOB
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								AOBMKD="$BASEDIR/aob_$startdate.mkd"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Sanity check
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								[ -e "$AOBMKD" ] || { echo "Unable to find $AOBMKD"; exit 1; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Make temporary files and set traps to delete them
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								##TMP1=$(mktemp) || { echo "$SCRIPT: creation of temporary file failed!"; exit 1; }
							 | 
						||
| 
								 | 
							
								##trap 'cleanup_temp $TMP1' SIGHUP SIGINT SIGPIPE SIGTERM EXIT
							 | 
						||
| 
								 | 
							
								##
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Use Awk to process the table we failed to generate in SQL :-(
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								##awk -F '|' -f /dev/fd/7 <<<"$TABLE" >"$TMP1" 7<<'ENDAWK'
							 | 
						||
| 
								 | 
							
								##BEGIN{
							 | 
						||
| 
								 | 
							
								##    total = 0
							 | 
						||
| 
								 | 
							
								##    remainder = (2429 - 871 + 1)
							 | 
						||
| 
								 | 
							
								##    print "<table>"
							 | 
						||
| 
								 | 
							
								##    print "<tr><th>Month</th><th>Month count</th>"\
							 | 
						||
| 
								 | 
							
								##        "<th>Running total</th><th>Remainder</th></tr>"
							 | 
						||
| 
								 | 
							
								##}
							 | 
						||
| 
								 | 
							
								##{
							 | 
						||
| 
								 | 
							
								##    total = total + $2
							 | 
						||
| 
								 | 
							
								##    remainder = remainder - $2
							 | 
						||
| 
								 | 
							
								##    printf "<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n",
							 | 
						||
| 
								 | 
							
								##        $1,$2,total,remainder
							 | 
						||
| 
								 | 
							
								##}
							 | 
						||
| 
								 | 
							
								##END{
							 | 
						||
| 
								 | 
							
								##    print "</table>"
							 | 
						||
| 
								 | 
							
								##}
							 | 
						||
| 
								 | 
							
								##ENDAWK
							 | 
						||
| 
								 | 
							
								##cat >>"$TMP1" <<ENDDATE
							 | 
						||
| 
								 | 
							
								##<p><small><small>Table updated: $(date --utc +'%F %T')</small></small></p>
							 | 
						||
| 
								 | 
							
								##ENDDATE
							 | 
						||
| 
								 | 
							
								##_DEBUG "Table" "$(cat "$TMP1")"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Build the output files
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# if tpage --define "uploads=$UPLOADS" --define "remaining=$REMAINING" \
							 | 
						||
| 
								 | 
							
								#     --define "table=$TMP1" "$AOBMKD" |\
							 | 
						||
| 
								 | 
							
								#     pandoc -f markdown-smart -t html5 -o "${AOBMKD%mkd}html"; then
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								if pandoc -f markdown-smart -t html5 "$AOBMKD" -o "${AOBMKD%mkd}html"; then
							 | 
						||
| 
								 | 
							
								    echo "Converted $AOBMKD to HTML"
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
								    echo "Conversion of $AOBMKD to HTML failed"
							 | 
						||
| 
								 | 
							
								fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								exit
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21:fdm=marker
							 |