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 https://ru.wikipedia.org/wiki/Панграмма https://en.wikipedia.org/wiki/Pangram
45 Экс-граф? Плюш изъят. Бьём чуждый цен хвощ!
46 Waltz, bad nymph, for quick jigs vex
47 ',.ფyfგcრლაოეუიდჰთნსყჯქxბმwვზ
49 Il1| Il|1 I1l| I1|l I|1l I|l1 lI1| lI|1 l1I| l1|I l|1I l|I1
50 1lI| 1l|I 1Il| 1I|l 1|Il 1|lI |l1I |lI1 |1lI |1Il |I1l |Il1
54 [];',.//|/\ >- -> ~~< <-- --> == === ==> <==
56 S in S9 59 S9 is like 5 also 8B B8 BB 88B8 88B8
57 final fjord flair ft fff
58 3ЗЭэзээз3ЗqgO0o ijklI1| bgqpykvwlliliiijil1 lLLl
59 01234567890 3ДС ЗДС ӠДС ʒДС
60 rnrmnnmrrrnmmr <i>Nürnberg</i> (rn -> m)
62 örök für A̋ a̋ ő ű https://en.wikipedia.org/wiki/Diacritic
64 - - (~-) ~ ~ (-~) ''"''""., 1.65Mb
65 curly vs plain braces {} () {} ({ {( }) )} →
66 Bjarne Stroustrup (/ˈbjɑːrnə ˈstraʊstrʊp/; Danish: [ˈbjɑːnə ˈsdʁʌwˀsdʁɔb]
68 😁 😂 😃 😅 😆 😇 😈 😉 😊 😋 😌 😍 😎 😏 😐 😑
69 😒 😓 😕 😗 😘 😙 😚 😛 😜 😞 😠 😡 😢 😥 😧 😨
70 😩 😪 😫 😬 😭 😮 😯 😰 😱 😲 😳 😵 😶 😸 😹 😻
71 😼 😽 😾 😿 🙀 🙁 🙂 🙃 🙄 🙆 🙇 🙉 🙊 🙌 🙍 🙎
72 🙏 1F600 😀 1F621 😤 😦 😖 😄 😔 🙅 🙈 🙋 1F620
73 1F627 😟 😴 😷 😺 1F609 1F60C 😝 😣 ✉ 📧
79 Commutative [Co mm utative]
81 Before [Bef ore, Be for e]
82 higher [gh, h i gher, hi gher]
91 mkfifo [mk f i fo, mk f i fo]
98 Compiling [Co mp iling]
104 buildglyphs.js [buil dg lyphs]
114 Apostolic [A postolic]
116 Прокофьевну [Про ко фьевну]
119 обьявляным [об ья вленым]
121 etymological [et ymological]
124 некочевого [не ко чевого]
127 покрытие [по кр ытие]
128 Singapore [Si ng apore]
132 подтверждение [под тверждение]
134 callable [ca l l ab le]
138 Julia [J ulia | Jul i a]
139 Joe Armstrong [J oe (rip :()]
147 automatically effective
148 Ilium is the Latin for Ilion.
152 Box drawing alignment tests: █
154 ╔══╦══╗ ┌──┬──┐ ╭──┬──╮ ╭──┬──╮ ┏━━┳━━┓ ┎┒┏┑ ╷ ╻ ┏┯┓ ┌┰┐ ▊ ╱╲╱╲╳╳╳
155 ║┌─╨─┐║ │╔═╧═╗│ │╒═╪═╕│ │╓─╁─╖│ ┃┌─╂─┐┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ ┝╋┥ ▋ ╲╱╲╱╳╳╳
156 ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╿ │┃ ┍╅╆┓ ╵ ╹ ┗┷┛ └┸┘ ▌ ╱╲╱╲╳╳╳
157 ╠╡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳
158 ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▎
159 ║└─╥─┘║ │╚═╤═╝│ │╘═╪═╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▏
160 ╚══╩══╝ └──┴──┘ ╰──┴──╯ ╰──┴──╯ ┗━━┻━━┛ ▗▄▖▛▀▜ └╌╌┘ ╎ ┗╍╍┛ ┋ ▁▂▃▄▅▆▇█
163 https://mirrors.zju.edu.cn/CTAN/fonts/gofonts/doc/gofonts.pdf (page 2)
165 DIN Legibility Standard
167 The recent German DIN 1450 legibility standard
168 recommends several features for font legibility, including
169 differentiation of letter shapes to reduce confusion. The Go fonts
170 conform to the 1450 standard by carefully differentiating zero from
171 capital O; numeral 1 from capital I (eye) and lowercase l (ell);
172 numeral 5 from capital S; and numeral 8 from capital B. The shapes of
173 bowls of b d p q follow the natural asymmetries of legible Renaissance
174 handwriting, aiding differentiation to reduce confusion. [5]
177 (https://en.wikipedia.org/wiki/Jabberwocky
178 Idea from the aforementioned gofonts paper)
180 Бе сгладне и честлинните комбурси Það leið að stekju, og slýgir greðlar
181 търляха се и сврецваха във плите; sig snældu og böluðu um slöffruna,
182 съвсем окласни бяха тук щурпите og angurvært sungu sópfiðrungar
183 и отма равапсатваха прасурси. við sífgelt týðmana svíræna.
185 (https://en.wikipedia.org/wiki/Typeface)
187 For the rational mind, type design can be a maddening game
188 of drawing things differently in order to make them appear the
195 # https://github.com/react-boilerplate/react-boilerplate/issues/1340
196 test -d "$cachedir/fonts" || mkdir
"$cachedir/fonts"
197 filename
="$(basename "$1")"
199 cat >"$cachedir/fonts/text.html" <<EOF
200 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
201 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
204 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
205 <title>$filename</title>
206 <style type="text/css">
207 @font-face { font-family: moo; src: url('$1'); }
208 pre { font-family: moo; }
214 for size
in 6 8 10 12 4 2; do
215 text
$size $textfilename >>"$cachedir/fonts/text.html"
217 cat >>"$cachedir/fonts/text.html" <<EOF
219 $(fc-scan -f '%{fullname} %{style} %{slant} %{file} %{fontversion} %{capability} %{lang}' "$1" || file "$1")
225 trap 'test -n "$casp" && rm -f "$casp"' 0
227 while getopts s
:c
:m
:t
:fu opt
; do
232 c
) css
="-s $OPTARG";;
233 s
) textfilename
="$OPTARG";;
234 ?
) die
"usage: $0 [-c css] [-m mime/type] [-t filter] [-f] [-s textfile] [path|url]";;
237 shift $
(($OPTIND - 1))
238 test -z "$1" && die
"usage $0: path"
241 if ${force-test ! -e "$1"} && expr >/dev
/null
"$1" : "\(ftp\|https\?\)://"; then
242 if executable_p wget
; then
243 dl
() { wget
-q $1 -O $2; }
244 elif executable_p curl
; then
245 dl
() { curl
-L $1 -o $2; }
247 die
"no program to fetch remote urls found"
250 hashof
="$cachedir/$(basename "$1")"
251 dl
"$1" "$hashof" ||
test -e "$md5of"
253 set -- "$hashof" "$@"
258 test -z "$type" && { ft
=$
(file -L --mime-type -b "$1") || die
"$ft"; }
261 application
/x-gzip | application
/x-compress
) dc=zcat
;;
262 application
/x-xz
) dc=xzcat
;;
263 application
/x-bzip2
) dc=bzcat
;;
264 *) unset dc || true
;;
267 filt
='"${dc-cat}" "$1" |'
271 application
/postscript
) type=ps
;;
272 application
/pdf
) type=pdf
;;
273 image
/vnd.djvu
) type=djvu
;;
274 text
/html
) type=html
;;
275 text
/plain
) type=text
;;
276 application
/msword
) type=word
;;
277 application
/vnd.openxmlformats-officedocument.
* \
278 | application
/vnd.ms-powerpoint \
279 | application
/vnd.ms-excel \
280 | application
/vnd.oasis.opendocument.
*) type=uno
;;
281 image
/svg
+xml
) type=svg
;;
282 image
/png | image
/jpeg
) test -n "$dc" && type="image" ||
type="image2";;
283 image
/*) type=image
;;
284 application
/x-dvi
) type=dvi
;;
285 application
/x-font-ttf \
286 | application
/vnd.ms-opentype \
287 | application
/font-sfnt
) type=font
;;
293 if test -z "$type"; then
295 mime
=$
(file -L --mime-type -b "$1" || die
"$mime") || \
296 $
(file -L --mime-type -bz "$1" || die
"$mime")
297 typeofmime
"$mime" || die
"unhandled file type: '$mime'"
302 ps
) conv
='ps2pdf - "$casp"';;
303 image2|pdf
) test -z "$dc" && exec llpp
"$@" || conv
='cat >"$casp"';;
305 missing texi2html
"texi2html(http://www.nongnu.org/texi2html/)"
306 missing prince
"PrinceXML(http://www.princexml.com/)"
307 conv
='texi2html - -o - | prince $css - -o "$casp"'
310 missing ddjvu
"ddjvu(http://djvu.sourceforge.net/doc/man/ddjvu.html)"
311 conv
='ddjvu -format=pdf - "$casp"'
314 missing prince
"Prince(http://www.princexml.com/)"
315 conv
='prince $css - -o "$casp"'
318 missing pandoc
"pandoc(http://pandoc.org)"
320 conv
='pandoc -r html - -w epub2 -o "$casp"'
323 if executable_p unoconv
&& test -z "$dc"; then
325 conv
='unoconv -o "$casp" "$1"'
327 missing antiword
"antiword or unoconv"
328 conv
='antiword -m 8859-1.txt -a a4 - >"$casp"'
332 test -n "$dc" && die
"cannot convert compressed '$mime'"
334 missing unoconv
"unoconv(http://dag.wiee.rs/home-made/unoconv/)"
335 conv
='unoconv -o "$casp" "$1"'
338 if executable_p inkscape
&& test -z "$dc"; then
340 conv
='inkscape -z -A "$casp" "$1"'
342 if executable_p rsvg-convert
; then
343 conv
='rsvg-convert -f pdf -o "$casp"'
345 test -n "$dc" && die
"cannot convert compressed '$mime'"
347 missing unoconv
"unoconv(http://dag.wiee.rs/home-made/unoconv/)"
348 conv
='unoconv -o "$casp" "$1"'
353 maketext
"$1" "$textfilename"
354 exec llpp
-origin $1 -layout-height 0 "$cachedir/fonts/text.html"
357 missing convert
"convert(http://www.imagemagick.org/script/convert.php)"
358 conv
='convert - pdf:"$casp"'
361 test -n "$dc" && die
"cannot convert compressed '$mime'"
363 missing dvipdf
"dvipdf(http://ghostscript.com/)"
364 conv
='dvipdf "$1" "$casp"'
367 missing pandoc
"pandoc(http://pandoc.org/)"
368 conv
='pandoc -t epub2 - -o "$casp"'
371 *) die
"unhandled filter type: '$type'";;
374 hash=$
(cksum "$hashof") || die
"$hash"
375 casp
=$cachedir/${hash%% *}$caspsuf
377 { test -n "$force" ||
test ! -e "$casp"; } && eval "$filt" "$conv"
380 exec llpp
-origin $origin "$@" "$casp"