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  }