[Zope-dev] DTML Block Parsing - Patch #2

Casey Duncan cduncan@kaivo.com
Wed, 24 Jan 2001 08:38:11 -0700


This is a multi-part message in MIME format.
--------------31CCAE3F5CB42E6A9196DE03
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

I am sufficiently happy with my second patch to post it here for any
takers. It should be applied to 2.3.0b2 or 2.3.0b1. It *has not* been
tested against 2.2.5.

The new patch supports nested comments so long as they are properly
balanced inside the comment. 

As with my first patch it also allows you to create a custom DTML block
tag that contains something other than valid DTML code. It now should
support block continuation tages as well, although this had not been
tested completely. 

Patch files are attached. Enjoy.
-- 
| Casey Duncan
| Kaivo, Inc.
| cduncan@kaivo.com
`------------------>
--------------31CCAE3F5CB42E6A9196DE03
Content-Type: text/plain; charset=us-ascii;
 name="DT_String.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="DT_String.patch"

*** DT_String.py~	Tue Dec 12 14:20:25 2000
--- DT_String.py	Wed Jan 24 08:22:11 2001
***************
*** 272,313 ****
          sname=stag
          sstart=start
          sa=sargs
!         while 1:
  
              l=tagre.search(text,start)
              if l < 0: self.parse_error('No closing tag', stag, text, sloc)
  
              try: tag, args, command, coname= self._parseTag(tagre,scommand,sa)
!             except ParseError, m: self.parse_error(m[0],m[1], text, l)
!             
!             if command:
!                 start=l+len(tag)
!                 if hasattr(command, 'blockContinuations'):
!                     # New open tag.  Need to find closing tag.
!                     start=self.parse_close(text, start, tagre, tag, l,
!                                            command, args)
              else:
!                 # Either a continuation tag or an end tag
!                 section=self.SubTemplate(sname)
!                 section._v_blocks=section.blocks=self.parse(text[:l],sstart)
!                 section._v_cooked=None
!                 blocks.append((tname,sargs,section))
      
!                 start=self.skip_eol(text,l+len(tag))
  
!                 if coname:
!                     tname=coname
!                     sname=tag
!                     sargs=args
!                     sstart=start
!                 else:
!                     try:
!                         r=scommand(blocks)
!                         if hasattr(r,'simple_form'): r=r.simple_form
!                         result.append(r)
!                     except ParseError, m: self.parse_error(m[0],stag,text,l)
  
!                     return start
  
      parse_close__roles__=()
      def parse_close(self, text, start, tagre, stag, sloc, scommand, sa):
--- 272,324 ----
          sname=stag
          sstart=start
          sa=sargs
!         # Determine if the tag wants dtml parsing
!         parse_dtml = not hasattr(scommand, 'disable_dtml_block_parsing')
  
+         while 1:
              l=tagre.search(text,start)
              if l < 0: self.parse_error('No closing tag', stag, text, sloc)
  
              try: tag, args, command, coname= self._parseTag(tagre,scommand,sa)
!             except ParseError, m: 
!                 if parse_dtml: self.parse_error(m[0],m[1], text, l)
!                 else: start = l + 1 # Not parsing DTML: Skip malformed tags
              else:
!                 if command:
!                     start=l+len(tag)
!                     if hasattr(command, 'blockContinuations'):
!                         # New open tag.  Need to find closing tag.
!                         try: start=self.parse_close(text, start, tagre, tag, l,
!                                                     command, args)
! 			except: 
!                             if parse_dtml: raise
!                 else:
!                     # Either a continuation tag or an end tag	
!                     if parse_dtml:
!                         section=self.SubTemplate(sname)
!                         section._v_blocks=section.blocks=self.parse(text[:l],sstart)
!                     else:
!                         section = String(text[sstart:l], __name__=sname)
!                         section._v_blocks = section.blocks = [section.raw]
! 
!                     section._v_cooked=None
!                     blocks.append((tname,sargs,section))
      
!                     start=self.skip_eol(text,l+len(tag))
  
!                     if coname:
!                         tname=coname
!                         sname=tag
!                         sargs=args
!                         sstart=start
!                     else:
!                         try:
!                             r=scommand(blocks)
!                             if hasattr(r,'simple_form'): r=r.simple_form
!                             result.append(r)
!                         except ParseError, m: self.parse_error(m[0],stag,text,l)
  
!                         return start
  
      parse_close__roles__=()
      def parse_close(self, text, start, tagre, stag, sloc, scommand, sa):

--------------31CCAE3F5CB42E6A9196DE03
Content-Type: text/plain; charset=us-ascii;
 name="DT_Var.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="DT_Var.patch"

*** DT_Var.old	Mon Jan 22 15:27:30 2001
--- DT_Var.py	Mon Jan 22 15:28:14 2001
***************
*** 461,466 ****
--- 461,467 ----
      ''' 
      name='comment'
      blockContinuations=()
+     disable_dtml_block_parsing = 1
  
      def __init__(self, args, fmt=''): pass
  

--------------31CCAE3F5CB42E6A9196DE03--