package com.masterofcode.android.EPubBook.SAXHandlers; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import com.masterofcode.android.EPubBook.OPFInfo; public class OPFHandler extends TagPathHandler { static final String PACKAGE = "package"; static final String METADATA = "/" + PACKAGE + "/metadata"; static final String MANIFEST = "/" + PACKAGE + "/manifest"; static final String SPINE = "/" + PACKAGE + "/spine"; static final String GUIDE = "/" + PACKAGE + "/guide"; static final String METADATA_TITLE = METADATA + "/title"; static final String METADATA_LANGUAGE = METADATA + "/language"; static final String METADATA_IDENTIFIER = METADATA + "/identifier"; static final String METADATA_DATE = METADATA + "/date"; static final String METADATA_PUBLISHER = METADATA + "/publisher"; static final String METADATA_META = METADATA + "/meta"; static final String METADATA_META_ATTR_CONTENT = "content"; static final String METADATA_META_ATTR_NAME = "name"; static final String MANIFEST_ITEM = MANIFEST + "/item"; static final String MANIFEST_ITEM_ATTR_ID = "id"; static final String MANIFEST_ITEM_ATTR_HREF = "href"; static final String MANIFEST_ITEM_ATTR_MEDIATYPE = "media-type"; static final String SPINE_TAG_ATTR_TOC = "toc"; static final String SPINE_ITEM = SPINE + "/itemref"; static final String SPINE_ITEM_ATTR_IDREF = "idref"; static final String SPINE_ITEM_ATTR_LANDSCAPE_SHOT = "landscape_shot"; static final String SPINE_ITEM_ATTR_PORTRAIT_SHOT = "portrait_shot"; static final String SPINE_ITEM_ATTR_COVERPAGE = "coverpage"; static final String SPINE_ITEM_ATTR_FULLSCREEN = "fullscreen"; static final String GUIDE_ITEM = GUIDE + "/reference"; static final String GUIDE_ITEM_ATTR_TYPE = "type"; static final String GUIDE_ITEM_ATTR_TITLE = "title"; static final String GUIDE_ITEM_ATTR_HREF = "href"; OPFInfo opfInfo; boolean isStrictCheck = false; public OPFHandler(boolean strictCheck) { opfInfo = new OPFInfo(); isStrictCheck = strictCheck; } @Override public void processStartElement(String tagPath, String uri, String localName, String qName, Attributes attributes) throws SAXException { super.processStartElement(tagPath, uri, localName, qName, attributes); if(tagPath.equalsIgnoreCase(METADATA_META)) { String name = attributes.getValue(METADATA_META_ATTR_NAME); String content = attributes.getValue(METADATA_META_ATTR_CONTENT); if(name != null && content != null) opfInfo.getMetadata().addAdditionalMetadata(name, content); return; } if(tagPath.equalsIgnoreCase(MANIFEST_ITEM)) { String id = attributes.getValue(MANIFEST_ITEM_ATTR_ID); String href = attributes.getValue(MANIFEST_ITEM_ATTR_HREF); String mediaType = attributes.getValue(MANIFEST_ITEM_ATTR_MEDIATYPE); if(id != null && href != null && mediaType != null) opfInfo.getManifest().addItem(id, href, mediaType); return; } if(tagPath.equalsIgnoreCase(SPINE)) { if (opfInfo.getSpine().getTocId()==null) { String toc = attributes.getValue(SPINE_TAG_ATTR_TOC); if(toc != null) opfInfo.getSpine().setTocId(toc); return; } else { if(isStrictCheck) throw new SAXException("EPub OPF has more than one 'spine' section"); } } if(tagPath.equalsIgnoreCase(SPINE_ITEM)) { String idRef = attributes.getValue(SPINE_ITEM_ATTR_IDREF); String lanscapeShot = attributes.getValue(SPINE_ITEM_ATTR_LANDSCAPE_SHOT); String portraitShot = attributes.getValue(SPINE_ITEM_ATTR_PORTRAIT_SHOT); String coverpage = attributes.getValue(SPINE_ITEM_ATTR_COVERPAGE); String fullscreen = attributes.getValue(SPINE_ITEM_ATTR_FULLSCREEN); boolean isCoverpage = false, isFullscreen = false; if(coverpage != null) { if(coverpage.equalsIgnoreCase("true")) isCoverpage = true; } if(fullscreen != null) { if(fullscreen.equalsIgnoreCase("true")) isFullscreen = true; } if(idRef != null) opfInfo.getSpine().addItem(idRef, lanscapeShot, portraitShot, isFullscreen, isCoverpage); return; } if(tagPath.equalsIgnoreCase(GUIDE_ITEM)) { String type = attributes.getValue(GUIDE_ITEM_ATTR_TYPE); String title = attributes.getValue(GUIDE_ITEM_ATTR_TITLE); String href = attributes.getValue(GUIDE_ITEM_ATTR_HREF); if(type != null && title != null && href != null) opfInfo.getGuide().addItem(type, title, href); return; } } @Override public void processElementContent(String tagPath, String content) throws SAXException { super.processElementContent(tagPath, content); if(tagPath.equalsIgnoreCase(METADATA_TITLE)) { // take first title if(opfInfo.getMetadata().getTitle()==null)opfInfo.getMetadata().setTitle(content); return; } if(tagPath.equalsIgnoreCase(METADATA_LANGUAGE)) { opfInfo.getMetadata().setLanguage(content); return; } if(tagPath.equalsIgnoreCase(METADATA_IDENTIFIER)) { opfInfo.getMetadata().setIdentifier(content); return; } if(tagPath.equalsIgnoreCase(METADATA_PUBLISHER)) { opfInfo.getMetadata().setPublisher(content); return; } if(tagPath.equalsIgnoreCase(METADATA_DATE)) { opfInfo.getMetadata().setDate(content); return; } } @Override public void endDocument() throws SAXException { super.endDocument(); opfInfo.getSpine().checkReferencedMediaTypes(opfInfo.getManifest()); opfInfo.getSpine().checkToc(opfInfo.getManifest()); } public OPFInfo getOpfInfo() { return opfInfo; } }