# -*- tcl -*-
#
# $Id: script,v 1.3 1999/03/08 11:38:46 tobotras Exp $

require TEItools.tcl
require RTF.spec
TEItoolsSetup "rtf"
set rtf_fp $outFile

require TEItoolsRTF.tcl

specification translate {
    {elements "BODY BACK"} {
	rtf special
	prefix {}
	startAction {
	    rtf:startSection	style_[toLower [query gi]]
	}
	endAction {
	    rtf:endSection
	}
    }
    {element TITLEPAGE} {
	rtf special
	prefix {}
	startAction {
	    rtf:startSection	style_titlepage
	}
	endAction {
	    rtf:endSection
	    rtf:startSection	style_contents
	    TableOfContents
	    rtf:endSection
	}
    }
    {element "TITLEHEAD"} {
	rtf para
	prefix {}
	paraStyle style_TitleHead
    }
    {element "TITLEPART"} {
	rtf para
	prefix {}
	paraStyle style_TitlePart
    }
    {element "STARTDATE"} {
	rtf special
	startAction {
	    rtf:startPara style_TZ
	    rtf:text " "
	    rtf:endPara
	    rtf:startPara style_StartDate
	}
	prefix	"  "
	endAction {
	    rtf:endPara
	}
    }
    {element HEAD in ITEM1} {
	paraStyle style_Head1
    }
    {element HEAD in STAGES} {
	paraStyle style_Head1
    }
    {element HEAD in STAGECONTENT} {
	paraStyle style_Head1
    }
    {element HEAD in STAGEDOCUMENTS} {
	paraStyle style_Head1
    }
    {element HEAD in ITEM2} {
	paraStyle style_Head2
    }
    {element HEAD in ITEM3} {
	paraStyle style_Head3
    }
    {element HEAD in ITEM4} {
	paraStyle style_Head4
    }
    {element HEAD} {
	rtf para
	paraStyle style_Head0
	prefix "[query parent propval N]"
	startAction openHeadMark
	endAction closeHead
    }
    {elements "ITEM1 ITEM2 ITEM3 ITEM4"} {
	rtf special
	prefix {}
	startAction openItem
	endAction   closeItem
    }
    {elements "LIST ORDEREDLIST"} {
	prefix {}
    }
    {element LISTITEM in ORDEREDLIST} {
	prefix	"[expr 1 + [countq prev element LISTITEM]].$rtfSpecial(EnSpace)"
    }
    {element LISTITEM} {
	rtf para
	paraStyle style_List_Item[countListNest]
	prefix		"$rtfSpecial(Bullet)$rtfSpecial(EnSpace)"
    }
    {element QUOTE} {
	rtf special
	prefix $rtfSpecial(LDQuote)
	suffix $rtfSpecial(RDQuote)
    }
    {el} {
	rtf none
	prefix	[openUnknown]
	cdataFilter textCdataFilter
	sdataFilter textSdataFilter
    }
}

proc main {} {
    rtf:start

    withNode docroot child el {
	CountThings
    }
    
    #FIXME
    withNode docroot child el {
	rtf:convert translate
    }
    rtf:end
    rtf:write "\n"
}

proc pageFooter {} {
    
}

proc pageHeader {} {
}

proc openItem {} {
    withNode child element HEAD {
	return
    }
    
    rtf:startPara style_[toLower [query gi]]
    rtf:write [query propval N]
}

proc closeItem {} {
    withNode child element HEAD {
	return
    }
    
    rtf:endPara
}

proc countListNest {} {
    set level 0
    foreachNode ancestor {
	set gi [query gi]
	foreach container {LIST ORDEREDLIST ITEM1 ITEM2 ITEM3 ITEM4 STAGES
	    STAGEDOCUMENTS STAGECONTENT ABSTRACT COMMONINFO GOAL CHARACTERISTICS
	    REQUIREMENTS CONTENTS FINISHINGREQUIREMENTS PREPARATION
	    DOCUMENTATIONREQUIREMENTS SOURCES RESUME} {
	    if { "$gi" == "$container" } {
		incr level
	    }
	}
    }
    return $level
}

proc TableOfContents {} {
    withNode docroot {
	rtf:convert generatetoc
    }
}

specification generatetoc {
    {element BODY} {
	rtf special
	startAction {
	    rtf:startPara style_Head1
	    rtf:write ""
	    rtf:endPara
	}
    }
    {element HEAD in COMMONINFO} {
	paraStyle style_TOC_1
    }
    {element HEAD in GOAL} {
	paraStyle style_TOC_1
    }
    {element HEAD in REQUIREMENTS} {
	paraStyle style_TOC_1
    }
    {element HEAD in CONTENTS} {
	paraStyle style_TOC_1
    }
    {element HEAD in FINISHINGREQUIREMENTS} {
	paraStyle style_TOC_1
    }
    {element HEAD in DOCUMENTATIONREQUIREMENTS} {
	paraStyle style_TOC_1
    }
    {element HEAD in SOURCES} {
	paraStyle style_TOC_1
    }
    {element HEAD in ITEM1} {
	paraStyle style_TOC_2
    }
    {element HEAD in ITEM2} {
	paraStyle style_TOC_3
    }
    {element HEAD} {
	rtf para
	paraStyle style_Default
	prefix [TOClinePrefix]
	cdataFilter textCdataFilter
	sdataFilter textSdataFilter
	endAction {
	    rtf:tab
	    withNode parent {
		PageRef [uniqueID]
	    }
	}
    }
    {el} {
	rtf special
	cdataFilter	null
	sdataFilter	null
	RE {}
    }
}

proc TOClinePrefix {} {
    set prefix [query parent propval N]
    if { "$prefix" == "" } {
	global rtfSpecial
	return "[expr 1 + [countq parent prev]].$rtfSpecial(EnSpace)"
    } else {
	return $prefix
    }
}

proc CountThings {} {
    if [string compare [query nodetype] "EL"] return
    global rtfSpecial
    switch -regexp [query gi] {
	"ITEM1" {
	    setprop N "[expr 1 + [countq parent prev]].[expr 1 + [countq prev element ITEM1]].$rtfSpecial(EnSpace)"
	}
	"ITEM2" {
	    if { ![string compare [query parent gi] "ITEM1"] } {
		setprop N "[expr 1 + [countq parent parent prev]].[expr 1 + [countq parent prev element ITEM1]].[expr 1 + [countq prev element ITEM2]].$rtfSpecial(EnSpace)"
	    } else {
		#  stages, stagedocuments, stagecontent  vvvvvvvvvvvvvvvvvvvv
		setprop N "[expr 1 + [countq parent parent prev]].[countq parent prev].[expr 1 + [countq prev element ITEM2]].$rtfSpecial(EnSpace)"
	    }
	}
	"ITEM3" {
	    if { ![string compare [query parent parent gi] "ITEM1"] } {
		setprop N "[expr 1 + [countq parent parent parent prev]].[expr 1 + [countq parent parent prev element ITEM1]].[expr 1 + [countq parent prev element ITEM2]].[expr 1 + [countq prev element ITEM3]].$rtfSpecial(EnSpace)"
	    } else {
	    #  stages, stagedocuments, stagecontent         vvvvvvvvvvvvvvvvvvvvvvvvvvv
		setprop N "[expr 1 + [countq parent parent parent prev]].[countq parent parent prev].[expr 1 + [countq parent prev element ITEM2]].[expr 1 + [countq parent prev element ITEM3]].$rtfSpecial(EnSpace)"
	    }
	}
	"ITEM4" {
	    if { ![string compare [query parent parent parent gi] "ITEM1"] } {
		setprop N "[expr 1 + [countq parent parent parent parent prev]].[expr 1 + [countq parent parent parent prev element ITEM1]].[expr 1 + [countq parent parent prev element ITEM2]].[expr 1 + [countq parent prev element ITEM3]].[expr 1 + [countq prev element ITEM4]].$rtfSpecial(EnSpace)"
	    } else {
	    #  stages, stagedocuments, stagecontent         vvvvvvvvvvvvvvvvvvvvvvvvvvv
		setprop N "[expr 1 + [countq parent parent parent parent prev]].[expr 1 + [countq parent parent parent prev]].[countq parent parent prev].[expr 1 + [countq parent prev element ITEM2]].[expr 1 + [countq parent prev element ITEM3]].$rtfSpecial(EnSpace)"
	    }
	}
	"STAGES" {
	    setprop N "[expr 1 + [countq parent prev]].1.$rtfSpecial(EnSpace)"
	}
	"STAGECONTENT" {
	    setprop N "[expr 1 + [countq parent prev]].2.$rtfSpecial(EnSpace)"
	}
	"STAGEDOCUMENTS" {
	    setprop N "[expr 1 + [countq parent prev]].3.$rtfSpecial(EnSpace)"
	}
	"(ABSTRACT)|(COMMONINFO)|(GOAL)|(CHARACTERISTICS)|(REQUIREMENTS)|(CONTENTS)|(FINISHINGREQUIREMENTS)|(PREPARATION)|(DOCUMENTATIONREQUIREMENTS)|(SOURCES)|(RESUME)" {
	    setprop N "[expr 1 + [countq prev]].$rtfSpecial(EnSpace)"
	}
    }
    foreachNode child el {
	CountThings
    }
}

rename textCdataFilter {}

proc textCdataFilter { text } {
    regsub -all -- "\[ \n\t\]+" $text " " text
    return $text
}

proc closeHead {} {
    closeHeadMark

    puts stderr "next type is [query next nodetype]"
    if { "[query next nodetype]" != "EL" } {
	rtf:startPara style_[toLower [query parent gi]]
    }
}
