summaryrefslogtreecommitdiffstats
path: root/tcl8.6/tools/tcltk-man2html.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'tcl8.6/tools/tcltk-man2html.tcl')
-rwxr-xr-xtcl8.6/tools/tcltk-man2html.tcl752
1 files changed, 0 insertions, 752 deletions
diff --git a/tcl8.6/tools/tcltk-man2html.tcl b/tcl8.6/tools/tcltk-man2html.tcl
deleted file mode 100755
index d607905..0000000
--- a/tcl8.6/tools/tcltk-man2html.tcl
+++ /dev/null
@@ -1,752 +0,0 @@
-#!/usr/bin/env tclsh
-
-if {[catch {package require Tcl 8.6-} msg]} {
- puts stderr "ERROR: $msg"
- puts stderr "If running this script from 'make html', set the\
- NATIVE_TCLSH environment\nvariable to point to an installed\
- tclsh8.6 (or the equivalent tclsh86.exe\non Windows)."
- exit 1
-}
-
-# Convert Ousterhout format man pages into highly crosslinked hypertext.
-#
-# Along the way detect many unmatched font changes and other odd things.
-#
-# Note well, this program is a hack rather than a piece of software
-# engineering. In that sense it's probably a good example of things
-# that a scripting language, like Tcl, can do well. It is offered as
-# an example of how someone might convert a specific set of man pages
-# into hypertext, not as a general solution to the problem. If you
-# try to use this, you'll be very much on your own.
-#
-# Copyright (c) 1995-1997 Roger E. Critchlow Jr
-# Copyright (c) 2004-2010 Donal K. Fellows
-
-set ::Version "50/8.6"
-set ::CSSFILE "docs.css"
-
-##
-## Source the utility functions that provide most of the
-## implementation of the transformation from nroff to html.
-##
-source [file join [file dirname [info script]] tcltk-man2html-utils.tcl]
-
-proc parse_command_line {} {
- global argv Version
-
- # These variables determine where the man pages come from and where
- # the converted pages go to.
- global tcltkdir tkdir tcldir webdir build_tcl build_tk verbose
-
- # Set defaults based on original code.
- set tcltkdir ../..
- set tkdir {}
- set tcldir {}
- set webdir ../html
- set build_tcl 0
- set build_tk 0
- set verbose 0
- # Default search version is a glob pattern
- set useversion {{,[8-9].[0-9]{,[.ab][0-9]{,[0-9]}}}}
-
- # Handle arguments a la GNU:
- # --version
- # --useversion=<version>
- # --help
- # --srcdir=/path
- # --htmldir=/path
-
- foreach option $argv {
- switch -glob -- $option {
- --version {
- puts "tcltk-man-html $Version"
- exit 0
- }
-
- --help {
- puts "usage: tcltk-man-html \[OPTION\] ...\n"
- puts " --help print this help, then exit"
- puts " --version print version number, then exit"
- puts " --srcdir=DIR find tcl and tk source below DIR"
- puts " --htmldir=DIR put generated HTML in DIR"
- puts " --tcl build tcl help"
- puts " --tk build tk help"
- puts " --useversion version of tcl/tk to search for"
- puts " --verbose whether to print longer messages"
- exit 0
- }
-
- --srcdir=* {
- # length of "--srcdir=" is 9.
- set tcltkdir [string range $option 9 end]
- }
-
- --htmldir=* {
- # length of "--htmldir=" is 10
- set webdir [string range $option 10 end]
- }
-
- --useversion=* {
- # length of "--useversion=" is 13
- set useversion [string range $option 13 end]
- }
-
- --tcl {
- set build_tcl 1
- }
-
- --tk {
- set build_tk 1
- }
-
- --verbose=* {
- set verbose [string range $option \
- [string length --verbose=] end]
- }
- default {
- puts stderr "tcltk-man-html: unrecognized option -- `$option'"
- exit 1
- }
- }
- }
-
- if {!$build_tcl && !$build_tk} {
- set build_tcl 1;
- set build_tk 1
- }
-
- if {$build_tcl} {
- # Find Tcl.
- set tcldir [lindex [lsort [glob -nocomplain -tails -type d \
- -directory $tcltkdir tcl$useversion]] end]
- if {$tcldir eq ""} {
- puts stderr "tcltk-man-html: couldn't find Tcl below $tcltkdir"
- exit 1
- }
- puts "using Tcl source directory $tcldir"
- }
-
- if {$build_tk} {
- # Find Tk.
- set tkdir [lindex [lsort [glob -nocomplain -tails -type d \
- -directory $tcltkdir tk$useversion]] end]
- if {$tkdir eq ""} {
- puts stderr "tcltk-man-html: couldn't find Tk below $tcltkdir"
- exit 1
- }
- puts "using Tk source directory $tkdir"
- }
-
- puts "verbose messages are [expr {$verbose ? {on} : {off}}]"
-
- # the title for the man pages overall
- global overall_title
- set overall_title ""
- if {$build_tcl} {
- append overall_title "[capitalize $tcldir]"
- }
- if {$build_tcl && $build_tk} {
- append overall_title "/"
- }
- if {$build_tk} {
- append overall_title "[capitalize $tkdir]"
- }
- append overall_title " Documentation"
-}
-
-proc capitalize {string} {
- return [string toupper $string 0]
-}
-
-##
-## Returns the style sheet.
-##
-proc css-style args {
- upvar 1 style style
- set body [uplevel 1 [list subst [lindex $args end]]]
- set tokens [join [lrange $args 0 end-1] ", "]
- append style $tokens " \{" $body "\}\n"
-}
-proc css-stylesheet {} {
- set hBd "1px dotted #11577b"
-
- css-style body div p th td li dd ul ol dl dt blockquote {
- font-family: Verdana, sans-serif;
- }
- css-style pre code {
- font-family: 'Courier New', Courier, monospace;
- }
- css-style pre {
- background-color: #f6fcec;
- border-top: 1px solid #6A6A6A;
- border-bottom: 1px solid #6A6A6A;
- padding: 1em;
- overflow: auto;
- }
- css-style body {
- background-color: #FFFFFF;
- font-size: 12px;
- line-height: 1.25;
- letter-spacing: .2px;
- padding-left: .5em;
- }
- css-style h1 h2 h3 h4 {
- font-family: Georgia, serif;
- padding-left: 1em;
- margin-top: 1em;
- }
- css-style h1 {
- font-size: 18px;
- color: #11577b;
- border-bottom: $hBd;
- margin-top: 0px;
- }
- css-style h2 {
- font-size: 14px;
- color: #11577b;
- background-color: #c5dce8;
- padding-left: 1em;
- border: 1px solid #6A6A6A;
- }
- css-style h3 h4 {
- color: #1674A4;
- background-color: #e8f2f6;
- border-bottom: $hBd;
- border-top: $hBd;
- }
- css-style h3 {
- font-size: 12px;
- }
- css-style h4 {
- font-size: 11px;
- }
- css-style ".keylist dt" ".arguments dt" {
- width: 20em;
- float: left;
- padding: 2px;
- border-top: 1px solid #999;
- }
- css-style ".keylist dt" { font-weight: bold; }
- css-style ".keylist dd" ".arguments dd" {
- margin-left: 20em;
- padding: 2px;
- border-top: 1px solid #999;
- }
- css-style .copy {
- background-color: #f6fcfc;
- white-space: pre;
- font-size: 80%;
- border-top: 1px solid #6A6A6A;
- margin-top: 2em;
- }
- css-style .tablecell {
- font-size: 12px;
- padding-left: .5em;
- padding-right: .5em;
- }
-}
-
-##
-## foreach of the man directories specified by args
-## convert manpages into hypertext in the directory
-## specified by html.
-##
-proc make-man-pages {html args} {
- global manual overall_title tcltkdesc verbose
- global excluded_pages forced_index_pages process_first_patterns
-
- makedirhier $html
- set cssfd [open $html/$::CSSFILE w]
- puts $cssfd [css-stylesheet]
- close $cssfd
- set manual(short-toc-n) 1
- set manual(short-toc-fp) [open $html/[indexfile] w]
- puts $manual(short-toc-fp) [htmlhead $overall_title $overall_title]
- puts $manual(short-toc-fp) "<DL class=\"keylist\">"
- set manual(merge-copyrights) {}
-
- foreach arg $args {
- # preprocess to set up subheader for the rest of the files
- if {![llength $arg]} {
- continue
- }
- lassign $arg -> name file
- if {[regexp {(.*)(?: Package)? Commands(?:, version .*)?} $name -> pkg]} {
- set name "$pkg Commands"
- } elseif {[regexp {(.*)(?: Package)? C API(?:, version .*)?} $name -> pkg]} {
- set name "$pkg C API"
- }
- lappend manual(subheader) $name $file
- }
-
- ##
- ## parse the manpages in a section of the docs (split by
- ## package) and construct formatted manpages
- ##
- foreach arg $args {
- if {[llength $arg]} {
- make-manpage-section $html $arg
- }
- }
-
- ##
- ## build the keyword index.
- ##
- if {!$verbose} {
- puts stderr "Assembling index"
- }
- file delete -force -- $html/Keywords
- makedirhier $html/Keywords
- set keyfp [open $html/Keywords/[indexfile] w]
- puts $keyfp [htmlhead "$tcltkdesc Keywords" "$tcltkdesc Keywords" \
- $overall_title "../[indexfile]"]
- set letters {A B C D E F G H I J K L M N O P Q R S T U V W X Y Z}
- # Create header first
- set keyheader {}
- foreach a $letters {
- set keys [array names manual "keyword-\[[string totitle $a$a]\]*"]
- if {[llength $keys]} {
- lappend keyheader "<A HREF=\"$a.htm\">$a</A>"
- } else {
- # No keywords for this letter
- lappend keyheader $a
- }
- }
- set keyheader <H3>[join $keyheader " |\n"]</H3>
- puts $keyfp $keyheader
- foreach a $letters {
- set keys [array names manual "keyword-\[[string totitle $a$a]\]*"]
- if {![llength $keys]} {
- continue
- }
- # Per-keyword page
- set afp [open $html/Keywords/$a.htm w]
- puts $afp [htmlhead "$tcltkdesc Keywords - $a" \
- "$tcltkdesc Keywords - $a" \
- $overall_title "../[indexfile]"]
- puts $afp $keyheader
- puts $afp "<DL class=\"keylist\">"
- foreach k [lsort -dictionary $keys] {
- set k [string range $k 8 end]
- puts $afp "<DT><A NAME=\"$k\">$k</A></DT>"
- puts $afp "<DD>"
- set refs {}
- foreach man $manual(keyword-$k) {
- set name [lindex $man 0]
- set file [lindex $man 1]
- if {[info exists manual(tooltip-$file)]} {
- set tooltip $manual(tooltip-$file)
- if {[string match {*[<>""]*} $tooltip]} {
- manerror "bad tooltip for $file: \"$tooltip\""
- }
- lappend refs "<A HREF=\"../$file\" TITLE=\"$tooltip\">$name</A>"
- } else {
- lappend refs "<A HREF=\"../$file\">$name</A>"
- }
- }
- puts $afp "[join $refs {, }]</DD>"
- }
- puts $afp "</DL>"
- # insert merged copyrights
- puts $afp [copyout $manual(merge-copyrights)]
- puts $afp "</BODY></HTML>"
- close $afp
- }
- # insert merged copyrights
- puts $keyfp [copyout $manual(merge-copyrights)]
- puts $keyfp "</BODY></HTML>"
- close $keyfp
-
- ##
- ## finish off short table of contents
- ##
- puts $manual(short-toc-fp) "<DT><A HREF=\"Keywords/[indexfile]\">Keywords</A><DD>The keywords from the $tcltkdesc man pages."
- puts $manual(short-toc-fp) "</DL>"
- # insert merged copyrights
- puts $manual(short-toc-fp) [copyout $manual(merge-copyrights)]
- puts $manual(short-toc-fp) "</BODY></HTML>"
- close $manual(short-toc-fp)
-
- ##
- ## output man pages
- ##
- unset manual(section)
- if {!$verbose} {
- puts stderr "Rescanning [llength $manual(all-pages)] pages to build cross links and write out"
- }
- foreach path $manual(all-pages) wing_name $manual(all-page-domains) {
- set manual(wing-file) [file dirname $path]
- set manual(tail) [file tail $path]
- set manual(name) [file root $manual(tail)]
- try {
- set text $manual(output-$manual(wing-file)-$manual(name))
- set ntext 0
- foreach item $text {
- incr ntext [llength [split $item \n]]
- incr ntext
- }
- set toc $manual(toc-$manual(wing-file)-$manual(name))
- set ntoc 0
- foreach item $toc {
- incr ntoc [llength [split $item \n]]
- incr ntoc
- }
- if {$verbose} {
- puts stderr "rescanning page $manual(name) $ntoc/$ntext"
- } else {
- puts -nonewline stderr .
- }
- set outfd [open $html/$manual(wing-file)/$manual(name).htm w]
- puts $outfd [htmlhead "$manual($manual(wing-file)-$manual(name)-title)" \
- $manual(name) $wing_name "[indexfile]" \
- $overall_title "../[indexfile]"]
- if {($ntext > 60) && ($ntoc > 32)} {
- foreach item $toc {
- puts $outfd $item
- }
- } elseif {$manual(name) in $forced_index_pages} {
- if {!$verbose} {puts stderr ""}
- manerror "forcing index generation"
- foreach item $toc {
- puts $outfd $item
- }
- }
- foreach item $text {
- puts $outfd [insert-cross-references $item]
- }
- puts $outfd "</BODY></HTML>"
- } on error msg {
- if {$verbose} {
- puts stderr $msg
- } else {
- puts stderr "\nError when processing $manual(name): $msg"
- }
- } finally {
- catch {close $outfd}
- }
- }
- if {!$verbose} {
- puts stderr "\nDone"
- }
- return {}
-}
-
-##
-## Helper for assembling the descriptions of base packages (i.e., Tcl and Tk).
-##
-proc plus-base {var root glob name dir desc} {
- global tcltkdir
- if {$var} {
- if {[file exists $tcltkdir/$root/README]} {
- set f [open $tcltkdir/$root/README]
- set d [read $f]
- close $f
- if {[regexp {This is the \w+ (\S+) source distribution} $d -> version]} {
- append name ", version $version"
- }
- }
- set glob $root/$glob
- return [list $tcltkdir/$glob $name $dir $desc]
- }
-}
-
-##
-## Helper for assembling the descriptions of contributed packages.
-##
-proc plus-pkgs {type args} {
- global build_tcl tcltkdir tcldir
- if {$type ni {n 3}} {
- error "unknown type \"$type\": must be 3 or n"
- }
- if {!$build_tcl} return
- set result {}
- set pkgsdir $tcltkdir/$tcldir/pkgs
- foreach {dir name version} $args {
- set globpat $pkgsdir/$dir/doc/*.$type
- if {![llength [glob -type f -nocomplain $globpat]]} {
- # Fallback for manpages generated using doctools
- set globpat $pkgsdir/$dir/doc/man/*.$type
- if {![llength [glob -type f -nocomplain $globpat]]} {
- continue
- }
- }
- set dir [string trimright $dir "0123456789-."]
- switch $type {
- n {
- set title "$name Package Commands"
- if {$version ne ""} {
- append title ", version $version"
- }
- set dir [string totitle $dir]Cmd
- set desc \
- "The additional commands provided by the $name package."
- }
- 3 {
- set title "$name Package C API"
- if {$version ne ""} {
- append title ", version $version"
- }
- set dir [string totitle $dir]Lib
- set desc \
- "The additional C functions provided by the $name package."
- }
- }
- lappend result [list $globpat $title $dir $desc]
- }
- return $result
-}
-
-##
-## Set up some special cases. It would be nice if we didn't have them,
-## but we do...
-##
-set excluded_pages {case menubar pack-old}
-set forced_index_pages {GetDash}
-set process_first_patterns {*/ttk_widget.n */options.n}
-set ensemble_commands {
- after array binary chan clock dde dict encoding file history info interp
- memory namespace package registry self string trace update zlib
- clipboard console font grab grid image option pack place selection tk
- tkwait ttk::style winfo wm itcl::delete itcl::find itcl::is
-}
-array set remap_link_target {
- stdin Tcl_GetStdChannel
- stdout Tcl_GetStdChannel
- stderr Tcl_GetStdChannel
- style ttk::style
- {style map} ttk::style
- {tk busy} busy
- library auto_execok
- safe-tcl safe
- tclvars env
- tcl_break catch
- tcl_continue catch
- tcl_error catch
- tcl_ok catch
- tcl_return catch
- int() mathfunc
- wide() mathfunc
- packagens pkg::create
- pkgMkIndex pkg_mkIndex
- pkg_mkIndex pkg_mkIndex
- Tcl_Obj Tcl_NewObj
- Tcl_ObjType Tcl_RegisterObjType
- Tcl_OpenFileChannelProc Tcl_FSOpenFileChannel
- errorinfo env
- errorcode env
- tcl_pkgpath env
- Tcl_Command Tcl_CreateObjCommand
- Tcl_CmdProc Tcl_CreateObjCommand
- Tcl_CmdDeleteProc Tcl_CreateObjCommand
- Tcl_ObjCmdProc Tcl_CreateObjCommand
- Tcl_Channel Tcl_OpenFileChannel
- Tcl_WideInt Tcl_NewIntObj
- Tcl_ChannelType Tcl_CreateChannel
- Tcl_DString Tcl_DStringInit
- Tcl_Namespace Tcl_AppendExportList
- Tcl_Object Tcl_NewObjectInstance
- Tcl_Class Tcl_GetObjectAsClass
- Tcl_Event Tcl_QueueEvent
- Tcl_Time Tcl_GetTime
- Tcl_ThreadId Tcl_CreateThread
- Tk_Window Tk_WindowId
- Tk_3DBorder Tk_Get3DBorder
- Tk_Anchor Tk_GetAnchor
- Tk_Cursor Tk_GetCursor
- Tk_Dash Tk_GetDash
- Tk_Font Tk_GetFont
- Tk_Image Tk_GetImage
- Tk_ImageMaster Tk_GetImage
- Tk_ItemType Tk_CreateItemType
- Tk_Justify Tk_GetJustify
- Ttk_Theme Ttk_GetTheme
-}
-array set exclude_refs_map {
- bind.n {button destroy option}
- clock.n {next}
- history.n {exec}
- next.n {unknown}
- zlib.n {binary close filename text}
- canvas.n {bitmap text}
- console.n {eval}
- checkbutton.n {image}
- clipboard.n {string}
- entry.n {string}
- event.n {return}
- font.n {menu}
- getOpenFile.n {file open text}
- grab.n {global}
- interp.n {time}
- menu.n {checkbutton radiobutton}
- messageBox.n {error info}
- options.n {bitmap image set}
- radiobutton.n {image}
- safe.n {join split}
- scale.n {label variable}
- scrollbar.n {set}
- selection.n {string}
- tcltest.n {error}
- tkvars.n {tk}
- tkwait.n {variable}
- tm.n {exec}
- ttk_checkbutton.n {variable}
- ttk_combobox.n {selection}
- ttk_entry.n {focus variable}
- ttk_intro.n {focus text}
- ttk_label.n {font text}
- ttk_labelframe.n {text}
- ttk_menubutton.n {flush}
- ttk_notebook.n {image text}
- ttk_progressbar.n {variable}
- ttk_radiobutton.n {variable}
- ttk_scale.n {variable}
- ttk_scrollbar.n {set}
- ttk_spinbox.n {format}
- ttk_treeview.n {text open}
- ttk_widget.n {image text variable}
- TclZlib.3 {binary flush filename text}
-}
-array set exclude_when_followed_by_map {
- canvas.n {
- bind widget
- focus widget
- image are
- lower widget
- raise widget
- }
- selection.n {
- clipboard selection
- clipboard ;
- }
- ttk_image.n {
- image imageSpec
- }
- fontchooser.n {
- tk fontchooser
- }
-}
-
-try {
- # Parse what the user told us to do
- parse_command_line
-
- # Some strings depend on what options are specified
- set tcltkdesc ""; set cmdesc ""; set appdir ""
- if {$build_tcl} {
- append tcltkdesc "Tcl"
- append cmdesc "Tcl"
- append appdir "$tcldir"
- }
- if {$build_tcl && $build_tk} {
- append tcltkdesc "/"
- append cmdesc " and "
- append appdir ","
- }
- if {$build_tk} {
- append tcltkdesc "Tk"
- append cmdesc "Tk"
- append appdir "$tkdir"
- }
-
- apply {{} {
- global packageBuildList tcltkdir tcldir build_tcl
-
- # When building docs for Tcl, try to build docs for bundled packages too
- set packageBuildList {}
- if {$build_tcl} {
- set pkgsDir [file join $tcltkdir $tcldir pkgs]
- set subdirs [glob -nocomplain -types d -tails -directory $pkgsDir *]
-
- foreach dir [lsort $subdirs] {
- # Parse the subdir name into (name, version) as fallback...
- set description [split $dir -]
- if {2 != [llength $description]} {
- regexp {([^0-9]*)(.*)} $dir -> n v
- set description [list $n $v]
- }
-
- # ... but try to extract (name, version) from subdir contents
- try {
- try {
- set f [open [file join $pkgsDir $dir configure.in]]
- } trap {POSIX ENOENT} {} {
- set f [open [file join $pkgsDir $dir configure.ac]]
- }
- foreach line [split [read $f] \n] {
- if {2 == [scan $line \
- { AC_INIT ( [%[^]]] , [%[^]]] ) } n v]} {
- set description [list $n $v]
- break
- }
- }
- } finally {
- catch {close $f; unset f}
- }
-
- if {[file exists [file join $pkgsDir $dir configure]]} {
- # Looks like a package, record our best extraction attempt
- lappend packageBuildList $dir {*}$description
- }
- }
- }
-
- # Get the list of packages to try, and what their human-readable names
- # are. Note that the package directory list should be version-less.
- try {
- set packageDirNameMap {}
- if {$build_tcl} {
- set f [open $tcltkdir/$tcldir/pkgs/package.list.txt]
- try {
- foreach line [split [read $f] \n] {
- if {[string trim $line] eq ""} continue
- if {[string match #* $line]} continue
- lassign $line dir name
- lappend packageDirNameMap $dir $name
- }
- } finally {
- close $f
- }
- }
- } trap {POSIX ENOENT} {} {
- set packageDirNameMap {
- itcl {[incr Tcl]}
- tdbc {TDBC}
- thread Thread
- }
- }
-
- # Convert to human readable names, if applicable
- for {set idx 0} {$idx < [llength $packageBuildList]} {incr idx 3} {
- lassign [lrange $packageBuildList $idx $idx+2] d n v
- if {[dict exists $packageDirNameMap $n]} {
- lset packageBuildList $idx+1 [dict get $packageDirNameMap $n]
- }
- }
- }}
-
- #
- # Invoke the scraper/converter engine.
- #
- make-man-pages $webdir \
- [list $tcltkdir/{$appdir}/doc/*.1 "$tcltkdesc Applications" UserCmd \
- "The interpreters which implement $cmdesc."] \
- [plus-base $build_tcl $tcldir doc/*.n {Tcl Commands} TclCmd \
- "The commands which the <B>tclsh</B> interpreter implements."] \
- [plus-base $build_tk $tkdir doc/*.n {Tk Commands} TkCmd \
- "The additional commands which the <B>wish</B> interpreter implements."] \
- {*}[plus-pkgs n {*}$packageBuildList] \
- [plus-base $build_tcl $tcldir doc/*.3 {Tcl C API} TclLib \
- "The C functions which a Tcl extended C program may use."] \
- [plus-base $build_tk $tkdir doc/*.3 {Tk C API} TkLib \
- "The additional C functions which a Tk extended C program may use."] \
- {*}[plus-pkgs 3 {*}$packageBuildList]
-} on error {msg opts} {
- # On failure make sure we show what went wrong. We're not supposed
- # to get here though; it represents a bug in the script.
- puts $msg\n[dict get $opts -errorinfo]
- exit 1
-}
-
-# Local-Variables:
-# mode: tcl
-# End: