tools/textviewer.sh
[claws.git] / tools / textviewer.sh
1 #!/bin/bash
2
3 # textviewer.sh
4 # Copyright 2003 Luke Plant <L.Plant.98@cantab.net>
5 # and Johann Koenig <johann@mental-graffiti.com>
6
7 # This program is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU General Public License
9 # as published by the Free Software Foundation; either version 2
10 # of the License, or (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program; if not, write to the Free Software
19 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 # 02111-1307, USA.
21
22 ##############################################################################
23 #
24 # This script is a text viewer designed to be used with sylpheed-claws actions
25 # Set up an action with the command line:  textviewer.sh %p |
26 #
27 # The script will try to detect file type automatically, and then
28 # invokes a relevant program to print the file in plain text to
29 # the standard output.
30 #
31 # From v 0.9.7claws7, sylpheed-claws sets the temporary file
32 # of a part to XXXXXX.mimetmp.[filename of attachment]
33 # This means we can use the extension of the filename for checking.
34 # Also use the program 'file' if that fails.
35 #
36 # To extend the script just follow the patterns that already exist, or
37 # contact the author if you have problems.
38
39 ##############################################################################
40 #
41 # Change Log
42 #
43 # 2004-02-13
44 #       - added support for perl and shell scripts, and recognize that
45 #         'file' will always return 'text' somewhere in its output for
46 #         files that, well, contain text
47 #
48 # 2004-01-25
49 #       - added brief messages describing whats going on
50 #
51 # 2004-01-23
52 #       - added support for 'pdftotext,' from xpdf-utils debian package
53 #
54 # 2004-01-05
55 #       - added matcher and action for OpenOffice Writer documents
56 #         (requires ooo2txt)
57 #
58 # 2004-01-05
59 #       - changed page width parameter for antiword
60 #       - fixed matcher for 'diffs'
61 #       - added a matcher and action for bzip2 - bzip2 files
62 #         are decompressed and textviewer.sh run on the result
63 #       - similarly decompress gzip files and run textviewer.sh
64 #         on the result, insteading of doing 'gzip -l'
65 #
66 # 2003-12-30
67 #       added the script to sylpheed-claws/tools
68 #
69 # 2003-12-30
70 #       - use 'fold' after 'unrtf' to wrap to a nice width
71 #       - added basic file sanity checks
72 #
73 # 2003-12-29
74 #       Added recognition for "Zip " from 'file' output
75 #
76 # 2003-12-19
77 #       Initial public release
78 #
79 ###############################################################################
80
81 if [ $# -eq 0 ]
82 then
83         echo "No filename supplied." >&2 
84         echo "Usage: textviewer.sh FILE" >&2 
85         exit 1
86 fi
87
88 [ -f "$1" ] ||
89 {
90         echo "File \"$1\" does not exist or is not a regular file." >&2
91         exit 1
92 }
93
94 [ -r "$1" ] ||
95 {       
96         echo "Cannot read file \"$1\"." >&2
97         exit 1
98 }
99
100 FILETYPE=`file --brief "$1"` || 
101 {
102         echo "Please install the command 'file' to use this script." >&2
103         exit 1 
104 };
105
106 case "$1" in 
107         *.doc)  TYPE=MSWORD     ;;
108         *.zip)  TYPE=ZIP        ;;
109         *.tar.gz|*.tgz) TYPE=TARGZ ;;
110         *.tar.bz2|*.tar.bz)     TYPE=TARBZ ;;
111         *.gz)   TYPE=GZIP       ;;
112         *.bz2|*.bz)     TYPE=BZIP       ;;
113         *.tar)  TYPE=TAR        ;;
114         *.diff) TYPE=TEXT       ;;
115         *.txt)  TYPE=TEXT       ;;
116         *.rtf)  TYPE=RTF        ;;
117         *.sxw)  TYPE=OOWRITER   ;;
118         *.pdf)  TYPE=PDF        ;;
119         *.sh)   TYPE=TEXT       ;;
120         *.pl)   TYPE=TEXT       ;;
121 esac
122
123 if [ "$TYPE" == "" ]    
124 then
125         case $FILETYPE in 
126                 *"text"*)       TYPE=TEXT       ;;
127                 gzip*)          TYPE=GZIP ;;
128                 bzip2*)         TYPE=BZIP ;;
129                 "POSIX tar archive"*)   TYPE=TAR        ;;
130                 "Zip "*)        TYPE=ZIP  ;;
131                 "Rich Text Format"*)    
132                                 TYPE=RTF  ;;
133         esac
134 fi
135
136 case $TYPE in
137         TARGZ)  echo -e "Gzip'd tarball contents:\n"    ; 
138                 tar -tzvf "$1"                          ;;
139
140         TARBZ)  echo -e "Bzip'd tarball contents:\n"    ; 
141                 tar -tjvf "$1"                          ;;
142
143         BZIP)   TMP=`mktemp "$1".temp.XXXXXXX` || exit 1;
144                 bunzip2 -c "$1" > "$TMP"  || exit 1;
145                 echo -e "Re-running \"$0\" on bunzip'd contents of \"$1\":\n";
146                 "$0" "$TMP";
147                 rm "$TMP"                                       ;;
148
149         GZIP)   TMP=`mktemp "$1".temp.XXXXXXX` || exit 1;
150                 gunzip -c "$1" > "$TMP"  || exit 1;
151                 echo "Re-running \"$0\" on gunzip'd contents of \"$1\":\n";
152                 "$0" "$TMP";
153                 rm "$TMP"                                       ;;
154
155         TAR)    echo -e "Tar archive contents:\n"       ; 
156                 tar -tvf "$1"                           ;;
157
158         ZIP)    echo -e "Zip file contents:\n"          ;
159                 unzip -l "$1"                           ;;
160
161         RTF)    which unrtf > /dev/null  2>&1 || 
162                 {
163                         echo "Program 'unrtf' for displaying RTF files not found" >&2
164                         exit 1
165                 };
166                 echo -e "Displaying \"$1\" using \"unrtf\":\n";
167                 unrtf -t text "$1" 2>/dev/null | egrep  -v '^### ' | fold -s -w 72  ;;
168
169         TEXT)   cat "$1"                                ;;
170
171         MSWORD) which antiword  > /dev/null  2>&1 || 
172                 {
173                         echo "Program 'antiword' for displaying MS Word files not found" >&2
174                         exit 1 
175                 };
176                 echo -e "Displaying \"$1\" using \"antiword\":\n";
177                 antiword -w 72 "$1"                             ;;
178
179         OOWRITER) which ooo2txt > /dev/null 2>&1 ||
180                 {
181                         echo "Program 'ooo2txt' for converting OpenOffice Writer files not files not found" >&2
182                         exit 1
183                 };
184                 echo -e "Displaying \"$1\" using \"ooo2txt\":\n";
185                 ooo2txt "$1"                                    ;;
186
187         PDF) which pdftotext > /dev/null 2>&1 ||
188                 {
189                         echo "Program 'pdftotext' for converting Adobe Portable Document Format to text not found" >&2
190                         exit 1
191                 };
192                 echo -e "Displaying \"$1\" using \"pdftotext\":\n";
193                 pdftotext "$1"  -                               ;;
194
195         *)      echo "Unsupported file type \"$FILETYPE\", cannot display.";;
196 esac