# -*- tcl -*-
#
# fmt.html
#
# (c) 2001 Andreas Kupries 
#
# [expand] definitions to convert a tcl based manpage definition into
# a manpage based upon HTML markup. Additional definition files allow
# the conversion into nroff and TMML.
#
################################################################
################################################################
proc here {} [list return [__file dirname [info script]]]
proc this {} [list return [__file tail    [info script]]]
source [__file join [here] _common.tcl]   ; # Shared code
source [__file join [here] _html.tcl]     ; # HTML basic formatting
proc bgcolor {} {return ""}
proc border  {} {return 0}
################################################################
################################################################
## Backend for HTML markup
# ==============================================================
# Internal data structures and state
# --------------------------------------------------------------
# I. Internal cross references (between and to sections)
global SectionNames	;# array mapping section name to refid
# sectionId --
#	Format section name as an XML ID.
#
proc sectionId {name} {
    regsub -all {[^[:alnum:]]} $name {} name
    return [string tolower $name]
}
# possibleReference text gi --
#	Check if $text is a potential cross-reference;
#	if so, format as a reference;
#	otherwise format as a $gi element.
#
proc possibleReference {text gi} {
    global SectionNames
    if {[info exists SectionNames($text)]} {
	return [taga a [list href #$SectionNames($text)]]$text[tag/ a]
    } else {
	return [tag $gi]$text[tag/ $gi]
    }
}
# --------------------------------------------------------------
# II. Description tracking: Located in the common code.
# --------------------------------------------------------------
# III. Handling of lists. Simplified, the global check of nesting and
#      legality of list commands allows us to throw away most of the
#      existing checks.
global liststack ; # stack of list tags to use in list_end
global hintstack ; # stack of hint information.
global chint     ; # current hint settings
global lmark     ; # boolean flag, 1 = list item command was last
#                ; #               0 = something other than a list item command
set    liststack [list]
set    hintstack [list]
set    chint     ""
set    lmark     0
proc llevel {} {global liststack ; return [llength $liststack]}
proc lpush {t hint} {
    global  liststack hintstack chint
    lappend liststack [tag/ $t]
    lappend hintstack $chint
    set     chint $hint
    return [tag $t]
}
proc lpop {} {
    global liststack hintstack chint
    set t         [lindex   $liststack end]
    set liststack [lreplace $liststack end end]
    set chint     [lindex   $hintstack end]
    set hintstack [lreplace $hintstack end end]
    return $t
}
proc lsmark {value} {
    global lmark ; set lmark $value ; return
}
proc limark {} {
    # hint and mark processing.
    # hint: compact list, do not create additional whitespace
    if {[lcompact]} {return ""}
    # hint: wide list, create additional whitespace.
    # mark: exception: two list items following each other have no whitespace.
    global lmark ; if {$lmark} {return ""}
    return [tag br][tag br]\n
}
proc lcompact {} {global chint ; string equal $chint compact}
proc HandleText {text} {
    set redux [string map [list " " "" "\t" "" "\n" ""] $text]
    if {$redux != {}} {lsmark 0}
    return [htmlEscape $text]
}
################################################################
################################################################
################################################################
# Formatting commands.
proc manpage_begin {title section version} {
    if {[mp_pass] == 1} {return}
    set module      [mp_module]
    set shortdesc   [GetDesc mdesc]
    set description [GetDesc tdesc]
    set     hdr ""
    append  hdr "[markup ]$title - $shortdesc [markup ]\n"
    append  hdr "[ht_comment "Generated from [mp_file] by tcllib/doctools/mpexpand with [this]"]\n"
    append  hdr "[ht_comment "Copyright (c) [clock format [clock seconds] -format %Y] $::tcl_platform(user)"]\n"
    append  hdr "[ht_comment {All rights reserved}]\n"
    append  hdr "[ht_comment "CVS: \$Id\$ $title.$section"]\n"
    append  hdr "\n"
    append  hdr "[markup ] [string trimleft $title :]($section) $version $module \"$shortdesc\"[markup 
]\n"
    append  hdr "[section NAME]\n"
    append  hdr "[para] $title - $description"
    return $hdr
}
proc moddesc {desc} {
    if {[mp_pass] == 2} {return}
    SetDesc mdesc $desc
    return
}
proc titledesc {desc} {
    if {[mp_pass] == 2} {return}
    SetDesc tdesc $desc
    return
}
proc manpage_end {}     {return [markup