[D. McC]: For those who want super-simple hypertext help with extremely little overhead, here's something that will do the job. It requires:
* At least Tk 8.4, to use the "-elide" flag for hiding the link markup tags. (With Tk 8.5, you can use the elegant "-all" flag for the text searches; with Tk 8.4, you can use the clunky code I wrote to substitute for the "-all" flag. Thanks to [HJG] for pointing out that you get an error if you try to use the "-all" flag with Tk 8.4.)
* A plain-text help file with uniquely named section titles (or other section identifiers), plus minimal markup for links with names that exactly replicate the section titles, like this:
Run Programs
----
set tko [package require Tk]
# Here's a proc to create the text box:
proc userhelp {} {
toplevel .uhelp
grid [text .uhelp.tx -width 65 -height 25 -bg white \
-yscrollcommand ".uhelp.roll set" \
-font "times 14" -wrap word -cursor top_left_arrow] \
-row 0 -column 0 -sticky news
grid [scrollbar .uhelp.roll -width 12 \
-command ".uhelp.tx yview"] -row 0 -column 1 -sticky news
grid [button .uhelp.close -text "Close" -borderwidth 6 \
-command {destroy .uhelp}] -row 1 -column 0 \
-columnspan 2 -sticky news
grid rowconfigure .uhelp 0 -weight 1
grid columnconfigure .uhelp 0 -weight 1
}
# Here's one to find links with Tk 8.4, which doesn't have
# the "-all" flag for text-widget searches:
proc findlinks {what} {
set ::present_place $::place
catch {set ::place [.uhelp.tx search -regexp \
-count countum "$what" "$::present_place +1c" end]}
if {$::place ne ""} {
lappend ::linklist $::place
lappend ::countlist $countum
findlinks $what
} else {
return [list $::linklist $::countlist]
}
}
# Here's one to get the text widget to display links and let the user see
# the uniquely named sections when the links are clicked
# (anybody who can make this one even simpler than it is, please let me know):
proc getlinks {} {
# Find beginnings and ends of all links:
if {$::tko > 8.4} {
set linkstars [.uhelp.tx search -regexp -all \
-count cti "" 1.0 end]
set linkends [.uhelp.tx search -regexp -all "" 1.0 end]
} else {
# Delete this code if you don't need to work with Tk 8.4
set ::place 1.0
set ::linklist [list]
set ::countlist [list]
set starlog [findlinks ""]
set linkstars [lindex $starlog 0]
set cti [lindex $starlog end]
set ::place 1.0
set ::linklist [list]
set ::countlist [list]
set endlog [findlinks ""]
set linkends [lindex $endlog 0]
unset ::linklist ::countlist ::present_place ::place
}
# Fix the links up to work:
for {set i 0} {$i < [llength $linkstars]} {incr i} {
set star [lindex $linkstars $i] ; # Begin link-start tag
set starleng [lindex $cti $i] ; # Length of link-start tag
set starsplit [split $star "."]
set starline [lindex $starsplit 0] ; # Line number in text
set starchar [lindex $starsplit end] ; # Position in line
# End of link-start tag:
set starend $starline.[expr {$starchar + $starleng}]
# Content of link-start tag:
set linkstar [.uhelp.tx get $star $starend]
set linkname [string trim $linkstar "<>"] ; # Link name
# Tag to hide link tags:
.uhelp.tx tag configure hide -elide 1
.uhelp.tx tag add hide $star $starend
# Add tag for clickable link between link-start and link-end tags:
set finis [lindex $linkends $i]
.uhelp.tx tag add $linkname $starend $finis
# And one to hide the link-end tag:
.uhelp.tx tag add hide $finis "$finis +7c"
# Get clickable tag to look right and do things:
.uhelp.tx tag configure $linkname -foreground blue -underline 1
.uhelp.tx tag bind $linkname {
# See where clicked link is:
set clickpos [.uhelp.tx index insert]
# Verify that it's really a link:
set tagnames [.uhelp.tx tag names $clickpos]
set tagplace [lsearch $tagnames "link *"]
if {$tagplace > -1} {
# If so, strip off everything but its name:
set tagname [lindex $tagnames $tagplace]
set tagend [lindex [.uhelp.tx tag range "$tagname"] end]
set searchname [string map "{link } {} {\"} {}" $tagname]
# And find where the name appears in the help-file text:
set target [.uhelp.tx search "$searchname" $tagend \
end]
if {$target ne ""} {
.uhelp.tx see $target
}
}
}
}
}
# And here's an example of a proc for getting an application to invoke the help system:
proc comhelp {fn} {
userhelp
wm title .uhelp "WISH Command Center - User Help"
set helpfile [open $fn r]
set helpcontents [read $helpfile]
close $helpfile
.uhelp.tx insert 1.0 $helpcontents
getlinks
}
# Test:
comhelp "/home/david/9.com/wish/suite/comhelp_link.txt"
----
[HJG] I don't see how those section titles in the helpfile should marked up.
[MG] Perhaps you could post the contents of comhelp_link.txt here, too, so we can see exactly what the demo/example at the bottom should look like?
----
[Category Deployment] | [Category Documentation]