9 cachedir
="${XDG_CACHE_HOME:-$HOME/.cache}/llpp"
10 test -d "$cachedir" || die
"cache directory '$cachedir' does not exist"
16 command -v "$1" >/dev
/null
2>&1
21 eval "$1() { die \"$2 is needed for \$type conversion\"; }"
26 <pre style="font-size: ${1}pt;">
29 test -n "$2" && cat $2 ||
cat <<EOF
34 abcdefghijklmnopqrstwxyz
35 ABCDEFGHIJKLMNOPQRSTWXYZ
36 абвгдеёжзийклмнопрстуфхцчшщэюя
37 АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЭЮЯ
38 инпипнишпнипшнипнпншпнпинпипнпипщнпипипин
45 S in S9 59 S9 is like 5
47 3ЗЭэзээз3ЗqgO0o ijklI1| bgqpykvwlliliiijil1 lLLl
53 curly vs plain braces {} () {} →
59 Commutative [Co mm utative]
61 Before [Bef ore, Be for e]
62 higher [gh, h i gher, hi gher]
71 mkfifo [mk f i fo, mk f i fo]
78 Compiling [Co mp iling]
84 buildglyphs.js [buil dg lyphs]
97 automatically effective
98 Ilium is the Latin for Ilion.
101 Box drawing alignment tests: █
103 ╔══╦══╗ ┌──┬──┐ ╭──┬──╮ ╭──┬──╮ ┏━━┳━━┓ ┎┒┏┑ ╷ ╻ ┏┯┓ ┌┰┐ ▊ ╱╲╱╲╳╳╳
104 ║┌─╨─┐║ │╔═╧═╗│ │╒═╪═╕│ │╓─╁─╖│ ┃┌─╂─┐┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ ┝╋┥ ▋ ╲╱╲╱╳╳╳
105 ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╿ │┃ ┍╅╆┓ ╵ ╹ ┗┷┛ └┸┘ ▌ ╱╲╱╲╳╳╳
106 ╠╡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳
107 ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▎
108 ║└─╥─┘║ │╚═╤═╝│ │╘═╪═╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▏
109 ╚══╩══╝ └──┴──┘ ╰──┴──╯ ╰──┴──╯ ┗━━┻━━┛ ▗▄▖▛▀▜ └╌╌┘ ╎ ┗╍╍┛ ┋ ▁▂▃▄▅▆▇█
112 https://mirrors.zju.edu.cn/CTAN/fonts/gofonts/doc/gofonts.pdf (page 2)
114 DIN Legibility Standard
116 The recent German DIN 1450 legibility standard
117 recommends several features for font legibility, including
118 differentiation of letter shapes to reduce confusion. The Go fonts
119 conform to the 1450 standard by carefully differentiating zero from
120 capital O; numeral 1 from capital I (eye) and lowercase l (ell);
121 numeral 5 from capital S; and numeral 8 from capital B. The shapes of
122 bowls of b d p q follow the natural asymmetries of legible Renaissance
123 handwriting, aiding differentiation to reduce confusion. [5]
126 Mistaking S for a 5 (at certain sizes) is more of a problem... but... Ze Germans
128 (https://en.wikipedia.org/wiki/Jabberwocky
129 Idea from the aforementioned gofonts paper)
131 Бе сгладне и честлинните комбурси Það leið að stekju, og slýgir greðlar
132 търляха се и сврецваха във плите; sig snældu og böluðu um slöffruna,
133 съвсем окласни бяха тук щурпите og angurvært sungu sópfiðrungar
134 и отма равапсатваха прасурси. við sífgelt týðmana svíræna.
137 (https://en.wikipedia.org/wiki/Typeface)
139 For the rational mind, type design can be a maddening game
140 of drawing things differently in order to make them appear the
147 # https://github.com/react-boilerplate/react-boilerplate/issues/1340
148 test -d "$cachedir/fonts" || mkdir
"$cachedir/fonts"
149 filename
="$(basename "$1")"
151 cat >"$cachedir/fonts/text.html" <<EOF
152 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
153 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
156 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
157 <title>$filename</title>
158 <style type="text/css">
171 for size
in 6 8 10 12 4 2; do
172 text
$size $textfilename >>"$cachedir/fonts/text.html"
174 cat >>"$cachedir/fonts/text.html" <<EOF
176 $(fc-scan -f '%{fullname} %{style} %{slant} %{file} %{fontversion} %{capability} %{lang}' "$1" || file "$1")
182 trap 'test -n "$casp" && rm -f "$casp"' 0
184 while getopts s
:c
:m
:t
:fu opt
; do
189 c
) css
="-s $OPTARG";;
191 s
) textfilename
="$OPTARG";;
192 ?
) die
"usage: $0 [-c css] [-m mime/type] [-t filter] [-f] [-s textfile] [path|url]";;
195 shift $
(($OPTIND - 1))
196 test -z "$1" && die
"usage $0: path"
199 if ${force-test ! -e "$1"} && expr >/dev
/null
"$1" : "\(ftp\|https\?\)://"; then
200 if executable_p wget
; then
204 elif executable_p curl
; then
209 die
"no program to fetch remote urls found"
212 md5of
="$cachedir/$(basename "$1")"
213 dl
"$1" "$md5of" ||
test -e "$md5of"
221 ft
=$
(file -L --mime-type -b "$1") || die
"$ft"
225 application
/x-gzip | application
/x-compress
) dc=zcat
;;
226 application
/x-xz
) dc=xzcat
;;
227 application
/x-bzip2
) dc=bzcat
;;
228 *) unset dc || true
;;
231 filt
='"${dc-cat}" "$1" |'
235 application
/postscript
) type=ps
;;
236 application
/pdf
) type=pdf
;;
237 image
/vnd.djvu
) type=djvu
;;
238 text
/html
) type=html
;;
239 text
/plain
) type=text
;;
240 application
/msword
) type=word
;;
241 application
/vnd.openxmlformats-officedocument.
* \
242 | application
/vnd.ms-powerpoint \
243 | application
/vnd.ms-excel \
244 | application
/vnd.oasis.opendocument.
*) type=uno
;;
245 image
/svg
+xml
) type=svg
;;
246 image
/png | image
/jpeg
) test -n "$dc" && type="image" ||
type="image2";;
247 image
/*) type=image
;;
248 application
/x-dvi
) type=dvi
;;
249 application
/x-font-ttf \
250 | application
/vnd.ms-opentype \
251 | application
/font-sfnt
) type=font
;;
257 if test -z "$type"; then
259 mime
=$
(file -L --mime-type -b "$1" || die
"$mime") || \
260 $
(file -L --mime-type -bz "$1" || die
"$mime")
261 typeofmime
"$mime" || die
"unhandled file type: '$mime'"
266 ps
) conv
='ps2pdf - "$casp"';;
267 image2|pdf
) test -z "$dc" && exec llpp
"$@" || conv
='cat >"$casp"';;
269 missing texi2html
"texi2html(http://www.nongnu.org/texi2html/)"
270 missing prince
"PrinceXML(http://www.princexml.com/)"
271 conv
='texi2html - -o - | prince $css - -o "$casp"'
274 missing ddjvu
"ddjvu(http://djvu.sourceforge.net/doc/man/ddjvu.html)"
275 conv
='ddjvu -format=pdf - "$casp"'
278 missing prince
"PrinceXML(http://www.princexml.com/)"
279 conv
='prince $css - -o "$casp"'
282 missing pandoc
"pandoc(http://pandoc.org)"
284 conv
='pandoc -r html - -w epub2 -o "$casp"'
287 if executable_p unoconv
&& test -z "$dc"; then
289 conv
='unoconv -o "$casp" "$1"'
291 missing antiword
"antiword or unoconv"
292 conv
='antiword -m 8859-1.txt -a a4 - >"$casp"'
296 test -n "$dc" && die
"cannot convert compressed '$mime'"
298 missing unoconv
"unoconv(http://dag.wiee.rs/home-made/unoconv/)"
299 conv
='unoconv -o "$casp" "$1"'
302 if executable_p inkscape
&& test -z "$dc"; then
304 conv
='inkscape -z -A "$casp" "$1"'
306 missing rsvg-convert
"rsvg-convert"
307 conv
='rsvg-convert -f pdf -o "$casp"'
311 if test -z $usemupdf; then
312 v
="llpp -origin $1 -layout-height 0"
314 mupdf
=$HOME/x
/rcs
/git
/mupdf
/build
/native
/mupdf-gl
315 executable_p
$mupdf || v
=mupdf-gl
&& v
=$mupdf
318 maketext
"$1" "$textfilename"
319 exec $v "$cachedir/fonts/text.html"
322 missing convert
"convert(http://www.imagemagick.org/script/convert.php)"
323 conv
='convert - pdf:"$casp"'
326 test -n "$dc" && die
"cannot convert compressed '$mime'"
328 missing dvipdf
"dvipdf(http://ghostscript.com/)"
329 conv
='dvipdf "$1" "$casp"'
332 missing pandoc
"pandoc(http://pandoc.org/)"
333 conv
='pandoc -t epub2 - -o "$casp"'
336 *) die
"unhandled filter type: '$type'";;
339 hash=$
(md5sum "$md5of") || die
"$hash"
340 casp
=$cachedir/${hash%% *}$caspsuf
342 { test -n "$force" ||
test ! -e "$casp"; } && eval "$filt" "$conv"
345 exec llpp
-origin $origin "$@" "$casp"