Cosmetics
[llpp.git] / misc / llppac
blob9d6f08fffc9e7d82684a35bab83a94b5e2f71d88
1 #!/bin/sh
2 set -e
4 die() {
5 echo "$1" >&2
6 exit 1
9 cachedir="${XDG_CACHE_HOME:-$HOME/.cache}/llpp"
10 test -d "$cachedir" || die "cache directory '$cachedir' does not exist"
12 caspsuf=
13 type=
15 executable_p() {
16 command -v "$1" >/dev/null 2>&1
19 missing() {
20 executable_p $1 || \
21 eval "$1() { die \"$2 is needed for \$type conversion\"; }"
24 maketext() {
25 test -d "$cachedir/fonts" || mkdir "$cachedir/fonts"
26 cat >"$cachedir/fonts/text" <<EOF
27 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
28 eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
29 minim veniam, quis nostrud exercitation ullamco laboris nisi ut
30 aliquip ex ea commodo consequat. Duis aute irure dolor in
31 reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
32 pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
33 culpa qui officia deserunt mollit anim id est laborum.
34 Posting Soccer Goals On Vine Is Illegal, Say England's Premier League
35 abcdefghizklmnopqrstwxyz
36 ABCDEFGHIZKLMNOPQRSTWXYZ
37 \`1234567890-=\\
38 ~!@#\$%^&*()_+|
39 [];',./
40 {}:"<>?"
42 EOF
45 trap 'test -n "$casp" && rm -f "$casp"' 0
47 while getopts m:t:f opt; do
48 case $opt in
49 m) mime=$OPTARG;;
50 t) type=$OPTARG;;
51 f) force=1;;
52 ?) die "usage: $0 [-m mime/type] [-t filter] [-f] [path|url]";;
53 esac
54 done
55 shift $(($OPTIND - 1))
56 test -z "$1" && die "usage $0: path"
58 if test ! -e "$1" && expr >/dev/null "$1" : "\(ftp\|https\?\)://"; then
59 if executable_p wget; then
60 dl() {
61 wget -q -c -nc $1 -O $2
63 elif executable_p curl; then
64 dl() {
65 curl $1 -o $2
67 else
68 die "no program to fetch remote urls found"
71 md5of="$cachedir/$(basename "$1")"
72 dl "$1" "$md5of" || test -e "$md5of"
73 shift
74 set -- "$md5of" "$@"
75 else
76 md5of="$1"
79 test -z "$type" && {
80 ft=$(file -L --mime-type -b "$1") || die "$ft"
83 case $ft in
84 application/x-gzip | application/x-compress) dc=zcat;;
85 application/x-xz) dc=xzcat;;
86 application/x-bzip2) dc=bzcat;;
87 *) unset dc || true;;
88 esac
90 filt='"${dc-cat}" "$1" |'
92 if test -z "$type"; then
93 test -z "$mime" && mime=$(file -L --mime-type -bz "$1" || die "$mime")
94 case $mime in
95 application/postscript) type=ps;;
96 application/pdf) type=pdf;;
97 image/vnd.djvu) type=djvu;;
98 text/html) type=html;;
99 text/plain) type=text;;
100 application/msword) type=word;;
101 application/vnd.openxmlformats-officedocument.* \
102 | application/vnd.ms-powerpoint \
103 | application/vnd.ms-excel \
104 | application/vnd.oasis.opendocument.*) type=uno;;
105 image/svg+xml) type=svg;;
106 image/png | image/jpeg) test -n "$dc" && type="image" || type="image2";;
107 image/*) type=image;;
108 application/x-dvi) type=dvi;;
109 application/x-font-ttf | application/vnd.ms-opentype) type=font;;
110 *) die "unhandled file type: '$mime'";;
111 esac
114 case $type in
115 ps) conv='ps2pdf - "$casp"';;
116 image2|pdf) test -z "$dc" && exec llpp "$@" || conv='cat >"$casp"';;
117 djvu) conv='ddjvu -format=pdf - "$casp"';;
118 html) {
119 missing prince "PrinceXML(http://www.princexml.com/)"
120 conv='prince -s /home/malc/xsrc/llpp/misc/rr.css - -o "$casp"'
122 word) {
123 if executable_p unoconv && test -z "$dc"; then
124 unset filt
125 caspsuf=.pdf
126 conv='unoconv -o "$casp" "$1"'
127 else
128 missing antiword "antiword or unoconv"
129 conv='antiword -m 8859-1.txt -a a4 - >"$casp"'
132 uno) {
133 test -n "$dc" && die "cannot convert compressed '$mime'"
134 unset filt
135 missing unoconv "unoconv(http://dag.wiee.rs/home-made/unoconv/)"
136 conv='unoconv -o "$casp" "$1"'
137 caspsuf=.pdf
139 svg) {
140 if executable_p inkscape && test -z "$dc"; then
141 unset filt
142 conv='inkscape -z -A "$casp" "$1"'
143 else
144 missing rsvg-convert "rsvg-convert"
145 conv='rsvg-convert -f pdf -o "$casp"'
148 font) {
149 if test -e "$2"; then
150 arg="$2"
151 else
152 arg="--waterfall $cachedir/fonts/text"
153 maketext
155 # https://mail.gnome.org/archives/gtk-i18n-list/2010-June/msg00000.html
156 eval $filt cat >$cachedir/fonts/font
157 cat >$cachedir/fonts/fonts.conf <<EOF
158 <?xml version="1.0"?>
159 <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
160 <fontconfig>
161 <dir>$cachedir/fonts/</dir>
162 <cachedir>$cachedir/fonts/</cachedir>
163 <config></config>
164 </fontconfig>
166 unset filt
167 missing pango-view "pango-view(http://www.pango.org/)"
168 conv='FONTCONFIG_PATH=$cachedir/fonts/ pango-view -q $arg -o $casp'
169 caspsuf=.pdf
171 fcfont) {
172 if test -e "$2"; then
173 arg="$2"
174 else
175 arg="--waterfall $cachedir/fonts/text"
176 maketext
178 unset filt
179 missing pango-view "pango-view(http://www.pango.org/)"
180 conv='pango-view --font="$1" -q $arg -o $casp'
181 caspsuf=.pdf
182 md5of=/dev/null
183 force=1
185 image) {
186 missing convert "convert(http://www.imagemagick.org/script/convert.php)"
187 conv='convert - pdf:"$casp"'
189 dvi) {
190 test -n "$dc" && die "cannot convert compressed '$mime'"
191 unset filt
192 missing dvipdf "dvipdf(http://ghostscript.com/)"
193 conv='dvipdf "$1" "$casp"'
195 text) {
196 missing pandoc "pandoc(http://pandoc.org/)"
197 conv='pandoc -t epub - -o "$casp"'
198 caspsuf=.epub
200 *) die "unhandled filter type: '$type'";;
201 esac
203 hash=$(md5sum "$md5of") || die "$hash"
204 casp=$cachedir/${hash%% *}$caspsuf
205 (test -n "$force" -o ! -e "$casp") && eval "$filt" "$conv"
207 exec llpp -origin "$@" "$casp"