index: release v1.18 with only altgr index linked
[sheet.git] / countries.plp
index 6e12b1b66b14c9b3ace2b39f9255fdd316d59230..efd2f256407351c0c88973d6d165ccc398e56d32 100644 (file)
@@ -1,27 +1,23 @@
 <(common.inc.plp)><:
-       our $VERSION = 'v1.0';
 
-:><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html lang="en">
+Html({
+       title => 'country code cheat sheet',
+       version => '1.3',
+       description =>
+               "Table of ISO-3166-1 country codes with the names of reserved territories.",
+       keywords => [qw'country code cc tld cctld continent territory land table'],
+       stylesheet => [qw'light dark circus mono red'],
+       data => ['data/countries.inc.pl'],
+});
 
-<head>
-<meta http-equiv="content-type" content="<:= $header{content_type} :>">
-<title>country code cheat sheet</title>
-<meta name="description" content="Table of ISO-3166-2 country codes with the names of reserved territories.">
-<meta name="keywords" content="country, code, cc, tld, territory, land, table">
-<:= stylesheet(qw'light dark mono red') :>
-<link rel="icon" type="image/png" href="/clip.png">
-</head>
-
-<body>
-<h1>Country codes</h1>
+:>
+<h1>ISO-3166-1α2 Country codes</h1>
 
 <:
-my $cc = do 'countries.inc.pl';
+my $cc = Data('data/countries');
 
 {
-       printf '<table class="mcmap">';
+       printf '<table class="ccmap">';
        print '<col><colgroup span="26">';
        for my $section (qw{thead}) {
                print "<$section><tr><th>↳";
@@ -38,35 +34,30 @@ my $cc = do 'countries.inc.pl';
                                next;
                        };
                        my ($name, $class, $short, $ref) = @$country;
+                       $name .= " → $ref" if $ref;
                        $ref ||= $code;
-                       local $_ = $ref;
+                       my $cell;
                        if (exists $get{show}) {
-                               my $img = "flag/$ref.png";
-                               $_ = sprintf '<img src="/%s" alt="%s">', $img, $ref if -e $img;
+                               sub showflag {
+                                       my ($cc) = @_;
+                                       my $img = "data/flag/$cc.png";
+                                       return -e $img &&
+                                               sprintf '<img src="/%s" alt="%s">', $img, $cc;
+                               }
+
+                               $cell = showflag($code) // join(' ',
+                                       map { showflag($_) || $_ } split(/ /, $ref)
+                               );
                        }
                        else {
-                               $_ = $short || $name;
-                               s/,.*//;
-                               s/(?<=.)\(.*\)\s*//;
-                               s/ republic\b//gi;
-                               s/ islands?\b//gi;
-                               s/\bthe //g;
-                               s/ and / & /g and s/(?<=.)[a-z ]+//g;
-                               s/\bsaint /st /gi;
-                               s/South(?:ern)? /S-/g;
-                               s/North(?:ern)? /N-/g;
-                               s/New /n./g;
-                               s/(\S)(\S+)-/$1-/g;  # strip most chars preceding dash
-                               s/(\S{4}[b-df-hj-np-tv-xz])((?<!Austr)(?!land)\w{2,})/$1./g;  # abbreviate (at consonant)
-                               $_ = EscapeHTML($_);
+                               $cell = EscapeHTML($short || $name);
                        }
-                       $name =~ s/([^,]*), (.*)/$2 $1/;
                        printf "\n".'<td class="%s" title="%s">%s',
-                               $_ ? 'X '.$class : '', EscapeHTML("$code: $name"), $_;
+                               $cell ? 'X '.$class : '', EscapeHTML("$code: $name"), $cell;
                }
                print "\n";
        }
-       print "</table>\n";
+       say '</table>';
 }
 
 :>
@@ -77,11 +68,13 @@ my $cc = do 'countries.inc.pl';
        <td class="X c-af">africa
        <td class="X c-eu">europe
        <td class="X c-as">asia
-       <td class="X c-aa">antarctica
+       <td class="X c-an">antarctica
        <td class="X c-oc">oceania
        <td class="X c-sa">south america
        <td class="X c-na">north america
-       <td class="">reserved
+       <td class="X Xr">reserved
+       <td class="X Xi">org
+       <td class="">free
        <td class="X Co">user-assigned
        </table>
 
@@ -96,14 +89,26 @@ my $cc = do 'countries.inc.pl';
        </div>
 </div>
 
-<p class="footer">
-       <a href="/" rel="home">sheet.shiar.nl</a>/countries.<a href="/source/countries.plp"
-        rel="code" title="Written in Perl">plp</a>
-       <a href="http://git.shiar.nl/sheet.git/history/HEAD:/countries.plp"
-        rel="vcs-git" title="Git repository"><:= $VERSION :></a>
-       created by <a href="http://shiar.nl/" rel="author">Shiar</a> •
-       <a href="http://www.fsf.org/licensing/licenses/agpl-3.0.html" rel="copyright"
-        title="Licensed under the GNU Affero General Public License, version 3">AGPLv3</a>
-</p>
+<: exit unless exists $get{v}; :>
+<script type="text/javascript"><!--
+       const table = document.querySelector('.ccmap');
+       const label = Array.prototype.map.call(table.tHead.rows[0].children, i => i.textContent);
+       const flagchr = 0x1F1E5; // regional indicator symbol letter base
+       let nowidth;
+       for (let row = 0; row < label.length; row++) {
+               for (let col = 0; col < label.length; col++) {
+                       let cell = table.rows[row].cells[col];
+                       if (!cell.className) continue;
+                       let flag = String.fromCodePoint(flagchr + row) + String.fromCodePoint(flagchr + col);
+                       cell.innerHTML = `<big>${flag}</big>&nbsp;` + cell.innerHTML;
+                       if (nowidth === undefined) {
+                               // assume AA is invalid, compare its size to validate following glyphs
+                               nowidth = cell.firstChild.offsetWidth;
+                       }
+                       if (cell.firstChild.offsetWidth == nowidth) {
+                               cell.firstChild.remove();
+                       }
+               }
+       }
+//--></script>
 
-</html>