I don't think you should have code included in a {{= block. {{= should ONLY be used to wrap anything in its code block with a response.write(). Exactly how it does it now.
Doing otherwise is simply bad template design. I consider it a bug if it ever worked before. Allowing this syntax encourages template writers to do things in non-standard ways that won't make obvious sense to anybody else attempting to read their templates. (I currently have to maintain and re-write some very ugly web2py code in my day job... the previous guys working severely abused the power of the template system and it has caused us many issues/headaches because of it). tl;dr - it is the desired behaviour, update your app code to standards. lets not complicate web2py further. -- Thadeus On Fri, Mar 4, 2011 at 3:21 PM, Jonathan Lundell <jlund...@pobox.com> wrote: > On Mar 4, 2011, at 12:54 PM, Massimo Di Pierro wrote: > > > > All I meant is that > > > > {{=msg > > pass}} > > > > should become: > > > > response.write(msg) > > pass > > > > and not > > > > response.write(msg > > pass) > > > > since there is no ambiguity. > > Right. The question the code has to answer, implicitly, is: exactly what is > the termination of whatever will be passed to response.write. If the = > doesn't appear at the beginning of a code block, the answer is: the next > newline, or the end of the code block, whichever comes first. I think that's > the right answer. It does mean that: > > {{=msg abc > pass}} > > will become: > > response.write (msg abc) > pass > > ...but I think that's OK; it's just a "normal" syntax error. It's really > too complicated to try to parse the argument, since you want things like > > {{="abc def" > pass}} > > to work. > > I *think* that this will still work: > > {{="""string > on multiple > lines > """ > pass}} > > ...because the '=' detection comes after the multiline-string escape. > > > > > > > On Mar 4, 2:25 pm, Jonathan Lundell <jlund...@pobox.com> wrote: > >> On Mar 4, 2011, at 12:19 PM, Massimo Di Pierro wrote: > >> > >> > >> > >>> I agree that that is what it should do. Please open a ticket about > >>> this. > >> > >> Are you saying (I think) that both cases should terminate on a newline > (if present)? > >> > >> > >> > >> > >> > >> > >> > >> > >> > >>> On Mar 4, 11:20 am, Jonathan Lundell <jlund...@pobox.com> wrote: > >>>> On Mar 4, 2011, at 1:52 AM, szimszon wrote: > >> > >>>>> web2py™ Version 1.92.1 (2011-02-16 15:04:40) > >>>>> Python Python 2.5.2: /usr/bin/python > >> > >>>>> Traceback (most recent call last): > >>>>> File "/home/szimszon_nfs/web2py/gluon/restricted.py", line 186, in > >>>>> restricted > >>>>> ccode = compile2(code,layer) > >>>>> File "/home/szimszon_nfs/web2py/gluon/restricted.py", line 173, in > >>>>> compile2 > >>>>> return compile(code.rstrip().replace('\r\n','\n')+'\n', layer, > >>>>> 'exec') > >>>>> File "/home/szimszon_nfs/web2py/applications/serveradmin/views/ > >>>>> integrity/ftp.html", line 123 > >>>>> pass > >>>>> ^ > >>>>> SyntaxError: invalid syntax > >> > >>>>> if msg: > >>>>> response.write('\n<h2>', escape=False) > >>>>> response.write(T("Commands executed")) > >>>>> response.write('</h2>\n', escape=False) > >>>>> response.write(XML(msg) > >>>>> pass > >> > >>>>> My template was working until now (I don't know exactly from what > >>>>> web2py version is it bad). > >> > >>>>> My template was: > >> > >>>>> {{if msg:}} > >>>>> <h2>{{=T("Commands executed")}}</h2> > >>>>> {{ =XML(msg) > >>>>> pass > >>>>> try: > >>>>> dname=request.args[1] > >>>>> except: > >>>>> dname=0 > >>>>> pass > >>>>> editname=T('New')}} > >> > >>>> Thadeus might want to chime in here if I have the details wrong (there > really ought to be a formal reference for template syntax; the tutorial in > the book is nice, but not complete). > >> > >>>> There's a subtle difference in template parsing when =something > appears at the beginning of an escaped block (where "beginning" ignores > white space, so =XML above is regarded as being at the beginning of the code > block). > >> > >>>> You probably know already that =something is translated to > response.write(something). But the question arises, what exactly is > "something"? That is, where does it end? > >> > >>>> And when the '=something' is found at the beginning of a code block, > 'something' is defined to be *everything until the end of the code block*. > >> > >>>> When '=something' is found *embedded* in a code block (not at the > beginning, ignoring white space), then the end of 'something' is either the > next newline or the end of the code block, whichever comes first. > >> > >>>> So (to shorten up the problem here), you've effectively got this: > >> > >>>> {{=msg > >>>> pass}} > >> > >>>> ...which becomes: > >> > >>>> response.write(msg > >>>> pass) > >> > >>>> ...and Python is going to object. > >> > >>>> On the other hand, if you had written: > >> > >>>> {{if xyz: > >>>> =msg > >>>> pass}} > >> > >>>> The output will be: > >> > >>>> if xyz: > >>>> response.write(msg) > >>>> pass > >> > >>>> ...and everybody's happy. Because =msg wasn't the first thing in the > code block, only msg gets included in the response.write argument. > >> > >>>> Is there a good reason for =something to be interpreted two different > ways? I'm not sure it's intentional. Thadeus? Massimo? > >> > >>>>> Now I had to modify: > >> > >>>>> {{if msg:}} > >>>>> <h2>{{=T("Commands executed")}}</h2> > >>>>> {{ =XML(msg)}} < ----- > >>>>> {{pass <----------- > >>>>> try: > >>>>> dname=request.args[1] > >>>>> except: > >>>>> dname=0 > >>>>> pass > >>>>> editname=T('New')}} > > >