digraphs: additional line drawing proposals
[sheet.git] / unicode.plp
1 <:
2 use utf8;
3 use strict;
4 use warnings;
5 use open IO => ':utf8';
6
7 our $VERSION = '1.0';
8
9 $header{content_type} = 'text/html; charset=utf-8';
10
11 :><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
12  "http://www.w3.org/TR/html4/loose.dtd">
13 <html>
14
15 <head>
16 <title>digraph cheat sheet</title>
17 <meta http-equiv="content-type" content="utf-8">
18 <link rel="stylesheet" type="text/css" media="all" href="/digraphs.css">
19 <style>
20 table {
21         margin: 1ex 1ex 2ex;
22         float: left;
23         table-layout: auto;
24 }
25 thead td {
26         width: auto;
27 }
28 tbody {
29         border-width: 0;
30 }
31 h2, h3 {
32         clear: both;
33 }
34
35 th {
36         text-align: left;
37         font-size: 50%;
38         background: #888;
39         color: #FFF;
40         padding: 0 0.2em;
41 }
42 thead td {
43         border: 0;
44 }
45
46 td {
47         background: transparent;
48         vertical-align: top;
49         margin: 0;
50         padding: 0;
51         width: 1.6em;
52 }
53 small {
54         font-size: 50%;
55         display: block;
56 }
57 small.digraph {
58         background: #888;
59         color: #FFF;
60 }
61 small.value {
62         background: #CCC;
63         color: #666;
64 }
65
66 td.empty {
67         background: #DDD;
68 }
69 td.reserved {
70         background: #BBB;
71 }
72 </style>
73 </head>
74
75 <body>
76 <h1>Common Digraphs</h1>
77
78 <p>i^k in <a href="/">Vim</a>.
79 Also see the <a href="/digraphs">complete digraphs table</a>.</p>
80
81 <:
82 my $diinfo = do 'digraphs.inc.pl';
83 my %di = map { $diinfo->{$_}->[0] => $_ } grep { ref $diinfo->{$_} }
84         keys %$diinfo;
85
86 sub quote {
87         local $_ = shift;
88         s/"/&quot;/g;
89         s/</&lt;/g;
90         s/>/&gt;/g;
91         return $_;
92 }
93
94 sub table {
95         my ($width, $digraphs, $rowheads, $colheads) = @_;
96
97         my @rows;
98
99         my $colspan = 1;
100         for my $cell (@$digraphs) {
101                 my $class;
102                 if ($cell eq '.') {
103                         push @rows, '';
104                         $rows[-1] .= '<th>'.(shift @$rowheads || '&nbsp;') if $rowheads;
105                         next;
106                 }
107                 elsif ($cell eq '>') {
108                         $colspan++;
109                         next;
110                 }
111                 elsif ($cell =~ s/^-//) {
112                         $class = 'empty';
113                 }
114                 elsif ($cell eq '=') {
115                         $class = 'reserved';
116                         $cell = '';
117                 }
118
119                 my $code = join '', map { $di{ord $_} || '' } split //, $cell;
120                 my $name = $diinfo->{$code}->[1];
121
122                 $rows[-1] .= sprintf('<td%s%s%s>%s%s',
123                         defined $name  ? qq{ title="$name"}  : '',
124                         defined $class ? qq{ class="$class"} : '',
125                         $colspan > 1 && qq{ colspan="$colspan"},
126                         $cell eq '' ? '&nbsp;' : quote($cell),
127                         $code ne '' ? sprintf(' <small class="digraph">%s</small>', quote($code))
128                                 : length($cell) == 1 && $cell !~ /[a-z]/
129                                         ? sprintf(' <small class="%s">%04X</small>', 'value', ord $cell)
130                                         : '',
131                 );
132
133                 $colspan = 1;
134         }
135
136         if ($colheads) {
137                 unshift @rows, sprintf '<thead><tr><td>%s<tbody>', join '',
138                         map { sprintf '<th title="%2$s">%s', split(/:/, $_, 2) }
139                         @$colheads
140         }
141
142         return sprintf "<table>\n%s</table>\n", join '', map {"<tr>$_\n"} @rows;
143 }
144
145 print "<h2>Common</h2>\n\n";
146 print table(@$_) for (
147         [ 3 => [qw{. « » . ‹ › . ‘ ’ . “ ” . „ ‚}]],
148         [ 3 => [qw{. † ‡ • . § ¶ # . © ® ™ . − × ÷ . ± ² √}]],
149         [ 3 => [qw{. å ä ö ü ß . Å æ ø ű ſ}]],
150         [ 3 => [qw{. ¿ ç ñ é ê è}]],
151 );
152
153 print "<h2>Arrows</h2>\n\n";
154 print table(@$_) for (
155         [ 4 => [qw{. ↖ ↑ ↗ ↔ . ← - → ↕ . ↙ ↓ ↘ -}]],
156         [ 4 => [qw{. ⇖ ⇑ ⇗ ⇔ . ⇐ - ⇒ ⇕ . ⇘ ⇓ ⇙ -}]],
157         [ 3 => [qw{. ◤ ▲ ◥ . ◀ ◆ ▶ . ◣ ▼ ◢}]],
158         [ 3 => [qw{. ◸ △ ◹ . ◁ ◇ ▷ . ◺ ▽ ◿}]],
159 );
160
161 print "<h2>Line drawing</h2>\n\n";
162 print table(@$_) for (
163         [ 4 => [qw{. ┌ ┬ ┐ . ├ ┼ ┤ . └ ┴ ┘}]],
164         [ 4 => [qw{. ┏ ┳ ┓ . ┣ ╋ ┫ . ┗ ┻ ┛}]],
165         [ 3 => [qw{. ┍ ┯ ┑ . ┝ ┿ ┥ . ┕ ┷ ┙}]],
166         [ 3 => [qw{. ┎ ┰ ┒ . ┠ ╂ ┨ . ┖ ┸ ┚}]],
167         [ 4 => [qw{
168                 . ╴ ─ ╌ ┄ ┈ ╶ ╾
169                 . ╸ ━ ╍ ┅ ┉ ╺ ╼
170                 . ╵ │ ╎ ┆ ┊ ╷ ╿
171                 . ╹ ┃ ╏ ┇ ┋ ╻ ╽
172         }]],
173         [ 1 => [qw{. ╱ ╳ ╲ }]],
174         [ 4 => [qw{. ╔ ╦ ╗ ═ . ╠ ╬ ╣ ║ . ╚ ╩ ╝ - }]],
175         [ 3 => [qw{. ╒ ╤ ╕ . ╞ ╪ ╡ . ╘ ╧ ╛ }]],
176         [ 3 => [qw{. ╓ ╥ ╖ . ╟ ╫ ╢ . ╙ ╨ ╜ }]],
177 );
178
179 print "<h2>Signs</h2>\n\n";
180 print table(@$_) for (
181         [ 3 => [qw{. ▘ ▀ ▝ . ▌ █ ▐ . ▖ ▄ ▗ . ░ ▒ ▓}]],
182         [ 3 => [qw{. □ ▣ ■ . ▤ ▦ ▥ . ▧ ▩ ▨}]],
183         [ 4 => [qw{. ♠ ♡ ♢ ♣ . ♤ ♥ ♦ ♧}]],
184         [ 5 => [qw{. ☼ ☿ ♀ ♁ ♂ ♃ ♄ ♅ ♆ ♇}]],  # solar
185 #       [12 => [qw{. ♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓}]],  # zodiac
186         [ 8 => [qw{. ¤ ¢ ₥ € £ ₨ $ ¥ . ₫ ₭ ₦ ₱ ₧ ₮ ₩ ₪}]],
187 );
188
189 print "<h2>IPA</h2>\n\n";
190 print table(@$_) for (
191         [
192                 12 => [qw{
193                         . p  p̪  >  >  t  ʈ  c  k  q  =  ʡ  ʔ
194                         . b  b̪  >  >  d  ɖ  ɟ  ɡ  ɢ  =  -  =
195                         . m  ɱ  >  >  n  ɳ  ɲ  ŋ  ɴ  =  =  =
196                         . ʙ  -  >  >  r  -  -  =  ʀ  =  -я =
197                         . -  ⱱ  >  >  ɾ  ɽ  -  =  ɢ̆  =  -  =
198                         . ɸ  f  θ  s  ʃ  ʂ  ç  x  χ  ħ  ʜ  h
199                         . β  v  ð  z  ʒ  ʐ  ʝ  ɣ  ʁ  ʕ  ʢ  ɦ
200                         . =  =  >  >  ɬ  -  -  -  -  =  =  =
201                         . =  =  >  >  ɮ  -  -  -  -  =  =  =
202                         . -  ʋ  >  >  ɹ  ɻ  j  ɰ  -  -  -  =
203                         . =  =  >  >  l  ɭ  ʎ  ʟ  -  =  =  =
204                         . ʘ  -  ǀ  ǁ  ǃ  -‼ ǂ  -  -  =  =  =
205                         . ɓ  ɗ̪  >  >  ɗ  -ᶑ ʄ  ɠ  ʛ  =  =  =
206                 }],
207                 [
208                         'Plosive',
209                         'Voiced plosive',
210                         'Nasal',
211                         'Trill',
212                         'Tap/flap',
213                         'Fricative',
214                         'Voiced fricative',
215                         'Lateral fricative',
216                         'Voiced lateral fricative',
217                         'Approximant',
218                         'Lateral approximant',
219                         'Click',
220                         'Implosive',
221                 ],
222                 [
223                         qw'BiL:Bilabial LD:Labiodental D:Dental Alv:Alveolar PA:Postalveolar Rf:Retroflex Pal:Palatal Vel:Velar Uv:Uvular Ph:Pharyngeal EG:Epiglottal Gl:Glottal',
224                 ],
225         ],
226         [
227                 6 => [qw{
228                         . i y  ɨ ʉ  ɯ u
229                         . - ɪ  ʏ -  ʊ -
230                         . e ø  ɘ ɵ  ɤ o
231                         . - -  ə -  - -
232                         . ɛ œ  ɜ ɞ  ʌ ɔ
233                         . æ -  ɐ -  - -
234                         . a ɶ  - -  ɑ ɒ
235                 }],
236                 [qw{Close Near-close Close-mid Mid Open-mid Near-open Open}],
237                 [map {substr($_, 0, 1).':'.$_, substr($_, 0, 1)." r:$_ rounded"} qw{Front Central Back}]
238         ],
239 );
240
241 print "<h2>Japanese</h2>\n\n";
242 print table(@$_) for (
243         [
244                 1 => [qw{
245                         . あ い う え お =
246                         . か き く け こ =
247                         . さ し す せ そ =
248                         . た ち つ て と =
249                         . な に ぬ ね の ん
250                         . は ひ ふ へ ほ =
251                         . ま み む め も =
252                         . や =  ゆ =  よ =
253                         . ら り る れ ろ =
254                         . わ ゐ =  ゑ を =
255                 }],
256                 ['', qw{K S T N H M Y R W}],
257                 [qw{A I U E O}, ''],
258         ],
259         [
260                 1 => [qw{
261                         . が ぎ ぐ げ ご
262                         . ざ じ ず ぜ ぞ
263                         . だ ぢ づ で ど
264                         . ば び ぶ べ ぼ
265                         . ぱ ぴ ぷ ぺ ぽ
266                 }],
267                 [qw{G Z D B P}],
268                 [qw{A I U E O}],
269         ],
270         [
271                 1 => [qw{
272                         . ア イ ウ エ オ ー
273                         . カ キ ク ケ コ =
274                         . サ シ ス セ ソ =
275                         . タ チ ツ テ ト =
276                         . ナ ニ ヌ ネ ノ ン
277                         . ハ ヒ フ ヘ ホ =
278                         . マ ミ ム メ モ =
279                         . ヤ -  ユ -  ヨ =
280                         . ラ リ ル レ ロ =
281                         . ワ ヰ -  ヱ ヲ =
282                 }],
283                 ['', qw{K S T N H M Y R W}],
284                 [qw{A I U E O}, ''],
285         ],
286         [
287                 1 => [qw{
288                         . ガ ギ グ ゲ ゴ
289                         . ザ ジ ズ ゼ ゾ
290                         . ダ ヂ ヅ デ ド
291                         . バ ビ ブ ベ ボ
292                         . パ ピ プ ペ ポ
293                         . ヷ ヸ ヴ ヹ ヺ
294                 }],
295                 [qw{G Z D B P V}],
296                 [qw{A I U E O}],
297         ],
298 );