diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2015-09-29 14:43:22 +0200 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2015-10-02 14:03:46 +0100 |
commit | 6354c1a1f08d838d30019ba401367cebdc1a0f54 (patch) | |
tree | 0dea29e6a411017a72fb0315697043d9daf56e4e /source | |
parent | 841398e7693a511df66dd0f1b33d9604371d53e0 (diff) | |
download | mupdf-6354c1a1f08d838d30019ba401367cebdc1a0f54.tar.xz |
epub: Parse enough metadata to find title and author.
Diffstat (limited to 'source')
-rw-r--r-- | source/html/epub-doc.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/source/html/epub-doc.c b/source/html/epub-doc.c index 4610c64a..ed2729da 100644 --- a/source/html/epub-doc.c +++ b/source/html/epub-doc.c @@ -13,6 +13,7 @@ struct epub_document_s fz_html_font_set *set; int count; epub_chapter *spine; + char *dc_title, *dc_creator; }; struct epub_chapter_s @@ -146,6 +147,8 @@ epub_close_document(fz_context *ctx, fz_document *doc_) } fz_drop_archive(ctx, doc->zip); fz_drop_html_font_set(ctx, doc->set); + fz_free(ctx, doc->dc_title); + fz_free(ctx, doc->dc_creator); fz_free(ctx, doc); } @@ -203,6 +206,15 @@ epub_parse_chapter(fz_context *ctx, epub_document *doc, const char *path) return ch; } +static char * +find_metadata(fz_context *ctx, fz_xml *metadata, char *key) +{ + char *text = fz_xml_text(fz_xml_down(fz_xml_find_down(metadata, key))); + if (text) + return fz_strdup(ctx, text); + return NULL; +} + static void epub_parse_header(fz_context *ctx, epub_document *doc) { @@ -210,7 +222,7 @@ epub_parse_header(fz_context *ctx, epub_document *doc) fz_buffer *buf; fz_xml *container_xml, *content_opf; fz_xml *container, *rootfiles, *rootfile; - fz_xml *package, *manifest, *spine, *itemref; + fz_xml *package, *manifest, *spine, *itemref, *metadata; char base_uri[2048]; const char *full_path; const char *version; @@ -252,6 +264,13 @@ epub_parse_header(fz_context *ctx, epub_document *doc) if (!version || strcmp(version, "2.0")) fz_warn(ctx, "unknown epub version: %s", version ? version : "<none>"); + metadata = fz_xml_find_down(package, "metadata"); + if (metadata) + { + doc->dc_title = find_metadata(ctx, metadata, "title"); + doc->dc_creator = find_metadata(ctx, metadata, "creator"); + } + manifest = fz_xml_find_down(package, "manifest"); spine = fz_xml_find_down(package, "spine"); @@ -287,8 +306,13 @@ epub_parse_header(fz_context *ctx, epub_document *doc) int epub_lookup_metadata(fz_context *ctx, fz_document *doc_, const char *key, char *buf, int size) { - if (!strcmp(key, "format")) + epub_document *doc = (epub_document*)doc_; + if (!strcmp(key, FZ_META_FORMAT)) return fz_strlcpy(buf, "EPUB", size); + if (!strcmp(key, FZ_META_INFO_TITLE) && doc->dc_title) + return fz_strlcpy(buf, doc->dc_title, size); + if (!strcmp(key, FZ_META_INFO_AUTHOR) && doc->dc_creator) + return fz_strlcpy(buf, doc->dc_creator, size); return -1; } |