49 lines
1.4 KiB
Tcl
49 lines
1.4 KiB
Tcl
package require Tcl 8.5
|
|
|
|
set text {Given$a$text$file$of$many$lines,$where$fields$within$a$line$
|
|
are$delineated$by$a$single$'dollar'$character,$write$a$program
|
|
that$aligns$each$column$of$fields$by$ensuring$that$words$in$each$
|
|
column$are$separated$by$at$least$one$space.
|
|
Further,$allow$for$each$word$in$a$column$to$be$either$left$
|
|
justified,$right$justified,$or$center$justified$within$its$column.}
|
|
|
|
array set max {}
|
|
foreach line [split $text \n] {
|
|
set col 0
|
|
set thisline [split $line \$]
|
|
lappend words $thisline
|
|
foreach word $thisline {
|
|
set max([incr col]) [expr {[info exists max($col)]
|
|
? max($max($col), [string length $word])
|
|
: [string length $word]
|
|
}]
|
|
}
|
|
}
|
|
|
|
proc justify {word position width} {
|
|
switch -exact -- $position {
|
|
left {
|
|
return [format "%-*s" $width $word]
|
|
}
|
|
center {
|
|
set lpadw [expr {($width - [string length $word])/2}]
|
|
return [format "%s%-*s" [string repeat " " $lpadw] [incr width -$lpadw] $word]
|
|
}
|
|
right {
|
|
return [format "%*s" $width $word]
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach position {left center right} {
|
|
foreach thisline $words {
|
|
set col 0
|
|
set line ""
|
|
foreach word $thisline {
|
|
append line [justify $word $position $max([incr col])] " "
|
|
}
|
|
puts [string trimright $line]
|
|
}
|
|
puts ""
|
|
}
|