9 cachedir
="${XDG_CACHE_HOME:-$HOME/.cache}/llpp"
10 test -d "$cachedir" || die
"cache directory '$cachedir' does not exist"
15 executable_p
() { command -v "$1" >/dev
/null
2>&1; }
19 eval "$1() { die \"$2 is needed for \$type conversion\"; }"
24 <pre style="font-size: ${1}pt;">
27 test -n "$2" && cat $2 ||
cat <<EOF
32 abcdefghijklmnopqrstwxyz
33 ABCDEFGHIJKLMNOPQRSTWXYZ
34 абвгдеёжзийклмнопрстуфхцчшщэюя
35 АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЭЮЯ
36 инпипнишпнипшнипнпншпнпинпипнпипщнпипипин
37 иннициатива шиорокошарикоподшипниковый взбзднуть гидроаэроионизация
38 телегаммааппарат фельдъегерь четырёхсотпятидесятисемимиллиметровое
39 превысокомногорассмотрительствующий вскользь забулдыжничество
46 S in S9 59 S9 is like 5
48 3ЗЭэзээз3ЗqgO0o ijklI1| bgqpykvwlliliiijil1 lLLl
49 01234567890 3ДС ЗДС ӠДС ʒДС
50 rnrmnnmrrrnmmr <i>Nürnberg</i> (rn -> m)
52 örök für A̋ a̋ ő ű https://en.wikipedia.org/wiki/Diacritic
55 curly vs plain braces {} () {} →
56 Bjarne Stroustrup (/ˈbjɑːrnə ˈstraʊstrʊp/; Danish: [ˈbjɑːnə ˈsdʁʌwˀsdʁɔb]
62 Commutative [Co mm utative]
64 Before [Bef ore, Be for e]
65 higher [gh, h i gher, hi gher]
74 mkfifo [mk f i fo, mk f i fo]
81 Compiling [Co mp iling]
87 buildglyphs.js [buil dg lyphs]
97 Apostolic [A postolic]
99 Прокофьевну [Про ко фьевну]
102 обьявляным [об ья вленым]
104 etymological [et ymologoical]
107 некочевого [не ко чевого]
110 покрытие [по кр ытие]
111 Julia [J ulia | Jul i a]
112 Singapore [Si ng apore]
115 Joe Armstrong [J oe (rip :()]
117 подтверждение [под тверждение]
122 automatically effective
123 Ilium is the Latin for Ilion.
126 Box drawing alignment tests: █
128 ╔══╦══╗ ┌──┬──┐ ╭──┬──╮ ╭──┬──╮ ┏━━┳━━┓ ┎┒┏┑ ╷ ╻ ┏┯┓ ┌┰┐ ▊ ╱╲╱╲╳╳╳
129 ║┌─╨─┐║ │╔═╧═╗│ │╒═╪═╕│ │╓─╁─╖│ ┃┌─╂─┐┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ ┝╋┥ ▋ ╲╱╲╱╳╳╳
130 ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╿ │┃ ┍╅╆┓ ╵ ╹ ┗┷┛ └┸┘ ▌ ╱╲╱╲╳╳╳
131 ╠╡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳
132 ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▎
133 ║└─╥─┘║ │╚═╤═╝│ │╘═╪═╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▏
134 ╚══╩══╝ └──┴──┘ ╰──┴──╯ ╰──┴──╯ ┗━━┻━━┛ ▗▄▖▛▀▜ └╌╌┘ ╎ ┗╍╍┛ ┋ ▁▂▃▄▅▆▇█
137 https://mirrors.zju.edu.cn/CTAN/fonts/gofonts/doc/gofonts.pdf (page 2)
139 DIN Legibility Standard
141 The recent German DIN 1450 legibility standard
142 recommends several features for font legibility, including
143 differentiation of letter shapes to reduce confusion. The Go fonts
144 conform to the 1450 standard by carefully differentiating zero from
145 capital O; numeral 1 from capital I (eye) and lowercase l (ell);
146 numeral 5 from capital S; and numeral 8 from capital B. The shapes of
147 bowls of b d p q follow the natural asymmetries of legible Renaissance
148 handwriting, aiding differentiation to reduce confusion. [5]
151 Mistaking S for a 5 (at certain sizes) is more of a problem... but... Ze Germans
153 (https://en.wikipedia.org/wiki/Jabberwocky
154 Idea from the aforementioned gofonts paper)
156 Бе сгладне и честлинните комбурси Það leið að stekju, og slýgir greðlar
157 търляха се и сврецваха във плите; sig snældu og böluðu um slöffruna,
158 съвсем окласни бяха тук щурпите og angurvært sungu sópfiðrungar
159 и отма равапсатваха прасурси. við sífgelt týðmana svíræna.
161 (https://en.wikipedia.org/wiki/Typeface)
163 For the rational mind, type design can be a maddening game
164 of drawing things differently in order to make them appear the
171 # https://github.com/react-boilerplate/react-boilerplate/issues/1340
172 test -d "$cachedir/fonts" || mkdir
"$cachedir/fonts"
173 filename
="$(basename "$1")"
175 cat >"$cachedir/fonts/text.html" <<EOF
176 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
177 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
180 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
181 <title>$filename</title>
182 <style type="text/css">
183 @font-face { font-family: moo; src: url('$1'); }
184 pre { font-family: moo; }
190 for size
in 6 8 10 12 4 2; do
191 text
$size $textfilename >>"$cachedir/fonts/text.html"
193 cat >>"$cachedir/fonts/text.html" <<EOF
195 $(fc-scan -f '%{fullname} %{style} %{slant} %{file} %{fontversion} %{capability} %{lang}' "$1" || file "$1")
201 trap 'test -n "$casp" && rm -f "$casp"' 0
203 while getopts s
:c
:m
:t
:fu opt
; do
208 c
) css
="-s $OPTARG";;
209 s
) textfilename
="$OPTARG";;
210 ?
) die
"usage: $0 [-c css] [-m mime/type] [-t filter] [-f] [-s textfile] [path|url]";;
213 shift $
(($OPTIND - 1))
214 test -z "$1" && die
"usage $0: path"
217 if ${force-test ! -e "$1"} && expr >/dev
/null
"$1" : "\(ftp\|https\?\)://"; then
218 if executable_p wget
; then
219 dl
() { wget
-q $1 -O $2; }
220 elif executable_p curl
; then
221 dl
() { curl
-L $1 -o $2; }
223 die
"no program to fetch remote urls found"
226 hashof
="$cachedir/$(basename "$1")"
227 dl
"$1" "$hashof" ||
test -e "$md5of"
229 set -- "$hashof" "$@"
234 test -z "$type" && { ft
=$
(file -L --mime-type -b "$1") || die
"$ft"; }
237 application
/x-gzip | application
/x-compress
) dc=zcat
;;
238 application
/x-xz
) dc=xzcat
;;
239 application
/x-bzip2
) dc=bzcat
;;
240 *) unset dc || true
;;
243 filt
='"${dc-cat}" "$1" |'
247 application
/postscript
) type=ps
;;
248 application
/pdf
) type=pdf
;;
249 image
/vnd.djvu
) type=djvu
;;
250 text
/html
) type=html
;;
251 text
/plain
) type=text
;;
252 application
/msword
) type=word
;;
253 application
/vnd.openxmlformats-officedocument.
* \
254 | application
/vnd.ms-powerpoint \
255 | application
/vnd.ms-excel \
256 | application
/vnd.oasis.opendocument.
*) type=uno
;;
257 image
/svg
+xml
) type=svg
;;
258 image
/png | image
/jpeg
) test -n "$dc" && type="image" ||
type="image2";;
259 image
/*) type=image
;;
260 application
/x-dvi
) type=dvi
;;
261 application
/x-font-ttf \
262 | application
/vnd.ms-opentype \
263 | application
/font-sfnt
) type=font
;;
269 if test -z "$type"; then
271 mime
=$
(file -L --mime-type -b "$1" || die
"$mime") || \
272 $
(file -L --mime-type -bz "$1" || die
"$mime")
273 typeofmime
"$mime" || die
"unhandled file type: '$mime'"
278 ps
) conv
='ps2pdf - "$casp"';;
279 image2|pdf
) test -z "$dc" && exec llpp
"$@" || conv
='cat >"$casp"';;
281 missing texi2html
"texi2html(http://www.nongnu.org/texi2html/)"
282 missing prince
"PrinceXML(http://www.princexml.com/)"
283 conv
='texi2html - -o - | prince $css - -o "$casp"'
286 missing ddjvu
"ddjvu(http://djvu.sourceforge.net/doc/man/ddjvu.html)"
287 conv
='ddjvu -format=pdf - "$casp"'
290 missing prince
"Prince(http://www.princexml.com/)"
291 conv
='prince $css - -o "$casp"'
294 missing pandoc
"pandoc(http://pandoc.org)"
296 conv
='pandoc -r html - -w epub2 -o "$casp"'
299 if executable_p unoconv
&& test -z "$dc"; then
301 conv
='unoconv -o "$casp" "$1"'
303 missing antiword
"antiword or unoconv"
304 conv
='antiword -m 8859-1.txt -a a4 - >"$casp"'
308 test -n "$dc" && die
"cannot convert compressed '$mime'"
310 missing unoconv
"unoconv(http://dag.wiee.rs/home-made/unoconv/)"
311 conv
='unoconv -o "$casp" "$1"'
314 if executable_p inkscape
&& test -z "$dc"; then
316 conv
='inkscape -z -A "$casp" "$1"'
318 if executable_p rsvg-convert
; then
319 conv
='rsvg-convert -f pdf -o "$casp"'
321 test -n "$dc" && die
"cannot convert compressed '$mime'"
323 missing unoconv
"unoconv(http://dag.wiee.rs/home-made/unoconv/)"
324 conv
='unoconv -o "$casp" "$1"'
329 maketext
"$1" "$textfilename"
330 exec llpp
-origin $1 -layout-height 0 "$cachedir/fonts/text.html"
333 missing convert
"convert(http://www.imagemagick.org/script/convert.php)"
334 conv
='convert - pdf:"$casp"'
337 test -n "$dc" && die
"cannot convert compressed '$mime'"
339 missing dvipdf
"dvipdf(http://ghostscript.com/)"
340 conv
='dvipdf "$1" "$casp"'
343 missing pandoc
"pandoc(http://pandoc.org/)"
344 conv
='pandoc -t epub2 - -o "$casp"'
347 *) die
"unhandled filter type: '$type'";;
350 hash=$
(cksum "$hashof") || die
"$hash"
351 casp
=$cachedir/${hash%% *}$caspsuf
353 { test -n "$force" ||
test ! -e "$casp"; } && eval "$filt" "$conv"
356 exec llpp
-origin $origin "$@" "$casp"