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

通讯编程

开发平台:

Visual C++

  1. # man2help2.tcl --
  2. #
  3. # This file defines procedures that are used during the second pass of
  4. # the man page conversion.  It converts the man format input to rtf
  5. # form suitable for use by the Windows help compiler.
  6. #
  7. # Copyright (c) 1996 by Sun Microsystems, Inc.
  8. #
  9. # See the file "license.terms" for information on usage and redistribution
  10. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  11. # RCS: @(#) $Id: man2help2.tcl,v 1.12 2002/10/03 13:34:32 dkf Exp $
  12. # Global variables used by these scripts:
  13. #
  14. # state - state variable that controls action of text proc.
  15. #
  16. # topics - array indexed by (package,section,topic) with value
  17. #  of topic ID.
  18. #
  19. # keywords - array indexed by keyword string with value of topic ID.
  20. #
  21. # curID -  current topic ID, starts at 0 and is incremented for
  22. #  each new topic file.
  23. #
  24. # curPkg - current package name (e.g. Tcl).
  25. #
  26. # curSect - current section title (e.g. "Tcl Built-In Commands").
  27. #
  28. # initGlobals --
  29. #
  30. # This procedure is invoked to set the initial values of all of the
  31. # global variables, before processing a man page.
  32. #
  33. # Arguments:
  34. # None.
  35. proc initGlobals {} {
  36.     uplevel #0 unset state
  37.     global state chars
  38.     set state(paragraphPending) 0
  39.     set state(breakPending) 0
  40.     set state(firstIndent) 0
  41.     set state(leftIndent) 0
  42.     set state(inTP) 0
  43.     set state(paragraph) 0
  44.     set state(textState) 0
  45.     set state(curFont) ""
  46.     set state(startCode) "{\b "
  47.     set state(startEmphasis) "{\i "
  48.     set state(endCode) "}"
  49.     set state(endEmphasis) "}"
  50.     set state(noFill) 0
  51.     set state(charCnt) 0
  52.     set state(offset) [getTwips 0.5i]
  53.     set state(leftMargin) [getTwips 0.5i]
  54.     set state(nestingLevel) 0
  55.     set state(intl) 0
  56.     set state(sb) 0
  57.     setTabs 0.5i
  58. # set up international character table
  59.     array set chars {
  60. o^ F4
  61.     }
  62. }
  63. # beginFont --
  64. #
  65. # Arranges for future text to use a special font, rather than
  66. # the default paragraph font.
  67. #
  68. # Arguments:
  69. # font - Name of new font to use.
  70. proc beginFont {font} {
  71.     global file state
  72.     textSetup
  73.     if {[string equal $state(curFont) $font]} {
  74. return
  75.     }
  76.     endFont
  77.     puts -nonewline $file $state(start$font)
  78.     set state(curFont) $font
  79. }
  80. # endFont --
  81. #
  82. # Reverts to the default font for the paragraph type.
  83. #
  84. # Arguments:
  85. # None.
  86. proc endFont {} {
  87.     global state file
  88.     if {[string compare $state(curFont) ""]} {
  89. puts -nonewline $file $state(end$state(curFont))
  90. set state(curFont) ""
  91.     }
  92. }
  93. # textSetup --
  94. #
  95. # This procedure is called the first time that text is output for a
  96. # paragraph.  It outputs the header information for the paragraph.
  97. #
  98. # Arguments:
  99. # None.
  100. proc textSetup {} {
  101.     global file state
  102.     if $state(breakPending) {
  103. puts $file "\line"
  104.     }
  105.     if $state(paragraphPending) {
  106. puts $file [format "\parn\pard\fi%.0f\li%.0f" 
  107. $state(firstIndent) $state(leftIndent)]
  108. foreach tab $state(tabs) {
  109.     puts $file [format "\tx%.0f" $tab]
  110. }
  111. set state(tabs) {}
  112. if {$state(sb)} {
  113.     puts $file "\sb$state(sb)"
  114.     set state(sb) 0
  115. }
  116.     }
  117.     set state(breakPending) 0
  118.     set state(paragraphPending) 0
  119. }
  120. # text --
  121. #
  122. # This procedure adds text to the current state(paragraph).  If this is
  123. # the first text in the state(paragraph) then header information for the
  124. # state(paragraph) is output before the text.
  125. #
  126. # Arguments:
  127. # string - Text to output in the state(paragraph).
  128. proc text {string} {
  129.     global file state chars
  130.     textSetup
  131.     set string [string map [list 
  132.     "\" "\\" 
  133.     "{" "\{" 
  134.     "}" "\}" 
  135.     "t" {tab } 
  136.     '' "\rdblquote " 
  137.     `` "\ldblquote " 
  138.     ] $string]
  139.     # Check if this is the beginning of an international character string.
  140.     # If so, look up the sequence in the chars table and substitute the
  141.     # appropriate hex value.
  142.     if {$state(intl)} {
  143. if {[regexp {^'([^']*)'} $string dummy ch]} {
  144.     if {[info exists chars($ch)]} {
  145. regsub {^'[^']*'} $string "\\'$chars($ch)" string
  146.     } else {
  147. puts stderr "Unknown international character '$ch'"
  148.     }
  149. }
  150. set state(intl) 0
  151.     }
  152.     switch $state(textState) {
  153. REF { 
  154.     if {$state(inTP) == 0} {
  155. set string [insertRef $string]
  156.     }
  157. }
  158. SEE { 
  159.     global topics curPkg curSect
  160.     foreach i [split $string] {
  161. if {![regexp -nocase {^[a-z_0-9]+} [string trim $i] i ]} {
  162.     continue
  163. }
  164. if {![catch {set ref $topics($curPkg,$curSect,$i)} ]} {
  165.     regsub $i $string [link $i $ref] string
  166. }
  167.     }
  168. }
  169. KEY {
  170.     return
  171. }
  172.     }
  173.     puts -nonewline $file "$string"
  174. }
  175. # insertRef --
  176. #
  177. # This procedure looks for a string in the cross reference table and
  178. # generates a hot-link to the appropriate topic.  Tries to find the
  179. # nearest reference in the manual.
  180. #
  181. # Arguments:
  182. # string - Text to output in the state(paragraph).
  183. proc insertRef {string} {
  184.     global NAME_file curPkg curSect topics curID
  185.     set path {}
  186.     set string [string trim $string]
  187.     set ref {}
  188.     if {[info exists topics($curPkg,$curSect,$string)]} {
  189. set ref $topics($curPkg,$curSect,$string)
  190.     } else {
  191. set sites [array names topics "$curPkg,*,$string"]
  192. set count [llength $sites]
  193. if {$count > 0} {
  194.     set ref $topics([lindex $sites 0])
  195. } else {
  196.     set sites [array names topics "*,*,$string"]
  197.     set count [llength $sites]
  198.     if {$count > 0} {
  199. set ref $topics([lindex $sites 0])
  200.     }
  201. }
  202.     }
  203.     if {($ref != {}) && ($ref != $curID)} {
  204. set string [link $string $ref]
  205.     }
  206.     return $string
  207. }
  208. # macro --
  209. #
  210. # This procedure is invoked to process macro invocations that start
  211. # with "." (instead of ').
  212. #
  213. # Arguments:
  214. # name - The name of the macro (without the ".").
  215. # args - Any additional arguments to the macro.
  216. proc macro {name args} {
  217.     global state file
  218.     switch $name {
  219. AP {
  220.     if {[llength $args] != 3 && [llength $args] != 2} {
  221. puts stderr "Bad .AP macro: .$name [join $args " "]"
  222.     }
  223.     newPara 3.75i -3.75i
  224.     setTabs {1.25i 2.5i 3.75i}
  225.     font B
  226.     text [lindex $args 0]
  227.     tab
  228.     font I
  229.     text [lindex $args 1]
  230.     tab
  231.     font R
  232.     if {[llength $args] == 3} {
  233. text "([lindex $args 2])"
  234.     }
  235.     tab
  236. }
  237. AS {
  238.     # next page and previous page
  239. }
  240. br {
  241.     lineBreak
  242. }
  243. BS {}
  244. BE {}
  245. CE {
  246.     puts -nonewline $::file "\f0\fs20 "
  247.     set state(noFill) 0
  248.     set state(breakPending) 0
  249.     newPara ""
  250.     set state(leftIndent) [expr {$state(leftIndent) - $state(offset)}]
  251.     set state(sb) 80
  252. }
  253. CS {
  254.     # code section
  255.     set state(noFill) 1
  256.     newPara ""
  257.     set state(leftIndent) [expr {$state(leftIndent) + $state(offset)}]
  258.     set state(sb) 80
  259.     puts -nonewline $::file "\f1\fs18 "
  260. }
  261. DE {
  262.     set state(noFill) 0
  263.     decrNestingLevel
  264.     newPara 0i
  265. }
  266. DS {
  267.     set state(noFill) 1
  268.     incrNestingLevel
  269.     newPara 0i
  270. }
  271. fi {
  272.     set state(noFill) 0
  273. }
  274. IP {
  275.     IPmacro $args
  276. }
  277. LP {
  278.     newPara 0i
  279.     set state(sb) 80
  280. }
  281. ne {
  282. }
  283. nf {
  284.     set state(noFill) 1
  285. }
  286. OP {
  287.     if {[llength $args] != 3} {
  288. puts stderr "Bad .OP macro: .$name [join $args " "]"
  289.     }
  290.     set state(nestingLevel) 0
  291.     newPara 0i
  292.     set state(sb) 120
  293.     setTabs 4c
  294.     text "Command-Line Name:"
  295.     tab
  296.     font B
  297.     set x [lindex $args 0]
  298.     regsub -all {\-} $x - x
  299.     text $x
  300.     lineBreak
  301.     font R
  302.     text "Database Name:"
  303.     tab
  304.     font B
  305.     text [lindex $args 1]
  306.     lineBreak
  307.     font R
  308.     text "Database Class:"
  309.     tab
  310.     font B
  311.     text [lindex $args 2]
  312.     font R
  313.     set state(inTP) 0
  314.     newPara 0.5i
  315.     set state(sb) 80
  316. }
  317. PP {
  318.     newPara 0i
  319.     set state(sb) 120
  320. }
  321. RE {
  322.     decrNestingLevel
  323. }
  324. RS {
  325.     incrNestingLevel
  326. }
  327. SE {
  328.     font R
  329.     set state(noFill) 0
  330.     set state(nestingLevel) 0
  331.     newPara 0i
  332.     text "See the "
  333.     font B
  334.     set temp $state(textState)
  335.     set state(textState) REF
  336.     text options
  337.     set state(textState) $temp
  338.     font R
  339.     text " manual entry for detailed descriptions of the above options."
  340. }
  341. SH {
  342.     SHmacro $args
  343. }
  344. SO {
  345.     SHmacro "STANDARD OPTIONS"
  346.     set state(nestingLevel) 0
  347.     newPara 0i
  348.     setTabs {4c 8c 12c}
  349.     font B
  350.     set state(noFill) 1
  351. }
  352. so {
  353.     if {$args != "man.macros"} {
  354. puts stderr "Unknown macro: .$name [join $args " "]"
  355.     }
  356. }
  357. sp { ;# needs work
  358.     if {$args == ""} {
  359. set count 1
  360.     } else {
  361. set count [lindex $args 0]
  362.     }
  363.     while {$count > 0} {
  364. lineBreak
  365. incr count -1
  366.     }
  367. }
  368. ta {
  369.     setTabs $args
  370. }
  371. TH {
  372.     THmacro $args
  373. }
  374. TP {
  375.     TPmacro $args
  376. }
  377. UL { ;# underline
  378.     puts -nonewline $file "{\ul "
  379.     text [lindex $args 0]
  380.     puts -nonewline $file "}"
  381.     if {[llength $args] == 2} {
  382. text [lindex $args 1]
  383.     }
  384. }
  385. VE {}
  386. VS {}
  387. default {
  388.     puts stderr "Unknown macro: .$name [join $args " "]"
  389. }
  390.     }
  391. }
  392. # link --
  393. #
  394. # This procedure returns the string for  a hot link to a different
  395. # context location.
  396. #
  397. # Arguments:
  398. # label - String to display in hot-spot.
  399. # id - Context string to jump to.
  400. proc link {label id} {
  401.     return "{\uldb $label}{\v $id}"
  402. }
  403. # font --
  404. #
  405. # This procedure is invoked to handle font changes in the text
  406. # being output.
  407. #
  408. # Arguments:
  409. # type - Type of font: R, I, B, or S.
  410. proc font {type} {
  411.     global state
  412.     switch $type {
  413. P -
  414. R {
  415.     endFont
  416.     if {$state(textState) == "REF"} {
  417. set state(textState) INSERT
  418.     }
  419. }
  420. C -
  421. B {
  422.     beginFont Code
  423.     if {$state(textState) == "INSERT"} {
  424. set state(textState) REF
  425.     }
  426. }
  427. I {
  428.     beginFont Emphasis
  429. }
  430. S {
  431. }
  432. default {
  433.     puts stderr "Unknown font: $type"
  434. }
  435.     }
  436. }
  437. # formattedText --
  438. #
  439. # Insert a text string that may also have fB-style font changes
  440. # and a few other backslash sequences in it.
  441. #
  442. # Arguments:
  443. # text - Text to insert.
  444. proc formattedText {text} {
  445.     global chars
  446.     while {$text != ""} {
  447. set index [string first \ $text]
  448. if {$index < 0} {
  449.     text $text
  450.     return
  451. }
  452. text [string range $text 0 [expr {$index-1}]]
  453. set c [string index $text [expr {$index+1}]]
  454. switch -- $c {
  455.     f {
  456. font [string index $text [expr {$index+2}]]
  457. set text [string range $text [expr {$index+3}] end]
  458.     }
  459.     e {
  460. text "\"
  461. set text [string range $text [expr {$index+2}] end]
  462.     }
  463.     - {
  464. dash
  465. set text [string range $text [expr {$index+2}] end]
  466.     }
  467.     | {
  468. set text [string range $text [expr {$index+2}] end]
  469.     }
  470.     o {
  471. text "\'"
  472. regexp {'([^']*)'(.*)} $text all ch text
  473. text $chars($ch)
  474.     }
  475.     default {
  476. puts stderr "Unknown sequence: \$c"
  477. set text [string range $text [expr {$index+2}] end]
  478.     }
  479. }
  480.     }
  481. }
  482. # dash --
  483. #
  484. # This procedure is invoked to handle dash characters ("-" in
  485. # troff).  It outputs a special dash character.
  486. #
  487. # Arguments:
  488. # None.
  489. proc dash {} {
  490.     global state
  491.     if {[string equal $state(textState) "NAME"]} {
  492.      set state(textState) 0
  493.     }
  494.     text "-"
  495. }
  496. # tab --
  497. #
  498. # This procedure is invoked to handle tabs in the troff input.
  499. # Right now it does nothing.
  500. #
  501. # Arguments:
  502. # None.
  503. proc tab {} {
  504.     global file
  505.     textSetup
  506.     puts -nonewline $file "\tab "
  507. }
  508. # setTabs --
  509. #
  510. # This procedure handles the ".ta" macro, which sets tab stops.
  511. #
  512. # Arguments:
  513. # tabList - List of tab stops, each consisting of a number
  514. # followed by "i" (inch) or "c" (cm).
  515. proc setTabs {tabList} {
  516.     global file state
  517.     set state(tabs) {}
  518.     foreach arg $tabList {
  519. set distance [expr {$state(leftMargin) 
  520. + ($state(offset) * $state(nestingLevel)) + [getTwips $arg]}]
  521. lappend state(tabs) [expr {round($distance)}]
  522.     }
  523. }
  524. # lineBreak --
  525. #
  526. # Generates a line break in the HTML output.
  527. #
  528. # Arguments:
  529. # None.
  530. proc lineBreak {} {
  531.     global state
  532.     textSetup
  533.     set state(breakPending) 1
  534. }
  535. # newline --
  536. #
  537. # This procedure is invoked to handle newlines in the troff input.
  538. # It outputs either a space character or a newline character, depending
  539. # on fill mode.
  540. #
  541. # Arguments:
  542. # None.
  543. proc newline {} {
  544.     global state
  545.     if {$state(inTP)} {
  546.      set state(inTP) 0
  547. lineBreak
  548.     } elseif {$state(noFill)} {
  549. lineBreak
  550.     } else {
  551. text " "
  552.     }
  553. }
  554. # pageBreak --
  555. #
  556. # This procedure is invoked to generate a page break.
  557. #
  558. # Arguments:
  559. # None.
  560. proc pageBreak {} {
  561.     global file curVer
  562.     if {[string equal $curVer ""]} {
  563. puts $file {page}
  564.     } else {
  565. puts $file {par}
  566. puts $file {pardsb400qc}
  567. puts $file "Last change: $curVer\page"
  568.     }
  569. }
  570. # char --
  571. #
  572. # This procedure is called to handle a special character.
  573. #
  574. # Arguments:
  575. # name - Special character named in troff x or (xx construct.
  576. proc char {name} {
  577.     global file state
  578.     switch -exact $name {
  579.         \o {
  580.     set state(intl) 1
  581. }
  582. \  {
  583.     textSetup
  584.     puts -nonewline $file " "
  585. }
  586. \0 {
  587.     textSetup
  588.     puts -nonewline $file " \emspace "
  589. }
  590. \\ {
  591.     textSetup
  592.     puts -nonewline $file "\\"
  593. }
  594. \(+- {
  595.     textSetup
  596.     puts -nonewline $file "\'b1 "
  597. }
  598. \% -
  599. \| {
  600. }
  601. \(bu {
  602.     textSetup
  603.     puts -nonewline $file "