|
|
|
@ -36,13 +36,12 @@ import me.ag2s.epublib.util.StringUtil; |
|
|
|
|
* Reads the opf package document as defined by namespace http://www.idpf.org/2007/opf
|
|
|
|
|
* |
|
|
|
|
* @author paul |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
public class PackageDocumentReader extends PackageDocumentBase { |
|
|
|
|
|
|
|
|
|
private static final String TAG= PackageDocumentReader.class.getName(); |
|
|
|
|
private static final String TAG = PackageDocumentReader.class.getName(); |
|
|
|
|
private static final String[] POSSIBLE_NCX_ITEM_IDS = new String[]{"toc", |
|
|
|
|
"ncx", "ncxtoc","htmltoc"}; |
|
|
|
|
"ncx", "ncxtoc", "htmltoc"}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static void read( |
|
|
|
@ -56,7 +55,7 @@ public class PackageDocumentReader extends PackageDocumentBase { |
|
|
|
|
|
|
|
|
|
// Books sometimes use non-identifier ids. We map these here to legal ones
|
|
|
|
|
Map<String, String> idMapping = new HashMap<>(); |
|
|
|
|
String version=DOMUtil.getAttribute(packageDocument.getDocumentElement(),PREFIX_OPF,PackageDocumentBase.version); |
|
|
|
|
String version = DOMUtil.getAttribute(packageDocument.getDocumentElement(), PREFIX_OPF, PackageDocumentBase.version); |
|
|
|
|
|
|
|
|
|
resources = readManifest(packageDocument, packageHref, epubReader, |
|
|
|
|
resources, idMapping); |
|
|
|
@ -119,18 +118,18 @@ public class PackageDocumentReader extends PackageDocumentBase { |
|
|
|
|
try { |
|
|
|
|
href = URLDecoder.decode(href, Constants.CHARACTER_ENCODING); |
|
|
|
|
} catch (UnsupportedEncodingException e) { |
|
|
|
|
Log.e(TAG,e.getMessage()); |
|
|
|
|
Log.e(TAG, e.getMessage()); |
|
|
|
|
} |
|
|
|
|
String mediaTypeName = DOMUtil |
|
|
|
|
.getAttribute(itemElement, NAMESPACE_OPF, OPFAttributes.media_type); |
|
|
|
|
Resource resource = resources.remove(href); |
|
|
|
|
if (resource == null) { |
|
|
|
|
Log.e(TAG,"resource with href '" + href + "' not found"); |
|
|
|
|
Log.e(TAG, "resource with href '" + href + "' not found"); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
resource.setId(id); |
|
|
|
|
//for epub3
|
|
|
|
|
String properties=DOMUtil.getAttribute(itemElement,NAMESPACE_OPF,OPFAttributes.properties); |
|
|
|
|
String properties = DOMUtil.getAttribute(itemElement, NAMESPACE_OPF, OPFAttributes.properties); |
|
|
|
|
resource.setProperties(properties); |
|
|
|
|
|
|
|
|
|
MediaType mediaType = MediaTypes.getMediaTypeByName(mediaTypeName); |
|
|
|
@ -175,14 +174,14 @@ public class PackageDocumentReader extends PackageDocumentBase { |
|
|
|
|
Resource resource = resources.getByHref(StringUtil |
|
|
|
|
.substringBefore(resourceHref, Constants.FRAGMENT_SEPARATOR_CHAR)); |
|
|
|
|
if (resource == null) { |
|
|
|
|
Log.e(TAG,"Guide is referencing resource with href " + resourceHref |
|
|
|
|
Log.e(TAG, "Guide is referencing resource with href " + resourceHref |
|
|
|
|
+ " which could not be found"); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
String type = DOMUtil |
|
|
|
|
.getAttribute(referenceElement, NAMESPACE_OPF, OPFAttributes.type); |
|
|
|
|
if (StringUtil.isBlank(type)) { |
|
|
|
|
Log.e(TAG,"Guide is referencing resource with href " + resourceHref |
|
|
|
|
Log.e(TAG, "Guide is referencing resource with href " + resourceHref |
|
|
|
|
+ " which is missing the 'type' attribute"); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
@ -201,7 +200,7 @@ public class PackageDocumentReader extends PackageDocumentBase { |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Strips off the package prefixes up to the href of the packageHref. |
|
|
|
|
* |
|
|
|
|
* <p> |
|
|
|
|
* Example: |
|
|
|
|
* If the packageHref is "OEBPS/content.opf" then a resource href like "OEBPS/foo/bar.html" will be turned into "foo/bar.html" |
|
|
|
|
* |
|
|
|
@ -241,31 +240,32 @@ public class PackageDocumentReader extends PackageDocumentBase { |
|
|
|
|
.getFirstElementByTagNameNS(packageDocument.getDocumentElement(), |
|
|
|
|
NAMESPACE_OPF, OPFTags.spine); |
|
|
|
|
if (spineElement == null) { |
|
|
|
|
Log.e(TAG,"Element " + OPFTags.spine |
|
|
|
|
Log.e(TAG, "Element " + OPFTags.spine |
|
|
|
|
+ " not found in package document, generating one automatically"); |
|
|
|
|
return generateSpineFromResources(resources); |
|
|
|
|
} |
|
|
|
|
Spine result = new Spine(); |
|
|
|
|
String tocResourceId = DOMUtil |
|
|
|
|
.getAttribute(spineElement, NAMESPACE_OPF, OPFAttributes.toc); |
|
|
|
|
result |
|
|
|
|
.setTocResource(findTableOfContentsResource(tocResourceId, resources)); |
|
|
|
|
NodeList spineNodes = packageDocument |
|
|
|
|
.getElementsByTagNameNS(NAMESPACE_OPF, OPFTags.itemref); |
|
|
|
|
List<SpineReference> spineReferences = new ArrayList<>( |
|
|
|
|
spineNodes.getLength()); |
|
|
|
|
String tocResourceId = DOMUtil.getAttribute(spineElement, NAMESPACE_OPF, OPFAttributes.toc); |
|
|
|
|
Log.v(TAG,tocResourceId); |
|
|
|
|
result.setTocResource(findTableOfContentsResource(tocResourceId, resources)); |
|
|
|
|
NodeList spineNodes = DOMUtil.getElementsByTagNameNS(packageDocument, NAMESPACE_OPF, OPFTags.itemref); |
|
|
|
|
if(spineNodes==null){ |
|
|
|
|
Log.e(TAG,"spineNodes is null"); |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
List<SpineReference> spineReferences = new ArrayList<>(spineNodes.getLength()); |
|
|
|
|
for (int i = 0; i < spineNodes.getLength(); i++) { |
|
|
|
|
Element spineItem = (Element) spineNodes.item(i); |
|
|
|
|
String itemref = DOMUtil |
|
|
|
|
.getAttribute(spineItem, NAMESPACE_OPF, OPFAttributes.idref); |
|
|
|
|
String itemref = DOMUtil.getAttribute(spineItem, NAMESPACE_OPF, OPFAttributes.idref); |
|
|
|
|
if (StringUtil.isBlank(itemref)) { |
|
|
|
|
Log.e(TAG,"itemref with missing or empty idref"); // XXX
|
|
|
|
|
Log.e(TAG, "itemref with missing or empty idref"); // XXX
|
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
String id = idMapping.get(itemref); |
|
|
|
|
if (id == null) { |
|
|
|
|
id = itemref; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Resource resource = resources.getByIdOrHref(id); |
|
|
|
|
if (resource == null) { |
|
|
|
|
Log.e(TAG, "resource with id '" + id + "' not found"); |
|
|
|
@ -308,7 +308,7 @@ public class PackageDocumentReader extends PackageDocumentBase { |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* The spine tag should contain a 'toc' attribute with as value the resource id of the table of contents resource. |
|
|
|
|
* |
|
|
|
|
* <p> |
|
|
|
|
* Here we try several ways of finding this table of contents resource. |
|
|
|
|
* We try the given attribute value, some often-used ones and finally look through all resources for the first resource with the table of contents mimetype. |
|
|
|
|
* |
|
|
|
@ -318,7 +318,13 @@ public class PackageDocumentReader extends PackageDocumentBase { |
|
|
|
|
*/ |
|
|
|
|
static Resource findTableOfContentsResource(String tocResourceId, |
|
|
|
|
Resources resources) { |
|
|
|
|
Resource tocResource = null; |
|
|
|
|
Resource tocResource; |
|
|
|
|
//一些epub3的文件为了兼容epub2,保留的epub2的目录文件,这里优先选择epub3的xml目录
|
|
|
|
|
tocResource = resources.getByProperties("nav"); |
|
|
|
|
if (tocResource != null) { |
|
|
|
|
return tocResource; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (StringUtil.isNotBlank(tocResourceId)) { |
|
|
|
|
tocResource = resources.getByIdOrHref(tocResourceId); |
|
|
|
|
} |
|
|
|
@ -343,10 +349,7 @@ public class PackageDocumentReader extends PackageDocumentBase { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
//For EPUB3
|
|
|
|
|
if (tocResource==null){ |
|
|
|
|
tocResource=resources.getByProperties("nav"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (tocResource == null) { |
|
|
|
|
Log.e(TAG, |
|
|
|
|