4 font
=$HOME/x
/fnt
/LastResort.ttf
5 ! test -r $font ||
export LLPP_FALLBACK_FONT
=$font
12 cachedir
="${XDG_CACHE_HOME:-$HOME/.cache}/llpp"
13 test -d "$cachedir" || die
"cache directory '$cachedir' does not exist"
18 executable_p
() { command -v "$1" >/dev
/null
2>&1; }
22 eval "$1() { die \"$2 is needed for \$type conversion\"; }"
27 <pre style="font-size: ${1}pt;">
30 test -n "$2" && cat $2 ||
cat <<EOF
31 S9 З3Ӡʒ I|l1 O0 0O o0 0o
35 abcdefghijklmnopqrstuvwxyz
36 ABCDEFGHIJKLMNOPQRSTUVWXYZ
37 абвгдеёжзийклмнопрстуфхцчшщэюя
38 АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЭЮЯ
39 инпипнишпнипшнипнпншпнпинпипнпипщнпипипин
40 иннициатива шиорокошарикоподшипниковый взбзднуть гидроаэроионизация
41 телегаммааппарат фельдъегерь четырёхсотпятидесятисемимиллиметровое
42 превысокомногорассмотрительствующий вскользь забулдыжничество
44 ',.ფyfგcრლაოეუიდჰთნსყჯქxბმwვზ
46 Il1| Il|1 I1l| I1|l I|1l I|l1 lI1| lI|1 l1I| l1|I l|1I l|I1
47 1lI| 1l|I 1Il| 1I|l 1|Il 1|lI |l1I |lI1 |1lI |1Il |I1l |Il1
50 [];',./ >- -> ~~< <-- --> == === ==> <==
52 S in S9 59 S9 is like 5
53 final fjord flair ft fff
54 3ЗЭэзээз3ЗqgO0o ijklI1| bgqpykvwlliliiijil1 lLLl
55 01234567890 3ДС ЗДС ӠДС ʒДС
56 rnrmnnmrrrnmmr <i>Nürnberg</i> (rn -> m)
58 örök für A̋ a̋ ő ű https://en.wikipedia.org/wiki/Diacritic
60 - - (~-) ~ ~ (-~) ''"''"".,
61 curly vs plain braces {} () {} ({ {( }) )} →
62 Bjarne Stroustrup (/ˈbjɑːrnə ˈstraʊstrʊp/; Danish: [ˈbjɑːnə ˈsdʁʌwˀsdʁɔb]
69 Commutative [Co mm utative]
71 Before [Bef ore, Be for e]
72 higher [gh, h i gher, hi gher]
81 mkfifo [mk f i fo, mk f i fo]
88 Compiling [Co mp iling]
94 buildglyphs.js [buil dg lyphs]
104 Apostolic [A postolic]
106 Прокофьевну [Про ко фьевну]
109 обьявляным [об ья вленым]
111 etymological [et ymologoical]
114 некочевого [не ко чевого]
117 покрытие [по кр ытие]
118 Singapore [Si ng apore]
122 подтверждение [под тверждение]
124 callable [ca l l ab le]
128 Julia [J ulia | Jul i a]
129 Joe Armstrong [J oe (rip :()]
137 automatically effective
138 Ilium is the Latin for Ilion.
142 Box drawing alignment tests: █
144 ╔══╦══╗ ┌──┬──┐ ╭──┬──╮ ╭──┬──╮ ┏━━┳━━┓ ┎┒┏┑ ╷ ╻ ┏┯┓ ┌┰┐ ▊ ╱╲╱╲╳╳╳
145 ║┌─╨─┐║ │╔═╧═╗│ │╒═╪═╕│ │╓─╁─╖│ ┃┌─╂─┐┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ ┝╋┥ ▋ ╲╱╲╱╳╳╳
146 ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╿ │┃ ┍╅╆┓ ╵ ╹ ┗┷┛ └┸┘ ▌ ╱╲╱╲╳╳╳
147 ╠╡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳
148 ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▎
149 ║└─╥─┘║ │╚═╤═╝│ │╘═╪═╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▏
150 ╚══╩══╝ └──┴──┘ ╰──┴──╯ ╰──┴──╯ ┗━━┻━━┛ ▗▄▖▛▀▜ └╌╌┘ ╎ ┗╍╍┛ ┋ ▁▂▃▄▅▆▇█
153 https://mirrors.zju.edu.cn/CTAN/fonts/gofonts/doc/gofonts.pdf (page 2)
155 DIN Legibility Standard
157 The recent German DIN 1450 legibility standard
158 recommends several features for font legibility, including
159 differentiation of letter shapes to reduce confusion. The Go fonts
160 conform to the 1450 standard by carefully differentiating zero from
161 capital O; numeral 1 from capital I (eye) and lowercase l (ell);
162 numeral 5 from capital S; and numeral 8 from capital B. The shapes of
163 bowls of b d p q follow the natural asymmetries of legible Renaissance
164 handwriting, aiding differentiation to reduce confusion. [5]
167 (https://en.wikipedia.org/wiki/Jabberwocky
168 Idea from the aforementioned gofonts paper)
170 Бе сгладне и честлинните комбурси Það leið að stekju, og slýgir greðlar
171 търляха се и сврецваха във плите; sig snældu og böluðu um slöffruna,
172 съвсем окласни бяха тук щурпите og angurvært sungu sópfiðrungar
173 и отма равапсатваха прасурси. við sífgelt týðmana svíræna.
175 (https://en.wikipedia.org/wiki/Typeface)
177 For the rational mind, type design can be a maddening game
178 of drawing things differently in order to make them appear the
185 # https://github.com/react-boilerplate/react-boilerplate/issues/1340
186 test -d "$cachedir/fonts" || mkdir
"$cachedir/fonts"
187 filename
="$(basename "$1")"
189 cat >"$cachedir/fonts/text.html" <<EOF
190 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
191 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
194 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
195 <title>$filename</title>
196 <style type="text/css">
197 @font-face { font-family: moo; src: url('$1'); }
198 pre { font-family: moo; }
204 for size
in 6 8 10 12 4 2; do
205 text
$size $textfilename >>"$cachedir/fonts/text.html"
207 cat >>"$cachedir/fonts/text.html" <<EOF
209 $(fc-scan -f '%{fullname} %{style} %{slant} %{file} %{fontversion} %{capability} %{lang}' "$1" || file "$1")
215 trap 'test -n "$casp" && rm -f "$casp"' 0
217 while getopts s
:c
:m
:t
:fu opt
; do
222 c
) css
="-s $OPTARG";;
223 s
) textfilename
="$OPTARG";;
224 ?
) die
"usage: $0 [-c css] [-m mime/type] [-t filter] [-f] [-s textfile] [path|url]";;
227 shift $
(($OPTIND - 1))
228 test -z "$1" && die
"usage $0: path"
231 if ${force-test ! -e "$1"} && expr >/dev
/null
"$1" : "\(ftp\|https\?\)://"; then
232 if executable_p wget
; then
233 dl
() { wget
-q $1 -O $2; }
234 elif executable_p curl
; then
235 dl
() { curl
-L $1 -o $2; }
237 die
"no program to fetch remote urls found"
240 hashof
="$cachedir/$(basename "$1")"
241 dl
"$1" "$hashof" ||
test -e "$md5of"
243 set -- "$hashof" "$@"
248 test -z "$type" && { ft
=$
(file -L --mime-type -b "$1") || die
"$ft"; }
251 application
/x-gzip | application
/x-compress
) dc=zcat
;;
252 application
/x-xz
) dc=xzcat
;;
253 application
/x-bzip2
) dc=bzcat
;;
254 *) unset dc || true
;;
257 filt
='"${dc-cat}" "$1" |'
261 application
/postscript
) type=ps
;;
262 application
/pdf
) type=pdf
;;
263 image
/vnd.djvu
) type=djvu
;;
264 text
/html
) type=html
;;
265 text
/plain
) type=text
;;
266 application
/msword
) type=word
;;
267 application
/vnd.openxmlformats-officedocument.
* \
268 | application
/vnd.ms-powerpoint \
269 | application
/vnd.ms-excel \
270 | application
/vnd.oasis.opendocument.
*) type=uno
;;
271 image
/svg
+xml
) type=svg
;;
272 image
/png | image
/jpeg
) test -n "$dc" && type="image" ||
type="image2";;
273 image
/*) type=image
;;
274 application
/x-dvi
) type=dvi
;;
275 application
/x-font-ttf \
276 | application
/vnd.ms-opentype \
277 | application
/font-sfnt
) type=font
;;
283 if test -z "$type"; then
285 mime
=$
(file -L --mime-type -b "$1" || die
"$mime") || \
286 $
(file -L --mime-type -bz "$1" || die
"$mime")
287 typeofmime
"$mime" || die
"unhandled file type: '$mime'"
292 ps
) conv
='ps2pdf - "$casp"';;
293 image2|pdf
) test -z "$dc" && exec llpp
"$@" || conv
='cat >"$casp"';;
295 missing texi2html
"texi2html(http://www.nongnu.org/texi2html/)"
296 missing prince
"PrinceXML(http://www.princexml.com/)"
297 conv
='texi2html - -o - | prince $css - -o "$casp"'
300 missing ddjvu
"ddjvu(http://djvu.sourceforge.net/doc/man/ddjvu.html)"
301 conv
='ddjvu -format=pdf - "$casp"'
304 missing prince
"Prince(http://www.princexml.com/)"
305 conv
='prince $css - -o "$casp"'
308 missing pandoc
"pandoc(http://pandoc.org)"
310 conv
='pandoc -r html - -w epub2 -o "$casp"'
313 if executable_p unoconv
&& test -z "$dc"; then
315 conv
='unoconv -o "$casp" "$1"'
317 missing antiword
"antiword or unoconv"
318 conv
='antiword -m 8859-1.txt -a a4 - >"$casp"'
322 test -n "$dc" && die
"cannot convert compressed '$mime'"
324 missing unoconv
"unoconv(http://dag.wiee.rs/home-made/unoconv/)"
325 conv
='unoconv -o "$casp" "$1"'
328 if executable_p inkscape
&& test -z "$dc"; then
330 conv
='inkscape -z -A "$casp" "$1"'
332 if executable_p rsvg-convert
; then
333 conv
='rsvg-convert -f pdf -o "$casp"'
335 test -n "$dc" && die
"cannot convert compressed '$mime'"
337 missing unoconv
"unoconv(http://dag.wiee.rs/home-made/unoconv/)"
338 conv
='unoconv -o "$casp" "$1"'
343 maketext
"$1" "$textfilename"
344 exec llpp
-origin $1 -layout-height 0 "$cachedir/fonts/text.html"
347 missing convert
"convert(http://www.imagemagick.org/script/convert.php)"
348 conv
='convert - pdf:"$casp"'
351 test -n "$dc" && die
"cannot convert compressed '$mime'"
353 missing dvipdf
"dvipdf(http://ghostscript.com/)"
354 conv
='dvipdf "$1" "$casp"'
357 missing pandoc
"pandoc(http://pandoc.org/)"
358 conv
='pandoc -t epub2 - -o "$casp"'
361 *) die
"unhandled filter type: '$type'";;
364 hash=$
(cksum "$hashof") || die
"$hash"
365 casp
=$cachedir/${hash%% *}$caspsuf
367 { test -n "$force" ||
test ! -e "$casp"; } && eval "$filt" "$conv"
370 exec llpp
-origin $origin "$@" "$casp"