summary refs log tree commit diff
path: root/bin/bibsort.pl
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-12-15 23:52:37 -0500
committerJune McEnroe <june@causal.agency>2020-12-15 23:52:37 -0500
commitc401b3d4af2462e96aa327f1282e2882aa94609a (patch)
tree8c803064ffbb65a37882466a61cedb57de3457aa /bin/bibsort.pl
parentAdd modem -r flag to set baud rate (diff)
downloadsrc-c401b3d4af2462e96aa327f1282e2882aa94609a.tar.gz
src-c401b3d4af2462e96aa327f1282e2882aa94609a.zip
Add bibsort
My first perl script! hi doesn't have syntax highlighting for perl, and
I don't think I could sanely implement it, but oh well.
Diffstat (limited to 'bin/bibsort.pl')
-rw-r--r--bin/bibsort.pl66
1 files changed, 66 insertions, 0 deletions
diff --git a/bin/bibsort.pl b/bin/bibsort.pl
new file mode 100644
index 00000000..5f0ad7ba
--- /dev/null
+++ b/bin/bibsort.pl
@@ -0,0 +1,66 @@
+#!/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/, $a, 2;
+	my ($bf, $bl) = split /\s/, $b, 2;
+	$al cmp $bl || $af cmp $bf;
+}
+
+foreach $ref (@refs) {
+	@{$ref->{A}} = sort byLast @{$ref->{A}};
+	@{$ref->{Q}} = sort @{$ref->{Q}} if $ref->{Q};
+	next unless $ref->{N};
+	if ($ref->{N}[0] =~ /RFC/) {
+		$ref->{R} = $ref->{N};
+		delete $ref->{N};
+	}
+}
+
+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;
+}