#!/usr/bin/awk -f

# Initialisierung
#
# "lbrk" und "rbrk" werden als temporäre Ersatzstrings für die
# eckigen Klammern benutzt, wenn die originalen Fussnoten ersetzt
# werden, um doppelte Ersetzungen zu verhindern. Am Schluss werden
# diese Strings wieder durch die eckigen Klammern ersetzt.
BEGIN {
 maintext=1;
 count=1;
 lbrk="a192aedadac29bdc8ec296f267222d17"
 rbrk="8ea03e15e3312e78ce9278b05acd1af0"
}
/a192aedadac29bdc8ec296f267222d17/ {
 print "lbrk ist im Text enthalten, bitte Skript anpassen...";
 exit;
}
/8ea03e15e3312e78ce9278b05acd1af0/ {
 print "rbrk ist im Text enthalten, bitte Skript anpassen...";
 exit;
}

# Start des Fussnotenbereichs
/^@footnotes:/ {
 maintext = 0;
}

# Verarbeitung des Haupttextes
maintext == 1 {

 # Zeilen an "[" aufsplitten (potentielle Fussnotenfundstellen)
 num = split($0, array, "[");
 for (idx=1; idx<=num; idx++) {

   # Nur wenn auch "]" auftaucht, könnte es eine Fussnote sein
   if (match(array[idx], "]")) {

     # Nur wenn nur Zahlen zwischen "[" und "]" stehen, ist es eine
     footnote = substr(array[idx], 1, RSTART-1);
     if (footnote == sprintf("%d", footnote) ) {
       # Falls diese Referenz noch nie aufgetaucht ist, wird
       # eine neue Zuordnung alt -> neu in a_footnote gespeichert
       if (a_footnote[footnote] == 0) {
         a_footnote[footnote] = count;
         count++;
       }

       # Ersetzen der alten durch die neue Referenz
       gsub("\\[" footnote "\\]", lbrk a_footnote[footnote] rbrk);
     }
   }
 }

 # Ersetzen der temporären Ersatzstrings für die eckigen Klammern
 gsub(lbrk, "[");
 gsub(rbrk, "]");

 print $0;
}

# Verarbeitung des Fussnotenbereichs
/^\[[0-9]+\]/ && (maintext == 0) {
 # Extrahieren der alten Fussnote
 footnote = substr($1, 2, length($1)-2);

 # Extrahieren des zugehörigen Fussnotentextes
 footnotetext = substr($0, length($1)+2);

 # Speichern des Fussnotentextes in einem Array mit der neuen Numerierung
 a_footnotetext[a_footnote[footnote]] = footnotetext;
}

# Ausgabe der sortierten Fussnoten
END {
 print "@footnotes:\n";
 for (idx=1; idx<count; idx++) {
   printf("[%d] %s\n", idx, a_footnotetext[idx]);
 }
}