diff --git a/37567b_extract_images b/37567b_extract_images
new file mode 100644
index 0000000..f7353fd
--- /dev/null
+++ b/37567b_extract_images
@@ -0,0 +1,654 @@
+#!/usr/bin/env perl
+#===============================================================================
+#
+# FILE: extract_images
+#
+# USAGE: ./extract_images [--help] [--documentation|man]
+# [--prefix=STRING] [--[no-]backup] [--force] [--[no]silent]
+# HTML_file [ [HTML_file_2] [HTML_file_3] ... ]
+#
+# DESCRIPTION: Processes HTML files which may have 'data' URIs containing
+# images, and extracts these images into files in the same
+# directory. The 'data' scheme links are converted to 'https'
+# and reference the extracted files. The modified HTML is
+# output, and the original will be saved as a backup if
+# requested.
+#
+# OPTIONS: ---
+# REQUIREMENTS: ---
+# BUGS: ---
+# NOTES: ---
+# AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
+# VERSION: 0.0.1
+# CREATED: 2024-12-25 10:53:15
+# REVISION: 2024-12-29 15:19:35
+#
+#===============================================================================
+
+use v5.36;
+use strict;
+use warnings;
+use feature qw{ postderef say signatures state try };
+no warnings
+ qw{ experimental::postderef experimental::signatures experimental::try };
+
+use open ':std', ':encoding(UTF-8)'; # Make all IO UTF-8
+
+use Getopt::Long;
+use Pod::Usage;
+
+use HTML::TreeBuilder 5 -weak;
+use URI;
+use MIME::Types;
+
+#use File::Slurper;
+use Path::Tiny;
+use File::Copy;
+
+use Data::Dumper;
+
+#
+# Version number (Incremented by Vim)
+#
+our $VERSION = '0.0.1';
+
+#
+# Script and directory names
+#
+( my $PROG = $0 ) =~ s|.*/||mx;
+
+#-------------------------------------------------------------------------------
+# Declarations
+#-------------------------------------------------------------------------------
+my ( $notes, $typename, $tree, $uri );
+my ( $fcount, $basename, $filename, $suffix, $fh );
+my ( $updates, $bsuffix, $new_basename, $newURL );
+
+my $backupcount = 5;
+
+#-------------------------------------------------------------------------------
+# Options and arguments
+#-------------------------------------------------------------------------------
+# {{{
+#
+# Option defaults
+#
+my $DEFDEBUG = 0;
+my $DEFPREFIX = 'image';
+
+my %options;
+Options( \%options );
+
+#
+# Default help shows minimal information
+#
+pod2usage( -msg => "$PROG version $VERSION\n", -exitval => 1, -verbose => 0 )
+ if ( $options{'help'} );
+
+#
+# The -documentation or -man option shows the full POD documentation through
+# a pager for convenience
+#
+pod2usage( -msg => "$PROG version $VERSION\n", -exitval => 1, -verbose => 2 )
+ if ( $options{'documentation'} );
+
+#
+# Collect options
+#
+my $DEBUG = ( defined( $options{debug} ) ? $options{debug} : $DEFDEBUG );
+my $silent = ( defined( $options{silent} ) ? $options{silent} : 0 );
+my $prefix = ( defined( $options{prefix} ) ? $options{prefix} : $DEFPREFIX );
+my $backup = ( defined( $options{backup} ) ? $options{backup} : 1 );
+my $force = ( defined( $options{force} ) ? $options{force} : 0 );
+
+#
+# Check we have arguments
+#
+die "Usage: $PROG [options] file1 [file2 [file3 [fileN]]]\n"
+ unless ( scalar(@ARGV) > 0 );
+
+#
+# Clean up the prefix
+#
+$prefix = ($prefix =~ /(.*)_$/ ? $1 : $prefix);
+
+#
+# Backup suffix (the dot gets added later)
+#
+$bsuffix = 'bck';
+
+#
+# Debug the options
+#
+_debug(
+ $DEBUG > 1,
+ '$silent = ' . $silent,
+ '$prefix = ' . $prefix,
+ '$backup = ' . $backup,
+ '$force = ' . $force,
+);
+
+# }}}
+
+#-------------------------------------------------------------------------------
+# Prepare items for later use: current working directory and a MIME::Types
+# object
+#-------------------------------------------------------------------------------
+my $curdir = Path::Tiny->cwd;
+
+my $mt = MIME::Types->new;
+
+#-------------------------------------------------------------------------------
+# Loop through the arguments
+#-------------------------------------------------------------------------------
+foreach my $notesfile (@ARGV) {
+ unless (-e $notesfile) {
+ warn "Unable to find $notesfile\n";
+ next;
+ }
+
+ #
+ # Force the MIME type of $notesfile to a string
+ #
+ $typename = "" . $mt->mimeTypeOf("$notesfile");
+
+ #
+ # Check the MIME type and reject non-HTML
+ #
+ unless ($typename eq 'text/html') {
+ warn "File $notesfile is not HTML\n";
+ next
+ }
+
+ say "Reading from $notesfile\n" unless $silent;
+
+ #
+ # Get HTML file basename without the suffix for building filenames
+ #
+ $basename = path($notesfile)->basename('.html');
+
+ #
+ # Read the HTML
+ #
+ open (my $nfh, '<', $notesfile) or die "Unable to open $notesfile\n";
+ $notes = <$nfh>;
+ close($nfh);
+
+ #
+ # Image files are to have an index
+ #
+ $fcount = 0;
+
+ #
+ # Keep a note of HTML updates
+ #
+ $updates = 0;
+
+ #
+ # Initialise the TreeBuilder
+ #
+ $tree = HTML::TreeBuilder->new;
+ $tree->ignore_unknown(0);
+ $tree->no_expand_entities(1);
+ $tree->p_strict(1);
+ $tree->store_comments(1);
+ $tree->warn(1);
+
+ #
+ # Load this HTML file into the TreeBuilder
+ #
+ $tree->parse_content($notes)
+ or die "HTML::TreeBuilder failed to parse notes: $!\n";
+
+ #
+ # Loop through the tree looking for 'data' scheme images
+ #
+ for ( @{ $tree->extract_links( 'img' ) } ) {
+ my ( $link, $element, $attr, $tag ) = @$_;
+
+ $uri = URI->new( $link );
+ unless ($silent) {
+ say "Scheme: ",$uri->scheme;
+ say "Media type: ",$uri->media_type;
+ }
+
+ #
+ # We only care about 'data' scheme stuff - for now anyway, and only
+ # images within this set
+ #
+ if ( $uri->scheme eq 'data' ) {
+ #
+ # Only images
+ #
+ if ( $uri->media_type =~ /^image/ ) {
+ #
+ # Extract the file name suffix from the MIME string, and give it
+ # a leading '.'
+ #
+ ( $suffix = $uri->media_type ) =~ s{^.*/}{.};
+
+ #
+ # Construct the filename for this image
+ #
+ $fcount++;
+ $filename
+ = "$curdir/${prefix}_${basename}_${fcount}${suffix}";
+ say "Writing to: $filename" unless $silent;
+
+ say '-' x 40 unless $silent;
+
+ #
+ # Check if the file exists. Don't clobber it unless --force is active
+ #
+ if ( -e $filename ) {
+ unless ($force) {
+ warn "File $filename exists; not overwriting\n";
+ }
+ }
+ else {
+ #
+ # Write the data to the file in binary format. The URI module
+ # does the conversion so it's already binary.
+ #
+ $fh = path($filename)->openw_raw;
+ print $fh $uri->data;
+ close($fh);
+ }
+
+ #
+ # Update the HTML with a link to the file we created
+ #
+ $updates++;
+ $newURL = path($filename)->basename;
+ $element->attr( $attr, $newURL );
+ }
+ }
+ } # extract_links loop
+
+ #
+ # Output the changed HTML turning what became standalone back into
+ # a
fragment.
+ #
+ if ($updates > 0) {
+ my $body = $tree->look_down( _tag => 'body' );
+ ( my $result = $body->as_HTML( undef, ' ', {} ) )
+ =~ s{(^]*>|$)}{}gi;
+
+ #$notesfile = path($notesfile)->basename;
+ if ($backup) {
+ _backup( $notesfile, $bsuffix, $backupcount );
+ say "$notesfile backed up" unless $silent;
+ }
+ else {
+ say "$notesfile not backed up" unless $silent;
+ }
+
+ $fh = path($notesfile)->openw;
+ say $fh $result;
+ close($fh);
+
+ say "$updates images converted, $notesfile updated" unless $silent;
+ }
+ else {
+ say "No images found, no changes made to $notesfile" unless $silent;
+ }
+
+} # $notesfile loop
+
+exit;
+
+#=== FUNCTION ================================================================
+# NAME: _backup
+# PURPOSE: Given a file, make a backup of it by appending $suffix, and
+# handle previous backups
+# PARAMETERS: $filename path of file to backup
+# $suffix suffix to use, default 'bck'
+# $limit number of backups to keep
+# RETURNS: True or false depending on success
+# DESCRIPTION: Checks that the file exists and returns FALSE if it doesn't.
+# Rationalises the $limit to avoid it being 0 or less.
+# THROWS: No exceptions
+# COMMENTS: None
+# SEE ALSO: N/A
+#===============================================================================
+sub _backup {
+ my ( $filename, $suffix, $limit ) = @_;
+
+ my ( $backupname, $limitname );
+
+ #
+ # Check the target file exists
+ #
+ unless ( -e $filename ) {
+ warn "Unable to find $filename to backup\n";
+ return 0;
+ }
+
+ #
+ # Handle invalid $limit values
+ #
+ $limit = 1 unless ( $limit >= 1 );
+
+ #
+ # Defaults
+ #
+ $suffix = 'bck' unless $suffix;
+ $limitname = "$filename.$suffix.$limit";
+ $backupname = "$filename.$suffix";
+
+ #
+ # Look for existing backups
+ #
+ if ( -e $backupname ) {
+
+ #
+ # If maximum version exists delete it
+ #
+ if ( -e $limitname ) {
+ unlink($limitname);
+ }
+
+ #
+ # Go backwards through the versions incrementing their version numbers
+ #
+ for ( my $vsn = $limit - 1; $vsn > 0; $vsn-- ) {
+ if ( -e "$filename.$suffix.$vsn" ) {
+ move( "$filename.$suffix.$vsn",
+ sprintf( '%s.%s.%s', $filename, $suffix, $vsn + 1 ) );
+ }
+ }
+
+ #
+ # Make $filename.bck into $filename.bck.1
+ #
+ move( "$filename.$suffix", "$filename.$suffix.1" );
+
+ }
+
+ #
+ # Finally save the $filename as $filename.bck
+ #
+ move( $filename, "$filename.$suffix" );
+
+ return 1;
+}
+
+#=== FUNCTION ================================================================
+# NAME: _debug
+# PURPOSE: Prints debug reports
+# PARAMETERS: $active Boolean: 1 for print, 0 for no print
+# $messages... Arbitrary list of messages to print
+# RETURNS: Nothing
+# DESCRIPTION: Outputs messages if $active is true. It removes any trailing
+# newline from each one and then adds one in the 'print' to the
+# caller doesn't have to bother. Prepends each message with 'D>'
+# to show it's a debug message.
+# THROWS: No exceptions
+# COMMENTS: Differs from other functions of the same name
+# SEE ALSO: N/A
+#===============================================================================
+sub _debug {
+ my $active = shift;
+
+ my $message;
+ return unless $active;
+
+ while ($message = shift) {
+ chomp($message);
+ print STDERR "D> $message\n";
+ }
+}
+
+#=== FUNCTION ================================================================
+# NAME: Options
+# PURPOSE: Processes command-line options
+# PARAMETERS: $optref Hash reference to hold the options
+# RETURNS: Undef
+# DESCRIPTION: Process the options we want to offer. See the documentation
+# for details
+# THROWS: no exceptions
+# COMMENTS: none
+# SEE ALSO: n/a
+#===============================================================================
+sub Options {
+ my ($optref) = @_;
+
+ my @options = (
+ "help", "documentation|man", "debug=i", "silent!",
+ "prefix=s", "backup!", "force!",
+ # "config=s",
+ );
+
+ if ( !GetOptions( $optref, @options ) ) {
+ pod2usage(
+ -msg => "$PROG version $VERSION\n",
+ -exitval => 1,
+ -verbose => 0
+ );
+ }
+
+ return;
+}
+
+__END__
+
+#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+# Application Documentation
+#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+#{{{
+
+=head1 NAME
+
+extract_images - extract embedded images from HTML and save as files
+
+=head1 VERSION
+
+This documentation refers to extract_images version 0.0.1
+
+=head1 USAGE
+
+ extract_images
+ [--help] [--documentation|man] [-debug=N]
+ [--prefix=STRING] [--[no]backup] [--[no]force] [--[no]silent]
+ HTML_file [ [HTML_file_2] [ [HTML_file_3] ... ] ]
+
+ Examples:
+
+ extract_images --prefix=picture_ --backup index.html
+
+ extract_images --silent --nobackup shownotes.html
+
+=head1 REQUIRED ARGUMENTS
+
+The script requires the names of one or more HTML files which will be scanned
+for embedded images.
+
+=head1 OPTIONS
+
+Note that all on/off options can be written as B<--silent>, B<--nosilent> or
+B<--no-silent>. A single hyphen can be used at the start or a pair.
+
+=over 8
+
+=item B<--help>
+
+Reports brief information about how to use the script and exits. To see the
+full documentation use the option B<--documentation> or B<--man>. Alternatively,
+to generate a PDF version use the I tool from
+I. This can be
+installed with the cpan tool as App::pod2pdf.
+
+=item B<--documentation> or B<--man>
+
+Reports full information about how to use the script and exits. Alternatively,
+to generate a PDF version use the I tool from
+I. This can be
+installed with the cpan tool as App::pod2pdf.
+
+=item B<--debug=N>
+
+Run in debug mode at the level specified by I. Possible values are:
+
+=over 4
+
+=item B<0>
+
+No debugging (the default).
+
+=item B<1>
+
+TBA
+
+=item B<2>
+
+TBA
+
+=item B<3>
+
+TBA
+
+=back
+
+=item B<--prefix=STRING>
+
+Since embedded images have no names, when they are written to image files
+names are generated for them. These names are built from the following
+components:
+
+=over 4
+
+=item B
+
+The name of the HTML file without a suffix. So, if the name is 'index.html',
+the 'index' part will be used.
+
+=item B
+
+The prefix string provided by this option, or 'image' if not specified.
+
+=item B
+
+The images found in the HTML are counted, starting from 1, and this number is
+used here.
+
+=item B
+
+The image format extension, taken from the embedded image information.
+Examples would be 'jpg', 'jpeg' and 'png'.
+
+=back
+
+The B, B, B and B are joined
+together to make the file name as follows:
+
+ __.
+
+So the following run of the script would generate the first file shown below
+assuming the first embedded picture was in 'PNG' format:
+
+ extract_images --prefix=picture hpr4283.html
+
+ hpr4283_picture_1.png
+
+=item B<--[no]backup>
+
+The HTML is modified to leave placeholders referring to any embedded images
+found as it it processed. The new HTML is written to the original file if
+B<--nobackup> is specified, or a backup of the original file is made, before
+writing the new HTML. Making a backup is the default behaviour.
+
+=item B<--[no]force>
+
+Images are written to the current directory. If an image already exists, and
+B<--force> has not been specified, the script will stop processing and exit.
+The default setting of this option is B<--noforce>.
+
+=item B<--[no]silent>
+
+By default the script reports its progress as it processes an HTML file, but
+this can be turned off by using this option.
+
+=back
+
+=head1 DESCRIPTION
+
+This Perl script B parses HTML looking for embedded images.
+Such images use a URI with the scheme 'data' followed by image details
+including the encoded binary contents. See the Wikipedia article
+https://en.wikipedia.org/wiki/Data_URI_scheme for details.
+
+When such images are found they are written as files (with generated names),
+and the HTML is updated with these names replacing the original URI. Further
+work is likely to be required to build full image links, but the majority of
+work will have been done.
+
+The script will not overwrite image files unless the B<--force> option is
+used, but will overwrite the original HTML file unless B<--backup> is
+specified.
+
+By default details of progress are written to standard output, but this can be
+preveneted by using the B<--silent> option.
+
+=head2 GENERATED IMAGE FILE NAMES
+
+These names are built from various elements:
+
+ __.
+
+Where is the base name of the HTML input file, is the
+string provided with the B<--prefix=STRING> option (or B by default),
+ is a count of image files found during the scan of the HTML, and
+ is the appropriate file extension for the type of image being
+converted.
+
+See the option B<--prefix=STRING> for details of file name generation.
+
+=head1 DIAGNOSTICS
+
+TBA
+
+=head1 CONFIGURATION AND ENVIRONMENT
+
+TBA
+
+=head1 DEPENDENCIES
+
+ Data::Dumper
+ File::Copy
+ Getopt::Long
+ HTML::TreeBuilder
+ MIME::Types
+ Path::Tiny
+ Pod::Usage
+ URI
+
+=head1 BUGS AND LIMITATIONS
+
+There are no known bugs in this module.
+Please report problems to Dave Morriss (Dave.Morriss@gmail.com)
+Patches are welcome.
+
+=head1 AUTHOR
+
+Dave Morriss (Dave.Morriss@gmail.com)
+
+=head1 LICENCE AND COPYRIGHT
+
+Copyright (c) 2024 Dave Morriss (Dave.Morriss@gmail.com).
+All rights reserved.
+
+This module is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself. See perldoc perlartistic.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+=cut
+
+#}}}
+
+# [zo to open fold, zc to close]
+
+# vim: syntax=perl:ts=8:sw=4:et:ai:tw=78:fo=tcrqn21:fdm=marker
+
diff --git a/Show_Submission/extract_images b/Show_Submission/extract_images
index f7353fd..757e217 100755
--- a/Show_Submission/extract_images
+++ b/Show_Submission/extract_images
@@ -19,18 +19,17 @@
# BUGS: ---
# NOTES: ---
# AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
-# VERSION: 0.0.1
+# VERSION: 0.0.2
# CREATED: 2024-12-25 10:53:15
-# REVISION: 2024-12-29 15:19:35
+# REVISION: 2024-12-30 09:28:40
#
#===============================================================================
use v5.36;
use strict;
use warnings;
-use feature qw{ postderef say signatures state try };
-no warnings
- qw{ experimental::postderef experimental::signatures experimental::try };
+use feature qw{ say state try };
+no warnings qw{ experimental::try };
use open ':std', ':encoding(UTF-8)'; # Make all IO UTF-8
@@ -41,7 +40,6 @@ use HTML::TreeBuilder 5 -weak;
use URI;
use MIME::Types;
-#use File::Slurper;
use Path::Tiny;
use File::Copy;
@@ -50,7 +48,7 @@ use Data::Dumper;
#
# Version number (Incremented by Vim)
#
-our $VERSION = '0.0.1';
+our $VERSION = '0.0.2';
#
# Script and directory names
@@ -60,9 +58,9 @@ our $VERSION = '0.0.1';
#-------------------------------------------------------------------------------
# Declarations
#-------------------------------------------------------------------------------
-my ( $notes, $typename, $tree, $uri );
-my ( $fcount, $basename, $filename, $suffix, $fh );
-my ( $updates, $bsuffix, $new_basename, $newURL );
+my ( $notes, $typename, $uri );
+my ( $fcount, $basename, $filename, $suffix, $fh );
+my ( $updates, $bsuffix, $newURL );
my $backupcount = 5;
@@ -104,8 +102,12 @@ my $force = ( defined( $options{force} ) ? $options{force} : 0 );
#
# Check we have arguments
#
-die "Usage: $PROG [options] file1 [file2 [file3 [fileN]]]\n"
- unless ( scalar(@ARGV) > 0 );
+pod2usage(
+ -msg => "Missing arguments. One or more HTML file names are needed\n",
+ -exitval => 1,
+ -verbose => 0
+ )
+unless ( scalar(@ARGV) > 0 );
#
# Clean up the prefix
@@ -115,7 +117,7 @@ $prefix = ($prefix =~ /(.*)_$/ ? $1 : $prefix);
#
# Backup suffix (the dot gets added later)
#
-$bsuffix = 'bck';
+$bsuffix = 'bak';
#
# Debug the options
@@ -131,18 +133,26 @@ _debug(
# }}}
#-------------------------------------------------------------------------------
-# Prepare items for later use: current working directory and a MIME::Types
-# object
+# Prepare a MIME::Types object
#-------------------------------------------------------------------------------
-my $curdir = Path::Tiny->cwd;
-
my $mt = MIME::Types->new;
#-------------------------------------------------------------------------------
# Loop through the arguments
#-------------------------------------------------------------------------------
foreach my $notesfile (@ARGV) {
- unless (-e $notesfile) {
+
+ #
+ # Get the absolute path of the argument
+ #
+ my $abs_nf = path($notesfile)->absolute;
+
+ #
+ # Get the 'dirname' from the absolute path
+ #
+ my $dirname = path($abs_nf)->parent->stringify;
+
+ unless (-e $abs_nf) {
warn "Unable to find $notesfile\n";
next;
}
@@ -150,22 +160,22 @@ foreach my $notesfile (@ARGV) {
#
# Force the MIME type of $notesfile to a string
#
- $typename = "" . $mt->mimeTypeOf("$notesfile");
+ $typename = "" . coalesce( $mt->mimeTypeOf("$abs_nf"), '' );
#
# Check the MIME type and reject non-HTML
#
unless ($typename eq 'text/html') {
- warn "File $notesfile is not HTML\n";
+ warn "File $abs_nf is not HTML\n";
next
}
- say "Reading from $notesfile\n" unless $silent;
+ say "Reading from $abs_nf\n" unless $silent;
#
- # Get HTML file basename without the suffix for building filenames
+ # Get HTML file basename (no path) without the suffix for building filenames
#
- $basename = path($notesfile)->basename('.html');
+ $basename = path($abs_nf)->basename('.html');
#
# Read the HTML
@@ -175,7 +185,7 @@ foreach my $notesfile (@ARGV) {
close($nfh);
#
- # Image files are to have an index
+ # Image files are to have an index/sequence number
#
$fcount = 0;
@@ -187,7 +197,7 @@ foreach my $notesfile (@ARGV) {
#
# Initialise the TreeBuilder
#
- $tree = HTML::TreeBuilder->new;
+ my $tree = HTML::TreeBuilder->new;
$tree->ignore_unknown(0);
$tree->no_expand_entities(1);
$tree->p_strict(1);
@@ -195,7 +205,7 @@ foreach my $notesfile (@ARGV) {
$tree->warn(1);
#
- # Load this HTML file into the TreeBuilder
+ # Load the HTML obtained from the file into the TreeBuilder
#
$tree->parse_content($notes)
or die "HTML::TreeBuilder failed to parse notes: $!\n";
@@ -203,13 +213,13 @@ foreach my $notesfile (@ARGV) {
#
# Loop through the tree looking for 'data' scheme images
#
- for ( @{ $tree->extract_links( 'img' ) } ) {
+ for ( @{ $tree->extract_links('img') } ) {
my ( $link, $element, $attr, $tag ) = @$_;
- $uri = URI->new( $link );
+ $uri = URI->new($link);
unless ($silent) {
- say "Scheme: ",$uri->scheme;
- say "Media type: ",$uri->media_type;
+ say "Scheme: ", $uri->scheme;
+ say "Media type: ", $uri->media_type;
}
#
@@ -221,34 +231,34 @@ foreach my $notesfile (@ARGV) {
# Only images
#
if ( $uri->media_type =~ /^image/ ) {
- #
- # Extract the file name suffix from the MIME string, and give it
- # a leading '.'
- #
+ #
+ # Extract the file name suffix from the MIME string, and give it
+ # a leading '.'
+ #
( $suffix = $uri->media_type ) =~ s{^.*/}{.};
#
- # Construct the filename for this image
+ # Construct the filename for this image making sure it's in
+ # the directory the HTML is in.
#
$fcount++;
$filename
- = "$curdir/${prefix}_${basename}_${fcount}${suffix}";
+ = "$dirname/${prefix}_${basename}_${fcount}${suffix}";
say "Writing to: $filename" unless $silent;
say '-' x 40 unless $silent;
#
- # Check if the file exists. Don't clobber it unless --force is active
+ # If the file exists and --force is not active, warn and skip.
+ # Otherwise write the file.
#
- if ( -e $filename ) {
- unless ($force) {
- warn "File $filename exists; not overwriting\n";
- }
+ if ( -e $filename && !$force ) {
+ warn "File $filename exists; not overwriting\n";
}
else {
#
- # Write the data to the file in binary format. The URI module
- # does the conversion so it's already binary.
+ # Write the data to the file in binary format. The URI
+ # module does the conversion so it's already binary.
#
$fh = path($filename)->openw_raw;
print $fh $uri->data;
@@ -256,14 +266,16 @@ foreach my $notesfile (@ARGV) {
}
#
- # Update the HTML with a link to the file we created
+ # Update the HTML with a link to the file we created (or that
+ # was already there from an earlier time).
#
$updates++;
- $newURL = path($filename)->basename;
+ $newURL = path($filename)->basename;
$element->attr( $attr, $newURL );
}
}
- } # extract_links loop
+
+ } # extract_links loop
#
# Output the changed HTML turning what became standalone back into
@@ -276,7 +288,7 @@ foreach my $notesfile (@ARGV) {
#$notesfile = path($notesfile)->basename;
if ($backup) {
- _backup( $notesfile, $bsuffix, $backupcount );
+ _backup( $abs_nf, $bsuffix, $backupcount );
say "$notesfile backed up" unless $silent;
}
else {
@@ -373,6 +385,24 @@ sub _backup {
return 1;
}
+#=== FUNCTION ================================================================
+# NAME: coalesce
+# PURPOSE: To find the first defined argument and return it
+# PARAMETERS: Arbitrary number of arguments
+# RETURNS: The first defined argument or undef if there are none
+# DESCRIPTION: Just a simple way of ensuring an 'undef' value is never
+# returned when doing so might be a problem.
+# THROWS: No exceptions
+# COMMENTS: None
+# SEE ALSO: N/A
+#===============================================================================
+sub coalesce {
+ foreach (@_) {
+ return $_ if defined($_);
+ }
+ return undef; ## no critic
+}
+
#=== FUNCTION ================================================================
# NAME: _debug
# PURPOSE: Prints debug reports
@@ -443,7 +473,7 @@ extract_images - extract embedded images from HTML and save as files
=head1 VERSION
-This documentation refers to extract_images version 0.0.1
+This documentation refers to extract_images version 0.0.2
=head1 USAGE