#!/usr/bin/python
import sys
import re
def mkMap(lst):
return dict([(ref, "[%d]" % (n+1)) for n, ref in enumerate(lst)])
def asNum(line):
try:
key = int(line[1:].split(']', 1)[0])
except:
key = line or None # If line looks wrong, just return the raw line
return key
def footnote(in_s, usebody=False):
# compile regexps
my_re1 = re.compile(r"\[\d+\]")
my_re2 = re.compile(r"(\[\d+\])")
foot_split = "\n@footnote:\n"
body, foots = in_s.split(foot_split)
links = list(set(my_re1.findall(body)))
targets = list(set(my_re1.findall(foots)))
mapping = mkMap(links if usebody else targets) # Ref order of body xor foots
# Replace source->target footnote numbers
def numsub(m):
return mapping.get(m.group(1), "not_found")
body = my_re2.sub(numsub, body )
foots = my_re2.sub(numsub, foots)
# May need to reorder target lines in foots
if usebody:
foots = '\n'.join(sorted(foots.splitlines(), key=asNum))
return body + foot_split + "\n" + foots.strip()
def main():
print footnote(sys.stdin.read(), usebody='-a' in sys.argv[1:])
if __name__ == '__main__':
main()