git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3251 c06c8d41-db1a-0410-9941-cceddc491573
EPQKWAF3HH5NNZXDKCF7BCHXXXVHKI37XXPPLRMWZZ5SNTYRT7IQC
UWSQBOM7ZCQBPKCTDQRVFFVIK4OTVW7IJSH3F4U52VBWXSK5L4RAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
5UYUTXYWSIP5DCQOSPW2AVNZO6RHJ2BE7JZ2WLISST22UY2LLMCQC
RVST2QHYJ757ZHK4AUJ5NGPDZ44AD6RVFVXYPKQIBJXZBDNUCHXQC
MWHMD65QP6UKXO6Q4ZVEAMXY563AJ6KH7J6UEZOB5CRPPSRB762QC
#!/usr/bin/perl
use strict;
use warnings;
my $NAMEHEAD = qr/contributed to .*Stone Soup:\s*$/;
open my $inf, '<', 'CREDITS' or die "Unable to read CREDITS: $!\n";
my @text = <$inf>;
close $inf;
my @recol = recolumnise(@text);
for (@text) {
print;
if (/$NAMEHEAD/o) {
print "\n";
print @recol, "\n";
last;
}
}
sub last_word {
my $s = shift;
my ($word) = $s =~ /.* (\S+)$/;
$word ||= $s;
lc($word)
}
sub recolumnise {
my @text = @_;
my @columns;
for (@text) {
push @columns, $_ if (/$NAMEHEAD/o .. undef);
}
# Discard header lines:
splice @columns, 0, 2;
my @names = sort { last_word($a) cmp last_word($b) } extract_names(@columns);
my @recol = resplit(3, @names);
@recol
}
sub pad_column {
my ($rcol, $size) = @_;
my $maxlen;
for (@$rcol) {
$maxlen = length() if !$maxlen || length() > $maxlen;
}
$maxlen += 6;
$maxlen = $size if $maxlen < $size;
@$rcol = map { $_ . (" " x ($maxlen - length())) } @$rcol;
}
sub resplit {
my ($ncols, @names) = @_;
my $colsize = @names / $ncols;
$colsize++ if @names % $ncols;
my @columns;
my $start = 0;
for (1 .. ($ncols - 1)) {
push @columns, [ @names[ $start .. ($start + $colsize - 1) ] ];
$start += $colsize;
}
push @columns, [ @names[ $start .. $#names ] ];
my $stop = 80 / $ncols;
pad_column($_, $stop) for @columns;
my @out;
for my $row (1 .. $colsize) {
push @out, join("", map { $columns[$_ - 1][$row - 1] || '' } 1 .. $ncols);
}
s/^\s+//, s/\s+$//, $_ .= "\n" for @out;
@out
}
sub extract_names {
my @cols = @_;
my @names;
for my $line (@cols) {
push @names, ($line =~ /((?:\S+ )*\S+)/g);
}
@names
}