String fileName = ""
Boolean sortByTextAppearance = false, argsOk=false
String errorText="Usage groovy OrderFootnotes.groovy [option] filename\noption: -t: order footnotes by text appearance"
if( args ){
    if( args.size() == 2 ){
        argsOk=true
        args.each{ String arg ->
            if( arg=="-t" ){
                sortByTextAppearance = true 
            } else { 
                fileName = arg 
            }
        }
    } else if( args.size() == 1 ){
        argsOk=true
        fileName = args[0]
    }
}
if( ! argsOk ){
    println errorText
    return
}
Map<String,String> mapOldNewNumber = [:]
FileReader fr = new FileReader(fileName)
Map<String,Long> footnoteNumbers = [:]
Set footnoteSet = []
if( sortByTextAppearance ){
	if(fr.ready()){
		Boolean isFootnotes = false
		long newCount = 0
		fr.eachLine{ String line ->
			String parsed = ""
			Long startIndex = 0
			line.eachMatch(/\[[0-9]+\]/){ number ->
				long tmpNumber = Long.valueOf(number[0].replaceAll(/[\[\]]/,""))
				if( isFootnotes ){
					footnoteNumbers[mapOldNewNumber[tmpNumber]] = line - number[0]
				} else {
					long tmpCount = mapOldNewNumber[tmpNumber]
					if( ! tmpCount ){
						tmpCount = mapOldNewNumber[tmpNumber] = ++newCount
					}
					parsed += line[startIndex..<line.indexOf("[${tmpNumber}]")]
					parsed += "[$tmpCount]"
					startIndex = (line.indexOf("[${tmpNumber}]") + "[${tmpNumber}]".size() )
				}
			}
			if ( line ==~ /@footnote:/ && ! isFootnotes ) {
				isFootnotes = true
				println line
			}
			if( ! isFootnotes ) 
				println "${parsed}"
		}
		fr.close()
	} else { 
		println errorText 
		return
	}
} else {
	if(fr.ready()){
		Boolean isFootnotes = false
		long newCount = 0
		fr.eachLine{ String line ->
			if( isFootnotes ){
				line.eachMatch(/\[[0-9]+\]/){ number ->
					long tmpNumber = Long.valueOf(number[0].replaceAll(/[\[\]]/,""))
					footnoteNumbers["${++newCount}"] = line - number[0]
					mapOldNewNumber["${tmpNumber}"] = newCount
				} 
			}
			if ( line ==~ /@footnote:/ && ! isFootnotes ) 
				isFootnotes = true
		}
		fr.close()
		fr = new FileReader(fileName)
		isFootnotes = false
		fr.eachLine{ String line ->
			if ( line ==~ /@footnote:/ && ! isFootnotes ) {
				isFootnotes = true
				println line
			}
			if( ! isFootnotes ){	
				Long startIndex = 0
				String parsed = ""	
				line.eachMatch(/\[[0-9]+\]/){ number ->
					long tmpNumber = Long.valueOf(number[0].replaceAll(/[\[\]]/,""))
					long replaceNum = mapOldNewNumber["$tmpNumber"]
					parsed += line[startIndex..<line.indexOf("[$tmpNumber]")]
					parsed += "[$replaceNum]"
					startIndex = (line.indexOf("[$tmpNumber]") + "[$tmpNumber]".size())
				}
				println parsed
			}
		}
    		fr.close()
	} else { 
		println errorText 
		return
	}
}
println footnoteNumbers.entrySet().sort{Long.valueOf(it.key)}.collect{"[${it.key}] ${it.value}"}.join("\n")