#!/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]);
  }
}
