Changeset 2814:a0d1511ab9aa in livinglogic.python.xist

Show
Ignore:
Timestamp:
07/26/07 14:09:12 (12 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Refactor same of the match implementations for CSS selectors.

Files:
1 modified

Legend:

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

    r2813 r2814  
    975975            node = path[-1] 
    976976            for child in path[-2]: 
    977                 if child is node: 
     977                if child is node: # no previous siblings 
    978978                    return False 
    979979                if self.left.match(path[:-1]+[child]): 
     
    13421342class CSSFirstOfTypeSelector(Selector): 
    13431343    def match(self, path): 
    1344         if len(path) < 2: 
    1345             return False 
    1346         node = path[-1] 
    1347         return isinstance(node, xsc.Element) and _is_nth_node(misc.Iterator(_children_of_type(path[-2], node.xmlname)), node, 1) 
     1344        if len(path) >= 2: 
     1345            node = path[-1] 
     1346            return isinstance(node, xsc.Element) and _is_nth_node(misc.Iterator(_children_of_type(path[-2], node.xmlname)), node, 1) 
     1347        return False 
    13481348 
    13491349    def __str__(self): 
     
    13531353class CSSLastOfTypeSelector(Selector): 
    13541354    def match(self, path): 
    1355         if len(path) < 2: 
    1356             return False 
    1357         node = path[-1] 
    1358         return isinstance(node, xsc.Element) and _is_nth_last_node(misc.Iterator(_children_of_type(path[-2], node.xmlname)), node, 1) 
     1355        if len(path) >= 2: 
     1356            node = path[-1] 
     1357            return isinstance(node, xsc.Element) and _is_nth_last_node(misc.Iterator(_children_of_type(path[-2], node.xmlname)), node, 1) 
     1358        return False 
    13591359 
    13601360    def __str__(self): 
     
    13641364class CSSOnlyChildSelector(Selector): 
    13651365    def match(self, path): 
    1366         if len(path) < 2: 
    1367             return False 
    1368         node = path[-1] 
    1369         for child in path[-2][xsc.Element]: 
    1370             if child is not node: 
    1371                 return False 
    1372         return True 
     1366        if len(path) >= 2: 
     1367            node = path[-1] 
     1368            for child in path[-2][xsc.Element]: 
     1369                if child is not node: 
     1370                    return False 
     1371            return True 
     1372        return False 
    13731373 
    13741374    def __str__(self): 
     
    13781378class CSSOnlyOfTypeSelector(Selector): 
    13791379    def match(self, path): 
    1380         if len(path) < 2: 
    1381             return False 
    1382         node = path[-1] 
    1383         if not isinstance(node, xsc.Element): 
    1384             return False 
    1385         for child in _children_of_type(path[-2], node.xmlname): 
    1386             if child is not node: 
    1387                 return False 
    1388         return True 
     1380        if len(path) >= 2: 
     1381            node = path[-1] 
     1382            if isinstance(node, xsc.Element): 
     1383                for child in _children_of_type(path[-2], node.xmlname): 
     1384                    if child is not node: 
     1385                        return False 
     1386                return True 
     1387        return False 
    13891388 
    13901389    def __str__(self): 
     
    13941393class CSSEmptySelector(Selector): 
    13951394    def match(self, path): 
    1396         if not path: 
    1397             return False 
    1398         node = path[-1] 
    1399         if not isinstance(node, xsc.Element): 
    1400             return False 
    1401         for child in path[-1].content: 
    1402             if isinstance(child, xsc.Element) or (isinstance(child, xsc.Text) and child): 
    1403                 return False 
    1404         return True 
     1395        if path: 
     1396            node = path[-1] 
     1397            if isinstance(node, xsc.Element): 
     1398                for child in path[-1].content: 
     1399                    if isinstance(child, xsc.Element) or (isinstance(child, xsc.Text) and child): 
     1400                        return False 
     1401                return True 
     1402        return False 
    14051403 
    14061404    def __str__(self): 
     
    14261424class CSSNthChildSelector(CSSFunctionSelector): 
    14271425    def match(self, path): 
    1428         if len(path) < 2: 
    1429             return False 
    1430         node = path[-1] 
    1431         if not isinstance(node, xsc.Element): 
    1432             return False 
    1433         return _is_nth_node(path[-2][xsc.Element], node, self.value) 
     1426        if len(path) >= 2: 
     1427            node = path[-1] 
     1428            if isinstance(node, xsc.Element): 
     1429                return _is_nth_node(path[-2][xsc.Element], node, self.value) 
     1430        return False 
    14341431 
    14351432 
    14361433class CSSNthLastChildSelector(CSSFunctionSelector): 
    14371434    def match(self, path): 
    1438         if len(path) < 2: 
    1439             return False 
    1440         node = path[-1] 
    1441         if not isinstance(node, xsc.Element): 
    1442             return False 
    1443         return _is_nth_last_node(path[-2][xsc.Element], node, self.value) 
     1435        if len(path) >= 2: 
     1436            node = path[-1] 
     1437            if isinstance(node, xsc.Element): 
     1438                return _is_nth_last_node(path[-2][xsc.Element], node, self.value) 
     1439        return False 
    14441440 
    14451441 
    14461442class CSSNthOfTypeSelector(CSSFunctionSelector): 
    14471443    def match(self, path): 
    1448         if len(path) < 2: 
    1449             return False 
    1450         node = path[-1] 
    1451         if not isinstance(node, xsc.Element): 
    1452             return False 
    1453         return _is_nth_node(self._children_of_type(path[-2], node.xmlname), node, self.value) 
     1444        if len(path) >= 2: 
     1445            node = path[-1] 
     1446            if isinstance(node, xsc.Element): 
     1447                return _is_nth_node(self._children_of_type(path[-2], node.xmlname), node, self.value) 
     1448        return False 
    14541449 
    14551450 
    14561451class CSSNthLastOfTypeSelector(CSSFunctionSelector): 
    14571452    def match(self, path): 
    1458         if len(path) < 2: 
    1459             return False 
    1460         node = path[-1] 
    1461         if not isinstance(node, xsc.Element): 
    1462             return False 
    1463         return _is_nth_last_node(self._children_of_type(path[-2], node.xmlname), node, self.value) 
     1453        if len(path) >= 2: 
     1454            node = path[-1] 
     1455            if isinstance(node, xsc.Element): 
     1456                return _is_nth_last_node(self._children_of_type(path[-2], node.xmlname), node, self.value) 
     1457        return False 
    14641458 
    14651459 
     
    15321526            node = path[-1] 
    15331527            for child in path[-2][xsc.Element]: 
    1534                 if child is node: 
     1528                if child is node: # no previous element siblings 
    15351529                    return False 
    15361530                if self.left.match(path[:-1]+[child]):