#!/usr/bin/ruby
# orders the targets
# reads the file twice, uses just a little memory
# Urs Meyer, ursmr [at] gmx.ch, September 2008

filename = ARGV[0] || "sample4.txt"

# pass 1: collect footnote targets, map to new reference numbers

mapping = {}
newref = 0

File.open(filename).each_line { |line|
   # start processing after marker line
   unless ($. == 1) .. line =~ /@footnote:/
       line =~ /\[(\d+)\]/
       mapping[$1] = (newref += 1) unless $1.nil?
   end
}

# pass 2: substitute footnote references

File.open(filename).each_line { |line|
   puts line.gsub(/\[(\d+)\]/) { "[#{mapping[$1]}]" }
}