-
Notifications
You must be signed in to change notification settings - Fork 188
/
Copy pathPackageParser.js
120 lines (107 loc) · 5.64 KB
/
PackageParser.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
define(['jquery', 'jxpath'], function($, JXPath){
var resolver = function( prefix ) {
var mappings = {
def: "http://www.idpf.org/2007/opf",
dc: "http://purl.org/dc/elements/1.1/"
};
return mappings[ prefix ];
};
PackageParser = {
parsePackageDom : function(data){
var jsonObj = {
metadata: {
id: $.xpath(data, "//def:metadata/dc:identifier", resolver).text(),
epub_version: $.xpath(data, "//def:package/@version", resolver).val(),
title: $.xpath(data, "//def:metadata/dc:title", resolver).text(),
author: $.xpath(data, "//def:metadata/dc:creator", resolver).text(),
publisher: $.xpath(data, "//def:metadata/dc:publisher", resolver).text(),
description: $.xpath(data, "//def:metadata/dc:description", resolver).text(),
rights: $.xpath(data, "//def:metadata/dc:rights", resolver).text(),
language: $.xpath(data, "//def:metadata/dc:language", resolver).text(),
pubdate: $.xpath(data, "//def:metadata/dc:date", resolver).text(),
modified_date: $.xpath(data, "//def:metadata/def:meta[@property='dcterms:modified']", resolver).text(),
layout: $.xpath(data, "//def:metadata/def:meta[@property='rendition:layout']", resolver).text(),
spread: $.xpath(data, "//def:metadata/def:meta[@property='rendition:spread']", resolver).text(),
orientation: $.xpath(data, "//def:metadata/def:meta[@property='rendition:orientation']", resolver).text(),
ncx: $.xpath(data, "//def:spine/@toc", resolver).val(),
page_prog_dir: $.xpath(data, "//def:spine/@page-progression-direction", resolver).val(),
active_class: $.xpath(data, "//def:metadata/def:meta[@property='media:active-class']", resolver).text()
}
/* UNUSED
manifest:
(function() {
var array = [];
$.xpath(data, "//def:item", resolver).each(function(item) {
array.push({
id: $.xpath(item, "@id", resolver).val(),
href: $.xpath(item, "@href", resolver).val(),
media_type: $.xpath(item, "@media-type", resolver).val(),
properties: $.xpath(item, "@properties", resolver).val(),
media_overlay: $.xpath(item, "@media-overlay", resolver).val()
});
});
return array;
})(),
spine:
(function() {
var array = [];
$.xpath(data, "//def:itemref", resolver).each(function(item) {
array.push({
idref: $.xpath(item, "@idref", resolver).val(),
properties: $.xpath(item, "@properties", resolver).val(),
linear: $.xpath(item, "@linear", resolver).val()
});
});
return array;
})(),
bindings:
(function() {
var array = [];
$.xpath(data, "//def:bindings/def:mediaType", resolver).each(function(item) {
array.push({
handler: $.xpath(item, "@handler", resolver).val(),
media_type: $.xpath(item, "@media-type", resolver).val()
});
});
return array;
})()
*/
};
jsonObj = jsonObj.metadata;
//console.debug(JSON.stringify(jsonObj));
jsonObj.coverHref = PackageParser.getCoverHref(data);
return jsonObj;
},
getCoverHref : function(dom) {
var manifest; var $imageNode;
manifest = dom.getElementsByTagName('manifest')[0];
// epub3 spec for a cover image is like this:
/*<item properties="cover-image" id="ci" href="cover.svg" media-type="image/svg+xml" />*/
$imageNode = $('item[properties~="cover-image"]', manifest);
if($imageNode.length === 1 && $imageNode.attr("href") ) {
return $imageNode.attr("href");
}
// some epub2's cover image is like this:
/*<meta name="cover" content="cover-image-item-id" />*/
// PragProg ebooks have two cover entries in meta, both
// referencing the same cover id from items; metaNode.length
// does not have to be just 1
var metaNode = $('meta[name="cover"]', dom);
var contentAttr = metaNode.attr("content");
if(metaNode.length >= 1 && contentAttr) {
$imageNode = $('item[id="'+contentAttr+'"]', manifest);
if($imageNode.length === 1 && $imageNode.attr("href")) {
return $imageNode.attr("href");
}
}
// that didn't seem to work so, it think epub2 just uses item with id=cover
$imageNode = $('#cover', manifest);
if($imageNode.length === 1 && $imageNode.attr("href")) {
return $imageNode.attr("href");
}
// seems like there isn't one, thats ok...
return null;
},
}
return PackageParser;
})