- if len(params) <= 6:
- node = None
- with_obj = None
- as_var = None
- remaining_tokens = params[1:]
- while remaining_tokens:
- option_token = remaining_tokens.pop(0)
- if option_token == 'with':
- try:
- with_obj = remaining_tokens.pop(0)
- except IndexError:
- raise template.TemplateSyntaxError('"%s" template tag option "with" requires an argument specifying an object handled by the view on the node' % tag)
- elif option_token == 'as':
- try:
- as_var = remaining_tokens.pop(0)
- except IndexError:
- raise template.TemplateSyntaxError('"%s" template tag option "as" requires an argument specifying a variable name' % tag)
- else: # node
- node = option_token
- return NodeURLNode(node=node, with_obj=with_obj, as_var=as_var)
- else:
- raise template.TemplateSyntaxError('"%s" template tag cannot accept more than five arguments' % tag)
\ No newline at end of file
+ if len(params) >= 2 and params[-2] == 'as':
+ as_var = params[-1]
+ params = params[:-2]
+
+ if len(params) >= 2 and params[-2] == 'for':
+ node = parser.compile_filter(params[-1])
+ params = params[:-2]
+
+ if len(params) >= 2 and params[-2] == 'with':
+ with_obj = parser.compile_filter(params[-1])
+ params = params[:-2]
+
+ if with_obj is not None:
+ if params:
+ raise template.TemplateSyntaxError('`%s` template tag accepts no arguments or keyword arguments if with <obj> is specified.' % tag)
+ return NodeURLNode(with_obj=with_obj, node=node, as_var=as_var)
+
+ if params:
+ args = []
+ kwargs = {}
+ view_name = params.pop(0)
+ for param in params:
+ match = kwarg_re.match(param)
+ if not match:
+ raise TemplateSyntaxError("Malformed arguments to `%s` tag" % tag)
+ name, value = match.groups()
+ if name:
+ kwargs[name] = parser.compile_filter(value)
+ else:
+ args.append(parser.compile_filter(value))
+ return NodeURLNode(view_name=view_name, args=args, kwargs=kwargs, node=node, as_var=as_var)
+
+ return NodeURLNode(node=node, as_var=as_var)
\ No newline at end of file