github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/flosch/pongo2.v3/parser_document.go (about) 1 package pongo2 2 3 // Doc = { ( Filter | Tag | HTML ) } 4 func (p *Parser) parseDocElement() (INode, *Error) { 5 t := p.Current() 6 7 switch t.Typ { 8 case TokenHTML: 9 p.Consume() // consume HTML element 10 return &nodeHTML{token: t}, nil 11 case TokenSymbol: 12 switch t.Val { 13 case "{{": 14 // parse variable 15 variable, err := p.parseVariableElement() 16 if err != nil { 17 return nil, err 18 } 19 return variable, nil 20 case "{%": 21 // parse tag 22 tag, err := p.parseTagElement() 23 if err != nil { 24 return nil, err 25 } 26 return tag, nil 27 } 28 } 29 return nil, p.Error("Unexpected token (only HTML/tags/filters in templates allowed)", t) 30 } 31 32 func (tpl *Template) parse() *Error { 33 tpl.parser = newParser(tpl.name, tpl.tokens, tpl) 34 doc, err := tpl.parser.parseDocument() 35 if err != nil { 36 return err 37 } 38 tpl.root = doc 39 return nil 40 } 41 42 func (p *Parser) parseDocument() (*nodeDocument, *Error) { 43 doc := &nodeDocument{} 44 45 for p.Remaining() > 0 { 46 node, err := p.parseDocElement() 47 if err != nil { 48 return nil, err 49 } 50 doc.Nodes = append(doc.Nodes, node) 51 } 52 53 return doc, nil 54 }