claws-mail/tools/textviewer.pl
2013-03-20 11:26:52 +01:00

139 lines
3.3 KiB
Perl
Executable file

#!/usr/bin/perl
# COPYRIGHT AND LICENSE
# Copyright (C) 2005-2006 H.Merijn Brand
#
# This script is free software; you can redistribute it and/or modify it
# under the same terms as Perl and/or Claws Mail itself. (GPL)
use strict;
use warnings;
sub usage ($;$)
{
my ($err, $str) = (@_, "");
$err and select STDERR;
print
"usage: $0 [--html] [--type=<type>] file\n",
" --html Generate HTML (if supported)\n",
" --type=X X as mimetype (msword => doc)\n";
$str and print "$str\n";
exit $err;
} # usage
@ARGV == 1 and $ARGV[0] eq "-?" || $ARGV[0] =~ m/^-+help$/ and usage (0);
use Getopt::Long qw(:config bundling nopermute);
my $opt_v = 0;
my $opt_t;
my $opt_h = "text";
GetOptions (
"v|verbose:1" => \$opt_v,
"t|type|mimetype=s" => \$opt_t,
"h|html" => sub { $opt_h = "html" },
) or usage (1);
$opt_v and print "$0 @ARGV\n";
my $file = shift or usage (1, "File argument is missing");
-f $file or usage (1, "File argument is not a plain file");
-r $file or usage (1, "File argument is not a readable file");
-s $file or usage (1, "File argument is an empty file");
# anon-list contains all possible commands to show content
# plain text is a reference to same type (alias)
# %f will be replaced with file. If no %f, file will be the last arg
my %fh = (
text => {
bin => [ "strings" ], # fallback for binary files
txt => [ "cat" ], # Plain text
html => [ "txt2htm",
"text2html" ], # HTML
msword => "doc",
doc => [ "antiword -w 72" ], # M$ Word
"vnd.ms-excel" => "xls",
"ms-excel" => "xls",
xls => [ "xlscat -L" ], # M$ Excel
# ppt => [ "ppthtml" ], # M$ PowerPoint
# ppthtml "$1" | html2text
rtf => [ "rtf2text",
"unrtf -t text" ], # RTF
pdf => [ "pdftotext %f -" ], # Adobe PDF
sxc => "xls", # OpenOffice spreadsheet
odt => [ "ooo2txt" ], # OpenOffice writer
csv => "xls", # Comma Separated Values
pl => [ "perltidy -st -se",
"cat" ], # Perl
pm => "pl",
( map { $_ => "txt" } qw(
diff
c h ic ec cc
sh sed awk
plain
)),
bz2 => [ "bzip2 -d < %f | strings" ],
test => [ \&test ], # Internal
},
html => {
rtf => [ "rtf2html" ],
},
);
my $ext = $file =~ m/\.(\w+)$/ ? lc $1 : "";
$opt_t && exists $fh{text}{lc $opt_t} and $ext = lc$opt_t;
unless (exists $fh{text}{$ext}) {
my $ftype = `file --brief $file`;
$ext =
$ftype =~ m/^pdf doc/i ? "pdf" :
$ftype =~ m/^ascii( english)? text/i ? "txt" :
$ftype =~ m/^(utf-8 unicode|iso-\d+)( english)? text/i ? "txt" :
$ftype =~ m/^xml doc/i ? "xml" :
$ftype =~ m/^\w+ compress/i ? "bin" :
"bin" ;
# \w+ archive
# \w+ image
# ...
}
$ext ||= "txt";
exists $fh{$opt_h}{$ext} or $opt_h = "text";
exists $fh{$opt_h}{$ext} or $ext = "txt";
my $ref = $fh{$opt_h}{$ext};
ref $ref or $ref = $fh{$opt_h}{$ref};
$opt_v and print STDERR "[ @$ref ] $file\n";
sub which ($)
{
(my $cmd = shift) =~ s/\s.*//; # Only the command. Discard arguments here
foreach my $path (split m/:+/, $ENV{PATH}) {
-x "$path/$cmd" and return "$path/$cmd";
}
return 0;
} # which
my $cmd = "cat -ve";
foreach my $c (@$ref) {
if (ref $c) {
$c->($file);
exit;
}
my $cp = which ($c) or next;
$cmd = $c;
last;
}
$cmd =~ s/%f\b/$file/g or $cmd .= " $file";
$opt_v and print "$cmd\n";
exec $cmd;