parser_document.go 1.1 KB

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