Changeset 2758:c8a46c05d777 in livinglogic.python.xist

Show
Ignore:
Timestamp:
07/04/07 17:34:47 (12 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Rename makeselector() to makewalkfilter() (becuase ConstantWalkFilter?
is not a selector).

Make makewalkfilter() more robust: Don't fall back to creating a
ConstantWalkFilter? is the aragument is not tuple (but raise a TypeError?
instead).

Fix nthoftype for negative indexes.

Location:
src/ll/xist
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • src/ll/xist/xfind.py

    r2756 r2758  
    2828 
    2929 
    30 def makeselector(obj): 
     30def makewalkfilter(obj): 
    3131    if not isinstance(obj, xsc.WalkFilter): 
    3232        if isinstance(obj, xsc._Node_Meta): 
     
    3636        elif callable(obj): 
    3737            obj = CallableSelector(obj) 
     38        elif isinstance(obj, tuple): 
     39            obj = xsc.ConstantWalkFilter(obj) 
    3840        else: 
    39             obj = xsc.ConstantWalkFilter(obj) 
     41            raise TypeError("can't convert %r to selector" % obj) 
    4042    return obj 
    4143 
     
    615617        if len(path) < 2: 
    616618            return False 
     619        if self.index in ("even", "odd"): 
     620            for (i, child) in enumerate(path[-2]): 
     621                if child is path[-1]: 
     622                    return (i % 2) == (self.index == "odd") 
     623            return False # can't happen 
    617624        try: 
    618             if self.index in ("even", "odd"): 
    619                 for (i, child) in enumerate(path[-2]): 
    620                     if child is path[-1]: 
    621                         return (i % 2) == (self.index == "odd") 
    622                 return False # can't happen 
    623625            return path[-2][self.index] is path[-1] 
    624626        except IndexError: 
     
    634636        self.types = types 
    635637 
     638    def _find(self, path): 
     639        types = self.types if self.types else path[-1].__class__ 
     640        for child in path[-2]: 
     641            if isinstance(child, types): 
     642                yield child 
     643 
    636644    def match(self, path): 
    637645        if len(path) < 2: 
    638646            return False 
    639         try: 
    640             types = self.types if self.types else path[-1].__class__ 
    641             if self.index in ("even", "odd"): 
    642                 i = 0 
    643                 for child in path[-2]: 
    644                     if isinstance(child, types): 
    645                         if child is path[-1]: 
    646                             return (i % 2) == (self.index == "odd") 
    647                         i += 1 
    648             else: 
    649                 i = 0 
    650                 for child in path[-2]: 
    651                     if isinstance(child, types): 
    652                         if child is path[-1]: 
    653                             return i == self.index 
    654                         i += 1 
    655             return False 
    656         except IndexError: 
    657             return False 
     647        if self.index in ("even", "odd"): 
     648            for (i, child) in enumerate(self._find(path)): 
     649                if child is path[-1]: 
     650                    return (i % 2) == (self.index == "odd") 
     651            return False 
     652        else: 
     653            try: 
     654                return misc.item(self._find(path), self.index) is path[-1] 
     655            except IndexError: 
     656                return False 
    658657 
    659658    def __repr__(self): 
  • src/ll/xist/xsc.py

    r2756 r2758  
    10181018        """ 
    10191019        from ll.xist import xfind 
    1020         filter = xfind.makeselector(filter) 
     1020        filter = xfind.makewalkfilter(filter) 
    10211021        return self._walk(filter, [self]) 
    10221022 
     
    10281028        """ 
    10291029        from ll.xist import xfind 
    1030         filter = xfind.makeselector(filter) 
     1030        filter = xfind.makewalkfilter(filter) 
    10311031        def iterate(path): 
    10321032            for path in self._walk(filter, path): 
     
    10411041        """ 
    10421042        from ll.xist import xfind 
    1043         filter = xfind.makeselector(filter) 
     1043        filter = xfind.makewalkfilter(filter) 
    10441044        def iterate(path): 
    10451045            for path in self._walk(filter, path):