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