Skip to content

Commit 25dad2a

Browse files
authored
Merge pull request #9 from Kozea/lang
Optimize lang attribute selectors
2 parents 7db51af + fdd4c59 commit 25dad2a

2 files changed

Lines changed: 12 additions & 1 deletion

File tree

cssselect2/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ def __init__(self):
3131
self.class_selectors = {}
3232
self.lower_local_name_selectors = {}
3333
self.namespace_selectors = {}
34+
self.lang_attr_selectors = []
3435
self.other_selectors = []
3536
self.order = 0
3637

@@ -68,6 +69,8 @@ def add_selector(self, selector, payload):
6869
elif selector.namespace is not None:
6970
self.namespace_selectors.setdefault(selector.namespace, []) \
7071
.append(entry)
72+
elif selector.requires_lang_attr:
73+
self.lang_attr_selectors.append(entry)
7174
else:
7275
self.other_selectors.append(entry)
7376

@@ -98,6 +101,10 @@ def match(self, element):
98101
ascii_lower(element.local_name), []))
99102
relevant_selectors.append(
100103
self.namespace_selectors.get(element.namespace_url, []))
104+
105+
if 'lang' in element.etree_element.attrib:
106+
relevant_selectors.append(self.lang_attr_selectors)
107+
101108
relevant_selectors.append(self.other_selectors)
102109

103110
results = [

cssselect2/compiler.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ def __init__(self, parsed_selector):
5454
self.local_name = None
5555
self.lower_local_name = None
5656
self.namespace = None
57+
self.requires_lang_attr = False
5758

5859
node = parsed_selector.parsed_tree
5960
if isinstance(node, parser.CombinedSelector):
@@ -68,6 +69,9 @@ def __init__(self, parsed_selector):
6869
self.lower_local_name = simple_selector.lower_local_name
6970
elif isinstance(simple_selector, parser.NamespaceSelector):
7071
self.namespace = simple_selector.namespace
72+
elif isinstance(simple_selector, parser.AttributeSelector) and \
73+
simple_selector.name == "lang":
74+
self.requires_lang_attr = True
7175

7276

7377
def _compile_node(selector):
@@ -169,7 +173,7 @@ def _compile_node(selector):
169173
% (selector.lower_name, selector.name))
170174
value = selector.value
171175
if selector.operator is None:
172-
return 'el.etree_element.get(%s) is not None' % key
176+
return '%s in el.etree_element.attrib' % key
173177
elif selector.operator == '=':
174178
return 'el.etree_element.get(%s) == %r' % (key, value)
175179
elif selector.operator == '~=':

0 commit comments

Comments
 (0)