#!/usr/bin/env perl
# Randall array
use strict;
use constant {
USED => 0,
DEFINED => 1,
DEFINITION => 2
};
my $ORDER_BY = USED;
#my $ORDER_BY = DEFINED;
my @parsed;
my %mapping; # mapping of digits
{
my $counter = 1;
while (<>) {
if (/^\@footnotes?:/) {
push @parsed, $_;
last;
}
while (s/^ (.*?) \[ (\d+) \]//x) {
push @parsed, $1;
push @parsed, $mapping{$2} ||= [$counter++];
}
push @parsed, $_;
}
}
die "missing footer" if eof;
{
my $counter = 1;
while (<>) {
my ($number, $text) = /^ \[ (\d+) \] (.*)/x
or (push @parsed, $_), next;
my $item = $mapping{$number} or
warn("ignoring unused note: $_"), next;
$item->[DEFINED] = $counter++;
$item->[DEFINITION] = $text;
}
}
for my $item (@parsed) {
if (ref $item) {
printf '[%s]', $item->[$ORDER_BY];
} else {
print $item;
}
}
for my $itemkey (sort {
$mapping{$a}[$ORDER_BY] <=> $mapping{$b}[$ORDER_BY]
} keys %mapping) {
my $value = $mapping{$itemkey};
printf "[%s]%s\n", $value->[$ORDER_BY], $value->[DEFINITION];
}