#!/usr/bin/ruby # orders footnotes by first occurence # Urs Meyer, ursmr [at] gmx.ch, September 2008 filename = ARGV[0] || "sample4.txt" mapping = {} newref = 0 lines = [] File.foreach(filename) { |line| if ($. == 1) .. line =~ /@footnote:/ # text body line.scan(/\[(\d+)\]/).flatten.each { |ref| mapping[ref] = (newref += 1) if mapping[ref].nil? } # print text body now as footnote mapping is known puts line.gsub(/\[(\d+)\]/) { "[#{mapping[$1]}]" } else # footnote targets # collect targets sorted in an array line =~ /\[(\d+)\]/ lines[mapping[$1]] = line.sub(/\[(\d+)\]/) { "[#{mapping[$1]}]" } unless $1.nil? || mapping[$1].nil? end } # print targets lines.each { |line| puts line unless line.nil? }