1 /* SPDX-License-Identifier: Zlib */
2 
3 #define N_SEARCH_RESULTS 512
4 
5 #include <glib.h>
6 
7 #include "plugin.h"
8 #include "utils.h"
9 
10 girara_list_t*
pdf_page_search_text(zathura_page_t * page,void * data,const char * text,zathura_error_t * error)11 pdf_page_search_text(zathura_page_t* page, void* data, const char* text, zathura_error_t* error)
12 {
13   mupdf_page_t* mupdf_page = data;
14 
15   if (page == NULL || text == NULL) {
16     if (error != NULL) {
17       *error = ZATHURA_ERROR_INVALID_ARGUMENTS;
18     }
19     goto error_ret;
20   }
21 
22   zathura_document_t* document = zathura_page_get_document(page);
23   if (document == NULL || mupdf_page == NULL || mupdf_page->text == NULL) {
24     goto error_ret;
25   }
26 
27   mupdf_document_t* mupdf_document = zathura_document_get_data(document);;
28 
29   girara_list_t* list = girara_list_new2(g_free);
30   if (list == NULL) {
31     if (error != NULL) {
32       *error = ZATHURA_ERROR_OUT_OF_MEMORY;
33     }
34     goto error_free;
35   }
36 
37   /* extract text */
38   if (mupdf_page->extracted_text == false) {
39     mupdf_page_extract_text(mupdf_document, mupdf_page);
40   }
41 
42   fz_quad* hit_bbox = fz_malloc_array(mupdf_page->ctx, N_SEARCH_RESULTS, fz_quad);
43   int num_results = fz_search_stext_page(mupdf_page->ctx, mupdf_page->text,
44       text, hit_bbox, N_SEARCH_RESULTS);
45 
46   fz_rect r;
47   for (int i = 0; i < num_results; i++) {
48     zathura_rectangle_t* rectangle = g_malloc0(sizeof(zathura_rectangle_t));
49 
50     r = fz_rect_from_quad(hit_bbox[i]);
51     rectangle->x1 = r.x0;
52     rectangle->x2 = r.x1;
53     rectangle->y1 = r.y0;
54     rectangle->y2 = r.y1;
55 
56     girara_list_append(list, rectangle);
57   }
58 
59   fz_free(mupdf_page->ctx, hit_bbox);
60 
61   return list;
62 
63 error_free:
64 
65   if (list != NULL ) {
66     girara_list_free(list);
67   }
68 
69 error_ret:
70 
71   if (error != NULL && *error == ZATHURA_ERROR_OK) {
72     *error = ZATHURA_ERROR_UNKNOWN;
73   }
74 
75   return NULL;
76 }
77 
78