Package qm :: Package external :: Package DocumentTemplate :: Module DT_With
[hide private]
[frames] | no frames]

Source Code for Module qm.external.DocumentTemplate.DT_With

  1  ############################################################################## 
  2  #  
  3  # Zope Public License (ZPL) Version 1.0 
  4  # ------------------------------------- 
  5  #  
  6  # Copyright (c) Digital Creations.  All rights reserved. 
  7  #  
  8  # This license has been certified as Open Source(tm). 
  9  #  
 10  # Redistribution and use in source and binary forms, with or without 
 11  # modification, are permitted provided that the following conditions are 
 12  # met: 
 13  #  
 14  # 1. Redistributions in source code must retain the above copyright 
 15  #    notice, this list of conditions, and the following disclaimer. 
 16  #  
 17  # 2. Redistributions in binary form must reproduce the above copyright 
 18  #    notice, this list of conditions, and the following disclaimer in 
 19  #    the documentation and/or other materials provided with the 
 20  #    distribution. 
 21  #  
 22  # 3. Digital Creations requests that attribution be given to Zope 
 23  #    in any manner possible. Zope includes a "Powered by Zope" 
 24  #    button that is installed by default. While it is not a license 
 25  #    violation to remove this button, it is requested that the 
 26  #    attribution remain. A significant investment has been put 
 27  #    into Zope, and this effort will continue if the Zope community 
 28  #    continues to grow. This is one way to assure that growth. 
 29  #  
 30  # 4. All advertising materials and documentation mentioning 
 31  #    features derived from or use of this software must display 
 32  #    the following acknowledgement: 
 33  #  
 34  #      "This product includes software developed by Digital Creations 
 35  #      for use in the Z Object Publishing Environment 
 36  #      (http://www.zope.org/)." 
 37  #  
 38  #    In the event that the product being advertised includes an 
 39  #    intact Zope distribution (with copyright and license included) 
 40  #    then this clause is waived. 
 41  #  
 42  # 5. Names associated with Zope or Digital Creations must not be used to 
 43  #    endorse or promote products derived from this software without 
 44  #    prior written permission from Digital Creations. 
 45  #  
 46  # 6. Modified redistributions of any form whatsoever must retain 
 47  #    the following acknowledgment: 
 48  #  
 49  #      "This product includes software developed by Digital Creations 
 50  #      for use in the Z Object Publishing Environment 
 51  #      (http://www.zope.org/)." 
 52  #  
 53  #    Intact (re-)distributions of any official Zope release do not 
 54  #    require an external acknowledgement. 
 55  #  
 56  # 7. Modifications are encouraged but must be packaged separately as 
 57  #    patches to official Zope releases.  Distributions that do not 
 58  #    clearly separate the patches from the original work must be clearly 
 59  #    labeled as unofficial distributions.  Modifications which do not 
 60  #    carry the name Zope may be packaged in any form, as long as they 
 61  #    conform to all of the clauses above. 
 62  #  
 63  #  
 64  # Disclaimer 
 65  #  
 66  #   THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY 
 67  #   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 68  #   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
 69  #   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS 
 70  #   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 71  #   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
 72  #   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 
 73  #   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
 74  #   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
 75  #   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
 76  #   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
 77  #   SUCH DAMAGE. 
 78  #  
 79  #  
 80  # This software consists of contributions made by Digital Creations and 
 81  # many individuals on behalf of Digital Creations.  Specific 
 82  # attributions are listed in the accompanying credits file. 
 83  #  
 84  ############################################################################## 
 85  '''Nested namespace access 
 86   
 87     The 'with' tag is used to introduce nested namespaces. 
 88   
 89     The text enclosed in the with tag is rendered using information 
 90     from the given variable or expression. 
 91   
 92     For example, if the variable 'person' is bound to an object that 
 93     has attributes 'name' and 'age', then a 'with' tag like the 
 94     following can be used to access these attributes:: 
 95   
 96       <!--#with person--> 
 97         <!--#var name-->, 
 98         <!--#var age--> 
 99       <!--#/with--> 
100   
101     Eather a 'name' or an 'expr' attribute may be used to specify data. 
102     A 'mapping' attribute may be used to indicate that the given data 
103     should be treated as mapping object, rather than as an object with 
104     named attributes. 
105   
106  '''  
107   
108  __rcs_id__='$Id: DT_With.py 694 2003-04-16 02:53:50Z sc $' 
109  __version__='$Revision: 694 $'[11:-2] 
110   
111  from DT_Util import parse_params, name_param, InstanceDict, render_blocks, str 
112  from DT_Util import TemplateDict 
113 -class With:
114 blockContinuations=() 115 name='with' 116 mapping=None 117 only=0 118
119 - def __init__(self, blocks):
120 tname, args, section = blocks[0] 121 args=parse_params(args, name='', expr='', mapping=1, only=1) 122 name,expr=name_param(args,'with',1) 123 if expr is None: expr=name 124 else: expr=expr.eval 125 self.__name__, self.expr = name, expr 126 self.section=section.blocks 127 if args.has_key('mapping') and args['mapping']: self.mapping=1 128 if args.has_key('only') and args['only']: self.only=1
129
130 - def render(self, md):
131 expr=self.expr 132 if type(expr) is type(''): v=md[expr] 133 else: v=expr(md) 134 135 if not self.mapping: 136 if type(v) is type(()) and len(v)==1: v=v[0] 137 v=InstanceDict(v,md) 138 139 if self.only: 140 _md=md 141 md=TemplateDict() 142 if hasattr(_md, 'validate'): 143 md.validate=_md.validate 144 145 md._push(v) 146 try: return render_blocks(self.section, md) 147 finally: md._pop(1)
148 149 __call__=render
150