girara_tree_node_t* cb_document_index_generate(zathura_document_t* document, cb_document_t* cb_document, zathura_error_t* error) { if (document == NULL || cb_document == NULL) { if (error != NULL) { *error = ZATHURA_ERROR_INVALID_ARGUMENTS; } return NULL; } girara_tree_node_t* root = girara_node_new(zathura_index_element_new("ROOT")); unsigned int page_number = 0; GIRARA_LIST_FOREACH(cb_document->pages, cb_document_page_meta_t*, iter, page) { gchar* markup = g_markup_escape_text(page->file, -1); zathura_index_element_t* index_element = zathura_index_element_new(markup); g_free(markup); if (index_element != NULL) { zathura_rectangle_t rect = { 0, 0, 0, 0 }; zathura_link_target_t target = { ZATHURA_LINK_DESTINATION_XYZ, NULL, page_number, -1, -1, -1, -1, 0 }; index_element->link = zathura_link_new(ZATHURA_LINK_GOTO_DEST, rect, target); girara_node_append_data(root, index_element); } ++page_number; } GIRARA_LIST_FOREACH_END(cb_document->pages, cb_document_page_meta_t*, iter, page); return root; }
girara_tree_node_t* pdf_document_index_generate(zathura_document_t* document, void* data, zathura_error_t* error) { mupdf_document_t* mupdf_document = data; if (document == NULL || mupdf_document == NULL) { if (error != NULL) { *error = ZATHURA_ERROR_INVALID_ARGUMENTS; } return NULL; } /* get outline */ fz_outline* outline = fz_load_outline(mupdf_document->ctx, mupdf_document->document); if (outline == NULL) { if (error != NULL) { *error = ZATHURA_ERROR_UNKNOWN; } return NULL; } /* generate index */ girara_tree_node_t* root = girara_node_new(zathura_index_element_new("ROOT")); build_index(mupdf_document->ctx, mupdf_document->document, outline, root); /* free outline */ fz_drop_outline(mupdf_document->ctx, outline); return root; }
girara_tree_node_t* djvu_document_index_generate(zathura_document_t* document, djvu_document_t* djvu_document, zathura_error_t* error) { if (document == NULL || djvu_document == NULL) { if (error != NULL) { *error = ZATHURA_ERROR_INVALID_ARGUMENTS; } return NULL; } miniexp_t outline = miniexp_dummy; while ((outline = ddjvu_document_get_outline(djvu_document->document)) == miniexp_dummy) { handle_messages(djvu_document, true); } if (outline == miniexp_dummy) { return NULL; } if (miniexp_consp(outline) == 0 || miniexp_car(outline) != miniexp_symbol("bookmarks")) { ddjvu_miniexp_release(djvu_document->document, outline); return NULL; } girara_tree_node_t* root = girara_node_new(zathura_index_element_new("ROOT")); build_index(djvu_document, miniexp_cdr(outline), root); ddjvu_miniexp_release(djvu_document->document, outline); return root; }
static void build_index(fz_context* ctx, fz_document* document, fz_outline* outline, girara_tree_node_t* root) { if (outline == NULL || root == NULL) { return; } while (outline != NULL) { zathura_index_element_t* index_element = zathura_index_element_new(outline->title); zathura_link_target_t target = { ZATHURA_LINK_DESTINATION_UNKNOWN, NULL, 0, -1, -1, -1, -1, 0 }; zathura_link_type_t type = ZATHURA_LINK_INVALID; zathura_rectangle_t rect = { .x1 = 0, .y1 = 0, .x2 = 0, .y2 = 0 }; if (outline->uri == NULL) { type = ZATHURA_LINK_NONE; } else if (fz_is_external_link(ctx, outline->uri) == 1) { if (strstr(outline->uri, "file://") == outline->uri) { type = ZATHURA_LINK_GOTO_REMOTE; target.value = outline->uri; } else { type = ZATHURA_LINK_URI; target.value = outline->uri; } } else { float x = 0; float y = 0; type = ZATHURA_LINK_GOTO_DEST; target.destination_type = ZATHURA_LINK_DESTINATION_XYZ; target.page_number = fz_resolve_link(ctx, document, outline->uri, &x, &y); target.left = x; target.top = y; target.zoom = 0.0; } index_element->link = zathura_link_new(type, rect, target); if (index_element->link == NULL) { outline = outline->next; continue; } girara_tree_node_t* node = girara_node_append_data(root, index_element); if (outline->down != NULL) { build_index(ctx, document, outline->down, node); } outline = outline->next; } }
static void build_index(djvu_document_t *djvu_document, miniexp_t expression, girara_tree_node_t* root) { if (expression == miniexp_nil || root == NULL) { return; } int fileno = ddjvu_document_get_filenum(djvu_document->document); int curfile = 0; while (miniexp_consp(expression) != 0) { miniexp_t inner = miniexp_car(expression); if (miniexp_consp(inner) && miniexp_consp(miniexp_cdr(inner)) && miniexp_stringp(miniexp_car(inner)) && miniexp_stringp(miniexp_car(inner)) ) { const char* name = miniexp_to_str(miniexp_car(inner)); const char* link = miniexp_to_str(miniexp_cadr(inner)); /* TODO: handle other links? */ if (link == NULL || link[0] != '#') { expression = miniexp_cdr(expression); continue; } zathura_link_type_t type = ZATHURA_LINK_GOTO_DEST; zathura_rectangle_t rect; zathura_link_target_t target = { 0 }; target.destination_type = ZATHURA_LINK_DESTINATION_XYZ; /* Check if link+1 contains a number */ bool number = true; const size_t linklen = strlen(link); for (unsigned int k = 1; k < linklen; k++) { if (!isdigit(link[k])) { number = false; break; } } /* if link starts with a number assume it is a number */ if (number == true) { target.page_number = atoi(link + 1) - 1; } else { /* otherwise assume it is an id for a page */ ddjvu_fileinfo_t info; int f, i; for (i=0; i < fileno; i++) { f = (curfile + i) % fileno; ddjvu_document_get_fileinfo(djvu_document->document, f, &info); if (info.id != NULL && !strcmp(link+1, info.id)) { break; } } /* got a page */ if (i < fileno && info.pageno >= 0) { curfile = (f+1) % fileno; target.page_number = info.pageno; } else { /* give up */ expression = miniexp_cdr(expression); continue; } } zathura_index_element_t* index_element = zathura_index_element_new(name); if (index_element == NULL) { continue; } index_element->link = zathura_link_new(type, rect, target); if (index_element->link == NULL) { zathura_index_element_free(index_element); continue; } girara_tree_node_t* node = girara_node_append_data(root, index_element); /* search recursive */ build_index(djvu_document, miniexp_cddr(inner), node); } expression = miniexp_cdr(expression); } }