| 1 | ## -*- tcl -*- |
|---|
| 2 | # ### ### ### ######### ######### ######### |
|---|
| 3 | ## |
|---|
| 4 | # $Id$ |
|---|
| 5 | # |
|---|
| 6 | # Index Formatting Engine : docidx --> HTML. |
|---|
| 7 | # Single-pass |
|---|
| 8 | # |
|---|
| 9 | # Copyright (c) 2003-2007 Andreas Kupries <andreas_kupries@sourceforge.net> |
|---|
| 10 | # Freely redistributable. |
|---|
| 11 | |
|---|
| 12 | # ### ### ### ######### ######### ######### |
|---|
| 13 | ## Requisites |
|---|
| 14 | |
|---|
| 15 | dt_source _idx_common.tcl |
|---|
| 16 | dt_source _html.tcl |
|---|
| 17 | |
|---|
| 18 | # ### ### ### ######### ######### ######### |
|---|
| 19 | ## API implementation |
|---|
| 20 | |
|---|
| 21 | rename idx_postprocess {} |
|---|
| 22 | rename fmt_postprocess idx_postprocess |
|---|
| 23 | |
|---|
| 24 | proc fmt_plain_text {text} {return {}} |
|---|
| 25 | |
|---|
| 26 | proc fmt_index_begin {l t} { |
|---|
| 27 | global la ti |
|---|
| 28 | set la $l |
|---|
| 29 | set ti $t |
|---|
| 30 | return {} |
|---|
| 31 | } |
|---|
| 32 | |
|---|
| 33 | proc fmt_key {text} { |
|---|
| 34 | global key lk ch |
|---|
| 35 | set lk $text |
|---|
| 36 | set key($lk) {} |
|---|
| 37 | set ch([F $lk]) . |
|---|
| 38 | return {} |
|---|
| 39 | } |
|---|
| 40 | |
|---|
| 41 | proc fmt_manpage {f l} {Ref [dt_fmap $f] $l} |
|---|
| 42 | proc fmt_url {u l} {Ref $u $l} |
|---|
| 43 | |
|---|
| 44 | proc fmt_index_end {} { |
|---|
| 45 | LoadKwid |
|---|
| 46 | set lines {} |
|---|
| 47 | BeginHeader ; Meta ; EndHeader |
|---|
| 48 | BeginBody ; Title ; Navbar |
|---|
| 49 | BeginIndex ; Keys ; EndIndex |
|---|
| 50 | EndBody |
|---|
| 51 | return [join $lines \n] |
|---|
| 52 | } |
|---|
| 53 | |
|---|
| 54 | # ### ### ### ######### ######### ######### |
|---|
| 55 | ## Helper commands |
|---|
| 56 | |
|---|
| 57 | proc Ref {r l} { |
|---|
| 58 | global key lk |
|---|
| 59 | lappend key($lk) $r $l |
|---|
| 60 | return {} |
|---|
| 61 | } |
|---|
| 62 | |
|---|
| 63 | proc F {text} { |
|---|
| 64 | return [string toupper [string index $text 0]] |
|---|
| 65 | } |
|---|
| 66 | |
|---|
| 67 | proc LoadKwid {} { |
|---|
| 68 | global kwid |
|---|
| 69 | # Engine parameter - load predefined keyword anchors. |
|---|
| 70 | set ki [Get kwid] |
|---|
| 71 | if {![llength $ki]} return |
|---|
| 72 | array set kwid $ki |
|---|
| 73 | return |
|---|
| 74 | } |
|---|
| 75 | |
|---|
| 76 | proc BeginHeader {} { |
|---|
| 77 | global la ti |
|---|
| 78 | upvar 1 lines lines |
|---|
| 79 | lappend lines [markup <html>] |
|---|
| 80 | lappend lines [ht_comment [c_provenance]] |
|---|
| 81 | lappend lines [ht_comment "CVS: \$Id\$ $la"] |
|---|
| 82 | lappend lines [markup <head>] |
|---|
| 83 | lappend lines "[markup <title>] $la [markup </title>]" |
|---|
| 84 | return |
|---|
| 85 | } |
|---|
| 86 | |
|---|
| 87 | proc Meta {} { |
|---|
| 88 | # Engine parameter - insert 'meta' |
|---|
| 89 | set meta [Get meta] |
|---|
| 90 | if {$meta == {}} return |
|---|
| 91 | upvar 1 lines lines |
|---|
| 92 | lappend lines [markup $meta] |
|---|
| 93 | return |
|---|
| 94 | } |
|---|
| 95 | |
|---|
| 96 | proc EndHeader {} { |
|---|
| 97 | upvar 1 lines lines |
|---|
| 98 | lappend lines [markup </head>] |
|---|
| 99 | return |
|---|
| 100 | } |
|---|
| 101 | |
|---|
| 102 | proc BeginBody {} { |
|---|
| 103 | upvar 1 lines lines |
|---|
| 104 | lappend lines [markup <body>] |
|---|
| 105 | # Engine parameter - insert 'meta' |
|---|
| 106 | set header [Get header] |
|---|
| 107 | if {$header == {}} return |
|---|
| 108 | lappend lines [markup $header] |
|---|
| 109 | return |
|---|
| 110 | } |
|---|
| 111 | |
|---|
| 112 | proc Title {} { |
|---|
| 113 | global la ti |
|---|
| 114 | upvar 1 lines lines |
|---|
| 115 | if {($la != {}) && ($ti != {})} { |
|---|
| 116 | set title "$la -- $ti" |
|---|
| 117 | } elseif {$la != {}} { |
|---|
| 118 | set title $la |
|---|
| 119 | } elseif {$ti != {}} { |
|---|
| 120 | set title $ti |
|---|
| 121 | } |
|---|
| 122 | lappend lines "[markup <h3>] $title [markup </h3>]" |
|---|
| 123 | return |
|---|
| 124 | } |
|---|
| 125 | |
|---|
| 126 | proc Navbar {} { |
|---|
| 127 | global ch cnt dot |
|---|
| 128 | upvar 1 lines lines |
|---|
| 129 | |
|---|
| 130 | set nav {} |
|---|
| 131 | foreach c [lsort -dict [array names ch]] { |
|---|
| 132 | set ref c[incr cnt] |
|---|
| 133 | set ch($c) $ref |
|---|
| 134 | lappend nav [ALink $ref $c] |
|---|
| 135 | } |
|---|
| 136 | |
|---|
| 137 | lappend lines [markup "<hr><div class=\"#idxnav\">"] |
|---|
| 138 | lappend lines [join $nav $dot] |
|---|
| 139 | lappend lines [markup </div>] |
|---|
| 140 | return |
|---|
| 141 | } |
|---|
| 142 | |
|---|
| 143 | proc BeginIndex {} { |
|---|
| 144 | upvar 1 lines lines |
|---|
| 145 | lappend lines [markup "<hr><table class=\"#idx\" width=\"100%\">"] |
|---|
| 146 | return |
|---|
| 147 | } |
|---|
| 148 | |
|---|
| 149 | proc Keys {} { |
|---|
| 150 | global key |
|---|
| 151 | upvar 1 lines lines |
|---|
| 152 | set lc {} |
|---|
| 153 | foreach k [lsort -dict [array names key]] { |
|---|
| 154 | set c [F $k] ; if {$lc != $c} { Section $c ; set lc $c } |
|---|
| 155 | BeginKey $k |
|---|
| 156 | References $k |
|---|
| 157 | EndKey |
|---|
| 158 | } |
|---|
| 159 | return |
|---|
| 160 | } |
|---|
| 161 | |
|---|
| 162 | proc Section {c} { |
|---|
| 163 | global ch |
|---|
| 164 | upvar 1 lines lines |
|---|
| 165 | lappend lines [markup {<tr class="#idxheader"><th colspan="2">}] |
|---|
| 166 | lappend lines [markup "<a name=\"$ch($c)\">Keywords: $c</a>"] |
|---|
| 167 | lappend lines [markup </th></tr>] |
|---|
| 168 | return |
|---|
| 169 | } |
|---|
| 170 | |
|---|
| 171 | proc BeginKey {k} { |
|---|
| 172 | upvar 1 lines lines |
|---|
| 173 | lappend lines [markup "<tr class=\"[Row]\" valign=top>"] |
|---|
| 174 | lappend lines [BeginColLeft][SetAnchor $k][markup </td>] |
|---|
| 175 | lappend lines [BeginColRight] |
|---|
| 176 | return |
|---|
| 177 | } |
|---|
| 178 | |
|---|
| 179 | proc EndKey {} { |
|---|
| 180 | upvar 1 lines lines |
|---|
| 181 | lappend lines [markup </td></tr>] |
|---|
| 182 | return |
|---|
| 183 | } |
|---|
| 184 | |
|---|
| 185 | proc References {k} { |
|---|
| 186 | global key dot |
|---|
| 187 | upvar 1 lines lines |
|---|
| 188 | set refs {} |
|---|
| 189 | foreach {ref label} $key($k) { |
|---|
| 190 | lappend refs [markup "<a href=\"$ref\"> $label </a>"] |
|---|
| 191 | } |
|---|
| 192 | lappend lines [join $refs $dot] |
|---|
| 193 | return |
|---|
| 194 | } |
|---|
| 195 | |
|---|
| 196 | proc EndIndex {} { |
|---|
| 197 | upvar 1 lines lines |
|---|
| 198 | lappend lines [markup </table>] |
|---|
| 199 | # Engine parameter - insert 'footer' |
|---|
| 200 | set footer [Get footer] |
|---|
| 201 | if {$footer == {}} return |
|---|
| 202 | lappend lines [markup "<hr>"] |
|---|
| 203 | lappend lines [markup $footer] |
|---|
| 204 | return |
|---|
| 205 | } |
|---|
| 206 | |
|---|
| 207 | proc EndBody {} { |
|---|
| 208 | upvar 1 lines lines |
|---|
| 209 | lappend lines [markup "</body></html>"] |
|---|
| 210 | return |
|---|
| 211 | } |
|---|
| 212 | |
|---|
| 213 | proc ALink {dst label} { |
|---|
| 214 | markup "<a href=\"#$dst\"> $label </a>" |
|---|
| 215 | } |
|---|
| 216 | |
|---|
| 217 | proc BeginColLeft {} { |
|---|
| 218 | return [markup {<td class="#idxleft" width="35%">}] |
|---|
| 219 | } |
|---|
| 220 | |
|---|
| 221 | proc BeginColRight {} { |
|---|
| 222 | return [markup {<td class="#idxright" width="65%">}] |
|---|
| 223 | } |
|---|
| 224 | |
|---|
| 225 | proc SetAnchor {text} { |
|---|
| 226 | return [markup "<a name=[Anchor $text]> $text </a>"] |
|---|
| 227 | } |
|---|
| 228 | |
|---|
| 229 | proc Anchor {text} { |
|---|
| 230 | global kwid cnt |
|---|
| 231 | if {[info exists kwid($text)]} { |
|---|
| 232 | return "\"$kwid($text)\"" |
|---|
| 233 | } |
|---|
| 234 | set anchor key$cnt |
|---|
| 235 | incr cnt |
|---|
| 236 | return "\"$anchor\"" |
|---|
| 237 | } |
|---|
| 238 | |
|---|
| 239 | proc Row {} { |
|---|
| 240 | global even |
|---|
| 241 | set res [expr {$even |
|---|
| 242 | ? "\#idxeven" |
|---|
| 243 | : "\#idxodd"}] |
|---|
| 244 | Flip |
|---|
| 245 | return $res |
|---|
| 246 | } |
|---|
| 247 | |
|---|
| 248 | proc Flip {} { |
|---|
| 249 | global even |
|---|
| 250 | set even [expr {1-$even}] |
|---|
| 251 | return |
|---|
| 252 | } |
|---|
| 253 | |
|---|
| 254 | # ### ### ### ######### ######### ######### |
|---|
| 255 | ## Engine state |
|---|
| 256 | |
|---|
| 257 | # key : string -> dict(ref -> label) "key formatting" |
|---|
| 258 | # ch : string -> '.' "key starting characters" |
|---|
| 259 | # lk : string "last key" |
|---|
| 260 | # la : string "index label" |
|---|
| 261 | # ti : string "index title" |
|---|
| 262 | # cnt : int |
|---|
| 263 | # kwid : string -> ... |
|---|
| 264 | # even : bool |
|---|
| 265 | |
|---|
| 266 | global key ; array set key {} |
|---|
| 267 | global ch ; array set ch {} |
|---|
| 268 | global lk ; set lk {} |
|---|
| 269 | global la ; set la {} |
|---|
| 270 | global ti ; set ti {} |
|---|
| 271 | global cnt ; set cnt 0 |
|---|
| 272 | global kwid ; array set kwid {} |
|---|
| 273 | global even ; set even 1 |
|---|
| 274 | global dot ; set dot [markup { · }] |
|---|
| 275 | |
|---|
| 276 | # ### ### ### ######### ######### ######### |
|---|
| 277 | ## Engine parameters |
|---|
| 278 | |
|---|
| 279 | global __var |
|---|
| 280 | array set __var { |
|---|
| 281 | meta {} |
|---|
| 282 | header {} |
|---|
| 283 | footer {} |
|---|
| 284 | kwid {} |
|---|
| 285 | } |
|---|
| 286 | proc Get {varname} {global __var ; return $__var($varname)} |
|---|
| 287 | proc idx_listvariables {} {global __var ; return [array names __var]} |
|---|
| 288 | proc idx_varset {varname text} { |
|---|
| 289 | global __var |
|---|
| 290 | if {![info exists __var($varname)]} {return -code error "Unknown engine variable \"$varname\""} |
|---|
| 291 | set __var($varname) $text |
|---|
| 292 | return |
|---|
| 293 | } |
|---|
| 294 | |
|---|
| 295 | ## |
|---|
| 296 | # ### ### ### ######### ######### ######### |
|---|