Allow easily ignoring the UI and non-element pseudo-selectors

This commit is contained in:
Kovid Goyal 2015-02-21 10:26:19 +05:30
parent bd0313c357
commit 3420913923

View File

@ -78,6 +78,8 @@ def normalize_language_tag(tag):
taglist.add('-'.join(base_tag + tags)) taglist.add('-'.join(base_tag + tags))
return taglist return taglist
INAPPROPRIATE_PSEUDO_CLASSES = frozenset([
'active', 'after', 'disabled', 'visited', 'link', 'before', 'focus', 'first-letter', 'enabled', 'first-line', 'hover', 'checked', 'target'])
class Select(object): class Select(object):
@ -125,7 +127,7 @@ class Select(object):
'*=': 'substringmatch', '*=': 'substringmatch',
} }
def __init__(self, root, default_lang=None, dispatch_map=None, trace=False): def __init__(self, root, default_lang=None, ignore_inappropriate_pseudo_classes=False, dispatch_map=None, trace=False):
if hasattr(root, 'getroot'): if hasattr(root, 'getroot'):
root = root.getroot() root = root.getroot()
self.root = root self.root = root
@ -134,6 +136,10 @@ class Select(object):
self.default_lang = default_lang self.default_lang = default_lang
if trace: if trace:
self.dispatch_map = {k:trace_wrapper(v) for k, v in self.dispatch_map.iteritems()} self.dispatch_map = {k:trace_wrapper(v) for k, v in self.dispatch_map.iteritems()}
if ignore_inappropriate_pseudo_classes:
self.ignore_inappropriate_pseudo_classes = INAPPROPRIATE_PSEUDO_CLASSES
else:
self.ignore_inappropriate_pseudo_classes = frozenset()
def invalidate_caches(self): def invalidate_caches(self):
'Invalidate all caches. You must call this before using this object if you have made changes to the HTML tree' 'Invalidate all caches. You must call this before using this object if you have made changes to the HTML tree'
@ -517,8 +523,12 @@ def select_pseudo(cache, pseudo):
yield cache.root yield cache.root
return return
raise ExpressionError( if pseudo.ident in cache.ignore_inappropriate_pseudo_classes:
"The pseudo-class :%s is not supported" % pseudo.ident) def func(cache, item):
return True
else:
raise ExpressionError(
"The pseudo-class :%s is not supported" % pseudo.ident)
for item in cache.iterparsedselector(pseudo.selector): for item in cache.iterparsedselector(pseudo.selector):
if func(cache, item): if func(cache, item):
@ -571,4 +581,4 @@ if __name__ == '__main__':
from pprint import pprint from pprint import pprint
root = etree.fromstring('<body xmlns="xxx" xml:lang="en"><p id="p" class="one two" lang="fr"><a id="a"/><b/><c/><d/></p></body>') root = etree.fromstring('<body xmlns="xxx" xml:lang="en"><p id="p" class="one two" lang="fr"><a id="a"/><b/><c/><d/></p></body>')
select = Select(root, trace=True) select = Select(root, trace=True)
pprint(list(select('p'))) pprint(list(select('p:disabled')))