# -*- tcl -*-
# $Id: script,v 1.8 1998/11/14 14:27:33 tobotras Exp $
# HTML -> TeX. You'd expected me to write HTML->PS? No way.
#

require Simple.tcl
require TEItools.tcl
TEItoolsSetup "tex"
require TEItoolsTeX.tcl

specification translate {
    {element HTML} {
	prefix		"[openFile]"
	suffix		"[closeFile]"
    }
    {elements "HEAD TITLE LINK META BASE MAP AREA"} {
	prefix		""
	cdataFilter	null
	sdataFilter	null
    }
    {elements "BODY"} {
	prefix		""
    }
    {element H1} {
	prefix		"\\n\\\\section{"
	suffix		"}\\n"
    }
    {element H2} {
	prefix		"\\n\\\\subsection{"
	suffix		"}\\n"
    }
    {element H3} {
	prefix		"\\n\\\\subsubsection{"
	suffix		"}\\n"
    }
    {element H4} {
	prefix		"\\n\\\\paragraph{"
	suffix		"}\\n"
    }
    {element PRE} {
	prefix		"\\n\\\\begin{verbatim}\\n"
	suffix		"\\n\\\\end{verbatim}\\n"
	cdataFilter	identity
	sdataFilter	verbatimFilter
    }
    {element HR} {
	prefix		"\\n\\\\medskip\\\\hrule\\\\medskip\\n"
    }
    {element UL} {
	prefix		"\\n\\\\begin{itemize}\\n"
	suffix		"\\n\\\\end{itemize}\\n"
    }
    {element OL} {
	prefix		{\n\\begin{enumerate}\n}
	suffix		{\n\\end{enumerate}\n}
    }
    {element LI} {
	prefix		"\\n\\\\item "
	suffix		"\\n"
    }
    {element P} {
	prefix		"\\n\\\\par\\n"
    }
    {element A} {
	prefix		"\{\\\\bfseries\\\\em{}"
	suffix		"\}"
    }
    {elements "I EM"} {
	prefix		"\{\\\\em{}"
	suffix		"\}"
    }
    {element BR in P} {
	prefix		"[lineBreak]"
    }
    {element BR} {
	prefix		""
    }
    {element SMALL} {
	prefix		"\{\\\\small "
	suffix		"\}"
    }
    {element TT} {
	prefix		"\\\\texttt\{"
	suffix		"\}"
    }
    {elements "STRONG B"} {
	prefix		"\\\\textbf\{"
	suffix		"\}"
    }
    {element CENTER} {
	prefix		"\\n\\\\begin{center}\\n"
	suffix		"\\n\\\\end{center}\\n"
    }
    {element TABLE} {
	prefix		"[openTable]"
	suffix		"[closeTable]"
    }
    {element TR in TABLE} {
	prefix		{\\hline\n}
	suffix		"[closeRow]"
    }
    {element TD in TR in TABLE} {
	prefix		"[openCell]"
	suffix		"[closeCell]"
    }
    {element IMG} {
	prefix		"\n\\\\begin{figure*}\\[hbp\\]\\\\begin{center}\n[doFigure]"
	suffix		"\\\\end{center}\n\\\\end{figure*}\n"
    }
    {el} {
	prefix		"[openUnknown]"
	cdataFilter	textCdataFilter
	sdataFilter	textSdataFilter
    }
}

proc doFigure {} {
    set fileName [file tail [query attval SRC]]
    return [insertGraphicFile $fileName]
}

#To be moved to TeXlib.tcl
proc insertGraphicFile { fileName } {
    append fileName ".eps"
    if { ![file readable $fileName] } {
	Warning "no such file: $fileName"
    } else {
	return "\n\\includegraphics*{$fileName}\n"
    }
}

proc lineBreak {} {
    return "\n\\mbox{}\\\\\n"
}

proc openTable {} {
    set cols [countColsInTable]

    set tableFormat "|"
    
    for {set i 0} {$i < $cols} {incr i} {
	append tableFormat "p{\\CellW}|"
    }

    set ret "
%\\begin{center}
\\setlength\\CellW {\\textwidth}
\\addtolength{\\CellW}{-[expr 2 * $cols]\\tabcolsep}
\\divide\\CellW $cols
\\begin{longtable}{$tableFormat}
\\endfirsthead
"
    set t [localize endfoot]
    if { $t != "" } {
	append ret "\n\\multicolumn{$cols}{r}{$t}\\\\\n\\endfoot\n"
    }

    append ret "\\endlastfoot\n"

    set t [localize continue_caption]
    if { $t != "" } {
        append ret "\\caption[]{[localize cyr]$t}\\\\\n"
    }

    set t [localize endhead]
    if { $t != "" } {
        append ret "\\multicolumn{$cols}{l}{$t}\\\\\\hline\n"
    }

    append ret "\\endhead\n"
    return $ret
}

proc countColsInTable {} {
    set maxCols 0
    foreachNode child element TR {
	set N 0
	foreachNode child element TD {
	    set colSpan [query attval COLSPAN]
	    if { $colSpan == "" } {
		set colSpan 1
	    }
	    incr N $colSpan
	}
	if { $maxCols < $N } {
	    set maxCols $N
	}
    }
    if { $maxCols == 0 } {
	Error "Table without rows?? Hm..."
    }
    return $maxCols
}

proc closeTable {} {
    set ret "
\\end{longtable}
%\\end{center}
"
}



proc openFile {} {
    return "
\\documentclass\[a4paper\]{article}
[localize LaTeX_preamble]
\\usepackage{graphicx,longtable,geometry,textcomp}
[extraPreamble]
[TEItools_Style]
\\begin{document}
\\newlength\\CellW
[definePageStyle]
"
}

proc closeFile {} {
    #
    # Cut'n'paste from tei/tex/script:latexFileFooter
    #
    set fqdn {}
    global env
    if { [info exist env(HOST) ] } {
	set fqdn $env(HOST)
    } elseif { [info exist env(HOSTNAME)] } {
	set fqdn $env(HOSTNAME)
    } else {
	catch {set fqdn [exec hostname]}
    }
    if { [string first "." $fqdn] == -1 } {
	catch {set fqdn "${fqdn}.[exec domainname]"}
    }
    return "
\\end{document}
% Converted to LaTeX by $env(USER)@$fqdn at [exec date]
"
}

proc TEItools_Style {} {
    return "
\\sloppy
\\setlength{\\parindent}{0pt}
\\addtolength{\\parskip}{1ex}
"
}

proc extraPreamble {} {
    return "
\\geometry{[geometryArgs]}
\\setcounter{secnumdepth}{0}
"
}

proc geometryArgs {} {
    return "a4paper"
}

proc definePageStyle {} {
    return
}

proc openUnknown {} {
    Warning "unknown element [query gi]"
    return
}

proc closeRow {} {
    withNode next {
	return
    }
    return "\\hline\n"
}

proc openCell {} {
    set colSpan [query attval COLSPAN]
    if { $colSpan == "" } {
	set colSpan 1
    }
    if { $colSpan == 1 } {
	set cellHead "\{"
    } else {
	set cellHead "\\multicolumn\{$colSpan\}\{|l|\}\{"
    }
    return "${cellHead}\\noindent\\mbox{}\\hskip0pt{}\\parbox\{${colSpan}\\CellW\}\{\\strut "
}

proc closeCell {} {
    set tail "\\strut\}\}"
    withNode next {
	return "${tail}&
"
    }
    return "${tail}\\\\
"
}
