This repository has been archived by the owner on Feb 21, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tterse.go
75 lines (63 loc) · 2.04 KB
/
tterse.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package tterse
import (
"github.com/lestrrat/go-xslate/parser"
"io"
)
// SymbolSet contains TTerse specific symbols
var SymbolSet = parser.DefaultSymbolSet.Copy()
func init() {
// "In" must come before Include
SymbolSet.Set("INCLUDE", parser.ItemInclude, 2.0)
SymbolSet.Set("IN", parser.ItemIn, 1.5)
SymbolSet.Set("WITH", parser.ItemWith)
SymbolSet.Set("CALL", parser.ItemCall)
SymbolSet.Set("END", parser.ItemEnd)
SymbolSet.Set("WRAPPER", parser.ItemWrapper)
SymbolSet.Set("SET", parser.ItemSet)
SymbolSet.Set("GET", parser.ItemGet)
SymbolSet.Set("IF", parser.ItemIf)
SymbolSet.Set("ELSIF", parser.ItemElseIf)
SymbolSet.Set("ELSE", parser.ItemElse)
SymbolSet.Set("UNLESS", parser.ItemUnless)
SymbolSet.Set("FOREACH", parser.ItemForeach)
SymbolSet.Set("WHILE", parser.ItemWhile)
SymbolSet.Set("MACRO", parser.ItemMacro)
SymbolSet.Set("BLOCK", parser.ItemBlock)
SymbolSet.Set("END", parser.ItemEnd)
}
// TTerse is the main parser for TTerse
type TTerse struct{}
// NewStringLexer creates a new lexer
func NewStringLexer(template string) *parser.Lexer {
l := parser.NewStringLexer(template, SymbolSet)
l.SetTagStart("[%")
l.SetTagEnd("%]")
return l
}
// NewReaderLexer creates a new lexer
func NewReaderLexer(rdr io.Reader) *parser.Lexer {
l := parser.NewReaderLexer(rdr, SymbolSet)
l.SetTagStart("[%")
l.SetTagEnd("%]")
return l
}
// New creates a new TTerse parser
func New() *TTerse {
return &TTerse{}
}
// Parse parses the given template and creates an AST
func (p *TTerse) Parse(name string, template []byte) (*parser.AST, error) {
return p.ParseString(name, string(template))
}
// ParseString is the same as Parse, but receives a string instead of []byte
func (p *TTerse) ParseString(name, template string) (*parser.AST, error) {
b := parser.NewBuilder()
lex := NewStringLexer(template)
return b.Parse(name, lex)
}
// ParseReader gets the template content from an io.Reader type
func (p *TTerse) ParseReader(name string, rdr io.Reader) (*parser.AST, error) {
b := parser.NewBuilder()
lex := NewReaderLexer(rdr)
return b.Parse(name, lex)
}