Table Of Contents

Previous topic

Patching Cheetah

Next topic

Design Decisions and Tradeoffs

This Page

Directives: Flow Control

(flowControl)

#for

(flowControl.for)

The template:

#for $i in $range(10)
$i #slurp
#end for

The output:

0 1 2 3 4 5 6 7 8 9

The generated code:

for i in range(10):
    write(filter(i)) # generated from '$i' at line 2, col 1.
    write(' ')

#repeat

(flowControl.repeat)

The template:

#repeat 3
My bonnie lies over the ocean
#end repeat
O, bring back my bonnie to me!

The output:

My bonnie lies over the ocean
My bonnie lies over the ocean
My bonnie lies over the ocean
O, bring back my bonnie to me!

(OK, so the second line should be “sea” instead of “ocean”.)

The generated code:

for __i0 in range(3):
    write('My bonnie lies over the ocean\n')
write('O, bring back my bonnie to me!\n')

Note that a new local variable of the form {__i$num} will be used for each instance of {repeat} in order to permit nesting.

#while

(flowControl.while)

The template:

#set $alive = True
#while $alive
I am alive!
#set $alive = False
#end while

The output:

I am alive!

The generated code:

alive = True
while alive:
    write('I am alive!\n')
    alive = False

#if

()

The template:

#set $size = 500
#if $size >= 1500
It's big
#else if $size < 1500 and $size > 0
It's small
#else
It's not there
#end if

The output:

It's small

The generated code:

size = 500
if size >= 1500:
    write("It's big\n")
elif size < 1500 and size > 0:
    write("It's small\n")
else:
    write("It's not there\n")

#unless

(flowControl.unless)

The template:

#set $count = 9
#unless $count + 5 > 15
Count is in range.
#end unless

The output:

Count is in range.

The generated code:

count = 9
if not (count + 5 > 15):
    write('Count is in range.\n')

{ Note:} There is a bug in Cheetah 0.9.13. It’s forgetting the parentheses in the {if} expression, which could lead to it calculating something different than it should.

#break and #continue

(flowControl.break)

The template:

#for $i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 'James', 'Joe', 'Snow']
#if $i == 10
  #continue
#end if
#if $i == 'Joe'
  #break
#end if
$i - #slurp
#end for

The output:

1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 11 - 12 - James -

The generated code:

for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 'James', 'Joe', 'Snow']:
    if i == 10:
        write('')
        continue
    if i == 'Joe':
        write('')
        break
    write(filter(i)) # generated from '$i' at line 8, col 1.
    write(' - ')

#pass

(flowControl.pass)

The template:

Let's check the number.
#set $size = 500
#if $size >= 1500
It's big
#elif $size > 0
#pass
#else
Invalid entry
#end if
Done checking the number.

The output:

Let's check the number.
Done checking the number.

The generated code:

write("Let's check the number.\n")
size = 500
if size >= 1500:
    write("It's big\n")
elif size > 0:
    pass
else:
    write('Invalid entry\n')
write('Done checking the number.\n')

#stop

(flowControl.stop)

The template:

A cat
#if 1
  sat on a mat
  #stop
  watching a rat
#end if
in a flat.

The output:

A cat
  sat on a mat

The generated code:

write('A cat\n')
if 1:
    write('  sat on a mat\n')
    if dummyTrans:
        return trans.response().getvalue()
    else:
        return ""
    write('  watching a rat\n')
write('in a flat.\n')

#return

(flowControl.return)

The template:

1
$test[1]
3
#def test
1.5
#if 1
#return '123'
#else
99999
#end if
#end def

The output:

1
2
3

The generated code:

def test(self,
        trans=None,
        dummyTrans=False,
        VFS=valueFromSearchList,
        VFN=valueForName,
        getmtime=getmtime,
        currentTime=time.time):


    """
    Generated from #def test at line 5, col 1.
    """

    if not trans:
        trans = DummyTransaction()
        dummyTrans = True
    write = trans.response().write
    SL = self._searchList
    filter = self._currentFilter
    globalSetVars = self._globalSetVars

    ########################################
    ## START - generated method body

    write('1.5\n')
    if 1:
        return '123'
    else:
        write('99999\n')

    ########################################
    ## END - generated method body

    if dummyTrans:
        return trans.response().getvalue()
    else:
        return ""
def respond(self,
        trans=None,
        dummyTrans=False,
        VFS=valueFromSearchList,
        VFN=valueForName,
        getmtime=getmtime,
        currentTime=time.time):


    """
    This is the main method generated by Cheetah
    """

    if not trans:
        trans = DummyTransaction()
        dummyTrans = True
    write = trans.response().write
    SL = self._searchList
    filter = self._currentFilter
    globalSetVars = self._globalSetVars

    ########################################
    ## START - generated method body

    write('\n1\n')
    write(filter(VFS(SL,"test",1)[1])) # generated from '$test[1]' at line 3, col 1.
    write('\n3\n')

    ########################################
    ## END - generated method body

    if dummyTrans:
        return trans.response().getvalue()
    else:
        return ""