Changeset 3

Show
Ignore:
Timestamp:
Mon May 9 06:24:03 2005
Author:
rdelon
Message:

- Started support for PSP syntax ...

Files:

Legend:

Unmodified
Added
Removed
Modified
  • trunk/cherrytemplate/cherrytemplate.py

    r2 r3  
    66 66  
    67 67 def _findClosingTag(template, openingTag, closingTag, openTagCount, startIndex, text):  
    68       if openTagCount<0: raise ParseError, "Too many closing tags '%s' for '%s ... %s ...'"%(closingTag, openingTag, text)  
    69       i=template.find(openingTag, startIndex)  
    70       j=template.find(closingTag, startIndex)  
    71       #print "text:", text, "openCount:", openTagCount, "i:", i, "j:",j  
    72       #if i!=-1: print "i20:", template[i:i+20]  
    73       #if j!=-1: print "j20:", template[j:j+20]  
    74       if j==-1: raise ParseError, "No matching '%s' tag for '%s ... %s ...'"%(closingTag, openingTag, text)  
    75       if i==-1 or j<i: # closingTag is first  
    76           if openTagCount==0: return j # found it !  
      68     if openTagCount < 0:  
      69         raise ParseError, \  
      70             "Too many closing tags '%s' for '%s ... %s ...'" % (  
      71                 closingTag, openingTag, text  
      72             )  
      73     i = template.find(openingTag, startIndex)  
      74     j = template.find(closingTag, startIndex)  
      75     if j == -1: raise ParseError, "No matching '%s' tag for '%s ... %s ...'"%(closingTag, openingTag, text)  
      76     if i == -1 or j < i: # closingTag is first  
      77         if openTagCount == 0:  
      78             return j # found it !  
    77 79         return _findClosingTag(template, openingTag, closingTag, openTagCount-1, j+1, text)  
    78 80     else: # openingTag is first  
     
    138 140     return template  
    139 141  
      142 def _firstNonSpace(s):  
      143     i = 0  
      144     while i < len(s) and s[i] == ' ':  
      145         i += 1  
      146     return i  
      147  
    140 148 def _writeTemplate(f, template, tab):  
      149     # New cherrytemplate syntax  
      150     tagList = ['<%=', '<%', '<--']  
      151     minI = len(template)  
      152     minTag = ""  
      153     for tag in tagList:  
      154         i = template.find(tag)  
      155         if i == -1: continue  
      156         if i < minI:  
      157             minI = i  
      158             minTag = tag  
      159     if minTag == '<%':  
      160         j = _findClosingTag(template, '<%', '%>', 0, minI + 1, '')  
      161         execStr = template[minI+2:j]  
      162         # Try to indent execStr correctly  
      163         lines=[]  
      164         minIndent=1000  
      165         lastIndent=0  
      166         for line in execStr.split('\n'):  
      167             if line.split():  
      168                 indentCount = _firstNonSpace(line)  
      169                 lastIndent = indentCount  
      170                 if line.strip()[-1] == ':':  
      171                     lastIndent += 4  
      172                 if indentCount < minIndent: minIndent=indentCount  
      173                 lines.append(line)  
      174         if minIndent==1000: minIndent=0  
      175         lastIndent -= minIndent  
      176  
      177         _writeTemplate(f, template[:minI-1], tab)  
      178         lastLineIndent = ''  
      179         for line in lines:  
      180             # Remove "minIndent" tabs and add "tab" tabs from each line  
      181             sLine = line.strip()  
      182             if sLine.startswith('# end') or sLine.startswith('#end'):  
      183                 tab = tab[4:]  
      184                 continue  
      185             f.write(tab+line[minIndent:]+'\n')  
      186         _writeTemplate(f, template[j+2:], tab + ' ' * lastIndent)  
      187         return  
      188  
      189     elif minTag == '<%=':  
      190         j = _findClosingTag(template, '<%=', '%>', 0, minI + 1, '')  
      191         evalStr = template[minI+3:j]  
      192         _writeInTripleQuotes(f, template[:minI-1], tab)  
      193         f.write(tab+'yield %s\n' % evalStr)  
      194         _writeTemplate(f, template[j+2:], tab)  
      195         return  
      196  
      197  
      198     # Old cherrytemplate syntax  
    141 199     tagList=['py-eval', 'py-exec', 'py-code', 'py-attr', 'py-if', 'py-for']  
    142 200     minI=len(template)  
     
    371 429             _writeTemplate(f, template[j3+6:], tab)  
    372 430  
    373       elif minTag: raise "Internal error: minTag= '%s'" % minTag  
      431     elif minTag:  
      432         raise InternalError(minTag)  
    374 433  
    375 434 def renderTemplate(template = '', file = None, inputEncoding = None, outputEncoding = None, outputEncodingErrors = None, returnGenerator = None, glob = None, loc = None):  
     
    387 446     _writeTemplate(f, template, '    ')  
    388 447     template = f.getvalue()  
      448     print "*** template:", template  
      449     print "*** END TEMPLATE"  
    389 450      
    390 451     g = glob.copy() # make a copy because we don't want to avoid changing original global scope.