1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#!/usr/bin/env perl
use strict;
use warnings;
while (<>) {
print;
last if /^[.]Sh STANDARDS$/;
}
my ($ref, @refs);
while (<>) {
next if /^[.](Bl|It|$)/;
last if /^[.]El$/;
if (/^[.]Rs$/) {
$ref = {};
} elsif (/^[.]%(.) (.*)/) {
$ref->{$1} = [] unless $ref->{$1};
push @{$ref->{$1}}, $2;
} elsif (/^[.]Re$/) {
push @refs, $ref;
} else {
print;
}
}
sub byLast {
my ($af, $al) = split /\s(\S+)(,.*)?$/, $a;
my ($bf, $bl) = split /\s(\S+)(,.*)?$/, $b;
($al // $af) cmp ($bl // $bf) || $af cmp $bf;
}
foreach $ref (@refs) {
@{$ref->{A}} = sort byLast @{$ref->{A}};
@{$ref->{Q}} = sort @{$ref->{Q}} if $ref->{Q};
if ($ref->{N} && $ref->{N}[0] =~ /RFC/) {
$ref->{R} = $ref->{N};
delete $ref->{N};
}
if ($ref->{R} && $ref->{R}[0] =~ /RFC (\d+)/ && !$ref->{U}) {
$ref->{U} = ["https://tools.ietf.org/html/rfc${1}"];
}
}
sub byAuthor {
my ($ta, $tb) = ($a->{T}[0], $b->{T}[0]);
local ($a, $b) = ($a->{A}[0], $b->{A}[0]);
byLast() || $ta cmp $tb;
}
{
local ($,, $\) = (' ', "\n");
print '.Bl', '-item';
foreach $ref (sort byAuthor @refs) {
print '.It';
print '.Rs';
foreach my $key (qw(A T B I J R N V U P Q C D O)) {
next unless $ref->{$key};
foreach (@{$ref->{$key}}) {
print ".%${key}", $_;
}
}
print '.Re';
}
print '.El';
}
while (<>) {
print;
}
|