From c1dc45a79fd9d0e2d09470d6dd9e40f218785b5f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 15 Dec 2021 10:46:17 +0530 Subject: [PATCH] Edit book: Reports: Include descendant selectors that use classes when counting class usage. Fixes #1954839 [Style classes wrongly reported as 0 (unused)](https://bugs.launchpad.net/calibre/+bug/1954839) --- src/calibre/ebooks/oeb/polish/report.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/calibre/ebooks/oeb/polish/report.py b/src/calibre/ebooks/oeb/polish/report.py index 5db008f940..1497c3005d 100644 --- a/src/calibre/ebooks/oeb/polish/report.py +++ b/src/calibre/ebooks/oeb/polish/report.py @@ -297,10 +297,21 @@ def css_data(container, book_locale, result_data, *args): matches = tuple(select(selector)) except SelectorError: return () - for elem in matches: - for cls in elem.get('class', '').split(): - if '.' + cls.lower() in lsel: - class_map[cls][elem].append(rule) + seen = set() + + def get_elem_and_ancestors(elem): + p = elem + while p is not None: + if p not in seen: + yield p + seen.add(p) + p = p.getparent() + + for e in matches: + for elem in get_elem_and_ancestors(e): + for cls in elem.get('class', '').split(): + if '.' + cls.lower() in lsel: + class_map[cls][elem].append(rule) return (MatchLocation(tag_text(elem), elem.sourceline) for elem in matches)