[Zope-dev] Help needed: why is this DTML not working in zope 2 ?

Steve Alexander steve@cat-box.net
Tue, 04 Jul 2000 20:02:29 +0100


Steve Alexander wrote:
> 
> Gilles Lavaux wrote:
> >
> > Argh!!!
> >
> > no, I made a typo error : it was <!--#var image_name-->.the syntax was good.
> > Ok, I will use the new syntax in my new sites. But for my old site, I will
> > not modify my ~500 dtml methods, except if there is a way to automate the
> > change.
> 
> You can write a pretty simple external method to walk your Zope object
> heirarchy looking for DTML Methods and DTML documents, then altering the
> syntax. Shouldn't take more than an hour to write and debug and test and
> document, if you've written stuff in Python before.
> 
> I'm off to a meeting for a few hours, but harrass me later and I'll send
> to the list a proof-of-concept external method to get you started.

An external method for automated change from old syntax to new syntax
follows.

 * Use at your own risk
 * No warranty implied or given
 * Use on a copy of your main Zope site
 * Back up data.fs three times before starting
 * Not guarenteed not to spin your processor and never terminate
 * Run on a copy of Zope in debug mode (-D) to see the print statements
 * Barely tested, if at all


--------
import re

def convert_dtml(self):
    """Convert DTML Methods and DTML Documents from old syntax to 
       new syntax.
       Warning: recursive! Might just eat all your stack.
       Does not work on subclasses of DTML Method and DTML Document.
       Preserves normal comments, and handles instances of "-->" in 
       quotes.
    """
    print 'convert_dtml: id=%s' % self.title_and_id()
    if hasattr(self, 'meta_type') and \
          (self.meta_type == 'DTML Method' or \
           self.meta_type == 'DTML Document'):
        convert(self)
        
    # should this be "isPrincipiaFolderish"?        
    if hasattr(self, 'isAnObjectManager') and self.isAnObjectManager:
        for v in self.objectValues():
            v.convert_dtml()
            
_convert_regex = re.compile('<!--#(/?)(([^"-]+?|"[^"]*?"|-[^-])+?)-->')

def convert(dtml_item):
    print 'converting...'
    title = dtml_item.title
           # like document_src, but doesn't require RESPONSE
    data = dtml_item.PrincipiaSearchSource()
    print '----data----'
    print data
    newdata = _convert_regex.sub('<\g<1>dtml-\g<2>>', data)
    print '----newdata----'
    print newdata    
    print '----end----'    
    dtml_item.manage_edit(newdata, title)
    
--------


--
Steve Alexander
Software Engineer
Cat-Box limited
http://www.cat-box.net