Hi all,

For being able to do AST manupulations on templates we need to keep the 
grammar of templatetags somewhere.
During the sprints, Russel told me to attach these as a property on the 
functions that go into Library.tags. (I would attach an instance of a class 
named TemplateTagMeta.)

For those who wonder what the applications are. They are mainly for 
template preprocessing, HTML validation, and code completion in editors, 
when writing Django templates.

For simple_tag, assignment_tag and inclusion tag. The grammar rules are 
easy.
For any other custom tag it's right now impossible to extract the grammar.

The reason is mainly that it is too complicated to define custom template 
tags which consist of an open/close tag.
It should certainly not be necessary to touch the (parser, token) tuple.

I propose that we introduce a new, more user-friendly way of defining these 
tags. I created register.block_tag, but I'm not sure about the API. This 
works, and it's is all we need for the built-in "if" template tag.


@register.block_tag('if elif* else? endif')
def do_if(parser, blocks):
    conditions_nodelists = []
    for name, bits, nodelist in blocks:
        if name in ('if', 'elif'):
            condition = TemplateIfParser(parser, bits).parse()
        else:
            condition = None
        conditions_nodelists.append( (condition, nodelist) )

    return IfNode(conditions_nodelists)


The advantage is that it's both much more easy to write custom template 
tags which have one or more "bodies", and that this declaration allows us 
to extract the grammar rules of templates. (Which can be used for 
preprocessing, or HTML validation.)

Note that we don't deprecate the old way of writing template tags. It's a 
public API. But we should discourage custom token/parser manupulation in 
custom template tags. 

- What do you think about the name "block_tag"? I'm not sure. 
tag_with_grammar is too long, and the tag function itself cannot be changed 
anymore.
- What do you think about the syntax of the grammar. The space-separated 
notation is more often used in the Python core.
- Is the "parser" parameter really necessary. At least we need it in 
TemplateIfParser. But Why?
- register.block_tag works as well if the templatetags don't have a body. 
In that case, there's only one iteration through blocks, where nodelist is 
an empty list. Would this imply we need another name for "block_tag" or 
not? Otherwise we need something else for -- for instance -- the csrf_token 
template tag.

I'd also like to add a new management command to Django which prints the 
AST for templates. But in a human readable way. I think this would help a 
lot for developers to understand how the template tags of third party 
libraries work. And further, it would make it easier for people to write 
autocompletion plug-ins for a lot of editors.
What do you think would be good as a format, maybe the following?

<builtin>
if elif* else? endif
for empty? endfor
...
<admin>
...


Further, the following line does not say anything about the template tag 
parameters. 
@register.block_tag('if elif* else? endif')

Should we add some syntax to tell which template tags have or don't have 
any parameters, or leave that to the implementation of block_tag?


Cheers,
Jonathan

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-developers?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to