# Linuxdoc (aka QWERTZ) to DocBook 3.0 convertor
# $Id: script,v 1.5 1998/11/11 15:06:00 tobotras Exp $
# TODO:
#  URL within AUTHOR

require Simple.tcl
require TEItools.tcl

TEItoolsSetup "docbook"

output "<!doctype Book PUBLIC '-//Davenport//DTD DocBook V3.0//EN'>\n\n"

set appendix "no"

specification translate {
    {element TABLE} {
	prefix		"\n<Table>\n[caption]\n"
	suffix		"</Table>\n"
    }
    {element TABULAR} {
	prefix		"\n<TGroup cols=[countTabularCols [query attval CA]]><TBody>\n<Row><Entry>\n"
	suffix		"\n</TBody></TGroup>\n"
    }
    {element COLSEP} {
	#Sic!
	prefix		"</Entry>"
	suffix		"<Entry>"
    }
    {element ROWSEP} {
	#Sic!
	prefix		"</Row>"
	suffix		"[startRow]"
    }
    {element LINUXDOC} {
	prefix		{}
	suffix		{}
	startAction {
	    foreachNode descendant withGI LABEL {
		set ID [query attval ID]
		foreachNode ancestor {
		    set gi [query gi]
		    if { "$gi" == "SECT" || "$gi" == "SECT1" \
			     || "$gi" == "SECT2" || "$gi" == "SECT3" \
			     || "$gi" == "SECT4" || "$gi" == "SECT5" } {
			setprop LABEL " id='${ID}'"
			break
		    }
		}
	    }
	}
	endAction {
	    output "\n<!--\nGenerated by TEItools (http://xtalk.price.ru/SGML/TEItools)\n-->\n"
	}
    }
    {element TT within AUTHOR} {
	#???
	prefix		"<Emphasis role='TT'>"
	suffix		"</Emphasis>"
    }
    {elements "URL HTMLURL"} {
	prefix		"[URL]"
	suffix		{}
    }
    {element REF} {
	#ID is not used for now.
	prefix		"<XRef LinkEnd='[query attval ID]'>"
	suffix		{}
    }
    {element EPS in FIGURE} {
	prefix		"\n<Graphic Fileref='[query attval FILE]'>"
	suffix		"</Graphic>\n"
    }
    {elements "SECT SECT1 SECT2 SECT3 SECT4"} {
	#list of elements should be synced with divNames (see below)
	prefix		"[divStart [query gi]]"
	startAction {
	    puts stderr "." nonewline
	}
	suffix		"[divEnd [query gi]]"
    }
    {element VERB} {
	prefix		"<LiteralLayout><!\\[ CDATA \\[\n"
	suffix		"\n]]></LiteralLayout>\n"
	cdataFilter	verbFilterCdata
	sdataFilter	verbFilterSdata
    }
    {element CODE} {
	prefix		"<LiteralLayout><!\\[ CDATA \\[\n"
	suffix		"\n]]></LiteralLayout>\n"
	cdataFilter	verbFilterCdata
	sdataFilter	verbFilterSdata
    }
    {element NEWLINE in P} {
	prefix		"</Para>"
	suffix		"<Para>"
    }
    {elements "CAPTION HLINE LABEL NEWLINE FIGURE"} {
	#ignored
	prefix		{}
	suffix		{}
	cdataFilter	null
	sdataFilter	null
    }
    {element TAG} {
	prefix		"\n<GlossEntry><GlossTerm>"
	suffix		"</GlossTerm><GlossDef>"
    }
    {element APPENDIX} {
	prefix		{}
	suffix		{}
	startAction {
	    global appendix
	    set appendix "yes"
	}
    }
    {element P} {
	prefix		"[startPara]"
	suffix		"[endPara]"
    }
    {el} {
	prefix		"[qwertz2book [query gi] open]"
	suffix		"[qwertz2book [query gi] close]"
	cdataFilter	textFilterCdata
	sdataFilter	textFilterSdata
    }
}

substitution textFilterCdata {
    "---" {&mdash;}
    "--" {&mdash;}
    "\t" "        "
}

substitution textFilterSdata {
    {[oslash ]} {&oslash;}
    {[lowbar ]} {&lowbar;}
    {[quot   ]} {&quot;}
}

substitution verbFilterSdata {
    {[oslash ]} {&oslash;}
    {[lowbar ]} {&lowbar;}
    {[quot   ]} {&quot;}
}

substitution verbFilterCdata {
    "\t" "        "
}

proc genericAttributes {} {
    set ret {}

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

    #others
    #...
    return $ret
}

array set q2b {
    ABSTRACT	"Abstract Para"
    ARTICLE	"Book"
    AUTHOR	"Author"
    BF		"Emphasis"
    DATE	"Date"
    DESCRIP	"GlossList"
    EM		"Emphasis"
    ENUM	"OrderedList"
    HEADING	"Title"
    ITEMIZE	"ItemizedList"
    ITEM	"ListItem Para"
    NAME	"FirstName"
    QUOTE	"BlockQuote Para"
    TITLEPAG	"BookInfo"
    TITLE	"Title"
    TOC		"ToC"
    TSCREEN	"InformalExample Para"
    TT		"Literal"
    VERB	"Literal"
}

proc qwertz2book { gi openclose } {
    global q2b
    if { [info exist q2b($gi)] } {
	set element $q2b($gi)
	set entry "$element"
    } else {
	set entry $gi
	if { "$openclose" == "open" } {
	    Warning "unknown element $gi"
	}
    }
    set len [llength $entry]
    set ret {}
    for {set i 0} {$i < $len} {incr i} {
	if { "$openclose" == "open" } {
	    append ret "<[lindex $entry $i]"
	    if { $i == 0 } {
		append ret [genericAttributes]
	    }
	    append ret ">"
	} else {
	    append ret "</[lindex $entry [expr $len - $i - 1]]>"
	}
    }
    return $ret
}

proc URL {} {
    return "<ULink URL='[query attval URL]'>[query attval NAME]</ULink>"
}

array set divNames {
    SECT	"Chapter"
    SECT1	"Sect1"
    SECT2	"Sect2"
    SECT3	"Sect3"
    SECT4	"Sect4"
}

proc divStart { gi } {
    global divNames appendix
    set divName $divNames($gi)
    if { "$gi" == "SECT" && $appendix == "yes" } {
	set divName "Appendix"
    }
    setprop divName $divName
    return "\n<${divName}[query propval LABEL]>\n"
}

proc divEnd { gi } {
    return "\n</[query propval divName]>\n"
}

proc startRow {} {
    withNode next {
	return "<Row><Entry>"
    }
    return
}

proc countTabularCols { format } {
    set len [string length format]
    set cols 0
    for {set i 0} {$i < $len} {incr i} {
	set char [string index $format $i]
	if { "$char" == "l" || "$char" == "r" || "$char" == "c" } {
	    incr cols
	}
    }
    return $cols
}

proc caption {} {
    withNode descendant withGI "CAPTION" {
	return "\n<Title>[filteredContent]</Title>\n"
    }
    return
}

proc startPara {} {
    #<P> have to be ignored within <DESCRIP> and before first <TAG>
    set ignore yes
    withNode parent {
	if { [query gi] != "DESCRIP" } {
	    set ignore no
	}
    }
    if { "$ignore" == "yes" } {
	withNode prev withGI "TAG" {
	    set ignore no
	}
    }
    setprop ignore $ignore
    if { "$ignore" == "yes" } {
	return
    } else {
	return "<Para>"
    }
}

proc endPara {} {
    if { [query propval ignore] == "yes" } {
	return 
    } else {
	return "</Para>"
    }
}

#Local variables:
#mode: tcl
#End:

