Tuesday, April 22, 2008

Playing with perl

Ok, so I got bored and wound up with a new toy :-P

Hmm, now to hunt down some snacks...





     1: #!/usr/bin/perl
     2: 
     3: use strict;
     4: use warnings;
     5: 
     6: use Getopt::Long;
     7: use Image::Size;
     8: use Pod::Usage;
     9: 
    10: =pod
    11: =head1 NAME
    12: 
    13: image-size.pl
    14: 
    15: =head1 SYNOPSIS
    16: 
    17: image-size.pl [options] [file ...]
    18: 
    19:   Options:
    20:     -f, --ask-file  include output from file(1) 
    21:     -h, --help      print usage help info
    22:     --man           read manual page
    23:     -s, --silent    ignore errors
    24:     -v, --verbose   more verbose output
    25:     -d, --die       blow up on first error
    26: 
    27: =head1 DESCRIPTION
    28: 
    29: A quick perl script to do what I've always wanted, tell me the height and width
    30: of an image file. Without having to open a graphical program (X11) just for the
    31: sake of finding out! File formats supported are based on the Image::Size module
    32: which is required for this script to function.
    33: 
    34: Special thanks to the creators of the llama book for mentioning perls
    35: Image::Size module and thanks to the creators of that module!
    36: 
    37: =head1 OPTIONS
    38: 
    39: =over 8
    40: 
    41: =item B<-f, --ask-file>
    42: 
    43: Politely ask the systems file utility about the files format. This option
    44: requires the file program installed and accessible through your environments
    45: PATH.
    46: 
    47: =item B<-h, --help>
    48: 
    49: Print out a summery of command line options and exit.
    50: 
    51: =item B<--man>
    52: 
    53: Displays this manual page using the provided Plain Old Documentation.
    54: 
    55: =item B<-s, --silent>
    56: 
    57: Ignore failed files and continue, combine with -v or --verbose to include the
    58: file name but still skip printing error messages.
    59: 
    60: =item B<-v, --verbose>
    61: 
    62: Print the file name along with it's width, height, and type (if known). Each
    63: field is also separated by a new line and ordered in a more elaborate format.
    64: 
    65: =item B<-d, --die>
    66: 
    67: Default behavior for  image-size.pl is to print a simple warning message if any
    68: specified file can not be operated on. 
    69: 
    70: When the the -d or --die switches are given, the program will halt execution
    71: with an appropriate exit status instead of continuing. 
    72: 
    73: This is useful for when you do not wish to continue after an error when
    74: processing a list of files
    75: 
    76: Refer to the perl documentation for details about how the exit status is
    77: affected.
    78: 
    79: =back
    80: 
    81: =head1 EXIT STATUS
    82: 
    83: The image-size.pl utility exits 0 on success or returns via perls die() if -d or
    84: --die was passed on the command line.
    85: 
    86: =head1 SEE ALSO
    87: 
    88: L<perl(1)>, L<perldoc(1)>, L<file(1)>
    89: 
    90: =head1 LICENSE
    91: 
    92: Copyright (c) 2008, TerryP <snip>
    93: 
    94: Permission to use, copy, modify, and distribute this software for any purpose
    95: with or without fee is hereby granted, provided that the above copyright notice
    96: and this permission notice appear in all copies.
    97: 
    98: THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
    99: REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
   100: FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
   101: INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
   102: OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
   103: TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
   104: THIS SOFTWARE.
   105: 
   106: =cut
   107: 
   108: 
   109: # message for pod2usage()
   110: my $usage_msg = "$0 -- figure out the height and width of image files\n";
   111: 
   112: # message to display on error getting the image size
   113: my $warn_msg = "File does not exist or cannot be opened: ";
   114: 
   115: my ($deadly, $help, $verbose, $man, $silent, $ask) = undef;
   116: 
   117: {
   118:     Getopt::Long::Configure('bundling');
   119:     GetOptions(
   120:                 'f|ask-file'    =>       \$ask,
   121:                 'h|help|?'      =>       \$help,
   122:                 'man'           =>       \$man,
   123:                 's|silent'      =>       \$silent,
   124:                 'v|verbose'     =>       \$verbose,
   125:                 'd|die'         =>       \$deadly,
   126:               ) or $help++;
   127: 
   128:     pod2usage(-msg => $usage_msg, -output => \*STDOUT,
   129:               -exitval => 1, -verbose => 0 ) if $help;
   130:     pod2usage(-verbose => 2, -exitval => 1) if $man;
   131: 
   132:     exit 1 unless @ARGV;
   133: 
   134:     # check if we are reading file names off stdin
   135:     if ($ARGV[0] eq '-') {
   136:         while (<>) {
   137:             chomp;
   138:             &print_size(imgsize($_), $_)
   139:                 if -f $_ or $silent ? next : &handle_error and next;
   140:         }
   141:     } else {
   142:         foreach (@ARGV) {
   143:             &print_size(imgsize($_), $_)
   144:                 if -f $_ or $silent ? next : warn $warn_msg."$_\n" and next;
   145:         }
   146:     }
   147: }
   148: 
   149: sub print_size() {
   150:     my ($x, $y, $type, $file) = @_;
   151: 
   152:     $x = 'unkown' unless $x;
   153:     $y = 'unkown' unless $y;
   154: 
   155:     # keep it simple stupid
   156:     my $std_msg = "width-x: $x\theight-y: $y\tfile type: $type\n";
   157: 
   158:     # unless asked to shoot off your mouth
   159:     my $verb_msg = "file name: $file\n" .
   160:                    "width-x: $x\nheight-y: $y\n" .
   161:                    "file type: $type\n\n"; 
   162: 
   163:     $verbose ? print $verb_msg : print $std_msg;
   164: 
   165:     print "running file(1) ...\n\n",`file $_`,"\n" if $ask;
   166: }
   167: 
   168: sub handle_error() {
   169:     $deadly ? die $! : warn $warn_msg."$_\n";
   170: }
   171: 



No comments:

Post a Comment