# -*- tcl -*-

require TEItools.tcl
TEItoolsSetup "dtd"

eventHandler translateHandler -global {
    START {
	doElement
    }
    CDATA {
	doCdata
    }
    SDATA {
	doCdata
    }
}

proc main {} {
    translateHandler
    dumpDTD
}

proc doElement {} {
    set gi [query gi]
    if { "[query parent nodetype]" == "SD" } {
	global docElement
	set docElement $gi
    }
    global elements
    set elements($gi) 1
    global occurence
    set occurence([query parent gi],$gi) $gi
    foreachNode attlist {
	global attributes
	set attName [query attname]
	set attributes($gi,$attName) $attName
    }
}

proc doCdata {} {
    global occurence
    set elements([query parent gi]) 1
    set occurence([query parent parent gi],#PCDATA) "#PCDATA"
}

proc dumpDTD {} {
    global docElement elements occurence argv
    output "<!--

	This is automatically generated DTD.
	It is created from document instance and is guaranteed to be
	incorrect and require manual edition.

	Document element $docElement.

	Invocation: <!doctype $docElement SYSTEM ${argv}.dtd>

-->

"
    dumpElement $docElement
    unset elements($docElement)
    foreach gi [array names elements] {
	dumpElement $gi
    }
}

proc dumpElement { gi } {
    global occurence
    output "<!ELEMENT $gi - - "
    set eltsShown 0
    foreach elts [array names occurence "$gi,*"] {
	if { $eltsShown > 0 } {
	    output "|"
	} else {
	    output "("
	}
	output $occurence($elts)
	incr eltsShown
    }
    if { $eltsShown == 0 } {
	output "EMPTY"
    } else {
	output ")*"
    }
    output ">\n"
    global attributes
    set attrs "[array names attributes $gi,*]"
    if { "$attrs" != "" } {
	output "<!ATTLIST $gi\n"
	foreach attName $attrs {
	    output " $attributes($attName) CDATA #IMPLIED\n"
	}
	output ">\n"
    }
}
