diff options
Diffstat (limited to 'tools/man2html1.tcl')
-rw-r--r-- | tools/man2html1.tcl | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/tools/man2html1.tcl b/tools/man2html1.tcl new file mode 100644 index 0000000..2e8ba52 --- /dev/null +++ b/tools/man2html1.tcl @@ -0,0 +1,269 @@ +# man2html1.tcl -- +# +# This file defines procedures that are used during the first pass of the +# man page to html conversion process. It is sourced by h.tcl. +# +# Copyright (c) 1996 by Sun Microsystems, Inc. +# +# SCCS: @(#) man2html1.tcl 1.2 96/03/21 10:48:29 +# + +# Global variables used by these scripts: +# +# state - state variable that controls action of text proc. +# +# curFile - tail of current man page. +# +# file - file pointer; for both xref.tcl and contents.html +# +# NAME_file - array indexed by NAME and containing file names used +# for hyperlinks. +# +# KEY_file - array indexed by KEYWORD and containing file names used +# for hyperlinks. +# +# lib - contains package name. Used to label section in contents.html +# +# inDT - in dictionary term. + + + +# text -- +# +# This procedure adds entries to the hypertext arrays NAME_file +# and KEY_file. +# +# DT: might do this: if first word of $dt matches $name and [llength $name==1] +# and [llength $dt > 1], then add to NAME_file. +# +# Arguments: +# string - Text to index. + + +proc text string { + global state curFile NAME_file KEY_file inDT + + switch $state { + NAME { + foreach i [split $string ","] { + lappend NAME_file([string trim $i]) $curFile + } + } + KEY { + foreach i [split $string ","] { + lappend KEY_file([string trim $i]) $curFile + } + } + DT - + OFF - + DASH {} + default { + puts stderr "text: unknown state: $state" + } + } +} + + +# macro -- +# +# This procedure is invoked to process macro invocations that start +# with "." (instead of '). +# +# Arguments: +# name - The name of the macro (without the "."). +# args - Any additional arguments to the macro. + +proc macro {name args} { + switch $name { + SH { + global state + + switch $args { + NAME { + if {$state == "INIT" } { + set state NAME + } + } + DESCRIPTION {set state DT} + INTRODUCTION {set state DT} + KEYWORDS {set state KEY} + default {set state OFF} + } + + } + TP { + global inDT + set inDT 1 + } + TH { + global lib state inDT + set inDT 0 + set state INIT + if {[llength $args] != 5} { + set args [join $args " "] + puts stderr "Bad .TH macro: .$name $args" + } + set lib [lindex $args 3] ;# Tcl or Tk + } + } +} + + + +# dash -- +# +# This procedure is invoked to handle dash characters ("\-" in +# troff). It only function in pass1 is to terminate the NAME state. +# +# Arguments: +# None. + +proc dash {} { + global state + if {$state == "NAME"} { + set state DASH + } +} + + + +# newline -- +# +# This procedure is invoked to handle newlines in the troff input. +# It's only purpose is to terminate a DT (dictionary term). +# +# Arguments: +# None. + +proc newline {} { + global inDT + set inDT 0 +} + + + + +# initGlobals, tab, font, char, macro2 -- +# +# These procedures do nothing during the first pass. +# +# Arguments: +# None. + +proc initGlobals {} {} +proc tab {} {} +proc font type {} +proc char name {} +proc macro2 {name args} {} + + +# doListing -- +# +# Writes an ls like list to a file. Searches NAME_file for entries +# that match the input pattern. +# +# Arguments: +# file - Output file pointer. +# pattern - glob style match pattern + +proc doListing {file pattern} { + global NAME_file + + set max_len 0 + foreach name [lsort [array names NAME_file]] { + set ref $NAME_file($name) + if [string match $pattern $ref] { + lappend type $name + if {[string length $name] > $max_len} { + set max_len [string length $name] + } + } + } + if [catch {llength $type} ] { + puts stderr " doListing: no names matched pattern ($pattern)" + return + } + incr max_len + set ncols [expr 90/$max_len] + set nrows [expr int( ceil( [llength $type] / $ncols. ) ) ] + +# ? max_len ncols nrows + + set index 0 + foreach f $type { + lappend row([expr $index % $nrows]) $f + incr index + } + + puts -nonewline $file "<PRE>" + for {set i 0} {$i<$nrows} {incr i} { + foreach name $row($i) { + set str [format "%-*s" $max_len $name] + regsub $name $str "<A HREF=\"$NAME_file($name).html\">$name</A>" str + puts -nonewline $file $str + } + puts $file {} + } + puts $file "</PRE>" +} + + +# doContents -- +# +# Generates a HTML contents file using the NAME_file array +# as its input database. +# +# Arguments: +# file - name of the contents file. +# packageName - string used in the title and sub-heads of the HTML page. Normally +# name of the package without version numbers. + +proc doContents {file packageName} { + global footer + + set file [open $file w] + + puts $file "<HTML><HEAD><TITLE>$packageName Manual</TITLE></HEAD><BODY>" + puts $file "<H3>$packageName</H3>" + doListing $file "*.1" + + puts $file "<HR><H3>$packageName Commands</H3>" + doListing $file "*.n" + + puts $file "<HR><H3>$packageName Library</H3>" + doListing $file "*.3" + + puts $file $footer + puts $file "</BODY></HTML>" + close $file +} + + + + +# do -- +# +# This is the toplevel procedure that searches a man page +# for hypertext links. It builds a data base consisting of +# two arrays: NAME_file and KEY file. It runs the man2tcl +# program to turn the man page into a script, then it evals +# that script. +# +# Arguments: +# fileName - Name of the file to scan. + +proc do fileName { + global curFile + set curFile [file tail $fileName] + set file stdout + puts " Pass 1 -- $fileName" + flush stdout + if [catch {eval [exec man2tcl [glob $fileName]]} msg] { + global errorInfo + puts stderr $msg + puts "in" + puts $errorInfo + exit 1 + } +} + |