Format properly
[llpp.git] / misc / llppac
blob7cd4dd8a1c25044c7a4e1b11554808e5f42ed27c
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 set -- "$md5of" ${2+"@"}
74 else
75 md5of="$1"
78 test -z "$type" && {
79 ft=$(file -L --mime-type -b "$1") || die "$ft"
82 case $ft in
83 application/x-gzip | application/x-compress) dc=zcat;;
84 application/x-xz) dc=xzcat;;
85 application/x-bzip2) dc=bzcat;;
86 *) unset dc || true;;
87 esac
89 filt='"${dc-cat}" "$1" |'
91 if test -z "$type"; then
92 test -z "$mime" && mime=$(file -L --mime-type -bz "$1" || die "$mime")
93 case $mime in
94 application/postscript) type=ps;;
95 application/pdf) type=pdf;;
96 image/vnd.djvu) type=djvu;;
97 text/html) type=html;;
98 text/plain) type=text;;
99 application/msword) type=word;;
100 application/vnd.openxmlformats-officedocument.* \
101 | application/vnd.ms-powerpoint \
102 | application/vnd.ms-excel \
103 | application/vnd.oasis.opendocument.*) type=uno;;
104 image/svg+xml) type=svg;;
105 image/png | image/jpeg) test -n "$dc" && type="image" || type="image2";;
106 image/*) type=image;;
107 application/x-dvi) type=dvi;;
108 application/x-font-ttf | application/vnd.ms-opentype) type=font;;
109 *) die "unhandled file type: '$mime'";;
110 esac
113 case $type in
114 ps) conv='ps2pdf - "$casp"';;
115 image2|pdf) test -z "$dc" && exec llpp "$@" || conv='cat >"$casp"';;
116 djvu) conv='ddjvu -format=pdf - "$casp"';;
117 html) {
118 missing prince "PrinceXML(http://www.princexml.com/)"
119 conv='prince - -o "$casp"'
121 word) {
122 if executable_p unoconv && test -z "$dc"; then
123 unset filt
124 conv='unoconv -o "$casp" "$1"'
125 else
126 missing antiword "antiword or unoconv"
127 conv='antiword -m 8859-1.txt -a a4 - >"$casp"'
130 uno) {
131 test -n "$dc" && die "cannot convert compressed '$mime'"
132 unset filt
133 missing unoconv "unoconv(http://dag.wiee.rs/home-made/unoconv/)"
134 conv='unoconv -o "$casp" "$1"'
136 svg) {
137 if executable_p inkscape && test -z "$dc"; then
138 unset filt
139 conv='inkscape -z -A "$casp" "$1"'
140 else
141 missing rsvg-convert "rsvg-convert"
142 conv='rsvg-convert -f pdf -o "$casp"'
145 font) {
146 if test -e "$2"; then
147 arg="$2"
148 else
149 arg="--waterfall $cachedir/fonts/text"
150 maketext
152 # https://mail.gnome.org/archives/gtk-i18n-list/2010-June/msg00000.html
153 eval $filt cat >$cachedir/fonts/font
154 cat >$cachedir/fonts/fonts.conf <<EOF
155 <?xml version="1.0"?>
156 <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
157 <fontconfig>
158 <dir>$cachedir/fonts/</dir>
159 <cachedir>$cachedir/fonts/</cachedir>
160 <config></config>
161 </fontconfig>
163 unset filt
164 missing pango-view "pango-view(http://www.pango.org/)"
165 conv='FONTCONFIG_PATH=$cachedir/fonts/ pango-view -q $arg -o $casp'
166 caspsuf=.pdf
168 fcfont) {
169 if test -e "$2"; then
170 arg="$2"
171 else
172 arg="--waterfall $cachedir/fonts/text"
173 maketext
175 unset filt
176 missing pango-view "pango-view(http://www.pango.org/)"
177 conv='pango-view --font="$1" -q $arg -o $casp'
178 caspsuf=.pdf
179 md5of=/dev/null
180 force=1
182 image) {
183 missing convert "convert(http://www.imagemagick.org/script/convert.php)"
184 conv='convert - pdf:"$casp"'
186 dvi) {
187 test -n "$dc" && die "cannot convert compressed '$mime'"
188 unset filt
189 missing dvipdf "dvipdf(http://ghostscript.com/)"
190 conv='dvipdf "$1" "$casp"'
192 text) {
193 missing pandoc "pandoc(http://pandoc.org/)"
194 conv='pandoc -t epub - -o "$casp"'
195 caspsuf=.epub
197 *) die "unhandled filter type: '$type'";;
198 esac
200 hash=$(md5sum "$md5of") || die "$hash"
201 casp=$cachedir/${hash%% *}$caspsuf
202 (test -n "$force" -o ! -e "$casp") && eval "$filt" "$conv"
204 exec llpp -origin "$@" "$casp"