#-*- coding: utf-8 -*-
import sys, re
regex = re.compile(r"\[(?P<idx>\d+)\]|(?P<footer>@footnote)")

""" Indices fuer gewuenschte Sortierungen aufbauen """
def build_index(filename):
   positions = {}
   foot_idx = {}
   ref_idx = {}
   footer = False
   fr = open(filename)
   for i, line in enumerate(fr.readlines()):
       for mo in regex.finditer(line):
           idx = mo.group("idx")
           if idx:
               start, end = mo.span("idx")
               #Im Fussnotenteil steht die Nummer immer am Zeilenanfang nach [
               if footer and start > 1:
                   continue
               #Jeder Zeile werden Koordinaten von Fussnotennummern Zugewiesen
               positions.setdefault(i,[]).extend((start, end))
               if footer:
                   foot_idx[idx] = len(foot_idx) + 1
               if idx not in ref_idx:
                   ref_idx[idx] = len(ref_idx) + 1
           else:
               assert mo.group("footer")
               footer = True
   fr.close()
   return positions, ref_idx, foot_idx

""" Datei in gewuenschter Sortierung ausgeben """
def write(positions, sort_idx, filename):
   fr = open(filename)
   for i, line in enumerate(fr.readlines()):
       pos = 0
       #Hier keine Regex. Ausgabezeile wird mit Zeilenindex zu Fuss aufgebaut.
       posis = positions.get(i)
       if posis:
           for p, nextpos in enumerate(posis):
               part = line[pos:nextpos]
               if p % 2 == 1:
                   part = sort_idx[part]
               print(part, end="")
               pos = nextpos
       print(line[pos:], end="")
   fr.close()

def main():
   options, input = _parse_args()
   filename = input
   positions, ref_idx, foot_idx = build_index(filename)
   write(positions, ref_idx, filename)
   write(positions, foot_idx, filename)

if __name__ == "__main__":
   main()