diff --git a/src/calibre/gui2/viewer/search.py b/src/calibre/gui2/viewer/search.py index ad43b3ec8e..30002aaead 100644 --- a/src/calibre/gui2/viewer/search.py +++ b/src/calibre/gui2/viewer/search.py @@ -145,6 +145,14 @@ class Search: self._nsd = word_pats, full_pat return self._nsd + @property + def is_empty(self): + if not self.text: + return True + if self.mode in ('normal', 'word') and not regex.sub(r'[\s\p{P}]+', '', self.text): + return True + return False + def __str__(self): from collections import namedtuple s = ('text', 'mode', 'case_sensitive', 'backwards') diff --git a/src/calibre/gui2/viewer/ui.py b/src/calibre/gui2/viewer/ui.py index b9e6813d04..bb6084b211 100644 --- a/src/calibre/gui2/viewer/ui.py +++ b/src/calibre/gui2/viewer/ui.py @@ -336,6 +336,9 @@ class EbookViewer(MainWindow): def start_search(self, search_query): name = self.web_view.current_content_file if name: + if search_query.is_empty and search_query.text: + return error_dialog(self, _('Empty search expression'), _( + 'Cannot search for {!r} as it contains only punctuation and spaces.').format(search_query.text), show=True) self.web_view.get_current_cfi(self.search_widget.set_anchor_cfi) self.search_widget.start_search(search_query, name) self.web_view.setFocus(Qt.FocusReason.OtherFocusReason)