mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-07 10:14:46 -04:00
Allow restricting results to descendants of a particular tag
This commit is contained in:
parent
e7caf265c1
commit
bd3b162d7a
@ -156,13 +156,19 @@ class Select(object):
|
|||||||
return ascii_lower(x.rpartition('}')[2])
|
return ascii_lower(x.rpartition('}')[2])
|
||||||
self.map_tag_name = map_tag_name
|
self.map_tag_name = map_tag_name
|
||||||
|
|
||||||
def __call__(self, selector):
|
def __call__(self, selector, root=None):
|
||||||
'Return an iterator over all matching tags, in document order.'
|
''' Return an iterator over all matching tags, in document order.
|
||||||
|
Normally, all matching tags in the document are returned, is you
|
||||||
|
specify root, then only tags that are root or descendants of root are
|
||||||
|
returned. Note that this can be very expensive if root has a lot of
|
||||||
|
descendants. '''
|
||||||
seen = set()
|
seen = set()
|
||||||
|
if root is not None:
|
||||||
|
root = frozenset(self.itertag(root))
|
||||||
for selector in get_parsed_selector(selector):
|
for selector in get_parsed_selector(selector):
|
||||||
parsed_selector = selector.parsed_tree
|
parsed_selector = selector.parsed_tree
|
||||||
for item in self.iterparsedselector(parsed_selector):
|
for item in self.iterparsedselector(parsed_selector):
|
||||||
if item not in seen:
|
if item not in seen and (root is None or item in root):
|
||||||
yield item
|
yield item
|
||||||
seen.add(item)
|
seen.add(item)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user