50fef78078
Fixed a bug in the template fragment coalescer. Added the loadTemplate function to help reduce the amount of duplicated code in the template generator. Added a couple of helper methods to CContext to reduce the amount of possibly error prone boilerplate.
99 lines
2.3 KiB
Go
99 lines
2.3 KiB
Go
package tmpl
|
|
|
|
import (
|
|
"reflect"
|
|
)
|
|
|
|
// For use in generated code
|
|
type FragLite struct {
|
|
Body string
|
|
}
|
|
|
|
type Fragment struct {
|
|
Body string
|
|
TemplateName string
|
|
Index int
|
|
Seen bool
|
|
}
|
|
|
|
type OutBufferFrame struct {
|
|
Body string
|
|
Type string
|
|
TemplateName string
|
|
Extra interface{}
|
|
Extra2 interface{}
|
|
}
|
|
|
|
type CContext struct {
|
|
RootHolder string
|
|
VarHolder string
|
|
HoldReflect reflect.Value
|
|
TemplateName string
|
|
LoopDepth int
|
|
OutBuf *[]OutBufferFrame
|
|
}
|
|
|
|
func (con *CContext) Push(nType string, body string) (index int) {
|
|
*con.OutBuf = append(*con.OutBuf, OutBufferFrame{body, nType, con.TemplateName, nil, nil})
|
|
return con.LastBufIndex()
|
|
}
|
|
|
|
func (con *CContext) PushText(body string, fragIndex int, fragOutIndex int) (index int) {
|
|
*con.OutBuf = append(*con.OutBuf, OutBufferFrame{body, "text", con.TemplateName, fragIndex, fragOutIndex})
|
|
return con.LastBufIndex()
|
|
}
|
|
|
|
func (con *CContext) PushPhrase(body string, langIndex int) (index int) {
|
|
*con.OutBuf = append(*con.OutBuf, OutBufferFrame{body, "lang", con.TemplateName, langIndex, nil})
|
|
return con.LastBufIndex()
|
|
}
|
|
|
|
func (con *CContext) StartLoop(body string) (index int) {
|
|
con.LoopDepth++
|
|
return con.Push("startloop", body)
|
|
}
|
|
|
|
func (con *CContext) EndLoop(body string) (index int) {
|
|
return con.Push("endloop", body)
|
|
}
|
|
|
|
func (con *CContext) StartTemplate(body string) (index int) {
|
|
return con.addFrame(body, "starttemplate", nil, nil)
|
|
}
|
|
|
|
func (con *CContext) EndTemplate(body string) (index int) {
|
|
return con.Push("endtemplate", body)
|
|
}
|
|
|
|
func (con *CContext) AttachVars(vars string, index int) {
|
|
outBuf := *con.OutBuf
|
|
node := outBuf[index]
|
|
if node.Type != "starttemplate" && node.Type != "startloop" {
|
|
panic("not a starttemplate node")
|
|
}
|
|
node.Body += vars
|
|
outBuf[index] = node
|
|
}
|
|
|
|
func (con *CContext) addFrame(body string, ftype string, extra1 interface{}, extra2 interface{}) (index int) {
|
|
*con.OutBuf = append(*con.OutBuf, OutBufferFrame{body, ftype, con.TemplateName, extra1, extra2})
|
|
return con.LastBufIndex()
|
|
}
|
|
|
|
func (con *CContext) LastBufIndex() int {
|
|
return len(*con.OutBuf) - 1
|
|
}
|
|
|
|
func (con *CContext) DiscardAndAfter(index int) {
|
|
outBuf := *con.OutBuf
|
|
if len(outBuf) <= index {
|
|
return
|
|
}
|
|
if index == 0 {
|
|
outBuf = nil
|
|
} else {
|
|
outBuf = outBuf[:index]
|
|
}
|
|
*con.OutBuf = outBuf
|
|
}
|