package nliveroid.nlr.main.parser;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import nliveroid.nlr.main.LiveArchivesDialog.LiveArchiveTask;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import android.util.Log;
public class LiveArchiveParser implements ContentHandler {
private LiveArchiveTask task;
private StringBuilder innerText = new StringBuilder(1024);
private ArrayList<String[]> result = new ArrayList<String[]>();
private String[] element = new String[6];//日付、放送者名、LV、タイトル、TS有無、詳細
private String startTag;
private Attributes nowAttr;
private int tdCount;
private final Pattern lvpt = Pattern.compile("lv[0-9]+");
private boolean parseTarget;
public LiveArchiveParser(LiveArchiveTask task){
this.task = task;
}
private String getInnerText(char[] arg0,int arg2){
innerText = innerText.delete(0,arg0.length);
innerText.append(arg0, 0, arg2);
return innerText.toString();
}
@Override
public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
if(!parseTarget)return;
if(startTag.equals("td") && nowAttr != null && nowAttr.getValue("class") != null && nowAttr.getValue("class").equals("date")){
tdCount = 1;
String inner = getInnerText(arg0,arg2);//ここで2013/03/03<br>開演:08:43<br>とかなってる
// Log.d("DATE INNER --- " , " " + inner);
if(inner == null)return;
element[0] = inner.replaceAll("\t|\n", "") + "\n";
}else if(tdCount == 1&&startTag.equals("br")){
tdCount++;
// Log.d("DATE INNER --- " , " 1 " + startTag);
String inner = getInnerText(arg0,arg2);
if(inner == null)return;
element[0] += inner.replaceAll("\t|\n", "");
}else if(tdCount == 2 && startTag.equals("div")){
// Log.d("DATE INNER --- " , " 2 " + startTag);
tdCount++;
String inner = getInnerText(arg0,arg2);
if(inner == null)return;
element[1] = inner.replaceAll("\t|\n", "");
}else if(tdCount == 3 && nowAttr != null && nowAttr.getValue("href") != null){
// Log.d("DATE INNER --- " , " 3 " + startTag);
tdCount ++;
Matcher mc = lvpt.matcher(nowAttr.getValue("href"));
if(mc.find()){
element[2] = mc.group();
}
String inner = getInnerText(arg0,arg2);
if(inner == null)return;
element[3] = inner.replaceAll("\t|\n", "");
}else if(tdCount == 4 ){
// Log.d("DATE INNER --- " , " 4" + startTag);
if(startTag.equals("img")){//imgタグがあった時点でTS視聴可能と判断する
element[4] = "1";
}else if(startTag.equals("div") && nowAttr != null && nowAttr.getValue("class") != null
&&nowAttr.getValue("class").equals("txt")){
tdCount = 0;
String inner = getInnerText(arg0,arg2);
if(inner == null)return;
element[5] = inner.replaceAll("\t", "");
result.add(element.clone());
element = new String[6];
}
}
}
@Override
public void startElement(String arg0, String arg1, String arg2,
Attributes arg3) throws SAXException {
startTag = arg1;
nowAttr = arg3;
if(arg1.equals("table") && nowAttr.getValue("class") != null && nowAttr.getValue("class").equals("live_history")){
parseTarget = true;//念のためメインのテーブルのみパース
}
}
@Override
public void endElement(String arg0, String arg1, String arg2)throws SAXException {
// Log.d("ARCHIVE", " " + arg0 + " " +arg1);
if(arg1.equals("table")||arg1.equals("body")){
parseTarget = false;
task.finishCallBack(result);
}
}
@Override
public void endDocument() throws SAXException {}
@Override
public void endPrefixMapping(String arg0) throws SAXException {}
@Override
public void ignorableWhitespace(char[] arg0, int arg1, int arg2)throws SAXException {}
@Override
public void processingInstruction(String arg0, String arg1)throws SAXException {}
@Override
public void setDocumentLocator(Locator arg0) {}
@Override
public void skippedEntity(String arg0) throws SAXException {}
@Override
public void startDocument() throws SAXException {}
@Override
public void startPrefixMapping(String arg0, String arg1)throws SAXException {}
}