77 lines
1.5 KiB
Tcl
Executable File
77 lines
1.5 KiB
Tcl
Executable File
#!/usr/bin/env tclsh
|
|
# vim:se syn=tcl:
|
|
|
|
set filename [lindex $argv 0]
|
|
set f [open $filename]
|
|
|
|
# Read the file looking for command definitions
|
|
set lines {}
|
|
set commands {}
|
|
array set cdict {}
|
|
set c 0
|
|
|
|
while {[gets $f buf] >= 0} {
|
|
if {[string match "~~*" $buf]} {
|
|
if {[string match "*: *" $prev]} {
|
|
incr c
|
|
set target cmd_$c
|
|
set lines [linsert $lines end-1 "\[\[$target\]\]"]
|
|
set prevlist [split $prev ", "]
|
|
} else {
|
|
set target _[string map {:: _} $prev]
|
|
set prevlist [list $prev]
|
|
}
|
|
foreach cmd $prevlist {
|
|
set cmd [string trim $cmd :]
|
|
if {[regexp {^[a-z.:]+$} $cmd]} {
|
|
lappend commands [list $cmd $target]
|
|
set cdict($cmd) $target
|
|
}
|
|
}
|
|
}
|
|
lappend lines $buf
|
|
set prev $buf
|
|
}
|
|
close $f
|
|
|
|
# Build the command index in the list: $index
|
|
lappend index {[frame="none",grid="none"]}
|
|
lappend index {|=========================}
|
|
set i 0
|
|
set row {}
|
|
foreach command [lsort $commands] {
|
|
lassign $command cmd target
|
|
|
|
append row "|<<$target,*`$cmd`*>> "
|
|
incr i
|
|
if {$i % 8 == 0} {
|
|
lappend index $row
|
|
set row {}
|
|
}
|
|
}
|
|
while {$i % 8 != 0} {
|
|
incr i
|
|
append row "| "
|
|
}
|
|
lappend index $row
|
|
lappend index {|=========================}
|
|
|
|
# Map all `cmd` to <<$target,`cmd`>>
|
|
set mapping {}
|
|
foreach c [array names cdict] {
|
|
lappend mapping `$c` <<$cdict($c),*`$c`*>>
|
|
lappend mapping "`$c " "<<$cdict($c),*`$c`*>> `"
|
|
}
|
|
|
|
# And the command index
|
|
lappend mapping @INSERTINDEX@ [join $index \n]
|
|
|
|
# Output the result
|
|
foreach line $lines {
|
|
if {[string first ` $line] >= 0 || [string first @ $line] >= 0} {
|
|
puts [string map $mapping $line]
|
|
} else {
|
|
puts $line
|
|
}
|
|
}
|