All I meant is that

{{=msg
pass}}

should become:

response.write(msg)
pass

and not

response.write(msg
pass)

since there is no ambiguity.

On Mar 4, 2:25 pm, Jonathan Lundell <[email protected]> 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 <[email protected]> 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')}}

Reply via email to