diff options
author | June McEnroe <june@causal.agency> | 2020-12-15 23:52:37 -0500 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2020-12-15 23:52:37 -0500 |
commit | 94f14c5bb6d85ae56b8442dd9fae6b724547c9b9 (patch) | |
tree | a2210b871c036bd9b44367d0c2f33ef8a305829e /bin/bibsort.pl | |
parent | Add modem -r flag to set baud rate (diff) | |
download | src-94f14c5bb6d85ae56b8442dd9fae6b724547c9b9.tar.gz src-94f14c5bb6d85ae56b8442dd9fae6b724547c9b9.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 '')
-rw-r--r-- | bin/bibsort.pl | 66 |
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; +} |