# Directives: Flow Control

## #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

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!

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

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

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

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

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

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

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 ""