package org.softeg.slartus.forpdaplus.fragments.search; import android.content.SharedPreferences; import android.util.Log; import org.softeg.slartus.forpdacommon.NotReportException; import org.softeg.slartus.forpdaplus.App; import org.softeg.slartus.forpdaplus.R; import org.softeg.slartus.forpdaplus.classes.Exceptions.MessageInfoException; import org.softeg.slartus.forpdaplus.classes.HtmlBuilder; import org.softeg.slartus.forpdaplus.classes.Post; import org.softeg.slartus.forpdaplus.classes.TopicBodyBuilder; import org.softeg.slartus.forpdaplus.classes.common.Functions; import org.softeg.slartus.forpdaplus.emotic.Smiles; import java.util.Hashtable; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by IntelliJ IDEA. * User: slinkin * Date: 22.10.12 * Time: 12:54 * To change this template use File | Settings | File Templates. */ public class SearchPostsParser extends HtmlBuilder { private boolean m_SpoilerByButton = false; private Hashtable<String, String> m_EmoticsDict; public SearchPostsParser() { SharedPreferences prefs = App.getInstance().getPreferences(); m_SpoilerByButton = prefs.getBoolean("theme.SpoilerByButton", false); m_EmoticsDict = Smiles.getSmilesDict(); } public SearchResult searchResult; public String parse(String body) throws MessageInfoException, NotReportException { int posts = 0; Boolean isWebviewAllowJavascriptInterface = Functions.isWebviewAllowJavascriptInterface(App.getInstance()); searchResult = createSearchResult(body); beginHtml(App.getContext().getString(R.string.search_result)); beginTopic(searchResult); m_Body.append("<div class=\"posts_list search-results\">"); String userId, userName, user, dateTime, userState; Log.e("kek", "start matcher"); Matcher matcher = Pattern.compile("<div class=\"cat_name\" style=\"margin-bottom:0\">([\\s\\S]*?)<\\/div>[\\s\\S]*?post_date\">([^\\|&]*)[\\s\\S]*?<font color=\"([^\"]*?)\"[\\s\\S]*?showuser=(\\d+)\"[^>]*?>([\\s\\S]*?)(?:<i[\\s\\S]*?\\/i>)?<\\/a>[\\s\\S]*?<div class=\"post_body[^>]*?>([\\s\\S]*?)<\\/div><\\/div>(?=<div class=\"cat_name\"|<div><div class=\"pagination\">)").matcher(body); while (matcher.find()) { m_Body.append("<div class=\"post_container\">"); m_Body.append("<div class=\"topic_title_post\">").append(matcher.group(1)).append("</div>\n"); dateTime = matcher.group(2); userState = matcher.group(3).equals("red") ? "" : "online"; userId = matcher.group(4); userName = matcher.group(5); user = "<a class=\"s_inf nick " + userState + "\" " + TopicBodyBuilder.getHtmlout(isWebviewAllowJavascriptInterface, "showUserMenu", userId, userName) + "><span>" + userName + "</span></a>"; m_Body.append("<div class=\"post_header\">").append(user).append("<div class=\"s_inf date\"><span>").append(dateTime).append("</span></div></div>"); m_Body.append("<div class=\"post_body emoticons\">"); if (m_SpoilerByButton) { String find = "(<div class='hidetop' style='cursor:pointer;' )" + "(onclick=\"var _n=this.parentNode.getElementsByTagName\\('div'\\)\\[1\\];if\\(_n.style.display=='none'\\)\\{_n.style.display='';\\}else\\{_n.style.display='none';\\}\">)" + "(Спойлер \\(\\+/-\\).*?</div>)" + "(\\s*<div class='hidemain' style=\"display:none\">)"; String replace = "$1>$3<input class='spoiler_button' type=\"button\" value=\"+\" onclick=\"toggleSpoilerVisibility\\(this\\)\"/>$4"; m_Body.append(Post.modifyBody(matcher.group(6), m_EmoticsDict).replaceAll(find, replace)); } else { m_Body.append(Post.modifyBody(matcher.group(6), m_EmoticsDict)); } m_Body.append("</div>").append("</div><div class=\"between_messages\"></div>"); posts++; } Log.e("kek", "start matcher"); if (posts == 0) { m_Body.append("<div class=\"bad-search-result\">\n" + "\t<h3>Поиск не дал результатов</h3>\n" + "\t<span>Попробуйте сформулировать свой запрос иначе</span>\n" + "</div>"); } m_Body.append("</div>"); endTopic(searchResult); return m_Body.toString(); } private SearchResult createSearchResult(String page) { final Pattern pagesCountPattern = Pattern.compile("var pages = parseInt\\((\\d+)\\);"); // http://4pda.ru/forum/index.php?act=search&source=all&result=posts&sort=rel&subforums=1&query=pda&forums=281&st=90 //final Pattern paginationPattern = Pattern.compile("<div class=\"pagination\">([\\s\\S]*?)<\\/div><\\/div><br"); final Pattern lastPageStartPattern = Pattern.compile("(http://4pda.ru)?/forum/index.php\\?act=search.*?st=(\\d+)"); final Pattern currentPagePattern = Pattern.compile("<span class=\"pagecurrent\">(\\d+)</span>"); SearchResult searchResult = new SearchResult(); Matcher m = pagesCountPattern.matcher(page); if (m.find()) { searchResult.setPagesCount(m.group(1)); } m = lastPageStartPattern.matcher(page); while (m.find()) { searchResult.setLastPageStartCount(m.group(2)); } m = currentPagePattern.matcher(page); if (m.find()) { searchResult.setCurrentPage(m.group(1)); } else searchResult.setCurrentPage("1"); return searchResult; } public void beginTopic(SearchResult searchResult) { beginBody("search"); m_Body.append("<div id=\"topMargin\"></div>\n<div class=\"panel top\">"); if (searchResult.getPagesCount() > 1) { TopicBodyBuilder.addButtons(m_Body, searchResult.getCurrentPage(), searchResult.getPagesCount(), Functions.isWebviewAllowJavascriptInterface(App.getInstance()), true, true); } m_Body.append("</div>"); //m_Body.append("<br/><br/>"); } public void endTopic(SearchResult searchResult) { m_Body.append("<div id=\"entryEnd\"></div>\n"); m_Body.append("<div class=\"panel bottom\">"); if (searchResult.getPagesCount() > 1) { TopicBodyBuilder.addButtons(m_Body, searchResult.getCurrentPage(), searchResult.getPagesCount(), Functions.isWebviewAllowJavascriptInterface(App.getInstance()), true, false); } m_Body.append("</div><div id=\"bottomMargin\"></div>"); endBody(); endHtml(); } }