// tagURLForParser implements a {% urlfor %} tag. // // urlfor takes one argument for the controller, as well as any number of key/value pairs for additional URL data. // Example: {% urlfor "UserController.View" ":slug" "oal" %} func tagAppendParser(doc *p2.Parser, start *p2.Token, arguments *p2.Parser) (p2.INodeTag, *p2.Error) { var name string var isPublic bool // Parse variable name typeToken := arguments.MatchType(p2.TokenIdentifier) if typeToken != nil { name = typeToken.Val } else if sToken := arguments.MatchType(p2.TokenString); nil != sToken { name = sToken.Val } else { return nil, arguments.Error("Expected an identifier or string.", nil) } evals := []p2.IEvaluator{} for arguments.Remaining() > 0 { expr, err := arguments.ParseExpression() if err != nil { return nil, err } evals = append(evals, expr) } // if len(evals) <= 0 { // return nil, arguments.Error("URL takes one argument for the controller and any number of optional pairs of key/value pairs.", nil) // } return &tagAppendNode{isPublic, name, evals}, nil }
// tagURLForParser implements a {% urlfor %} tag. // // urlfor takes one argument for the controller, as well as any number of key/value pairs for additional URL data. // Example: {% urlfor "UserController.View" ":slug" "oal" %} func tagURLForParser(doc *p2.Parser, start *p2.Token, arguments *p2.Parser) (p2.INodeTag, *p2.Error) { evals := []p2.IEvaluator{} for arguments.Remaining() > 0 { expr, err := arguments.ParseExpression() evals = append(evals, expr) if err != nil { return nil, err } } if len(evals) <= 0 { return nil, arguments.Error("URL takes one argument for the controller and any number of optional value.", nil) } return &tagURLForNode{evals}, nil }