class Footnotes
       FOOTNOTE_HEADER = '@footnotes:'
       FOOTNOTE_HEADER_REGEXP = %r(^#{FOOTNOTE_HEADER})

       def initialize
               @cnt = 0
               @table = {}
       end

       def handle_text_block()
               r = /\[(\d+)\]/
               # process file ...
               while line = @file.gets
                       # unless footnote marker is found
                       return if line.match(FOOTNOTE_HEADER_REGEXP)
                       # change line's footnotes
                       line.gsub!(r) do |m|
                               # on first occurence:
                               # save old footnote with count in table
                               @table[m] = @cnt += 1 unless @table[m]
                               # return new footnote for replacement
                               "[#{@table[m]}]"
                       end
                       # print line with line ending
                       puts line
               end
       end

       def handle_footnotes()
               footnotes = {}
               r = /^(\[\d+\])/
               while line = @file.gets
                       old_note = line[r, 1] # extracts [22]
                       # skip if nothing was found
                       next unless old_note
                       new_note = @table[old_note]
                       # skip if nothing was found
                       next unless new_note
                       footnotes[new_note] = line[old_note.length..-1]
               end
               # print sorted footnotes
               footnotes.sort.each { |idx,ref| print "[#{idx}]#{ref}" }
       end

 # takes filename or nil (STDIN)
       def run(file = nil)
               @file = file ? File.open(file, 'r') : STDIN
               handle_text_block
               puts FOOTNOTE_HEADER
               handle_footnotes
   @file.close
       end
end

if __FILE__==$0
 # run Footnotes if file is executed
 Footnotes.new.run(ARGV.shift)
end