summary refs log tree commit diff
path: root/bin/bibsort.pl
blob: 89133c8734ce9a21e40acdeec05c73baad727ac4 (plain) (blame)
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
#!/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 cmp $bl || $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 {
	local ($a, $b) = ($a->{A}[0], $b->{A}[0]);
	byLast();
}

{
	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;
}
fferJune McEnroe 2022-02-20Clear edit buffer before running commandJune McEnroe 2022-02-20Show indicator in status when window has pending inputJune McEnroe 2022-02-20Use separate edit buffers for each IDJune McEnroe 2022-02-20Make sure new cap is actually larger than new lengthJune McEnroe 2022-02-20Remove unused mbs.len field from struct EditJune McEnroe 2022-02-19Remove unneeded includes in ui.cJune McEnroe 2022-02-19Reimplement tab completeJune McEnroe 2022-02-19Handle errors from editFn, etc.June McEnroe 2022-02-19Reimplement text macrosJune McEnroe 2022-02-19Factor out input handling to input.cJune McEnroe 2022-02-19Factor out window management to window.cJune McEnroe 2022-02-19Enable -Wmissing-prototypesJune McEnroe 2022-02-19Fix edit.[ch] license notice additional permissionsJune McEnroe 2022-02-19Run line editing testsJune McEnroe 2022-02-18Implement new line editing "library"June McEnroe 2022-02-18Simplify cursor positioning in inputJune McEnroe 2022-02-18Fix M-f orderingJune McEnroe 2022-02-12Move sandman build to scripts/MakefileJune McEnroe 2022-02-12Use compat_readpassphrase.c on LinuxJune McEnroe 2022-02-12Copy RPP defines from oconfigureJune McEnroe