fuzzytraverser.py
2008-01-11 20:14...
from zope.publisher.interfaces import NotFound
from zope.app import zapi
from zope.app.container.traversal import ContainerTraverser
import difflib
from interfaces import IFuzzyFolder
class FuzzyTraverser(ContainerTraverser) :
__used_for__ = IFuzzyFolder
nmax = None
def publishTraverse(self, request, name):
"""See zope.publisher.interfaces.browser.IBrowserPublisher"""
print "Traverse!!"
subob = self.get(name)
if subob is not None:
if self.nmax :
request.annotations.setdefault("fuzzytraverser",[]).append({'name':name,'nmax':self.nmax,'imax':self.imax})
return subob
return super(FuzzyTraverser, self).publishTraverse(request, name)
def get(self,name) :
res = self.context.get(name,None)
if res is not None :
return res
imax = 0.5
nmax = None
for key in self.context.keys() :
i = difflib.SequenceMatcher(None,name,key).ratio()
#print "===",i,name,key
if i >= imax :
imax = i
nmax = key
self.nmax = nmax
self.imax = imax
return self.context.get(nmax,None)



