From ab056e2e157f4d02fbacb18ca5eba97a558ff003 Mon Sep 17 00:00:00 2001 From: German Caro Date: Sat, 10 Mar 2012 21:43:55 -0300 Subject: [PATCH] Add support to djvu TOC --- djvu.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git a/djvu.c b/djvu.c index 1d9daa231..8f61f107f 100644 --- a/djvu.c +++ b/djvu.c @@ -15,6 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ +#include #include #include "string.h" @@ -119,15 +120,67 @@ static int getNumberOfPages(lua_State *L) { return 1; } -/* not supported yet, so return empty table */ +static int walkTableOfContent(lua_State *L, miniexp_t r, int *count, int depth) { + depth++; + + miniexp_t lista = miniexp_cdr(r); // go inside bookmars in the list + + int length = miniexp_length(r); + int counter = 0; + char page_number[6]; + + while(counter < length-1) { + lua_pushnumber(L, *count); + lua_newtable(L); + lua_pushstring(L, "page"); + + strcpy(page_number,miniexp_to_str(miniexp_car(miniexp_cdr(miniexp_nth(counter, lista))))); + + page_number[0]= '0'; //page numbers appear as #11, set # to 0 so strtol works + +// printf("string: %i:\n", strtol(page_number,NULL, 10)); + + lua_pushnumber(L, strtol(page_number,NULL, 10)); + lua_settable(L, -3); + + lua_pushstring(L, "depth"); + lua_pushnumber(L, depth); + lua_settable(L, -3); + lua_pushstring(L, "title"); + + lua_pushstring(L, miniexp_to_str(miniexp_car(miniexp_nth(counter, lista)))); + + lua_settable(L, -3); + + lua_settable(L, -3); + + + (*count)++; + + if (miniexp_length(miniexp_cdr(miniexp_nth(counter, lista))) > 1) { + walkTableOfContent(L, miniexp_cdr(miniexp_nth(counter,lista)), count, depth); + } + counter++; + + } + return 0; +} + + static int getTableOfContent(lua_State *L) { - /*int count = 1;*/ + int count = 1; DjvuDocument *doc = (DjvuDocument*) luaL_checkudata(L, 1, "djvudocument"); /*ol = djvu_load_outline(doc->doc_ref);*/ + miniexp_t r; + while ((r=ddjvu_document_get_outline(doc->doc_ref))==miniexp_dummy) + handle(L, doc->context, True); + + //printf("lista: %s\n", miniexp_to_str(miniexp_car(miniexp_nth(1, miniexp_cdr(r))))); lua_newtable(L); - /*walkTableOfContent(L, ol, &count, 0);*/ + walkTableOfContent(L, r, &count, 0); + return 1; }