diff options
Diffstat (limited to 'source/l/ebook-tools/epub3_fixed_layout.patch')
-rw-r--r-- | source/l/ebook-tools/epub3_fixed_layout.patch | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/source/l/ebook-tools/epub3_fixed_layout.patch b/source/l/ebook-tools/epub3_fixed_layout.patch new file mode 100644 index 00000000..b06b6378 --- /dev/null +++ b/source/l/ebook-tools/epub3_fixed_layout.patch @@ -0,0 +1,160 @@ +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"); + } |