From ebea435ad53543c539c46b2b40ab5476312e6319 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 4 Feb 2020 07:52:03 +0530 Subject: [PATCH] Viewer: When searching have single and double quotes match their curly variants as well. Fixes #1861715 [searching for contractions doesn't recognize typewriter apostrophes](https://bugs.launchpad.net/calibre/+bug/1861715) --- src/calibre/gui2/viewer/search.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/viewer/search.py b/src/calibre/gui2/viewer/search.py index 2150a95f5d..1bca57b0e8 100644 --- a/src/calibre/gui2/viewer/search.py +++ b/src/calibre/gui2/viewer/search.py @@ -50,6 +50,21 @@ class BusySpinner(QWidget): # {{{ # }}} +quote_map= {'"':'"“”', "'": "'‘’"} +qpat = regex.compile(r'''(['"])''') + + +def text_to_regex(text): + ans = [] + for part in qpat.split(text): + r = quote_map.get(part) + if r is not None: + ans.append('[' + r + ']') + else: + ans.append(regex.escape(part)) + return ''.join(ans) + + class Search(object): def __init__(self, text, mode, case_sensitive, backwards): @@ -72,10 +87,10 @@ class Search(object): if self.mode == 'word': words = [] for part in expr.split(): - words.append(r'\b{}\b'.format(regex.escape(part))) + words.append(r'\b{}\b'.format(text_to_regex(part))) expr = r'\s+'.join(words) else: - expr = regex.escape(expr) + expr = text_to_regex(expr) self._regex = regex.compile(expr, flags) return self._regex