man2html1.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # man2html1.tcl --
  2. #
  3. # This file defines procedures that are used during the first pass of the
  4. # man page to html conversion process. It is sourced by h.tcl.
  5. #
  6. # Copyright (c) 1996 by Sun Microsystems, Inc.
  7. #
  8. # SCCS: @(#) man2html1.tcl 1.2 96/03/21 10:48:29
  9. #
  10. # Global variables used by these scripts:
  11. #
  12. # state - state variable that controls action of text proc.
  13. #
  14. # curFile - tail of current man page.
  15. #
  16. # file - file pointer; for both xref.tcl and contents.html
  17. #
  18. # NAME_file - array indexed by NAME and containing file names used
  19. # for hyperlinks.
  20. #
  21. # KEY_file - array indexed by KEYWORD and containing file names used
  22. # for hyperlinks.
  23. #
  24. # lib - contains package name. Used to label section in contents.html
  25. #
  26. # inDT - in dictionary term. 
  27. # text --
  28. #
  29. # This procedure adds entries to the hypertext arrays NAME_file
  30. # and KEY_file.
  31. #
  32. # DT: might do this: if first word of $dt matches $name and [llength $name==1]
  33. #  and [llength $dt > 1], then add to NAME_file. 
  34. #
  35. # Arguments:
  36. # string - Text to index.
  37. proc text string {
  38.     global state curFile NAME_file KEY_file inDT
  39.     switch $state {
  40. NAME {
  41.     foreach i [split $string ","] {
  42. lappend NAME_file([string trim $i]) $curFile
  43.     }
  44. }
  45. KEY {
  46.     foreach i [split $string ","] {
  47. lappend KEY_file([string trim $i]) $curFile
  48.     }
  49. }
  50. DT -
  51. OFF -
  52. DASH {}
  53. default {
  54.     puts stderr "text: unknown state: $state"
  55. }
  56.     }
  57. }
  58. # macro --
  59. #
  60. # This procedure is invoked to process macro invocations that start
  61. # with "." (instead of ').
  62. #
  63. # Arguments:
  64. # name - The name of the macro (without the ".").
  65. # args - Any additional arguments to the macro.
  66. proc macro {name args} {
  67.     switch $name {
  68. SH {
  69.     global state
  70.     switch $args {
  71. NAME {
  72.     if {$state == "INIT" } {
  73. set state NAME
  74.     }
  75. }
  76. DESCRIPTION {set state DT}
  77. INTRODUCTION {set state DT}
  78. KEYWORDS {set state KEY}
  79. default {set state OFF}
  80.     }
  81. }
  82. TP {
  83.     global inDT
  84.     set inDT 1
  85. }
  86. TH {
  87.     global lib state inDT
  88.     set inDT 0
  89.     set state INIT
  90.     if {[llength $args] != 5} {
  91.     set args [join $args " "]
  92.     puts stderr "Bad .TH macro: .$name $args"
  93.     }
  94.     set lib [lindex $args 3] ;# Tcl or Tk
  95. }
  96.     }
  97. }
  98. # dash --
  99. #
  100. # This procedure is invoked to handle dash characters ("-" in
  101. # troff).  It only function in pass1 is to terminate the NAME state.
  102. #
  103. # Arguments:
  104. # None.
  105. proc dash {} {
  106.     global state
  107.     if {$state == "NAME"} {
  108. set state DASH
  109.     }
  110. }
  111. # newline --
  112. #
  113. # This procedure is invoked to handle newlines in the troff input.
  114. # It's only purpose is to terminate a DT (dictionary term).
  115. #
  116. # Arguments:
  117. # None.
  118. proc newline {} {
  119.     global inDT
  120.     set inDT 0
  121. }
  122. # initGlobals, tab, font, char, macro2 --
  123. #
  124. # These procedures do nothing during the first pass. 
  125. #
  126. # Arguments:
  127. # None.
  128. proc initGlobals {} {}
  129. proc tab {} {}
  130. proc font type {}
  131. proc char name {}
  132. proc macro2 {name args} {}
  133. # doListing --
  134. #
  135. # Writes an ls like list to a file. Searches NAME_file for entries
  136. # that match the input pattern.
  137. #
  138. # Arguments:
  139. # file - Output file pointer.
  140. # pattern - glob style match pattern
  141. proc doListing {file pattern} {
  142.     global NAME_file
  143.     set max_len 0
  144.     foreach name [lsort [array names NAME_file]] {
  145. set ref $NAME_file($name)
  146.     if [string match $pattern $ref] {
  147. lappend type $name
  148. if {[string length $name] > $max_len} {
  149. set max_len [string length $name]
  150.     }
  151. }
  152.     }
  153.     if [catch {llength $type} ] {
  154. puts stderr "       doListing: no names matched pattern ($pattern)"
  155. return
  156.     }
  157.     incr max_len
  158.     set ncols [expr 90/$max_len]
  159.     set nrows [expr int( ceil( [llength $type] / $ncols. ) ) ]
  160. # ? max_len ncols nrows
  161.     set index 0
  162.     foreach f $type {
  163. lappend row([expr $index % $nrows]) $f
  164. incr index
  165.     }
  166.     puts -nonewline $file "<PRE>"
  167.     for {set i 0} {$i<$nrows} {incr i} {
  168. foreach name $row($i) {
  169.     set str [format "%-*s" $max_len $name]
  170.     regsub $name $str "<A HREF="$NAME_file($name).html">$name</A>" str
  171.     puts -nonewline $file $str
  172. }
  173. puts $file {}
  174.     }
  175.     puts $file "</PRE>"
  176. }
  177. # doContents --
  178. #
  179. # Generates a HTML contents file using the NAME_file array
  180. # as its input database.
  181. #
  182. # Arguments:
  183. # file - name of the contents file.
  184. # packageName - string used in the title and sub-heads of the HTML page. Normally
  185. # name of the package without version numbers.
  186. proc doContents {file packageName} {
  187.     global footer
  188.     
  189.     set file [open $file w]
  190.     
  191.     puts $file "<HTML><HEAD><TITLE>$packageName Manual</TITLE></HEAD><BODY>"
  192.     puts $file "<H3>$packageName</H3>"
  193.     doListing $file "*.1"
  194.     puts $file "<HR><H3>$packageName Commands</H3>"
  195.     doListing $file "*.n"
  196.     puts $file "<HR><H3>$packageName Library</H3>"
  197.     doListing $file "*.3"
  198.     puts $file $footer
  199.     puts $file "</BODY></HTML>"
  200.     close $file
  201. }
  202. # do --
  203. #
  204. # This is the toplevel procedure that searches a man page
  205. # for hypertext links.  It builds a data base consisting of
  206. # two arrays: NAME_file and KEY file. It runs the man2tcl 
  207. # program to turn the man page into a script, then it evals 
  208. # that script.
  209. #
  210. # Arguments:
  211. # fileName - Name of the file to scan.
  212. proc do fileName {
  213.     global curFile
  214.     set curFile [file tail $fileName]
  215.     set file stdout
  216.     puts "  Pass 1 -- $fileName"
  217.     flush stdout
  218.     if [catch {eval [exec man2tcl [glob $fileName]]} msg] {
  219. global errorInfo
  220. puts stderr $msg
  221. puts "in"
  222. puts $errorInfo
  223. exit 1
  224.     }
  225. }