# -*- tcl -*-
#
# $Id: script,v 1.14 1998/11/11 15:05:57 tobotras Exp $

# DocBook 3.0 -> TEI Lite
# 
# FIXME!! Table rendition.
##

require Simple.tcl
require TEItools.tcl

TEItoolsSetup "tei"

specification translate {
    {elements "LEGALNOTICE AUTHORBLURB SCREENSHOT"} {
	prefix		{}
	suffix		{}
	cdataFilter	null
	sdataFilter	null
    }
    {element PARA within LEGALNOTICE} {
	prefix		{}
	suffix		{}
	cdataFilter	null
	sdataFilter	null
    }
    {element PARA within AUTHORBLURB} {
	prefix		{}
	suffix		{}
	cdataFilter	null
	sdataFilter	null
    }
    {element SURNAME within AUTHOR} {
	prefix		" "
    }
    {element GRAPHIC} {
	prefix		"\n<figure entity='[graphicEntityRef]'>"
	suffix		"</figure>\n"
    }
    {element XREF} {
	prefix		"<ptr target='[query attval LINKEND]'>"
	suffix		{}
    }
    {element TITLE in EXAMPLE} {
	prefix	"[openGi title]"
	suffix	"[closeGi title]\n"
    }
    {element TITLE within BOOKINFO} {
	prefix	"\n<doctitle><titlepart type='main'>"
	suffix	"</titlepart>\n"
    }
    {element SUBTITLE within BOOKINFO} {
	prefix	"\n<titlepart type='subtitle'>"
	suffix	"</titlepart>\n"
    }
    {element AUTHORBLURB within AUTHOR} {
	prefix		{}
	cdataFilter	null
	sdataFilter	null
    }
    {elements "PARA SIMPARA"} {
	prefix	"[openPara]"
	suffix	"[closePara]"
    }
    {element TOC} {
	prefix		"\n[openGi \"DivGen type='ToC'\"]"
	cdataFilter	null
	sdataFilter	null
    }
    {elements "THEAD TBODY TGROUP INFORMALEXAMPLE GLOSSENTRY"} {
	prefix		{}
	suffix		{}
    }
    {element ROW in THEAD} {
	prefix		"[openGi \"row role='label'\"]\n"
	suffix		"\n[closeGi row]\n"
    }
    {element ROW} {
	prefix		"[openGi row]\n"
	suffix		"\n[closeGi row]\n"
    }
    {element TABLE} {
	prefix		"[openGi p][openGi \"table rend='jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj'\"]\n"
	suffix		"[closeGi table][closeGi p]\n"
    }
    {elements "FIRSTNAME LASTNAME SURNAME OTHERNAME"} {
	prefix		{}
	suffix		" "
    }
    {elements "PROGRAMLISTING LITERALLAYOUT"} {
	prefix		"<eg><!\\[ CDATA \\["
	suffix		"]]></eg>"
    }
    {elements "BOOK CHAPTER SECT SECT1 SECT2 SECT3 SECT4 SECT5 BOOT" } {
	startAction {
	    global bodyStarted
	    if { ![info exists bodyStarted] } {
		set bodyStarted yes
		setprop openingElement yes
		output "<!doctype tei.2 public '-//TEI//DTD TEI Tools 0.1//EN' \[
[entitiesDefinitions]
\]>
<tei.2>
<teiheader>
<filedesc>
<titlestmt>
<title></title>
</titlestmt>
<publicationstmt>
</publicationstmt>
<sourcedesc>
</sourcedesc>
</filedesc>
</teiheader>
<text>
<body>
"
	    } else {
	        puts stderr "." nonewline
	    }	
        }
	endAction {
	    if { "[query propval openingElement]" != "" } {
		output		"
    </body>
  </text>
</tei.2>
"
	    }
        }
    }
    {element BOOKINFO} {
	prefix	"\n<front><titlepage>\n"
	suffix	"<body>"
	endAction {
	    global bodyStarted
	    set bodyStarted 1
	}
    }
    {element TOC} {
	prefix	"\n<DIVGEN type='ToC'>\n"
	suffix	{}
    }
    {element LISTITEM} {
	prefix	"<ITEM><P>"
	suffix	"</ITEM>\n"
    }
    {el} {
        prefix		"[openGi [book2tei [query gi]]]"
	suffix		"[closeGi [lindex [book2tei [query gi]] 0]]"
	sdataFilter	textSdataFilter
    }
}

###FIXME!! Add all the rest here:
substitution textSdataFilter {
    {[nbsp  ]} {&nbsp;}
    {[szlig ]} {&szlig;}
}

# Mapping from DocBook to TEI
array set b2t {
    ABSTRACT	"DIV type='Abstract'"
    APPENDIX	"DIV1 type='Appendix'"
    AUTHOR	"DOCAUTHOR"
    BOOK	"TEI.2"
    BLOCKQUOTE	"Q rend='Block'"
    CHAPTER	"DIV1 type='Section'"
    COMMAND	"CODE"
    DATE	"DOCDATE"
    ENTRY	"CELL"
    EMPHASIS	"HI"
    EXAMPLE	"Q rend='Block'"
    FILENAME	"CODE"
    GLOSSDEF	"ITEM"
    GLOSSLIST	"LIST type='Gloss'"
    GLOSSTERM	"LABEL"
    GUIBUTTON	"CODE"
    IMPORTANT	"NOTE place='Inline'"
    ITEMIZEDLIST "LIST type='Bullets'"
    LITERAL	"CODE"
    NOTE	"NOTE place='Foot'"
    ORDEREDLIST "LIST type='Ordered'"
    PRODUCTNAME "TITLE"
    QUOTE	"Q"
    SECT1	"DIV2 type='Subsection'"
    SECT2	"DIV3 type='Subsubsection'"
    SECT3	"DIV4 type='Paragraph'"
    SECT4	"DIV5 type='Subparagraph'"
    TERM	"TERM"
    TITLE	"HEAD"
    ULINK	"XREF type='URL'"
    USERINPUT	"CODE"
    VARIABLELIST "LIST type='Gloss'"
    VARLISTENTRY "LABEL"
}

proc book2tei { gi } {
    global b2t
    if { [info exist b2t($gi)] } {
	set element $b2t($gi)
	set ret "$element"
    } else {
	set ret $gi
	Warning "Can't map from DocBook to TEI: $gi"
    }
    return $ret
}

proc generateEntity {} {
    global entitySequence
    if { ![ info exists entitySequence] } {
	set entitySequence -1
    }
    return "ent[incr entitySequence]"
}


proc entitiesDefinitions {} {
    global filename2entity

    set ret {}

    foreachNode doctree element GRAPHIC {
	set fileref "[query attval FILEREF]"
	set entityref "[query attval ENTITYREF]"
	set format [attVal FORMAT]
	if { "$format" != "" && $format != "ps" && $format != "eps" } {
	    Error "Only PS and EPS graphic format are supported"
	}
	if { "$entityref" == "" } {
	    if { "$fileref" == "" } {
		Error "Either ENTITYREF or FILEREF should be supplied"
	    } else {
		set entityref [generateEntity]
		set filename2entity($fileref) $entityref
	    }
	} else {
	    withNode entity $entityref {
		set fileref [query sysid]
		set format [query dcn]
		if { "$format" != "" } {
		    if { $format != "ps" && $format != "eps" } {
			Error "Only PS and EPS graphic format are supported"
		    }
		} else {
		    set format "EPS"
		}
	    }
	}
	append ret "<!entity $entityref SYSTEM '[stripFileType $fileref]' NDATA $format>\n"
    }
    return $ret
}

proc graphicEntityRef {} {
    set fileref "[query attval FILEREF]"
    set entityref "[query attval ENTITYREF]"

    if { "$entityref" == "" } {
	global filename2entity
	set entityref $filename2entity($fileref)
    }
    return $entityref
}

proc openGi { gi } {
    return "<$gi[genericAttributes]>"
}

proc closeGi { gi } {
    return "</$gi>"
}

proc genericAttributes {} {
    
    set ret {}

    #ID
    set id [query attval ID]
    if { "$id" != "" } {
	append ret " ID='${id}'"
    }

    #others
    #...
    return $ret
}

proc openPara {} {
    withNode parent {
	set parentGI [query gi]
    }
    if { $parentGI == "NOTE" || $parentGI == "LISTITEM" } {
	if { [childNumber] == 1 } {
	    setprop "firstParOfNote" "true"
	    return
	}
    }
    return "<P>\n"
}

proc closePara {} {
    if { [query propval "firstParOfNote"] == "true" } {
	return
    }
    return "\n</P>"
}

