#!/usr/bin/awk -f

# This AWK script implements the second variant.
# It renumbers the footnotes in the text and then reorders the footnote descriptions.
# Renumbering happens line per line, but sorting of footnotes needs an array.
#
# usage: ./footnotes.awk < sample4.txt

BEGIN {
       ORS = ""
       footnotesSection = 0;
       footnoteCounter = 1;
       lastSortedFootnote = 0;
}

/^@footnote:$/ {
       footnotesSection = 1;
       next;
}

# matches lines with footnotes in the main text
/\[[0-9]+\]/ && footnotesSection == 0 {
       scannerOffset = 1;
       footnoteStartOffset = 1;

       while(0 != (footnoteStartOffset = match(substr($0, scannerOffset), "\\[[0-9]+\\]"))) {

               print substr($0, scannerOffset, footnoteStartOffset -1);

               footnoteStartOffset = footnoteStartOffset + scannerOffset - 1;
               footnoteStopOffset = index(substr($0, footnoteStartOffset), "]");

               footnote = substr($0, footnoteStartOffset + 1, footnoteStopOffset - 2);
               if(footnote in footnoteMap) {
                       print "[" footnoteMap[footnote] "]";
               } else {
                       print "[" footnoteCounter "]";
                       footnoteMap[footnote] = footnoteCounter;
                       footnoteCounter++;
               }

               scannerOffset = footnoteStartOffset + footnoteStopOffset;
       }

       print substr($0, scannerOffset) "\n";
       next;
}

# matches lines with footnotes in the footnote section
/^\[[0-9]+\]/ && footnotesSection == 1 {
       footnote = substr($0, 2, index($0, "]") - 2);
       lastSortedFootnote = footnoteMap[footnote];
       footnoteContainer[lastSortedFootnote] = "[" lastSortedFootnote "]" substr($0, index($0, "]") + 1) "\n";
       next;
}

# matches lines without footnotes in the main text
// && footnotesSection == 0 {
       print $0 "\n";
       next;
}

# matches lines without footnotes in the footnote section
// && footnotesSection == 1 {
       footnoteContainer[lastSortedFootnote] = footnoteContainer[lastSortedFootnote] $0 "\n";
       next;
}

# print sorted footnote section
END {
       print "@footnote:\n";
       for (x = 0; x < footnoteCounter; x++) {
               if(length(footnoteContainer[x]) == 0) {
                       print "[" x "] \n";
               } else {
                       print footnoteContainer[x];
               }
       }
}