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')}}