On Thu, Jun 23, 2011 at 11:35 AM, Mike Samuel <mikesam...@gmail.com> wrote:
> > > On Jun 21, 3:55 pm, Luke Plant <l.plant...@cantab.net> wrote: > > On 21/06/11 20:07, Mike Samuel wrote: > > > I'd like to add contextual autoescaping to django templates. > > > > > Briefly, it would automatically pick filters for each {{variable}} by > > > looking at the context in which it appears. So inside a <script> > > > body, it might convert a value to a valid bundle of JSON; but inside > > > the query part of a URL, it would %-encode. > > > > > You can play with a runnable example at > > >http://js-quasis-libraries-and-repl.googlecode.com/svn/trunk/index.html > > > . Just choose one of the "Safe HTML" examples from the dropdown at > > > the top right and hit enter. There is a detailed writeup based on > > > experience from another template language at > > >http://js-quasis-libraries-and-repl.googlecode.com/svn/trunk/safetemp. > .. > > > . > > > > > Would anyone be interested in such a thing for Django? If so, how > > > should I proceed? Is there a mechanism in the templates API that > > > would allow an optional pass to analyze a bundle of templates and add > > > filters? > > > > I have a brief look, and concluded that the approach outlined is > > probably impossible for Django templates. The main reason for this is > > that the grammar of Django templates is extensible via template tags. > > This would probably make it impossible to do the static analysis > > required. There might be other problems too. > > I don't think custom tags are that big a problem. If I understand > correctly, part of the custom tags work happens at compile time, and > part at render time. > > If the contextual analysis happens at compile time, after custom tags > do their compile time work, then it can make reasonable assumptions > about what happens at compile time: > > (1) That a custom tag ends in the same context it appears. I can > probably be stricter -- a custom tag that appears in a context other > than PCDATA is an error -- and see if real code obeys that > restriction. > (2) That a custom tags content is PCDATA unless it contains hints > saying otherwise. > > > > > If you wanted to proceed anyway, the way to do it would be to write a > > custom template loader and have it do the pre-pass. This could be > > written as a third party library. > > That sounds lovely. So I would write a loader that wraps another > loader, and have it modify the output of that loader? > > Is there a good example of a loader that does such a thing? Some > quick searching turns up django.template.loaders.cached.Loader which > seems to delegate the work of turning bytes in storage into templates > to other loaders, but is there an example that both delegates and > transforms? > > > > Regards, > > > > Luke > > > > -- > > "Our software is idiot proof. If you bought it, that's proof > > you're an idiot" (Dogbert) > > > > Luke Plant ||http://lukeplant.me.uk/ > > -- > You received this message because you are subscribed to the Google Groups > "Django developers" group. > To post to this group, send email to django-developers@googlegroups.com. > To unsubscribe from this group, send email to > django-developers+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/django-developers?hl=en. > > FWIW it's likely that Armin and I will be proposing a new, higher level, template tag API in the coming weeks/months, as the current API is fundamentally incompatible with good template compilation. Alex -- "I disapprove of what you say, but I will defend to the death your right to say it." -- Evelyn Beatrice Hall (summarizing Voltaire) "The people's good is the highest law." -- Cicero -- You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to django-developers@googlegroups.com. To unsubscribe from this group, send email to django-developers+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-developers?hl=en.