From a8ca34e8a04c29657507fc0733a85071cf07a3c5 Mon Sep 17 00:00:00 2001 From: luhuaei Date: Sun, 15 Dec 2019 18:12:03 +0800 Subject: [PATCH] pdf-viewer: add local search text. --- app/pdf-viewer/buffer.py | 46 ++++++++++++++++++++++++++++++++++++++++ eaf.el | 3 ++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/app/pdf-viewer/buffer.py b/app/pdf-viewer/buffer.py index 1f8f0a6..4ecfc9e 100755 --- a/app/pdf-viewer/buffer.py +++ b/app/pdf-viewer/buffer.py @@ -44,6 +44,8 @@ class AppBuffer(Buffer): self.buffer_widget.jump_to_percent(int(result_content)) elif result_type == "jump_link": self.buffer_widget.jump_to_link(str(result_content)) + elif result_type == "local_search_text": + self.buffer_widget.local_search_text(str(result_content)) def scroll(self, scroll_direction, scroll_type): if scroll_type == "page": @@ -123,6 +125,12 @@ class AppBuffer(Buffer): self.buffer_widget.add_mark_jump_link_tips() self.buffer_widget.send_input_message("Jump to link: ", "jump_link") + def local_search_text(self): + if self.buffer_widget.is_local_search_text: + self.buffer_widget.delete_all_mark_local_search_text() + else: + self.buffer_widget.send_input_message("Search text: ", "local_search_text") + class PdfViewerWidget(QWidget): translate_double_click_word = QtCore.pyqtSignal(str) @@ -157,6 +165,10 @@ class PdfViewerWidget(QWidget): self.jump_link_key_cache_dict = {} self.jump_link_annot_cache_dict = {} + # local search text + self.is_local_search_text = False + self.local_search_text_annot_cache_dict = {} + # Init scroll attributes. self.scroll_step = 20 self.scroll_offset = 0 @@ -217,6 +229,10 @@ class PdfViewerWidget(QWidget): self.delete_all_mark_link() page = self.document[index] + # follow page search text + if self.is_local_search_text: + page = self.add_mark_local_search_text(page, index) + trans = self.page_cache_trans if self.page_cache_trans is not None else fitz.Matrix(scale, scale) pixmap = page.getPixmap(matrix=trans, alpha=False) @@ -511,6 +527,36 @@ class PdfViewerWidget(QWidget): self.delete_all_mark_jump_link_tips() self.update() + def add_mark_local_search_text(self, page, page_index): + quads_list = page.searchFor(self.search_text, hit_max=999, quads=True) + annot_list = [] + if quads_list: + for quads in quads_list: + annot = page.addHighlightAnnot(quads) + annot.parent = page + annot_list.append(annot) + self.local_search_text_annot_cache_dict[page_index] = annot_list + return page + + def local_search_text(self, search_text): + # begin local search + self.is_local_search_text = True + self.search_text = search_text + self.page_cache_pixmap_dict.clear() + self.update() + + def delete_all_mark_local_search_text(self): + if self.local_search_text_annot_cache_dict: + for page_index in self.local_search_text_annot_cache_dict.keys(): + page = self.document[page_index] + for annot in self.local_search_text_annot_cache_dict[page_index]: + page.deleteAnnot(annot) + self.is_local_search_text = False + self.search_text = None + self.local_search_text_annot_cache_dict.clear() + self.page_cache_pixmap_dict.clear() + self.update() + def jump_to_page(self, page_num): self.update_scroll_offset(min(max(self.scale * (int(page_num) - 1) * self.page_height, 0), self.max_scroll_offset())) diff --git a/eaf.el b/eaf.el index 619644d..5aced5d 100644 --- a/eaf.el +++ b/eaf.el @@ -237,7 +237,8 @@ Try not to modify this alist directly. Use `eaf-setq' to modify instead." ("]" . "remember_jump") ("i" . "toggle_inverted_mode") ("m" . "toggle_mark_link") - ("f" . "jump_to_link")) + ("f" . "jump_to_link") + ("s" . "local_search_text")) "The keybinding of EAF PDF Viewer." :type 'cons)