parser_document.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. n := &nodeHTML{token: t}
  8. left := p.PeekTypeN(-1, TokenSymbol)
  9. right := p.PeekTypeN(1, TokenSymbol)
  10. n.trimLeft = left != nil && left.TrimWhitespaces
  11. n.trimRight = right != nil && right.TrimWhitespaces
  12. p.Consume() // consume HTML element
  13. return n, nil
  14. case TokenSymbol:
  15. switch t.Val {
  16. case "{{":
  17. // parse variable
  18. variable, err := p.parseVariableElement()
  19. if err != nil {
  20. return nil, err
  21. }
  22. return variable, nil
  23. case "{%":
  24. // parse tag
  25. tag, err := p.parseTagElement()
  26. if err != nil {
  27. return nil, err
  28. }
  29. return tag, nil
  30. }
  31. }
  32. return nil, p.Error("Unexpected token (only HTML/tags/filters in templates allowed)", t)
  33. }
  34. func (tpl *Template) parse() *Error {
  35. tpl.parser = newParser(tpl.name, tpl.tokens, tpl)
  36. doc, err := tpl.parser.parseDocument()
  37. if err != nil {
  38. return err
  39. }
  40. tpl.root = doc
  41. return nil
  42. }
  43. func (p *Parser) parseDocument() (*nodeDocument, *Error) {
  44. doc := &nodeDocument{}
  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. return doc, nil
  53. }