package com.masterofcode.android.EPubBook.SAXHandlers;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import com.masterofcode.android.EPubBook.TOCInfo;
import com.masterofcode.android.EPubBook.TOCInfoNavMap;
import com.masterofcode.android.EPubBook.TOCInfoNavPoint;
import android.util.Log;
public class TOCHandler extends TagPathHandler {
private final String DOC_TITLE_TEXT = "/ncx/docTitle/text";
private final String NAVPOINT_LABEL = "/navPoint/navLabel/text";
private final String NAVPOINT_CONTENT = "/navPoint/content";
private final String NAVPOINT_TAG = "navPoint";
private final String NAVPOINT_CONTENT_ATTR_SRC = "src";
private final String NAVPOINT_ATTR_ID = "id";
private final String NAVPOINT_ATTR_PLAY_ORDER = "playOrder";
private TOCInfo tocInfo;
private TOCInfoNavPoint currentNavPoint = null;
private TOCInfoNavMap navMap = null;
public TOCHandler()
{
super();
tocInfo = new TOCInfo();
navMap = new TOCInfoNavMap();
}
@Override
public void processStartElement(String tagPath, String uri, String localName, String qName, Attributes attributes) throws SAXException
{
super.processStartElement(tagPath, uri, localName, qName, attributes);
if(localName.equalsIgnoreCase(NAVPOINT_TAG))
{
TOCInfoNavPoint newNavPoint = new TOCInfoNavPoint();
String id = attributes.getValue(NAVPOINT_ATTR_ID);
String playOrder = attributes.getValue(NAVPOINT_ATTR_PLAY_ORDER);
if(id!=null) newNavPoint.setId(id);
if(playOrder!=null) newNavPoint.setPlayOrder(Integer.parseInt(playOrder));
newNavPoint.setParent(currentNavPoint);
if(currentNavPoint==null)
{
navMap.addNavPoint(newNavPoint);
} else {
currentNavPoint.addChild(newNavPoint);
}
currentNavPoint = newNavPoint;
return;
}
int idx = tagPath.lastIndexOf(NAVPOINT_CONTENT);
if (idx!=-1)
{
String src = attributes.getValue(NAVPOINT_CONTENT_ATTR_SRC);
if(src!=null)
{
if(currentNavPoint!=null)
{
currentNavPoint.setContentSrc(src);
}
}
return;
}
}
@Override
public void processEndElementAfterStrippingTagPath(String tagPath, String uri, String localName, String qName) throws SAXException
{
super.processEndElementAfterStrippingTagPath(tagPath, uri, localName, qName);
if(localName.equalsIgnoreCase(NAVPOINT_TAG))
{
currentNavPoint = currentNavPoint.getParent();
}
}
@Override
public void processElementContent(String tagPath, String content) throws SAXException
{
super.processElementContent(tagPath, content);
if(tagPath.equalsIgnoreCase(DOC_TITLE_TEXT))
{
tocInfo.setDocTitle(content);
return;
}
int idx = tagPath.lastIndexOf(NAVPOINT_LABEL);
if (idx!=-1)
{
currentNavPoint.setNavLabel(content);
}
}
public TOCInfo getTocInfo()
{
return tocInfo;
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
/*
Log.i("TOC---", "navPoint in navMap="+navMap.getNavPoints().size());
for(int i=0; i<navMap.getNavPoints().size(); i++)
{
Log.i("TOC---", "root navPoint["+i+"]");
inspectNavPoint(" ", navMap.getNavPoints().get(i));
}*/
}
public void inspectNavPoint(String padding, TOCInfoNavPoint navPoint)
{
Log.i("TOC---", padding + "id=" + navPoint.getId());
Log.i("TOC---", padding + "playOrder=" + navPoint.getPlayOrder());
Log.i("TOC---", padding + "label=" + navPoint.getNavLabel());
Log.i("TOC---", padding + "src=" + navPoint.getContentSrc());
if(navPoint.getChilds().size()>0)
{
Log.i("TOC---", padding + "childs:");
for(int i=0; i<navPoint.getChilds().size(); i++)
{
Log.i("TOC---", padding + padding + "child["+i+"]:");
inspectNavPoint(padding + padding + padding, navPoint.getChilds().get(i));
}
}
}
}