package nliveroid.nlr.main.parser; import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; import nliveroid.nlr.main.FinishCallBacks; import nliveroid.nlr.main.LiveInfo; 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 AllCommunityParser implements ContentHandler { private String startTag; private Attributes nowAttr; private StringBuilder innerText = new StringBuilder(1024); private ArrayList<LiveInfo> liveInfos = new ArrayList<LiveInfo>(); private LiveInfo tempInfo = new LiveInfo(); private String infoMaster = ""; private String communityAmount = "";//Interfaceの関係上String型、今表示しているX ~ XはPagerViewの今表示しているページと総数を使うので結局は総数のみでよい private boolean amountTarget = false;// private int strongTarget = 0; private FinishCallBacks task; private Pattern copt = Pattern.compile("co[0-9]+"); private Pattern figurespt = Pattern.compile("[0-9]++"); public AllCommunityParser(FinishCallBacks communityTask){ this.task = communityTask; } 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 { // Log.d("NLiveRoid","char " + getInnerText(arg0,arg2)); if(startTag.equals("p")&&nowAttr != null &&nowAttr.getValue("class") != null ){ if(nowAttr.getValue("class").equals("fs10")){ strongTarget = 1; }else if(strongTarget == 4 && nowAttr.getValue("class").equals("date")){//最終更新日時 infoMaster += getInnerText(arg0,arg2).replaceAll("\t|\n", "") + "<<SPLIT>>"; strongTarget++; Log.d("NLiveRoid","STRONG " +strongTarget + " " + infoMaster); }else if(strongTarget == 6 && nowAttr.getValue("class").equals("desc")){ String coDesc = getInnerText(arg0,arg2); if(coDesc != null && !coDesc.equals("")){ //ほとんどないけどもしコミュの詳細に<<SPLIT>>があったら、えげつないことになるので適当に変えておく if(coDesc.contains("<<SPLIT>>")){ coDesc.replaceAll("<<SPLIT>>", "_split_"); } infoMaster += coDesc.replaceAll("\t|\n", "") + "<<SPLIT>>";//コミュの説明 strongTarget++; // Log.d("NLiveRoid","STRONG " +strongTarget + " " + infoMaster); } } }else if(startTag.equals("strong")){ if(amountTarget){ Log.d("NLiveRoid","getInnerText " + getInnerText(arg0,arg2)); Matcher nummc = figurespt.matcher(getInnerText(arg0,arg2).replaceAll("\t|\n", "")); if(nummc.find()){ communityAmount = nummc.group(); // Log.d("NLiveRoid","STRONG AMOUNT FINDED " +amountTarget + " " + communityAmount); } amountTarget = false; Log.d("NLiveRoid","STRONG AMOUNT END" +amountTarget + " " + communityAmount); }else if(strongTarget >= 1 && strongTarget <= 4){//レベル、メンバー、投稿動画の順で入る infoMaster += getInnerText(arg0,arg2).replaceAll("\t|\n", "") + "<<SPLIT>>"; strongTarget++; // Log.d("NLiveRoid","STRONG " +strongTarget + " " + infoMaster); } }else if(strongTarget == 5 && startTag.equals("a") && nowAttr != null && nowAttr.getValue("href") != null && !nowAttr.getValue("href").equals("")){ Matcher comc = copt.matcher(nowAttr.getValue("href")); if(comc.find()){ tempInfo.setCommunityID(comc.group());//コミュニティID } String coName = getInnerText(arg0,arg2); if(coName != null && !coName.equals("")){ tempInfo.setComunityName(coName.replaceAll("\t|\n", ""));//コミュニティ名 } strongTarget++; Log.d("NLiveRoid","STRONG " +strongTarget + " " + infoMaster); }else if(!amountTarget && startTag.equals("div") && nowAttr != null && nowAttr.getValue("class") != null && nowAttr.getValue("class").equals("pagelink")){ // Log.d("PAGERLINK ", " -------- " + amountTarget); amountTarget = true; } } @Override public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException { startTag=arg1; nowAttr = arg3; Log.d("NLiveRoid","startTag " + startTag); if(strongTarget == 7){ if(startTag.equals("img") && nowAttr != null && nowAttr.getValue("src") != null){ // Log.d("ATTR---- " , " " + nowAttr.getValue("src")); if(nowAttr.getValue("src").matches(".*icn_mstatLiveOn.*")){ infoMaster += "1<<SPLIT>>"; }else{ infoMaster += "0<<SPLIT>>"; } strongTarget++; Log.d("NLiveRoid","STRONG " +strongTarget + " " + infoMaster); } }else if(strongTarget == 8){ if(startTag.equals("img") && nowAttr != null && nowAttr.getValue("src") != null){ // Log.d("ATTR---XXX- " , " " + nowAttr.getValue("src")); if(nowAttr.getValue("src").matches(".*icn_mstatBackstageON.*")){ infoMaster += "1";//最後はSPLIT付けない }else{ infoMaster += "0"; } Log.d("NLiveRoid","ADDED tmpInfo " +strongTarget + " " + infoMaster); tempInfo.setCommunity_info(infoMaster); infoMaster = ""; strongTarget = 0;//1コミュできたら戻す liveInfos.add(tempInfo.clone()); tempInfo = new LiveInfo(); } } } @Override public void endDocument() throws SAXException {} @Override public void endElement(String arg0, String arg1, String arg2)throws SAXException { if(arg1.equals("body")){ task.finishCallBack(liveInfos,communityAmount); } } @Override public void endPrefixMapping(String arg0) throws SAXException {} @Override public void ignorableWhitespace(char[] arg0, int arg1, int arg2) throws SAXException { // TODO } @Override public void processingInstruction(String arg0, String arg1) throws SAXException { // TODO } @Override public void setDocumentLocator(Locator arg0) { // TODO } @Override public void skippedEntity(String arg0) throws SAXException { // TODO } @Override public void startDocument() throws SAXException { // TODO } @Override public void startPrefixMapping(String arg0, String arg1) throws SAXException { // TODO } }