#!/usr/bin/perl -w
#
# syntax: perl footnotes.pl sample4.txt > new.txt

use strict;

$|=0;

if (!@ARGV){
    print "usage: $0 old.txt > new.txt\n";
    exit 1;
}

my @broken;
my %mapindex;
my %txtindex;
my $stopp = 0;
my $count = 0;
my $msg = 'WARNING: footnote not defined!';

while (<>) {
    if ($stopp) {
        if ( /\[ (\d+) \] (.*)/x ) {
            $txtindex{$1} = $2;
        }
        next;
    }
    if ( /^\@footnotes:$/ ) {
        $stopp = 1;
        print $_;
        next;
    }
    while ( s/^ (.*?) \[ (\d+) \]//x ) {
        print $1;
        if ( exists $mapindex{$2} ) {
            print '[' . $mapindex{$2} . ']';
            next;
        }
        $mapindex{$2} = ++$count;
        print '['. $count. ']';
    }
    print $_;
}

for my $key ( sort { $mapindex{$a} <=> $mapindex{$b} } keys %mapindex ) {
    if ( exists $txtindex{$key} ) {
        printf ("[%s]%s\n", $mapindex{$key}, $txtindex{$key});
    }
    else {
        printf ("[%s] %s (old ref no %s)\n", $mapindex{$key}, $msg, $key);
        push (@broken, $mapindex{$key});
    }
}

if (@broken) {
    print STDERR "broken footnote(s): ", join(', ', @broken), "\n";
}

exit 0;

# eof
