chiark / gitweb /
numbered-alias-sheet: domain common suffix extraction
[evade-mail-usrlocal.git] / numbered-alias-sheet
index 0cdc738d93174299b10d5d62520871d258edf25a..d27c9f0bb93b90535394779043dd5e00bc52edc0 100755 (executable)
@@ -60,6 +60,7 @@ sub min {
 
 my $fontname_re = '[^()\\,]+';
 my $dbl_re = '(?:[0-9]+\.?|[0-9]*\.[0-9]+)';
+my $dom_re = '\@.*$';
 
 for (;;) {
     badusage unless @ARGV;
@@ -122,6 +123,7 @@ if (!@paperpts) {
 @ARGV >= 2 or badusage;
 
 our @strings;
+our $domain_suffix;
 
 sub readstrings () {
     my $nlen = 0;
@@ -134,15 +136,27 @@ sub readstrings () {
        push @strings, [ $1, $2 ];
     }
     $!=0; $?=0; close P or die "$us: generator failed: $! $?\n";
+
+    @strings or die "$us: nothing to show\n";
+
+    if ($strings[0][1] =~ m/$dom_re/o) {
+       my $dom = $&;
+       if (!grep { $_->[1] !~ m/$dom_re/o && $& eq $dom } @strings) {
+           $domain_suffix = $dom;
+           $_->[1] =~ s/$dom_re//o foreach @strings;
+       }
+    }
 }
 
 our @lp_values;
 our @numbers_metr;
 our @texts_metr;
+our @domain_metr;
 our $gap_width;
 our $colgap_width;
 our @core_size;
 our @item_size;
+our $domain_vsize;
 our $rotate_paper;
 our @eff_paper_size;
 
@@ -160,6 +174,7 @@ sub psstring ($) {
 our @numbers_1_metr;
 our @nom_gap_1_metr;
 our @texts_1_metr;
+our @domain_1_metr;
 
 sub prepare_metrics () {
     print DEBUG " prepare_metrics\n";
@@ -169,6 +184,9 @@ sub prepare_metrics () {
         [ \@nom_gap_1_metr, $fontname_num, ' '                      ],
         [ \@texts_1_metr,   $fontname,     map { $_->[1] } @strings ],
        );
+    if (defined $domain_suffix) {
+       push @sets, [ \@domain_1_metr, $fontname, $domain_suffix ];
+    }
     if (!$pchild) {
        foreach my $set (@sets) {
            my ($ra, $fn, @s) = @$set;
@@ -256,6 +274,10 @@ sub do_layout_recursive_search ($) {
        if (!$coord) {
            $each += $colgap_width;
            $avail += $colgap_width;
+       } else {
+           if (defined $domain_suffix) {
+               $avail -= $domain_vsize;
+           }
        }
        $lp_y{$coord} = floor($avail / $each);
        $lp_y{$coord} >= 1 or return wontfit "cannot fit even one $coord";
@@ -286,11 +308,14 @@ sub do_layout ($) {
     $gap_width = $gapratio * $fontsize * $nom_gap_1_metr[4];
     $colgap_width = $gap_width * 2;
     @texts_metr = map { $_ * $fontsize } @texts_1_metr;
+    @domain_metr = map { $_ * $fontsize } @domain_1_metr;
 
     $core_size[0] = $numbers_metr[4] + $gap_width + $texts_metr[4];
 
     $core_size[1] = $lineratio * $fontsize;
 
+    $domain_vsize = $lineratio * $fontsize;
+
     return do_layout_recursive_search 0;
 }
 
@@ -323,7 +348,7 @@ sub determine_size_layout () {
     $lp_y->{f} = $usesz;
     
     print DEBUG Dumper($usesz, \@lp_values, \@numbers_metr,
-                      \@texts_metr, $gap_width, \$colgap_width, \@core_size,
+                      \@texts_metr, $gap_width, $colgap_width, \@core_size,
                       \@item_size, \@eff_paper_size,
                       $lp_y);
 }
@@ -355,20 +380,51 @@ sub write_output () {
        prf "0 %s translate\n", -$eff_paper_size[1];
     }
     my $rows = ceil(@strings / $lp_y->{0});
+    my @cell_size;
+
+    $cell_size[0] = ($eff_paper_size[0] + $colgap_width) / $lp_y->{0};
+    $cell_size[1] = ($eff_paper_size[1] +
+                    (defined $domain_suffix ? -$domain_vsize : 0)
+                    ) / $rows;
+
+    prf "/rightadjust { dup stringwidth pop neg 0 rmoveto } bind def\n";
 
     foreach my $nums (qw(1 0)) {
        prf("%s findfont %s scalefont setfont\n",
            psstring($nums ? $fontname_num : $fontname),
            $lp_y->{f});
+       prf "%s setlinewidth\n", $gap_width * 0.1;
        print DEBUG "nums? $nums rows=$rows\n";
        foreach my $col (0..$lp_y->{0}-1) {
+           my $col_lhs = $cell_size[0] * $col;
+           if ($col > 0 && $nums) {
+               prf "newpath %s ", $col_lhs - $colgap_width*0.5;
+               prf "%s moveto ", $eff_paper_size[1];
+               prf "0 %s rlineto ", -$cell_size[1] * $rows;
+               prf "stroke\n";
+           }
            foreach my $row (0..$rows-1) {
                my $se = $strings[$col*$rows + $row];
                next unless $se;
-               prf "%s ", ($item_size[0] + $colgap_width) * $col
-                   + ($nums ? 0 : $numbers_metr[4] + $gap_width);
-               prf "%s ", $eff_paper_size[1] - $item_size[1] * ($row + 1);
-               prf "moveto %s show\n", psstring($se->[!$nums]);
+               prf "newpath ";
+               prf "%s ", $col_lhs 
+                   + ($nums ? $numbers_metr[4]
+                      : $numbers_metr[4] + $gap_width);
+               prf "%s ", $eff_paper_size[1] - $cell_size[1] * $row
+                   - $core_size[1];
+               prf "moveto %s ", psstring($se->[!$nums]);
+               if ($nums) {
+                   prf "rightadjust ";
+               }
+#              prf " gsave 10 10 rlineto stroke grestore\n";
+               prf "show\n";
+           }
+       }
+       if (!$nums) {
+           if (defined $domain_suffix) {
+               prf "%s 0 moveto", $eff_paper_size[0];
+               prf "%s ", psstring($domain_suffix);
+               prf "rightadjust show\n";
            }
        }
     }