##Eskil Plugin : Compare files after sorting lines
## Flag -sortwords : Sort words within each line first.
## Flag -nospace : Ignore space
#
# This plugin compares files after sorting the lines in each side
# Example file for a plugin.
# A plugin's first line must start exactly like this one.
# The text after : is the summary you can get at the command line
# A plugin may declare command line options that should be allowed through
# to ::argv
# A plugin must define this procedure to do the job.
# side: left or right
# chi: An input channel for reading the original file.
# cho: An output channel for writing the processed file.
proc PreProcess {side chi cho} {
# Look for parameters in command line
set opts(-sortwords) 0
set opts(-nospace) 0
set i [lsearch -exact $::argv "-sortwords"]
if {$i >= 0} {
set opts(-sortwords) 1
}
set i [lsearch -exact $::argv "-nospace"]
if {$i >= 0} {
set opts(-nospace) 1
}
set data [read $chi]
set endingNewLine 0
if {[string index $data end] eq "\n"} {
set data [string range $data 0 end-1]
set endingNewLine 1
}
set lines [split $data \n]
if {$opts(-sortwords)} {
set newlines {}
foreach line $lines {
# Extract words
set words [regexp -all -inline {\w+} $line]
set words [lsort -dictionary $words]
lappend newlines [join $words]
}
set lines $newlines
}
if {$opts(-nospace)} {
set sortlines {}
foreach line $lines {
set nospace [regsub -all {\s+} $line ""]
lappend sortlines [list $nospace $line]
}
set sortlines [lsort -dictionary {*}$::Info -index 0 $sortlines]
set lines {}
foreach line $sortlines {
lappend lines [lindex $line 1]
}
} else {
# Allow sort parameters in info
set lines [lsort -dictionary {*}$::Info $lines]
}
puts -nonewline $cho [join $lines \n]
if {$endingNewLine} {
puts $cho ""
}
# Signal that the file after processing should be used both
# for comparison and for displaying.
return 1
}