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

""" Indices für gewünschte 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 gewünschter 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():
    filename = "footnotes.txt"
    positions, ref_idx, foot_idx = build_index(filename)
    write(positions, ref_idx, filename)   
    write(positions, foot_idx, filename)

if __name__ == "__main__":
    main()
