// closeBlock : OPEN_ENDBLOCK helperName CLOSE func (p *parser) parseCloseBlock(block *ast.BlockStatement) { // OPEN_ENDBLOCK tok := p.shift() if tok.Kind != lexer.TokenOpenEndBlock { errExpected(lexer.TokenOpenEndBlock, tok) } // helperName endId := p.parseHelperName() closeName, ok := ast.HelperNameStr(endId) if !ok { errNode(endId, "Erroneous closing expression") } openName := block.Expression.Canonical() if openName != closeName { errNode(endId, fmt.Sprintf("%s doesn't match %s", openName, closeName)) } // CLOSE tokClose := p.shift() if tokClose.Kind != lexer.TokenClose { errExpected(lexer.TokenClose, tokClose) } block.CloseStrip = ast.NewStrip(tok.Val, tokClose.Val) }
// mustache : OPEN helperName param* hash? CLOSE // | OPEN_UNESCAPED helperName param* hash? CLOSE_UNESCAPED func (p *parser) parseMustache() *ast.MustacheStatement { // OPEN | OPEN_UNESCAPED tok := p.shift() closeToken := lexer.TokenClose if tok.Kind == lexer.TokenOpenUnescaped { closeToken = lexer.TokenCloseUnescaped } unescaped := false if (tok.Kind == lexer.TokenOpenUnescaped) || (rOpenAmp.MatchString(tok.Val)) { unescaped = true } result := ast.NewMustacheStatement(tok.Pos, tok.Line, unescaped) // helperName param* hash? result.Expression = p.parseExpression(tok) // CLOSE | CLOSE_UNESCAPED tokClose := p.shift() if tokClose.Kind != closeToken { errExpected(closeToken, tokClose) } result.Strip = ast.NewStrip(tok.Val, tokClose.Val) return result }
// openBlock : OPEN_BLOCK helperName param* hash? blockParams? CLOSE // openInverse : OPEN_INVERSE helperName param* hash? blockParams? CLOSE // openInverseChain: OPEN_INVERSE_CHAIN helperName param* hash? blockParams? CLOSE func (p *parser) parseOpenBlock() (*ast.BlockStatement, []string) { // OPEN_BLOCK | OPEN_INVERSE | OPEN_INVERSE_CHAIN tok := p.shift() // helperName param* hash? blockParams? result, blockParams := p.parseOpenBlockExpression(tok) // CLOSE tokClose := p.shift() if tokClose.Kind != lexer.TokenClose { errExpected(lexer.TokenClose, tokClose) } result.OpenStrip = ast.NewStrip(tok.Val, tokClose.Val) // named returned values return result, blockParams }
// partial : OPEN_PARTIAL partialName param* hash? CLOSE func (p *parser) parsePartial() *ast.PartialStatement { // OPEN_PARTIAL tok := p.shift() result := ast.NewPartialStatement(tok.Pos, tok.Line) // partialName result.Name = p.parsePartialName() // param* hash? result.Params, result.Hash = p.parseExpressionParamsHash() // CLOSE tokClose := p.shift() if tokClose.Kind != lexer.TokenClose { errExpected(lexer.TokenClose, tokClose) } result.Strip = ast.NewStrip(tok.Val, tokClose.Val) return result }