summaryrefslogblamecommitdiffstats
path: root/source/l/ebook-tools/epub3_fixed_layout.patch
blob: b06b6378a7befe12f8567b5c1c60415a86727be9 (plain) (tree)































































































































































                                                                                       
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");
 }