forked from HPR/hpr-tools
		
	Added two new scripts
Show_Submission/author_title.pl: Added the subtitle field taken from the
    JSON into the YAML
Show_Submission/do_pandoc_assets: New script to process Markdown assets
    files. Not in use.
			
			
This commit is contained in:
		
							
								
								
									
										114
									
								
								Show_Submission/author_title.pl
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										114
									
								
								Show_Submission/author_title.pl
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,114 @@ | ||||
| #!/usr/bin/env perl | ||||
| #=============================================================================== | ||||
| # | ||||
| #         FILE: author_title.pl | ||||
| # | ||||
| #        USAGE: ./author_title.pl JSON_file YAML_file | ||||
| # | ||||
| #  DESCRIPTION: Reads the JSON file generated as a new HPR show is uploaded | ||||
| #               via the submission form. Converts certain elements to a YAML | ||||
| #               structure which is written to a file for use by Pandoc when it | ||||
| #               generates a version of the notes used for local proof-reading. | ||||
| # | ||||
| #               This function has been performed by 'jq' in the past, but with | ||||
| #               mixed success. Also 'yq' has been used experimentally with | ||||
| #               little success because of the wide variety of the input JSON | ||||
| #               data. This script has been written to try and achieve parsing, | ||||
| #               data extraction and YAML generation in a more controllable | ||||
| #               way. | ||||
| # | ||||
| #      OPTIONS: --- | ||||
| # REQUIREMENTS: --- | ||||
| #         BUGS: --- | ||||
| #        NOTES: 2024-10-18 Modified the YAML to include the field Pandoc is | ||||
| #               looking for: 'subtitle', This adds another header to the full | ||||
| #               notes, which allows another check to be carried out. Also | ||||
| #               using Pandoc template 'hpr_dev.html' which omits the '<base>' | ||||
| #               tag. | ||||
| #       AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com | ||||
| #      VERSION: 0.0.3 | ||||
| #      CREATED: 2023-10-13 22:37:36 | ||||
| #     REVISION: 2024-10-18 16:17:14 | ||||
| # | ||||
| #=============================================================================== | ||||
|  | ||||
| use v5.16; | ||||
| use strict; | ||||
| use warnings; | ||||
| use feature qw{ postderef say signatures state try }; | ||||
| no warnings | ||||
|     qw{ experimental::postderef experimental::signatures experimental::try }; | ||||
|  | ||||
| use JSON; | ||||
| use YAML::Tiny; | ||||
| use Data::Dumper; | ||||
|  | ||||
| # | ||||
| # Version number (Incremented by Vim) | ||||
| # | ||||
| our $VERSION = '0.0.3'; | ||||
|  | ||||
| # | ||||
| # Script and directory names | ||||
| # | ||||
| ( my $PROG = $0 ) =~ s|.*/||mx; | ||||
| ( my $DIR  = $0 ) =~ s|/?[^/]*$||mx; | ||||
| $DIR = '.' unless $DIR; | ||||
|  | ||||
| #------------------------------------------------------------------------------- | ||||
| # Declarations | ||||
| #------------------------------------------------------------------------------- | ||||
| # | ||||
| # Constants and other declarations | ||||
| # | ||||
| my $basedir = "$ENV{HOME}/HPR/Show_Submission"; | ||||
|  | ||||
| # | ||||
| # Enable Unicode mode | ||||
| # | ||||
| binmode STDOUT, ":encoding(UTF-8)"; | ||||
| binmode STDERR, ":encoding(UTF-8)"; | ||||
|  | ||||
| # | ||||
| # Check arguments | ||||
| # | ||||
| die "Usage: $PROG JSON_file YAML_file\n" if ( scalar(@ARGV) != 2 ); | ||||
| my $json_file = shift; | ||||
| my $yaml_file = shift; | ||||
|  | ||||
| die "Unable to find $json_file\n" unless ( -e $json_file ); | ||||
|  | ||||
| # | ||||
| # Read and parse the JSON | ||||
| # | ||||
| my $json = JSON->new->utf8; | ||||
|  | ||||
| open( my $jfile, "<:encoding(UTF-8)", $json_file ) | ||||
|     or die "Unable to open $json_file\n"; | ||||
| my $json_text = <$jfile>; | ||||
| close($jfile); | ||||
|  | ||||
| my $content = decode_json($json_text); | ||||
|  | ||||
| # | ||||
| # Construct the YAML (is 'subtitle' better?) | ||||
| # | ||||
| my $yaml = YAML::Tiny->new( | ||||
|     {   author   => $content->{host}->{Host_Name}, | ||||
|         title    => $content->{episode}->{Title}, | ||||
|         subtitle => $content->{episode}->{Summary}, | ||||
|         summary  => $content->{episode}->{Summary}, | ||||
|     } | ||||
| ); | ||||
| #say Dumper(\$yaml); | ||||
|  | ||||
| # | ||||
| # Output the YAML | ||||
| # | ||||
| unless ( $yaml->write($yaml_file) ) { | ||||
|     warn "Problem writing the YAML to $yaml_file\n"; | ||||
| } | ||||
|  | ||||
| exit; | ||||
|  | ||||
| # vim: syntax=perl:ts=8:sw=4:et:ai:tw=78:fo=tcrqn21:fdm=marker | ||||
							
								
								
									
										189
									
								
								Show_Submission/do_pandoc_assets
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										189
									
								
								Show_Submission/do_pandoc_assets
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,189 @@ | ||||
| #!/bin/bash - | ||||
| #=============================================================================== | ||||
| # | ||||
| #         FILE: do_pandoc_assets | ||||
| # | ||||
| #        USAGE: ./do_pandoc_assets shownumber | ||||
| # | ||||
| #  DESCRIPTION: Runs Pandoc on any assets that need it. The assets are in the | ||||
| #               directory ~/HPR/Show_Submission/shownotes/hpr1234/ and the | ||||
| #               result is written to the 'uploads' directory to go to the HPR | ||||
| #               server. | ||||
| # | ||||
| #      OPTIONS: --- | ||||
| # REQUIREMENTS: --- | ||||
| #         BUGS: --- | ||||
| #        NOTES: --- | ||||
| #       AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com | ||||
| #      VERSION: 0.0.1 | ||||
| #      CREATED: 2024-08-14 18:54:21 | ||||
| #     REVISION: 2024-08-14 23:15:48 | ||||
| # | ||||
| #=============================================================================== | ||||
|  | ||||
| set -o nounset                              # Treat unset variables as an error | ||||
|  | ||||
| SCRIPT=${0##*/} | ||||
| # DIR=${0%/*} | ||||
|  | ||||
| VERSION='0.0.1' | ||||
|  | ||||
| STDOUT="/dev/fd/2" | ||||
|  | ||||
| # | ||||
| # Load library functions | ||||
| # | ||||
| LIB="$HOME/HPR/function_lib.sh" | ||||
| [ -e "$LIB" ] || { echo "$SCRIPT: Unable to source functions"; exit 1; } | ||||
| # shellcheck source=/home/cendjm/HPR/function_lib.sh | ||||
| source "$LIB" | ||||
|  | ||||
| # | ||||
| # Colour codes | ||||
| # | ||||
| define_colours | ||||
|  | ||||
| # {{{ Functions: -- _usage -- | ||||
| #===  FUNCTION  ================================================================ | ||||
| #         NAME: _usage | ||||
| #  DESCRIPTION: Report usage | ||||
| #   PARAMETERS: None | ||||
| #      RETURNS: Nothing | ||||
| #=============================================================================== | ||||
| _usage () { | ||||
|     cat >$STDOUT <<-endusage | ||||
| Usage: ./${SCRIPT} [-h] [-d] shownumber | ||||
|  | ||||
| Version: $VERSION | ||||
|  | ||||
| Runs Pandoc against assets for a particular show, catering for the case when | ||||
| a host sends in external notes (referenced from the main notes) in Markdown | ||||
| format rather than HTML. | ||||
|  | ||||
| For the moment the only format catered for is Markdown, in files with the | ||||
| suffix 'md' or 'mkd' | ||||
|  | ||||
| Options: | ||||
|   -h                    Print this help | ||||
|   -d                    Select dry run mode | ||||
|  | ||||
| Arguments: | ||||
|     shownumber | ||||
|  | ||||
| Examples | ||||
|   ./${SCRIPT} -h | ||||
|   ./${SCRIPT} -d 2240 | ||||
|  | ||||
| endusage | ||||
|     exit | ||||
| } | ||||
| # }}} | ||||
|  | ||||
| #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||
|  | ||||
| # | ||||
| # Sanity checks | ||||
| # | ||||
| JQ=$(command -v jq) | ||||
| [ -n "$JQ" ] || { echo "Program 'jq' was not found"; exit 1; } | ||||
|  | ||||
| # | ||||
| # Process options first | ||||
| # | ||||
| while getopts :dDh opt | ||||
| do | ||||
|     case "${opt}" in | ||||
|         d) DRYRUN=1;; | ||||
|         h) _usage;; | ||||
|         ?) echo "$SCRIPT: Invalid option; aborting"; exit 1;; | ||||
|     esac | ||||
| done | ||||
| shift $((OPTIND - 1)) | ||||
|  | ||||
| # | ||||
| # Default options if not provided | ||||
| # | ||||
| DRYRUN=${DRYRUN:-0} | ||||
|  | ||||
| # | ||||
| # Check there's an argument after removing any options. Abort if not | ||||
| # | ||||
| if [[ $# -ne 1 ]]; then | ||||
|     _usage | ||||
| fi | ||||
|  | ||||
| # | ||||
| # Make the explicit show id, catering for leading zeroes (belt & braces) | ||||
| # | ||||
| # TODO: cater for 'hpr1234' as well as a plain number | ||||
| printf -v SHOWID 'hpr%04d' "$1" | ||||
|  | ||||
| # | ||||
| # Paths to files | ||||
| # | ||||
| # ------------------------------------------------------------------------------ | ||||
| # Main directory | ||||
| BASENAME="$HOME/HPR/Show_Submission" | ||||
|  | ||||
| # JSON to YAML Perl script | ||||
| # J2Y="$BASENAME/author_title.pl" | ||||
| # [ -e "$J2Y" ] || { echo "Program '$J2Y' was not found"; exit 1; } | ||||
|  | ||||
| # The notes for all shows are here | ||||
| SHOWNOTES="$BASENAME/shownotes" | ||||
|  | ||||
| # Notes for this show are here | ||||
| SHOWDIR="$SHOWNOTES/$SHOWID" | ||||
|  | ||||
| # Assets which need Pandoc are here | ||||
| ASSETDIR="$SHOWDIR/uploads" | ||||
|  | ||||
| # The incoming JSON from the upload form | ||||
| JSONFILE="$SHOWDIR/shownotes.json" | ||||
|  | ||||
| # | ||||
| # Check there are Markdown files in the asset directory and collect their | ||||
| # names | ||||
| # | ||||
| declare -a MARKDOWN | ||||
| mapfile -t MARKDOWN < <(find "$ASSETDIR" -type f -regextype posix-extended -regex '.*\.mk?d') | ||||
|  | ||||
| # | ||||
| # Nothing found? | ||||
| # | ||||
| if [[ ${#MARKDOWN[@]} -eq 0 ]]; then | ||||
|     coloured 'red' "No Markdown files found" | ||||
|     exit 1 | ||||
| fi | ||||
|  | ||||
| # coloured 'cyan' "Markdown files found:" | ||||
| # printf '%s\n' "${MARKDOWN[@]}" | ||||
|  | ||||
| # | ||||
| # Process whatever markup we have, only catering for Markdown at present | ||||
| # | ||||
| for file in "${MARKDOWN[@]}"; do | ||||
|     coloured 'yellow' "Processing: $file" | ||||
|     OUTFILE="${file%.*}.html" | ||||
|  | ||||
|     if [[ $DRYRUN -eq 0 ]]; then | ||||
|         # | ||||
|         # Build nice HTML, disabling the smart quotes and stuff, but using | ||||
|         # a local format definition and the HPR CSS. For now we just add | ||||
|         # a title from the JSON. We could give Pandoc a block of YAML with | ||||
|         # more attributes if we wished. | ||||
|         # | ||||
|         pandoc -f markdown-smart -t html5  --standalone \ | ||||
|             --template=hpr.html5 -c https://hackerpublicradio.org/css/hpr.css \ | ||||
|             --metadata title="$(jq -r '.episode.Title' "$JSONFILE")" --strip-comments \ | ||||
|             -o "$OUTFILE" "${file}" | ||||
|         coloured 'green' "Wrote: $OUTFILE" | ||||
|     else | ||||
|         coloured 'yellow' "Dry run mode: Would have written $OUTFILE" | ||||
|     fi | ||||
| done | ||||
|  | ||||
| exit | ||||
|  | ||||
| # vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21:fdm=marker | ||||
|  | ||||
		Reference in New Issue
	
	Block a user