summaryrefslogtreecommitdiff
path: root/docs/html/_sources/dev_guide/placeholders.rst.txt
diff options
context:
space:
mode:
Diffstat (limited to 'docs/html/_sources/dev_guide/placeholders.rst.txt')
-rw-r--r--docs/html/_sources/dev_guide/placeholders.rst.txt489
1 files changed, 0 insertions, 489 deletions
diff --git a/docs/html/_sources/dev_guide/placeholders.rst.txt b/docs/html/_sources/dev_guide/placeholders.rst.txt
deleted file mode 100644
index 60aa0d2..0000000
--- a/docs/html/_sources/dev_guide/placeholders.rst.txt
+++ /dev/null
@@ -1,489 +0,0 @@
-Placeholders
-============
-
-(placeholders)
-
-Simple placeholders
--------------------
-
-(placeholders.simple)
-
-Let's add a few $placeholders to our template:
-
-::
-
- >>> from Cheetah.Template import Template
- >>> values = {'what': 'surreal', 'punctuation': '?'}
- >>> t = Template("""\
- ... Hello, $what world$punctuation
- ... One of Python's least-used functions is $xrange.
- ... """, [values])
- >>> print t
- Hello, surreal world?
- One of Python's least-used functions is <built-in function xrange>.
-
- >>> print t.generatedModuleCode()
- 1 #!/usr/bin/env python
-
- 2 """
- 3 Autogenerated by CHEETAH: The Python-Powered Template Engine
- 4 CHEETAH VERSION: 0.9.12
- 5 Generation time: Sun Apr 21 00:53:01 2002
- 6 """
-
- 7 __CHEETAH_genTime__ = 'Sun Apr 21 00:53:01 2002'
- 8 __CHEETAH_version__ = '0.9.12'
-
- 9 ##################################################
- 10 ## DEPENDENCIES
-
- 11 import sys
- 12 import os
- 13 import os.path
- 14 from os.path import getmtime, exists
- 15 import time
- 16 import types
- 17 from Cheetah.Template import Template
- 18 from Cheetah.DummyTransaction import DummyTransaction
- 19 from Cheetah.NameMapper import NotFound, valueForName,
- valueFromSearchList
- 20 import Cheetah.Filters as Filters
- 21 import Cheetah.ErrorCatchers as ErrorCatchers
-
- 22 ##################################################
- 23 ## MODULE CONSTANTS
-
- 24 try:
- 25 True, False
- 26 except NameError:
- 27 True, False = (1==1), (1==0)
-
- 28 ##################################################
- 29 ## CLASSES
-
- 30 class GenTemplate(Template):
- 31 """
- 32
- 33 Autogenerated by CHEETAH: The Python-Powered Template Engine
- 34 """
-
- 35 ##################################################
- 36 ## GENERATED METHODS
-
-
-::
-
- 37 def __init__(self, *args, **KWs):
- 38 """
- 39
- 40 """
-
- 41 Template.__init__(self, *args, **KWs)
-
- 42 def respond(self,
- 43 trans=None,
- 44 dummyTrans=False,
- 45 VFS=valueFromSearchList,
- 46 VFN=valueForName,
- 47 getmtime=getmtime,
- 48 currentTime=time.time):
-
-
- 49 """
- 50 This is the main method generated by Cheetah
- 51 """
-
- 52 if not trans:
- 53 trans = DummyTransaction()
- 54 dummyTrans = True
- 55 write = trans.response().write
- 56 SL = self._searchList
- 57 filter = self._currentFilter
- 58 globalSetVars = self._globalSetVars
- 59
- 60 ########################################
- 61 ## START - generated method body
- 62
- 63 write('Hello, ')
- 64 write(filter(VFS(SL,"what",1))) # generated from '$what' at
- # line 1, col 8.
- 65 write(' world')
- 66 write(filter(VFS(SL,"punctuation",1))) # generated from
- # '$punctuation' at line 1, col 19.
- 67 write("\nOne of Python's least-used methods is ")
- 68 write(filter(xrange)) # generated from '$xrange' at line 2,
- # col 39.
- 69 write('.\n')
- 70
- 71 ########################################
- 72 ## END - generated method body
- 73
- 74 if dummyTrans:
- 75 return trans.response().getvalue()
- 76 else:
- 77 return ""
-
-::
-
- 78
- 79 ##################################################
- 80 ## GENERATED ATTRIBUTES
-
- 81 __str__ = respond
- 82 _mainCheetahMethod_for_GenTemplate= 'respond'
-
- 83 # CHEETAH was developed by Tavis Rudd, Chuck Esterbrook, Ian Bicking
- # and Mike Orr;
- 84 # with code, advice and input from many other volunteers.
- 85 # For more information visit http://cheetahtemplate.org/
-
- 86 ##################################################
- 87 ## if run from command line:
- 88 if __name__ == '__main__':
- 89 GenTemplate().runAsMainProgram()
-
-
-(Again, I have added line numbers and split the lines as in the
-previous chapter.)
-
-This generated template module is different from the previous one
-in several trivial respects and one important respect. Trivially,
-{.\_filePath} and {.\_fileMtime} are not updated in
-{.\_\_init\_\_}, so they inherit the value {None} from {Template}.
-Also, that if-stanza in {.respond} that recompiles the template if
-the source file changes is missing - because there is no source
-file. So this module is several lines shorter than the other one.
-
-But the important way this module is different is that instead of
-the one {write} call outputting a string literal, this module has a
-series of {write} calls (lines 63-69) outputting successive chunks
-of the template. Regular text has been translated into a string
-literal, and placeholders into function calls. Every placeholder is
-wrapped inside a {filter} call to apply the current output filter.
-(The default output filter converts all objects to strings, and
-{None} to {""}.)
-
-Placeholders referring to a Python builtin like {xrange} (line 68)
-generate a bare variable name. Placeholders to be looked up in the
-searchList have a nested function call; e.g.,
-
-::
-
- write(filter(VFS(SL,"what",1))) # generated from '$what' at line 1, col 8.
-
-{VFS}, remember, is a function imported from {Cheetah.NameMapper}
-that looks up a value in a searchList. So we pass it the
-searchList, the name to look up, and a boolean (1) indicating we
-want autocalling. (It's {1} rather than {True} because it's
-generated from an {and} expression, and that's what Python 2.2
-outputs for true {and} expressions.)
-
-Complex placeholders
---------------------
-
-(placeholders.complex)
-
-Placeholders can get far more complicated than that. This example
-shows what kind of code the various NameMapper features produce.
-The formulas are taken from Cheetah's test suite, in the
-{Cheetah.Tests.SyntaxAndOutput.Placeholders} class.
-
-::
-
- 1 placeholder: $aStr
- 2 placeholders: $aStr $anInt
- 2 placeholders, back-to-back: $aStr$anInt
- 1 placeholder enclosed in {}: ${aStr}
- 1 escaped placeholder: \$var
- func placeholder - with (): $aFunc()
- func placeholder - with (int): $aFunc(1234)
- func placeholder - with (string): $aFunc('aoeu')
- func placeholder - with ('''\nstring'\n'''): $aFunc('''\naoeu'\n''')
- func placeholder - with (string*int): $aFunc('aoeu'*2)
- func placeholder - with (int*float): $aFunc(2*2.0)
- Python builtin values: $None $True $False
- func placeholder - with ($arg=float): $aFunc($arg=4.0)
- deeply nested argstring: $aFunc( $arg = $aMeth( $arg = $aFunc( 1 ) ) ):
- function with None: $aFunc(None)
- autocalling: $aFunc! $aFunc().
- nested autocalling: $aFunc($aFunc).
- list subscription: $aList[0]
- list slicing: $aList[:2]
- list slicing and subcription combined: $aList[:2][0]
- dict - NameMapper style: $aDict.one
- dict - Python style: $aDict['one']
- dict combined with autocalled string method: $aDict.one.upper
- dict combined with string method: $aDict.one.upper()
- nested dict - NameMapper style: $aDict.nestedDict.two
- nested dict - Python style: $aDict['nestedDict']['two']
- nested dict - alternating style: $aDict['nestedDict'].two
- nested dict - NameMapper style + method: $aDict.nestedDict.two.upper
- nested dict - alternating style + method: $aDict['nestedDict'].two.upper
- nested dict - NameMapper style + method + slice: $aDict.nestedDict.two.upper[:4]
- nested dict - Python style, variable key: $aDict[$anObj.meth('nestedDict')].two
- object method: $anObj.meth1
- object method + complex slice: $anObj.meth1[0: ((4/4*2)*2)/$anObj.meth1(2) ]
- very complex slice: $( anObj.meth1[0: ((4/4*2)*2)/$anObj.meth1(2) ] )
- $_('a call to gettext')
-
-We'll need a big program to set up the placeholder values. Here it
-is:
-
-::
-
- #!/usr/bin/env python
- from ComplexExample import ComplexExample
-
- try: # Python >= 2.2.1
- True, False
- except NameError: # Older Python
- True, False = (1==1), (1==0)
-
- class DummyClass:
- _called = False
- def __str__(self):
- return 'object'
-
- def meth(self, arg="arff"):
- return str(arg)
-
- def meth1(self, arg="doo"):
- return arg
-
- def meth2(self, arg1="a1", arg2="a2"):
- return str(arg1) + str(arg2)
-
- def callIt(self, arg=1234):
- self._called = True
- self._callArg = arg
-
- def dummyFunc(arg="Scooby"):
- return arg
-
- defaultTestNameSpace = {
- 'aStr':'blarg',
- 'anInt':1,
- 'aFloat':1.5,
- 'aList': ['item0','item1','item2'],
- 'aDict': {'one':'item1',
- 'two':'item2',
- 'nestedDict':{1:'nestedItem1',
- 'two':'nestedItem2'
- },
- 'nestedFunc':dummyFunc,
- },
- 'aFunc': dummyFunc,
- 'anObj': DummyClass(),
- 'aMeth': DummyClass().meth1,
- '_': lambda x: 'translated ' + x
- }
-
- print ComplexExample( searchList=[defaultTestNameSpace] )
-
-Here's the output:
-
-::
-
- 1 placeholder: blarg
- 2 placeholders: blarg 1
- 2 placeholders, back-to-back: blarg1
- 1 placeholder enclosed in {}: blarg
- 1 escaped placeholder: $var
- func placeholder - with (): Scooby
- func placeholder - with (int): 1234
- func placeholder - with (string): aoeu
- func placeholder - with ('''\nstring'\n'''):
- aoeu'
-
- func placeholder - with (string*int): aoeuaoeu
- func placeholder - with (int*float): 4.0
- Python builtin values: 1 0
- func placeholder - with ($arg=float): 4.0
- deeply nested argstring: 1:
- function with None:
- autocalling: Scooby! Scooby.
- nested autocalling: Scooby.
- list subscription: item0
- list slicing: ['item0', 'item1']
- list slicing and subcription combined: item0
- dict - NameMapper style: item1
- dict - Python style: item1
- dict combined with autocalled string method: ITEM1
- dict combined with string method: ITEM1
- nested dict - NameMapper style: nestedItem2
- nested dict - Python style: nestedItem2
- nested dict - alternating style: nestedItem2
- nested dict - NameMapper style + method: NESTEDITEM2
- nested dict - alternating style + method: NESTEDITEM2
- nested dict - NameMapper style + method + slice: NEST
- nested dict - Python style, variable key: nestedItem2
- object method: doo
- object method + complex slice: do
- very complex slice: do
- translated a call to gettext
-
-And here - tada! - is the generated module. To save space, I've
-included only the lines containing the {write} calls. The rest of
-the module is the same as in the first example, chapter
-pyModules.example. I've split some of the lines to make them fit on
-the page.
-
-::
-
- 1 write('1 placeholder: ')
- 2 write(filter(VFS(SL,"aStr",1))) # generated from '$aStr' at line 1, col 16.
- 3 write('\n2 placeholders: ')
- 4 write(filter(VFS(SL,"aStr",1))) # generated from '$aStr' at line 2, col 17.
- 5 write(' ')
- 6 write(filter(VFS(SL,"anInt",1)))
- # generated from '$anInt' at line 2, col 23.
- 7 write('\n2 placeholders, back-to-back: ')
- 8 write(filter(VFS(SL,"aStr",1))) # generated from '$aStr' at line 3, col 31.
- 9 write(filter(VFS(SL,"anInt",1)))
- # generated from '$anInt' at line 3, col 36.
- 10 write('\n1 placeholder enclosed in {}: ')
- 11 write(filter(VFS(SL,"aStr",1))) # generated from '${aStr}' at line 4,
- # col 31.
- 12 write('\n1 escaped placeholder: $var\nfunc placeholder - with (): ')
- 13 write(filter(VFS(SL,"aFunc",0)())) # generated from '$aFunc()' at line 6,
- # col 29.
- 14 write('\nfunc placeholder - with (int): ')
- 15 write(filter(VFS(SL,"aFunc",0)(1234))) # generated from '$aFunc(1234)' at
- # line 7, col 32.
- 16 write('\nfunc placeholder - with (string): ')
- 17 write(filter(VFS(SL,"aFunc",0)('aoeu'))) # generated from "$aFunc('aoeu')"
- # at line 8, col 35.
- 18 write("\nfunc placeholder - with ('''\\nstring'\\n'''): ")
- 19 write(filter(VFS(SL,"aFunc",0)('''\naoeu'\n'''))) # generated from
- # "$aFunc('''\\naoeu'\\n''')" at line 9, col 46.
- 20 write('\nfunc placeholder - with (string*int): ')
- 21 write(filter(VFS(SL,"aFunc",0)('aoeu'*2))) # generated from
- # "$aFunc('aoeu'*2)" at line 10, col 39.
- 22 write('\nfunc placeholder - with (int*float): ')
- 23 write(filter(VFS(SL,"aFunc",0)(2*2.0))) # generated from '$aFunc(2*2.0)'
- # at line 11, col 38.
- 24 write('\nPython builtin values: ')
- 25 write(filter(None)) # generated from '$None' at line 12, col 24.
- 26 write(' ')
- 27 write(filter(True)) # generated from '$True' at line 12, col 30.
- 28 write(' ')
- 29 write(filter(False)) # generated from '$False' at line 12, col 36.
- 30 write('\nfunc placeholder - with ($arg=float): ')
- 31 write(filter(VFS(SL,"aFunc",0)(arg=4.0))) # generated from
- # '$aFunc($arg=4.0)' at line 13, col 40.
- 32 write('\ndeeply nested argstring: ')
- 33 write(filter(VFS(SL,"aFunc",0)(
- arg = VFS(SL,"aMeth",0)( arg = VFS(SL,"aFunc",0)( 1 ) ) )))
- # generated from '$aFunc( $arg = $aMeth( $arg = $aFunc( 1 ) ) )'
- # at line 14, col 26.
- 34 write(':\nfunction with None: ')
- 35 write(filter(VFS(SL,"aFunc",0)(None))) # generated from '$aFunc(None)' at
- # line 15, col 21.
- 36 write('\nautocalling: ')
- 37 write(filter(VFS(SL,"aFunc",1))) # generated from '$aFunc' at line 16,
- # col 14.
- 38 write('! ')
- 39 write(filter(VFS(SL,"aFunc",0)())) # generated from '$aFunc()' at line 16,
- # col 22.
-
-::
-
- 40 write('.\nnested autocalling: ')
- 41 write(filter(VFS(SL,"aFunc",0)(VFS(SL,"aFunc",1)))) # generated from
- # '$aFunc($aFunc)' at line 17, col 21.
- 42 write('.\nlist subscription: ')
- 43 write(filter(VFS(SL,"aList",1)[0])) # generated from '$aList[0]' at line
- # 18, col 20.
- 44 write('\nlist slicing: ')
- 45 write(filter(VFS(SL,"aList",1)[:2])) # generated from '$aList[:2]' at
- # line 19, col 15.
- 46 write('\nlist slicing and subcription combined: ')
- 47 write(filter(VFS(SL,"aList",1)[:2][0])) # generated from '$aList[:2][0]'
- # at line 20, col 40.
- 48 write('\ndict - NameMapper style: ')
- 49 write(filter(VFS(SL,"aDict.one",1))) # generated from '$aDict.one' at line
- # 21, col 26.
- 50 write('\ndict - Python style: ')
- 51 write(filter(VFS(SL,"aDict",1)['one'])) # generated from "$aDict['one']"
- # at line 22, col 22.
- 52 write('\ndict combined with autocalled string method: ')
- 53 write(filter(VFS(SL,"aDict.one.upper",1))) # generated from
- # '$aDict.one.upper' at line 23, col 46.
- 54 write('\ndict combined with string method: ')
- 55 write(filter(VFN(VFS(SL,"aDict.one",1),"upper",0)())) # generated from
- # '$aDict.one.upper()' at line 24, col 35.
- 56 write('\nnested dict - NameMapper style: ')
- 57 write(filter(VFS(SL,"aDict.nestedDict.two",1))) # generated from
- # '$aDict.nestedDict.two' at line 25, col 33.
- 58 write('\nnested dict - Python style: ')
- 59 write(filter(VFS(SL,"aDict",1)['nestedDict']['two'])) # generated from
- # "$aDict['nestedDict']['two']" at line 26, col 29.
- 60 write('\nnested dict - alternating style: ')
- 61 write(filter(VFN(VFS(SL,"aDict",1)['nestedDict'],"two",1))) # generated
- # from "$aDict['nestedDict'].two" at line 27, col 34.
- 62 write('\nnested dict - NameMapper style + method: ')
- 63 write(filter(VFS(SL,"aDict.nestedDict.two.upper",1))) # generated from
- # '$aDict.nestedDict.two.upper' at line 28, col 42.
- 64 write('\nnested dict - alternating style + method: ')
- 65 write(filter(VFN(VFS(SL,"aDict",1)['nestedDict'],"two.upper",1)))
- # generated from "$aDict['nestedDict'].two.upper" at line 29, col 43.
- 66 write('\nnested dict - NameMapper style + method + slice: ')
-
-::
-
- 67 write(filter(VFN(VFS(SL,"aDict.nestedDict.two",1),"upper",1)[:4]))
- # generated from '$aDict.nestedDict.two.upper[:4]' at line 30, col 50.
- 68 write('\nnested dict - Python style, variable key: ')
- 69 write(filter(VFN(VFS(SL,"aDict",1)
- [VFN(VFS(SL,"anObj",1),"meth",0)('nestedDict')],"two",1)))
- # generated from "$aDict[$anObj.meth('nestedDict')].two" at line 31,
- # col 43.
- 70 write('\nobject method: ')
- 71 write(filter(VFS(SL,"anObj.meth1",1))) # generated from '$anObj.meth1' at
- # line 32, col 16.
- 72 write('\nobject method + complex slice: ')
- 73 write(filter(VFN(VFS(SL,"anObj",1),"meth1",1)
- [0: ((4/4*2)*2)/VFN(VFS(SL,"anObj",1),"meth1",0)(2) ]))
- # generated from '$anObj.meth1[0: ((4/4*2)*2)/$anObj.meth1(2) ]'
- # at line 33, col 32.
- 74 write('\nvery complex slice: ')
- 75 write(filter(VFN(VFS(SL,"anObj",1),"meth1",1)
- [0: ((4/4*2)*2)/VFN(VFS(SL,"anObj",1),"meth1",0)(2) ] ))
- # generated from '$( anObj.meth1[0: ((4/4*2)*2)/$anObj.meth1(2) ] )'
- # at line 34, col 21.
- 76 if False:
- 77 _('foo')
- 78 write(filter(VFS(SL,"_",0)("a call to gettext")))
- # generated from "$_('a call to gettext')"
- # at line 35, col 1.
- 79 write('\n')
-
-For each placeholder lookup, the the innermost level of nesting is
-a {VFS} call, which looks up the first (leftmost) placeholder
-component in the searchList. This is wrapped by zero or more {VFN}
-calls, which perform Universal Dotted Notation lookup on the next
-dotted component of the placeholder, looking for an attribute or
-key by that name within the previous object (not in the
-searchList). Autocalling is performed by {VFS} and {VFN}: that's
-the reason for their third argument.
-
-Explicit function/method arguments, subscripts and keys (which are
-all expressions) are left unchanged, besides expanding any embedded
-$placeholders in them. This means they must result in valid Python
-expressions, following the standard Python quoting rules.
-
-Built-in Python values ({None}, {True} and {False}) are converted
-to {filter(None)}, etc. They use normal Python variable lookup
-rather than {VFS}. (Cheetah emulates {True} and {False} using
-global variables for Python < 2.2.1, when they weren't builtins
-yet.)
-
-Notice the last line is a call to {\_} (i.e. {gettext}) which is
-used for internationalization (see
-http://docs.python.org/lib/module-gettext.html). The code is
-converted normally, but an {if False} block is used so that gettext
-can successfully mark the string for translation when parsing the
-generated Python. Otherwise, the NameMapper syntax would get in the
-way of this.
-
-