Various updates

Show_Submission/copy_shownotes: Changed the location of the function library

Show_Submission/do_brave: Updates to the way local stand-alone HTML is generated for
    review purposes.

Show_Submission/do_index: Changed the location of the function library

Show_Submission/do_pandoc: Changed the location of the function library; now uses
    'author_title.pl' to generate YAML for Pandoc

Show_Submission/do_parse: Trivial change

Show_Submission/do_pictures: Changed the location of the function library; better
    handling of the show specification

Show_Submission/do_report: Changed the location of the function library

Show_Submission/do_update_reservations: Changed the location of the function library

Show_Submission/fix_relative_links: Added features 'say' and 'state'

Show_Submission/parse_JSON: New checks: notes too short, trailing spaces on title,
    summary and tags (needing JSON changes). Check for Markdown in the
    assets (see 'do_pandoc_assets'). New 'trim' function.
This commit is contained in:
Dave Morriss 2024-12-01 20:45:20 +00:00
parent 7e925621f4
commit b7cae1cb90
10 changed files with 215 additions and 118 deletions

View File

@ -18,7 +18,7 @@
# AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
# VERSION: 0.0.10
# CREATED: 2015-09-16 21:51:15
# REVISION: 2023-07-01 22:48:53
# REVISION: 2024-06-18 20:42:17
#
#===============================================================================
@ -29,9 +29,9 @@ SCRIPT=${0##*/}
#
# Load library functions
#
LIB="$HOME/bin/function_lib.sh"
LIB="$HOME/HPR/function_lib.sh"
[ -e "$LIB" ] || { echo "$SCRIPT: Unable to source functions"; exit 1; }
# shellcheck source=/home/cendjm/bin/function_lib.sh
# shellcheck source=/home/cendjm/HPR/function_lib.sh
source "$LIB"
#

View File

@ -19,10 +19,17 @@
# 2022-12-22: We now write state changes to the file .status in
# the show directory, so we need to do that here too. Also
# changed to using the function library for cleanup_temp.
# 2024-10-17: Changed the logic around 'hpr????_full.html' by
# using a TT² template to enclose the usual HTML fragment in
# enough HTML to make it standalone. We have to get values from
# 'shownotes.json' and paass them into 'tpage' to do this, and
# the end result is not the same as the one generated by
# 'do_pandoc'. The result looks better than using the HTML
# fragment.
# AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
# VERSION: 0.0.5
# VERSION: 0.0.6
# CREATED: 2016-03-20 15:22:29
# REVISION: 2022-12-22 17:28:12
# REVISION: 2024-10-17 19:33:42
#
#===============================================================================
@ -47,18 +54,29 @@ if [[ $# -ne 1 ]]; then
exit 1
fi
epno="${1}"
#
# Directories and files
#
BASENAME="$HOME/HPR/Show_Submission"
SHOWDIR="$BASENAME/shownotes/hpr${1}"
RAWNOTES="$SHOWDIR/hpr${1}.out"
HTML="$SHOWDIR/hpr${1}.html"
FULLHTML="$SHOWDIR/hpr${1}_full.html"
SHOWDIR="$BASENAME/shownotes/hpr${epno}"
RAWNOTES="$SHOWDIR/hpr${epno}.out"
HTML="$SHOWDIR/hpr${epno}.html"
FULLHTML="$SHOWDIR/hpr${epno}_full.html"
SHOWNOTES="$SHOWDIR/shownotes.json"
STATUSFILE="$SHOWDIR/.status"
FORMATFILE="$SHOWDIR/.format"
FORMAT="$(cat "$FORMATFILE")"
HTMLFILE="$FULLHTML"
#
# Check we have this template
#
FULLTPL="$BASENAME/make_fullnotes.tpl"
[[ -e $FULLTPL ]] || { echo "Unable to find template $FULLTPL"; exit 1; }
#
# Check we have this browser
#
@ -66,14 +84,42 @@ BRAVE=$(command -v brave-browser)
[[ -v BRAVE ]] || { echo "Problem finding the Brave browser"; exit 1; }
#
# We prefer to view the 'full' html which we do by default. If not found
# (because the host sent in HTML themselves) we look for hpr????.html, which
# is a link to the notes from the form (hpr????.out), and view that. If the
# link didn't get created (not sure why) we copy the "raw" notes to
# a temporary file with an '.html' extension (TODO: we could just make a link
# here). Otherwise we found nothing viewable.
# Taking a different approach with the 'full' html. If the format is known to
# be 'html5' there will not be one the first time we run this script. We will
# make 'hpr????_full.html' by enclosing the HTML "fragment" in 'hpr????.html'
# in a TT² template with HTML header and footer.
#
if [[ ! -e $FULLHTML ]]; then
if [[ $FORMAT = 'html5' ]]; then
#
# Extract the fields we want from the JSON and make them Bash variables
#
declare _author _title _summary # Declare them for shellcheck
jqprog='@sh "_author=\(.host.Host_Name) '
jqprog+='_title=\(.episode.Title) '
jqprog+='_summary=\(.episode.Summary)"'
eval "$(jq -r "$jqprog" "$SHOWNOTES")"
#
# Feed the variables to the template to make the full HTML
#
tpage --define author="$_author" \
--define title="$_title" \
--define summary="$_summary" \
--define body="$HTML" \
"$FULLTPL" > "$FULLHTML"
else
#
# See above for how we make the 'full' notes if the host sent in HTML
# notes. Here we have received notes that use one of the excepted markup
# formats or are plain text (≡ Pandoc Markdown).
#
# If the 'full' HTML is not found (for unknown reasons) we look for
# hpr????.html, which is a link to the notes from the form (hpr????.out),
# and view that. If the link didn't get created (not sure why) we copy the
# "raw" notes to a temporary file with an '.html' extension (TODO: we
# could just make a link here). Otherwise we found nothing viewable.
#
if [[ ! -e $FULLHTML ]]; then
if [[ -e $HTML ]]; then
echo "No full HTML found, viewing $HTML instead"
HTMLFILE="$HTML"
@ -89,6 +135,7 @@ if [[ ! -e $FULLHTML ]]; then
echo "Nothing to view, giving up"
exit
fi
fi
fi
#

View File

@ -11,11 +11,11 @@
# OPTIONS: ---
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: ---
# NOTES: [[ Probably obsolete! ]]
# AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
# VERSION: 0.0.5
# CREATED: 2022-10-30 15:39:28
# REVISION: 2022-12-17 17:38:00
# REVISION: 2024-06-18 20:28:55
#
#===============================================================================
@ -31,9 +31,9 @@ STDOUT="/dev/fd/2"
#
# Load library functions (make_file_list, range_parse, cleanup_temp)
#
LIB="$HOME/bin/function_lib.sh"
LIB="$HOME/HPR/function_lib.sh"
[ -e "$LIB" ] || { echo "$SCRIPT: Unable to source functions"; exit 1; }
# shellcheck source=/home/cendjm/bin/function_lib.sh
# shellcheck source=/home/cendjm/HPR/function_lib.sh
source "$LIB"
#

View File

@ -37,9 +37,9 @@
# careful about collisions.
#
# AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
# VERSION: 0.2.10
# VERSION: 0.2.11
# CREATED: 2016-08-16 15:34:30
# REVISION: 2024-02-18 13:27:40
# REVISION: 2024-10-18 23:03:25
#
#===============================================================================
@ -48,16 +48,16 @@ set -o nounset # Treat unset variables as an error
SCRIPT=${0##*/}
#DIR=${0%/*}
VERSION='0.2.10'
VERSION='0.2.11'
STDOUT="/dev/fd/2"
#
# Load library functions
#
LIB="$HOME/bin/function_lib.sh"
LIB="$HOME/HPR/function_lib.sh"
[ -e "$LIB" ] || { echo "$SCRIPT: Unable to source functions"; exit 1; }
# shellcheck source=/home/cendjm/bin/function_lib.sh
# shellcheck source=/home/cendjm/HPR/function_lib.sh
source "$LIB"
#
@ -65,7 +65,7 @@ source "$LIB"
#
define_colours
# {{{ Functions: -- _usage -- _DEBUG --
# {{{ Functions: -- _usage --
#=== FUNCTION ================================================================
# NAME: _usage
# DESCRIPTION: Report usage
@ -102,19 +102,6 @@ Examples
endusage
exit
}
#=== FUNCTION ================================================================
# NAME: _DEBUG
# DESCRIPTION: Writes one or more message lines if in DEBUG mode
# PARAMETERS: List of messages
# RETURNS: Nothing
#===============================================================================
_DEBUG () {
[ "$DEBUG" == 0 ] && return
for msg in "$@"; do
printf 'D> %s\n' "$msg"
done
}
# }}}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -168,8 +155,8 @@ options[txt2tags]=''
#
# Sanity checks
#
JQ=$(command -v jq)
[ -n "$JQ" ] || { echo "Program 'jq' was not found"; exit 1; }
# JQ=$(command -v jq)
# [ -n "$JQ" ] || { echo "Program 'jq' was not found"; exit 1; }
# YQ=$(command -v yq)
# [ -n "$YQ" ] || { echo "Program 'yq' was not found"; exit 1; }
@ -235,7 +222,7 @@ trap 'cleanup_temp $TMP1 $TMP2 $TMP3' SIGHUP SIGINT SIGPIPE SIGTERM EXIT
# Main directory
BASENAME="$HOME/HPR/Show_Submission"
# JSON to YAML Perl script
# JSON to YAML Perl script - sanity check
J2Y="$BASENAME/author_title.pl"
[ -e "$J2Y" ] || { echo "Program '$J2Y' was not found"; exit 1; }
@ -303,19 +290,23 @@ BASEURL='https://hackerpublicradio.org/eps/'
# needed for Pandoc
#
# Non-YAML alternative - not chosen
#jqprog="@text \"author: \(.host.Host_Name)\ntitle: \(.episode.Title)\""
# jqprog="@text \"author: \(.host.Host_Name)\ntitle: \(.episode.Title)\""
#
# Testing another formatter (Journal 2023-03-03)
#jqprog="@sh \"---\nauthor: \(.host.Host_Name)\ntitle: \(.episode.Title)\n---\""
# jqprog="@sh \"---\nauthor: \(.host.Host_Name)\ntitle: \(.episode.Title)\n---\""
# Added quotes around the generated strings (2023-03-31)
# jqprog="@text \"---\nauthor: \(.host.Host_Name)\ntitle: \(.episode.Title)\n---\""
#
# Moved to 'yq' 2023-04-01
# jqprog="@text \"---\nauthor: '\(.host.Host_Name)'\ntitle: '\(.episode.Title)'\n---\""
# jq -r "$jqprog" "$JSONFILE" > "$TMP1"
#
# On 2023-10-01 wrote a Perl JSON to YAML generator just for these two
# elements. It's called 'author_title.pl'
#
# yqprog='{author:.host.Host_Name,title:.episode.Title}'
# ( echo "---"; $YQ -y "$yqprog" "$JSONFILE"; echo "---"; ) > "$TMP1"
#
$J2Y "$JSONFILE" "$TMP1"
_DEBUG "YAML:" "$(cat "$TMP1")"
@ -497,7 +488,7 @@ if [[ $DRYRUN -eq 0 ]]; then
#
# shellcheck disable=SC2086
pandoc -f ${FROM}${POPTIONS} -t html5 --ascii \
--standalone --template=hpr.html5 --no-highlight \
--standalone --template=hpr_dev.html5 --no-highlight \
-c https://hackerpublicradio.org/css/hpr.css \
--metadata-file="$TMP1" -o "$FULLHTML" "$TMP3"
RES=$?

View File

@ -124,6 +124,7 @@ fi
#
# $PARSER -novalid -ep "${show}" -in "$FROM" -show "$TOTPL" \
# -json "$JSONTPL" -format="$FMT"
#
$PARSER -ep "${show}" -in "$FROM" -show "$TOTPL" \
-format="$FMT" -release="$REL" -pictures="$PICTURES" -assets="$ASSETS" \
-zip="$ZIP"

View File

@ -60,9 +60,9 @@
# BUGS: ---
# NOTES: ---
# AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
# VERSION: 0.2.3
# VERSION: 0.2.4
# CREATED: 2020-05-25 13:20:18
# REVISION: 2024-02-22 14:32:03
# REVISION: 2024-07-25 21:39:16
#
#===============================================================================
@ -71,16 +71,16 @@ set -o nounset # Treat unset variables as an error
SCRIPT=${0##*/}
# DIR=${0%/*}
VERSION="0.2.3"
VERSION="0.2.4"
STDOUT="/dev/fd/2"
#
# Load library functions (make_file_list, range_parse, cleanup_temp)
#
LIB="$HOME/bin/function_lib.sh"
LIB="$HOME/HPR/function_lib.sh"
[ -e "$LIB" ] || { echo "$SCRIPT: Unable to source functions"; exit 1; }
# shellcheck source=/home/cendjm/bin/function_lib.sh
# shellcheck source=/home/cendjm/HPR/function_lib.sh
source "$LIB"
#
@ -88,7 +88,7 @@ source "$LIB"
#
define_colours
# {{{ -- _usage --
# {{{ -- _usage - _silent -- _dryrun --
#=== FUNCTION ================================================================
# NAME: _usage
# DESCRIPTION: Report usage
@ -150,9 +150,7 @@ Examples
endusage
exit
}
# }}}
# {{{ -- _silent -- _dryrun -- _DEBUG --
#=== FUNCTION ================================================================
# NAME: _silent
# DESCRIPTION: Output a message unless we're being silent
@ -179,19 +177,6 @@ _dryrun () {
prefix=
done
}
#=== FUNCTION ================================================================
# NAME: _DEBUG
# DESCRIPTION: Writes one or more message lines if in DEBUG mode
# PARAMETERS: List of messages
# RETURNS: Nothing
#===============================================================================
_DEBUG () {
[ "$DEBUG" == 0 ] && return
for msg in "$@"; do
printf 'D> %s\n' "$msg"
done
}
# }}}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -229,12 +214,25 @@ if [[ $# -ne 1 ]]; then
echo "${red}Missing shownumber argument${reset}"
_usage
fi
epno="${1}"
#
# Ensure item spec is correctly formatted. Have to cater for leading zeroes
# being interpreted as octal.
#
if [[ $epno =~ ^(hpr)?([0-9]+)$ ]]; then
epno="$((10#${BASH_REMATCH[-1]}))"
else
coloured 'red' "Incorrect show specification: $epno"
coloured 'yellow' "Use 'hpr9999' or '9999' formats"
exit 1
fi
#
# Paths to files
#
BASEDIR="$HOME/HPR/Show_Submission"
SHOWDIR="$BASEDIR/shownotes/hpr${1}"
SHOWDIR="$BASEDIR/shownotes/hpr${epno}"
# RAWFILE="$SHOWDIR/shownotes.txt"
JSONFILE="$SHOWDIR/shownotes.json"
PICDIR="$SHOWDIR/uploads"

View File

@ -15,7 +15,7 @@
# AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
# VERSION: 0.0.8
# CREATED: 2022-09-07 15:27:29
# REVISION: 2023-06-01 17:58:09
# REVISION: 2024-06-18 20:13:46
#
#===============================================================================
@ -32,9 +32,9 @@ STDOUT="/dev/fd/2"
#
# Load library functions
#
LIB="$HOME/bin/function_lib.sh"
LIB="$HOME/HPR/function_lib.sh"
[ -e "$LIB" ] || { echo "$SCRIPT: Unable to source functions"; exit 1; }
# shellcheck source=/home/cendjm/bin/function_lib.sh
# shellcheck source=/home/cendjm/HPR/function_lib.sh
source "$LIB"
#
@ -42,7 +42,7 @@ source "$LIB"
#
define_colours
#{{{ Functions: --- _usage --- _DEBUG --- _verbose --- _silent ---
#{{{ Functions: --- _usage --- _verbose --- _silent ---
#=== FUNCTION ================================================================
# NAME: _usage
# DESCRIPTION: Report usage
@ -77,22 +77,6 @@ endusage
exit
}
#=== FUNCTION ================================================================
# NAME: _DEBUG
# DESCRIPTION: Writes one or more messages if in DEBUG mode. Each argument is
# seen as a message and is written on a separate line.
# References the global variable 'DEBUG' which is expected to be
# True if debug output is wanted.
# PARAMETERS: List of messages
# RETURNS: Nothing
#===============================================================================
_DEBUG () {
[ "$DEBUG" == 0 ] && return
for msg in "$@"; do
printf 'D> %s\n' "$msg"
done
}
#=== FUNCTION ================================================================
# NAME: _verbose
# DESCRIPTION: Writes a message in verbose mode

View File

@ -15,7 +15,7 @@
# AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
# VERSION: 0.0.6
# CREATED: 2022-04-11 09:36:21
# REVISION: 2023-06-14 23:24:42
# REVISION: 2024-06-18 20:16:19
#
#===============================================================================
@ -32,9 +32,9 @@ STDOUT="/dev/fd/2"
#
# Load library functions
#
LIB="$HOME/bin/function_lib.sh"
LIB="$HOME/HPR/function_lib.sh"
[ -e "$LIB" ] || { echo "$SCRIPT: Unable to source functions"; exit 1; }
# shellcheck source=/home/cendjm/bin/function_lib.sh
# shellcheck source=/home/cendjm/HPR/function_lib.sh
source "$LIB"
#

View File

@ -25,8 +25,7 @@ use v5.16;
use strict;
use warnings;
use utf8;
use feature qw{ postderef say signatures state };
no warnings qw{ experimental::postderef experimental::signatures };
use feature qw{ say state };
use Carp;
use Getopt::Long;
@ -605,7 +604,7 @@ base URL described below.
=item B<-baseURL=URL>
This option will default to the foillowing URL if not provided:
This option will default to the following URL if not provided:
https://hackerpublicradio.org/eps/hpr${show}/

View File

@ -21,14 +21,17 @@
# BUGS: ---
# NOTES: ---
# AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
# VERSION: 0.0.14
# VERSION: 0.0.17
# CREATED: 2020-11-28 10:52:02
# REVISION: 2024-03-09 20:34:54
# REVISION: 2024-10-04 18:37:29
#
#===============================================================================
use 5.30.0;
use v5.36;
use utf8;
use feature qw{ postderef say signatures state try };
no warnings
qw{ experimental::postderef experimental::signatures experimental::try };
use Getopt::Long;
use Pod::Usage;
@ -57,7 +60,7 @@ use Data::Dumper;
#
# Version number (manually incremented)
#
our $VERSION = '0.0.14';
our $VERSION = '0.0.17';
#
# Script and directory names
@ -79,7 +82,12 @@ my $logfile = "$logdir/${PROG}.log";
my ( $snlevel, $showno, $summarylength, $notelength );
our $MARKUP_DETECTED = 0;
#
# Maximum and minimum number of characters (bytes)
#
my $MAXNOTELEN = 4000;
my $MINNOTELEN = 10;
#
# Printing: general output format
@ -223,13 +231,14 @@ my @markup_types = (
my @markup_found;
my $markup_choice;
my ( $showdir, $assetdir , $statusfile );
my ( $showdir, $assetdir, $statusfile );
my ( %media_files, $media_files );
my ( %assets, @assets, @audio, $sanitised );
my ( $has_audio, $has_extra, $has_archives );
my ( @archives, @extracted );
my ( $astate, $has_pictures, @pictures, $pictures );
my ( %spellchecks );
my ( $has_markup, @markup, $markup );
my ( $json_change, @json_changes, %spellchecks );
my @pstates = (
'No pictures found', # 0
'Pictures that need management', # 1
@ -347,8 +356,13 @@ open( my $fh, '<:encoding(UTF-8)', $infile );
my $json_text = <$fh>;
close($fh);
# TODO: bad JSON can crash the script here!
my $content = decode_json($json_text);
my $content;
try {
$content = decode_json($json_text);
}
catch ($e) {
die colored( "Failed to decode the JSON in $infile", 'red' ) . "\n"
}
$log->info( $showno, "[$VERSION] Processing $infile" );
@ -372,6 +386,19 @@ print STDERR '-' x 80, "\n";
printf STDERR $ofmt, "Show:", $content->{metadata}{Episode_Number};
printf STDERR $ofmt, "Date:", $content->{metadata}{Episode_Date};
#
# Trim off leading and trailing spaces in these fields
#
$json_change = 0;
for my $key ( 'Title', 'Summary', 'Tags' ) {
my $str = trim($content->{episode}{$key});
if ($str ne $content->{episode}{$key}) {
$content->{episode}{$key} = $str;
$json_change = 1;
push(@json_changes,$key);
}
}
#
# Detect Unicode in the Title, Summary or Tags and flag their presence.
#
@ -386,6 +413,9 @@ for my $key ( 'Title', 'Summary', 'Tags' ) {
);
}
alert( $ofmt, "JSON to be updated; changes to: " .
join(',',@json_changes) ) if $json_change;
#
# Check summary length. The field might be filled and something might have
# been lost.
@ -429,7 +459,12 @@ printf STDERR $ofmt, "Notes:", $snlevel . " HTML start/end tags found";
$notelength = length( $content->{episode}{Show_Notes} );
if ( $notelength > $MAXNOTELEN ) {
printf STDERR $ofmt, "Notes:",
colored( "Notes are longer than $MAXNOTELEN ($notelength)",
colored( "Notes are longer than $MAXNOTELEN bytes ($notelength)",
'bold yellow on_magenta' );
}
elsif ( $notelength <= $MINNOTELEN ) {
printf STDERR $ofmt, "Notes:",
colored( "Notes are shorter than $MINNOTELEN bytes ($notelength)",
'bold yellow on_magenta' );
}
@ -651,6 +686,17 @@ if (%media_files) {
_debug( $DEBUG > 2, '@assets: ' . Dumper( \@assets ) );
}
#-------------------------------------------------------------------------------
# Look for un-processed markup in the assets hash. For the moment we
# only look for Markdown.
#-------------------------------------------------------------------------------
$has_markup = @markup
= grep { $assets{$_}->{type} =~ m{^text/markdown$} } keys(%assets);
$markup = join( ', ', @markup );
if (@markup) {
_debug( $DEBUG > 2, '@markup ' . Dumper( \@markup ) );
}
#-------------------------------------------------------------------------------
# Look for archive files in the assets
#-------------------------------------------------------------------------------
@ -690,6 +736,11 @@ if (%media_files) {
@assets = array_difference(\@assets,\@archives);
push(@assets, @extracted);
#
# Remove markup files from the assets so we don't upload them
#
@assets = array_difference(\@assets,\@markup);
#
# Remove directory stuff from @assets elements and %assets keys
#
@ -745,6 +796,8 @@ if (%media_files) {
$log->info( $showno, "Media files: $media_files" ) if ($media_files);
$log->info( $showno, "Pictures: " . join( ', ', @pictures ) )
if (@pictures);
$log->info( $showno, "Markup " . join( ', ', @markup ) )
if (@markup);
$log->info( $showno, "Assets: " . join( ', ', @assets ) )
if (@assets);
@ -849,7 +902,6 @@ if ( $snlevel > 0 && $content->{metadata}{Shownotes_Format} =~ /html5/i ) {
"Apparently incorrect URLs detected in the notes", 'red'
), "\n";
}
}
#
@ -866,6 +918,15 @@ if ( $markup_choice eq 'html5'
"Declared format 'plain_text' but notes seem to be HTML5!" );
}
#
# 7. The host has sent in markup version(s) of their external notes, so we
# need to take special action.
#
if ($markup) {
printf STDERR "%s\n",
textFormat( $markup, 'Markup files:', 'L', 18, 80 );
}
#-------------------------------------------------------------------------------
# Determine the picture asset state
#-------------------------------------------------------------------------------
@ -1709,6 +1770,23 @@ sub find_Unicode {
return ( $string =~ /[^\x{00}-\x{7F}]/ );
}
#=== FUNCTION ================================================================
# NAME: trim
# PURPOSE: Trims leading and trailing spaces from a string
# PARAMETERS: string string to trim
# RETURNS: Trimmed string
# DESCRIPTION:
# THROWS: No exceptions
# COMMENTS: None
# SEE ALSO: N/A
#===============================================================================
sub trim {
my ($str) = @_;
$str =~ s/^\s+|\s+$//g;
return $str;
}
#=== FUNCTION ================================================================
# NAME: output_file_name
# PURPOSE: Generate an output file name with three choices
@ -1969,7 +2047,6 @@ sub alert {
my ( $fmt, $message ) = @_;
$fmt = "%-16s %s\n" unless $fmt;
# print STDERR "$bold$red", sprintf( $fmt, "** ALERT **:", $message ), "$reset";
print STDERR colored( sprintf( $fmt, "** ALERT **:", $message ),
'bold red' );
}
@ -2082,7 +2159,7 @@ parse_JSON - parse the JSON output file from the HPR show submission form
=head1 VERSION
This documentation refers to parse_JSON version 0.0.14
This documentation refers to parse_JSON version 0.0.17
=head1 USAGE