Index: src/libepub/opf.c =================================================================== --- src/libepub/opf.c (revision 147) +++ src/libepub/opf.c (revision 148) @@ -184,12 +184,16 @@ struct meta *new = malloc(sizeof(struct meta)); new->name = xmlTextReaderGetAttribute(reader, (xmlChar *)"name"); new->content = xmlTextReaderGetAttribute(reader, (xmlChar *)"content"); + new->property = xmlTextReaderGetAttribute(reader, (xmlChar *)"property"); + new->value = string; AddNode(meta->meta, NewListNode(meta->meta, new)); - if (string) - free(string); _epub_print_debug(opf->epub, DEBUG_INFO, "meta is %s: %s", new->name, new->content); + if (new->property) { + _epub_print_debug(opf->epub, DEBUG_INFO, "meta has property %s: %s", + new->property, new->value); + } } else if (xmlStrcasecmp(local, (xmlChar *)"date") == 0) { struct date *new = malloc(sizeof(struct date)); new->date = string; @@ -647,7 +651,7 @@ void _opf_parse_spine(struct opf *opf, xmlTextReaderPtr reader) { int ret; - xmlChar *linear; + xmlChar *linear, *properties; _epub_print_debug(opf->epub, DEBUG_INFO, "parsing spine"); @@ -707,7 +711,25 @@ if(linear) free(linear); - + + properties = xmlTextReaderGetAttribute(reader, (xmlChar *)"properties"); + if (properties) { + if (xmlStrcasecmp(properties, (xmlChar *)"rendition:page-spread-center") == 0) { + item->spreadPosition = PAGE_SPREAD_CENTER; + } else if (xmlStrcasecmp(properties, (xmlChar *)"page-spread-left") == 0) { + item->spreadPosition = PAGE_SPREAD_LEFT; + } else if (xmlStrcasecmp(properties, (xmlChar *)"page-spread-right") == 0) { + item->spreadPosition = PAGE_SPREAD_RIGHT; + } else { + item->spreadPosition = PAGE_SPREAD_UNKNOWN; + } + } else { + item->spreadPosition = PAGE_SPREAD_UNKNOWN; + } + + if(properties) + free(properties); + AddNode(opf->spine, NewListNode(opf->spine, item)); // decide what to do with non linear items @@ -884,7 +906,7 @@ DumpList(opf->metadata->creator, (ListDumpFunc)_list_dump_creator); printf("Identifier(s):\n "); DumpList(opf->metadata->id, (ListDumpFunc)_list_dump_id); - printf("Reading order:\n "); + printf("Reading order:\n"); DumpList(opf->spine, (ListDumpFunc)_list_dump_spine); printf("\n"); if (opf->guide) { Index: src/libepub/epub_shared.h =================================================================== --- src/libepub/epub_shared.h (revision 147) +++ src/libepub/epub_shared.h (revision 148) @@ -52,4 +52,14 @@ TITERATOR_PAGES /**< The pages of the ebook */ }; +/** + The page-spread-* properties +*/ +enum page_spread_position { + PAGE_SPREAD_CENTER, + PAGE_SPREAD_LEFT, + PAGE_SPREAD_RIGHT, + PAGE_SPREAD_UNKNOWN +}; + #endif Index: src/libepub/epublib.h =================================================================== --- src/libepub/epublib.h (revision 147) +++ src/libepub/epublib.h (revision 148) @@ -65,6 +65,8 @@ struct meta { xmlChar *name; xmlChar *content; + xmlChar *property; + xmlChar *value; }; struct id { @@ -170,6 +172,7 @@ struct spine { xmlChar *idref; int linear; //bool + enum page_spread_position spreadPosition; }; struct opf { Index: src/libepub/list.c =================================================================== --- src/libepub/list.c (revision 147) +++ src/libepub/list.c (revision 148) @@ -163,10 +163,24 @@ root->fullpath, root->mediatype); } void _list_dump_spine(struct spine *spine) { - printf("%s", spine->idref); + printf(" %s", spine->idref); if (spine->linear) printf("(L)"); - printf(" "); + switch (spine->spreadPosition) { + case PAGE_SPREAD_CENTER: + printf("(CENTER)"); + break; + case PAGE_SPREAD_LEFT: + printf("(LEFT)"); + break; + case PAGE_SPREAD_RIGHT: + printf("(RIGHT)"); + break; + default: + printf("(UNKNOWN)"); + break; + } + printf(" \n"); } void _list_dump_spine_linear(struct spine *spine) { @@ -200,6 +214,20 @@ printf("%s", meta->content); else printf("unspecified"); + + printf(" : "); + + if (meta->property) + printf("%s", meta->property); + else + printf("unspecified"); + + printf(" : "); + + if (meta->value) + printf("%s", meta->value); + else + printf("unspecified"); printf("\n"); }