#!/usr/bin/env tclsh8.5
#
# Renumber references and sort appendix
#
# (c) 2008 Michael Schlenker
#
# Handle the problem in multiple passes.
# 1. Find numbered footnotes and create renumbered mapping
# 2. Apply mapping to all numbers
# 3. Sort the footnote appendix and memorize indices
# 4. Output the head part, than iterate over the appendix
#

# we use Tcl 8.5 features
package require Tcl 8.5
# import +/-
namespace path ::tcl::mathop

proc main {file} {
   set fd [open $file]
   fconfigure $fd    -encoding iso8859-15
   fconfigure stdout -encoding iso8859-15
   set data [renumber [read $fd]]
   close $fd
   lassign [sort_appendix $data] first parts

   # dump the head part
   puts [string range $data 0 $first]
   # output the footnote appendix
   foreach item $parts {
       lassign $item no start end
       puts [format "\[%d\] %s" $no [string range $data $start $end]]
   }
}

proc renumber {data} {
   set map [dict create]
   foreach item [regexp -all -inline {\[\d+\]} $data] {
       if {! [dict exists $map $item] } { dict set map $item "\[[incr count]\]"}
   }
   string map $map $data
}

proc sort_appendix {data} {
  # find appendix
  set mark [string last "@footnote:" $data]
  # find entries
  foreach {full part} [regexp -start $mark -all -inline -indices {\n\[(\d+)\]} $data] {
      lassign $full end start
      set end [+ $end -1]
      set start [+ $start 2]
      if {[info exists item]} {
          lappend items [list $item $oldstart $end]
      } else {
          # first entry
          set first $end
      }
      set oldstart $start
      set item [string range $data {*}$part]
  }
  # last entry, up to end of file
  lappend items [list $item $oldstart [- [string length $data] 2]]
  return [list $first [lsort -index 0 -integer $items]]
}

main [lindex $argv 0]