package com.ladjzero.hipda; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.nodes.TextNode; import org.jsoup.select.Elements; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by chenzhuo on 16-2-11. */ public class ThreadsParser extends Parser { private static final Pattern COLOR_REG = Pattern.compile("#(\\d|[A-F])+"); public Response parse(String html) { Threads threads = new Threads(); Response.Meta resMeta = new Response.Meta(); Document doc = getDoc(html, resMeta); String selectStr = false ? "tbody[id^=normalthread_],tbody[id^=stickthread_" : "tbody[id^=normalthread_]"; Elements eThreads = doc.select("body#search").size() == 0 ? doc.select(selectStr) : doc.select("div.searchlist tbody"); for (Element eThread : eThreads) { Thread thread = toThreadObj(eThread); if (thread != null) threads.add(toThreadObj(eThread)); } int currPage = 1; Elements page = doc.select("div.pages > strong"); if (page.size() > 0) { currPage = Integer.valueOf(page.first().text()); } Elements nextPage = doc.select("div.pages > a[href$=&page=" + (currPage + 1) + "]"); threads.getMeta().setHasNextPage(nextPage.size() > 0); threads.getMeta().setPage(currPage); Response res = new Response(); res.setMeta(resMeta); res.setData(threads); res.setSuccess(true); return res; } public Threads parseMessages(String html) { Document doc = getDoc(html); Elements pms = doc.select("ul.pm_list li.s_clear"); Threads threads = new Threads(); for (Element pm : pms) { try { Elements eUser = pm.select("p.cite a"); String userName = eUser.text(); String userLink = eUser.attr("href"); String uid = Utils.getUriQueryParameter(userLink).get("uid"); User u = new User().setId(Integer.valueOf(uid)).setName(userName); String title = pm.select("div.summary").text(); boolean isNew = pm.select("img[alt=NEW]").size() != 0; String dateStr = ((TextNode) pm.select("p.cite").get(0).childNode(2)).text().replaceAll("\u00a0", ""); Thread thread = new Thread().setTitle(title).setAuthor(u).setNew(isNew).setDateStr(dateStr); threads.add(thread); } catch (Exception e) { e.printStackTrace(); // Logger.e("Can not parse user in PMs, pm: %s", pm.html()); } } int currPage = 1; Elements page = doc.select("div.pages > strong"); if (page.size() > 0) { currPage = Integer.valueOf(page.first().text()); } boolean hasNextPage = doc.select("div.pages > a[href$=&page=" + (currPage + 1) + "]").size() > 0; threads.getMeta().setHasNextPage(hasNextPage); threads.getMeta().setPage(currPage); return threads; } public Threads parseOwnPosts(String html) { Document doc = getDoc(html); Elements eThreads = doc.select("div.threadlist tbody tr"); Threads threads = new Threads(); for (int i = 0; i < eThreads.size(); i += 2) { Elements eTitle = eThreads.get(i).select("th a"); if (eTitle.size() > 0) { String href = eTitle.attr("href"); Map<String, String> params = Utils.getUriQueryParameter(href); String id = params.get("ptid"); String pid = params.get("pid"); String title = eTitle.text(); String body = eThreads.get(i + 1).select("th.lighttxt").text().trim(); String forumStr = eThreads.get(i).select("td.forum > a").attr("href"); String fid = Utils.getUriQueryParameter(forumStr).get("fid"); Thread thread = new Thread() .setTitle(title) .setId(Integer.valueOf(id)) .setBody(body) .setFid(Integer.valueOf(fid)) .setToFind(Integer.valueOf(pid)); threads.add(thread); } } int currPage = 1; Elements page = doc.select("div.pages > strong"); if (page.size() > 0) { currPage = Integer.valueOf(page.first().text()); } boolean hasNextPage = doc.select("div.pages > a[href$=&page=" + (currPage + 1) + "]").size() > 0; threads.getMeta().setPage(currPage); threads.getMeta().setHasNextPage(hasNextPage); return threads; } public Threads parseOwnThreads(String html) { Document doc = getDoc(html); Elements eThreads = doc.select("div.threadlist tbody tr"); Threads threads = new Threads(); for (Element eThread : eThreads) { Elements eTitle = eThread.select("th a"); Elements eForum = eThread.select(".forum a"); if (eTitle.size() > 0) { String href = eTitle.attr("href"); String id = href.substring(href.indexOf("tid=") + 4); String title = eTitle.text(); String forumLink = eForum.attr("href"); String fid = null; if (forumLink.length() > 0) { fid = forumLink.substring(forumLink.indexOf("fid=") + 4); } Thread thread = new Thread().setTitle(title).setId(Integer.valueOf(id)); if (fid != null) { thread.setFid(Integer.valueOf(fid)); } threads.add(thread); } } int currPage = 1; Elements page = doc.select("div.pages > strong"); if (page.size() > 0) { currPage = Integer.valueOf(page.first().text()); } boolean hasNextPage = doc.select("div.pages > a[href$=&page=" + (currPage + 1) + "]").size() > 0; threads.getMeta().setHasNextPage(hasNextPage); threads.getMeta().setPage(currPage); return threads; } public Threads parseMarkedThreads(String html) { Document doc = getDoc(html); Elements eThreads = doc.select("form[method=post] tbody tr"); Threads threads = new Threads(); for (Element eThread : eThreads) { Elements eTitle = eThread.select("th a"); if (eTitle.size() > 0) { String href = eTitle.attr("href"); String id = href.substring(href.indexOf("tid=") + 4, href.indexOf("&from")); String title = eTitle.text(); String forumStr = eThread.select("td.forum > a").attr("href"); String fid = Utils.getUriQueryParameter(forumStr).get("fid"); Thread thread = new Thread().setTitle(title).setId(Integer.valueOf(id)).setFid(Integer.valueOf(fid)); threads.add(thread); } } int currPage = 1; Elements page = doc.select("div.pages > strong"); if (page.size() > 0) { currPage = Integer.valueOf(page.first().text()); } boolean hasNextPage = doc.select("div.pages > a[href$=&page=" + (currPage + 1) + "]").size() > 0; threads.getMeta().setHasNextPage(hasNextPage); threads.getMeta().setPage(currPage); return threads; } private Thread toThreadObj(Element eThread) { Elements eSubject = eThread.select("th.subject"); Elements eLastPost = eThread.select("td.lastpost em a"); String lastHref = eLastPost.attr("href"); String style; String type = eSubject.select("em > a[href^=forumdisplay.php]").text(); if (lastHref != null && lastHref.length() > 0) { String id = Utils.getUriQueryParameter(lastHref).get("tid"); Element _title = eSubject.select("span a[href^=viewthread.php], a[href^=viewthread.php]").first(); String title = _title.text(); style = _title.attr("style"); boolean isNew = eThread.select("th.subject").hasClass("new"); Elements eAuthor = eThread.select("td.author"); Elements eUser = eAuthor.select("a"); String userName = eUser.text(); String dateStr = eAuthor.select("em").text().trim(); // if userHref.length() == 0, this thread is closed for some reason. String userHref = eUser.attr("href"); if (userHref.length() == 0) { return null; } String userId = Utils.getUriQueryParameter(userHref).get("uid"); String commentNum = eThread.select("td.nums > strong").text().trim(); String forumLink = eThread.select(".forum a").attr("href"); String fid = null; int uid = Integer.valueOf(userId); User user = new User().setId(uid).setName(userName); Thread ret = new Thread(); ret.setId(Integer.valueOf(id)).setTitle(title).setNew(isNew) .setCommentCount(Integer.valueOf(commentNum)).setAuthor(user).setDateStr(dateStr) .setStick(eThread.id().startsWith("stickthread_")) .setBold(style.contains("bold")) .setType(type); Matcher matcher = COLOR_REG.matcher(style); if (matcher.find()) ret.setColor(matcher.group()); if (forumLink.length() > 0) { fid = forumLink.substring(forumLink.indexOf("fid=") + 4); ret.setFid(Integer.valueOf(fid)); } return ret; } else { return null; } } }