mirror of https://github.com/golang/go.git
51 lines
1.3 KiB
Go
51 lines
1.3 KiB
Go
// Copyright 2011 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package parse
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strconv"
|
|
)
|
|
|
|
// Set returns a slice of Trees created by parsing the template set
|
|
// definition in the argument string. If an error is encountered,
|
|
// parsing stops and an empty slice is returned with the error.
|
|
func Set(text string, funcs ...map[string]interface{}) (tree map[string]*Tree, err os.Error) {
|
|
tree = make(map[string]*Tree)
|
|
defer (*Tree)(nil).recover(&err)
|
|
lex := lex("set", text)
|
|
const context = "define clause"
|
|
for {
|
|
t := New("set") // name will be updated once we know it.
|
|
t.startParse(funcs, lex)
|
|
// Expect EOF or "{{ define name }}".
|
|
if t.atEOF() {
|
|
break
|
|
}
|
|
t.expect(itemLeftDelim, context)
|
|
t.expect(itemDefine, context)
|
|
name := t.expect(itemString, context)
|
|
t.Name, err = strconv.Unquote(name.val)
|
|
if err != nil {
|
|
t.error(err)
|
|
}
|
|
t.expect(itemRightDelim, context)
|
|
end := t.parse(false)
|
|
if end == nil {
|
|
t.errorf("unexpected EOF in %s", context)
|
|
}
|
|
if end.Type() != nodeEnd {
|
|
t.errorf("unexpected %s in %s", end, context)
|
|
}
|
|
t.stopParse()
|
|
if _, present := tree[t.Name]; present {
|
|
return nil, fmt.Errorf("template: %q multiply defined", name)
|
|
}
|
|
tree[t.Name] = t
|
|
}
|
|
return
|
|
}
|