package org.softeg.slartus.forpdaplus.classes; import android.content.Context; import android.net.Uri; import android.text.TextUtils; import org.softeg.slartus.forpdaplus.App; import org.softeg.slartus.forpdaplus.Client; import org.softeg.slartus.forpdaplus.classes.forum.ExtTopic; import org.softeg.slartus.forpdaplus.common.HtmlUtils; import org.softeg.slartus.forpdaplus.emotic.Smiles; import org.softeg.slartus.forpdaplus.prefs.HtmlPreferences; import org.softeg.slartus.forpdaplus.prefs.Preferences; import java.util.Hashtable; /** * User: slinkin * Date: 26.03.12 * Time: 16:50 */ public class TopicBodyBuilder extends HtmlBuilder { public static final String NICK_SNAPBACK_TEMPLATE = "[SNAPBACK]%s[/SNAPBACK] [B]%s,[/B] \n"; private Boolean m_Logined, m_IsWebviewAllowJavascriptInterface; private ExtTopic m_Topic; private String m_UrlParams; private HtmlPreferences m_HtmlPreferences; private Hashtable<String, String> m_EmoticsDict; private boolean m_MMod = false; private Boolean m_IsLoadImages = true; private Boolean m_IsShowAvatars = true; public TopicBodyBuilder(Context context, Boolean logined, ExtTopic topic, String urlParams, Boolean isWebviewAllowJavascriptInterface) { m_HtmlPreferences = new HtmlPreferences(); m_HtmlPreferences.load(context); m_EmoticsDict = Smiles.getSmilesDict(); m_IsWebviewAllowJavascriptInterface = isWebviewAllowJavascriptInterface; m_Logined = logined; m_UrlParams = urlParams; m_Topic = topic; m_IsLoadImages = WebViewExternals.isLoadImages("theme"); m_IsShowAvatars = Preferences.Topic.isShowAvatars(); } @Override public void addScripts() { if (m_UrlParams != null) m_Body.append("<script type=\"text/javascript\">window.FORPDA_POST = \"").append(m_UrlParams.replaceFirst("(?:^|\\n)[\\s\\S]*?(#.*|anchor=.*)", "$1")).append("\";</script>\n"); super.addScripts(); } public void beginTopic() { String desc = TextUtils.isEmpty(m_Topic.getDescription()) ? "" : (", " + m_Topic.getDescription()); super.beginHtml(m_Topic.getTitle() + desc); super.beginBody("topic", null, m_IsLoadImages); m_Body.append("<div id=\"topMargin\" style=\"height:").append(ACTIONBAR_TOP_MARGIN).append(";\"></div>"); m_Body.append("<div class=\"panel top\">"); if (m_Topic.getPagesCount() > 1) { addButtons(m_Body, m_Topic.getCurrentPage(), m_Topic.getPagesCount(), m_IsWebviewAllowJavascriptInterface, false, true); } m_Body.append(getTitleBlock()).append("</div>"); } public void openPostsList() { m_Body.append("<div class=\"posts_list\">"); } public void endTopic() { m_Body.append("</div>"); m_Body.append("<div name=\"entryEnd\" id=\"entryEnd\"></div>\n"); m_Body.append("<div class=\"panel bottom\">"); if (m_Topic.getPagesCount() > 1) { addButtons(m_Body, m_Topic.getCurrentPage(), m_Topic.getPagesCount(), m_IsWebviewAllowJavascriptInterface, false, false); } if (Preferences.Topic.getReadersAndWriters()) { m_Body.append("<div class=\"who\"><a id=\"viewers\" ").append(getHtmlout(m_IsWebviewAllowJavascriptInterface, "showReadingUsers")) .append("><span>Кто читает тему</span></a>\n"); m_Body.append("<a id=\"writers\" ").append(getHtmlout(m_IsWebviewAllowJavascriptInterface, "showWriters")) .append("><span>Кто писал сообщения</span></a></div>\n"); } m_Body.append(getTitleBlock()).append("</div><div id=\"bottomMargin\"></div>"); //m_Body.append("<div style=\"padding-top:"+ACTIONBAR_TOP_MARGIN+"\"></div>\n"); super.endBody(); super.endHtml(); } private String getSpoiler(String title, String body, Boolean opened) { return ( m_HtmlPreferences.isSpoilerByButton() ? "<div class=\"hat\"><div class='hidetop ".concat(opened ? "open " : "close").concat("' style='cursor:pointer;' ><input class='spoiler_button' type=\"button\" value=\"+\" onclick=\"toggleSpoilerVisibility(this)\"/>") .concat(title) : "<div class=\"hat\"><div class='hidetop ".concat(opened ? "open " : "close").concat("' style='cursor:pointer;' onclick=\"openHat(this);\">") .concat(title) ).concat("</div><div class='hidemain'").concat(opened ? " " : " style=\"display:none\"").concat(">").concat(body).concat("</div></div>"); } public void addPost(Post post, Boolean spoil) { m_Body.append("<div name=\"entry").append(post.getId()).append("\"class=\"jump\" style=\"position: absolute; width: 100%; margin-top:-").append(ACTIONBAR_TOP_MARGIN).append("; left: 0;\" id=\"entry").append(post.getId()).append("\"></div>\n"); m_Body.append("<div class=\"post_container\" name=\"del").append(post.getId()).append("\">"); addPostHeader(m_Body, post); //m_Body.append("<div id=\"msg").append(post.getId()).append("\" name=\"msg").append(post.getId()).append("\">"); String postBody = post.getBody().trim(); if (m_HtmlPreferences.isSpoilerByButton()) postBody = HtmlPreferences.modifySpoiler(postBody); if (spoil) m_Body.append(getSpoiler("<b><span>Показать шапку</span></b>", postBody, false)); else m_Body.append(postBody); //m_Body.append("</div>\n\n"); addFooter(m_Body, post); m_Body.append("<div class=\"between_messages\"></div>"); m_Body.append("</div>"); } public String getBody() { String res; res = HtmlPreferences.modifyStyleImagesBody(m_Body.toString()); res = HtmlPreferences.modifyEmoticons(res, m_EmoticsDict); if (!m_IsLoadImages) res = HtmlPreferences.modifyAttachedImagesBody(m_IsWebviewAllowJavascriptInterface, res); return res; } public void addBody(String value) { m_Body.append(value); } public void addPoll(String value, boolean openSpoil) { m_Body.append("<div class=\"poll\">").append(getSpoiler("<b><span>Опрос</span></b>", value, openSpoil)).append("</div>"); } public void clear() { m_Topic = null; m_Body = null; } private String getTitleBlock() { String desc = TextUtils.isEmpty(m_Topic.getDescription()) ? "" : ("<span class=\"comma\">, </span>" + m_Topic.getDescription()); return "<div class=\"topic_title_post\"><a href=\"http://4pda.ru/forum/index.php?showtopic=" + m_Topic.getId() + (TextUtils.isEmpty(m_UrlParams) ? "" : ("&" + m_UrlParams)) + "\">" + "<span class=\"name\">" + m_Topic.getTitle() + "</span>" + (HtmlPreferences.isFullThemeTitle() ? "<span class=\"description\">" + desc + "</span>" : "") + "</a></div>\n"; } public static void addButtons(StringBuilder sb, int currentPage, int pagesCount, Boolean isUseJs, Boolean useSelectTextAsNumbers, Boolean top) { Boolean prevDisabled = currentPage == 1; Boolean nextDisabled = currentPage == pagesCount; sb.append("\n<div class=\"navi ").append(top ? "top" : "bottom").append("\">\n"); sb.append("<a class=\"button first").append(prevDisabled ? " disable\"" : "\"" + getHtmlout(isUseJs, "firstPage")).append("><span><<</span></a>\n"); sb.append("<a class=\"button prev").append(prevDisabled ? " disable\"" : "\"" + getHtmlout(isUseJs, "prevPage")).append("><span><</span></a>\n"); sb.append("<a class=\"button page\" ").append(getHtmlout(isUseJs, "jumpToPage")).append("><span>").append(useSelectTextAsNumbers ? (currentPage + "/" + pagesCount) : "Выбор").append("</span></a>\n"); sb.append("<a class=\"button next").append(nextDisabled ? " disable\"" : "\"" + getHtmlout(isUseJs, "nextPage")).append("><span>></span></a>\n"); sb.append("<a class=\"button last").append(nextDisabled ? " disable\"" : "\"" + getHtmlout(isUseJs, "lastPage")).append("><span>>></span></a>\n"); sb.append("</div>\n"); } private String normParam(String paramName) { return HtmlUtils.modifyHtmlQuote(paramName).replace("'", "\\'").replace("\"", """); } public static String getHtmlout(Boolean webViewAllowJs, String methodName, String val1, String val2) { return getHtmlout(webViewAllowJs, methodName, new String[]{val1, val2}); } private static String getHtmlout(Boolean webViewAllowJs, String methodName, String val1) { return getHtmlout(webViewAllowJs, methodName, new String[]{val1}); } public static String getHtmlout(Boolean webViewAllowJs, String methodName) { return getHtmlout(webViewAllowJs, methodName, new String[0]); } public static String getHtmlout(Boolean webViewAllowJs, String methodName, String[] paramValues) { return getHtmlout(webViewAllowJs, methodName, paramValues, true); } public static String getHtmlout(Boolean webViewAllowJs, String methodName, String[] paramValues, Boolean modifyParams) { StringBuilder sb = new StringBuilder(); if (!webViewAllowJs) { sb.append("href=\"http://www.HTMLOUT.ru/"); sb.append(methodName).append("?"); int i = 0; for (String paramName : paramValues) { sb.append("val").append(i).append("=").append(modifyParams ? Uri.encode(paramName) : paramName).append("&"); i++; } sb = sb.delete(sb.length() - 1, sb.length()); sb.append("\""); } else { sb.append(" onclick=\"window.HTMLOUT.").append(methodName).append("("); for (String paramName : paramValues) { sb.append("'").append(paramName).append("',"); } if (paramValues.length > 0) sb.delete(sb.length() - 1, sb.length()); sb.append(")\""); } return sb.toString(); } private void addPostHeader(StringBuilder sb, Post msg) { String nick = msg.getNick(); String nickParam = msg.getNickParam(); sb.append("<div class=\"post_header\"><div class=\"header_wrapper\">\n"); //Аватарка sb.append("<div class=\"avatar ").append(App.getInstance().getPreferences().getBoolean("isSquareAvarars", false) ? "" : "circle ").append(m_IsShowAvatars ? "\"" : "disable\"") .append(getHtmlout(m_IsWebviewAllowJavascriptInterface, "showUserMenu", new String[]{msg.getId(), msg.getUserId(), nickParam})); String avatar = msg.getAvatarFileName(); if (TextUtils.isEmpty(avatar)) { avatar = "file:///android_asset/profile/av.png"; } sb.append("><div class=\"img\" style=\"background-image:url(").append((m_IsShowAvatars ? avatar : "file:///android_asset/profile/av.png")).append(");\"></div></div>"); //Ник sb.append("<a class=\"inf nick ") .append(msg.getUserState() ? "online " : "") .append(msg.isCurator() ? "curator\"" : "\" ") .append(!TextUtils.isEmpty(msg.getUserId()) ? getHtmlout(m_IsWebviewAllowJavascriptInterface, "showUserMenu", new String[]{msg.getId(), msg.getUserId(), nickParam}) : "") .append("><span><b>").append(nick).append("</b></span></a>"); //Группа sb.append("<div class=\"inf group\">").append(msg.getUserGroup() == null ? "" : msg.getUserGroup()).append("</div>"); //Репутация if (!TextUtils.isEmpty(msg.getUserId())) { sb.append("<a class=\"inf reputation\" ") .append(getHtmlout(m_IsWebviewAllowJavascriptInterface, "showRepMenu", new String[]{msg.getId(), msg.getUserId(), msg.getNickParam(), msg.getCanPlusRep() ? "1" : "0", msg.getCanMinusRep() ? "1" : "0"})) .append("><span>").append(msg.getUserReputation()).append("</span></a>"); } //Дата sb.append("<div class=\"date-link\"><span class=\"inf date\"><span>").append(msg.getDate()).append("</span></span>"); //Ссылка на пост sb.append("<a class=\"inf link\" ") .append(getHtmlout(m_IsWebviewAllowJavascriptInterface, "showPostLinkMenu", msg.getId())) .append("><span><span class=\"sharp\">#</span>").append(msg.getNumber()).append("</span></a></div>"); //Меню if (Client.getInstance().getLogined()) { sb.append("<a class=\"inf menu\" ") .append(getHtmlout(m_IsWebviewAllowJavascriptInterface, "showPostMenu", new String[]{msg.getId(), msg.getDate(), msg.getUserId(), nickParam, msg.getCanEdit() ? "1" : "0", msg.getCanDelete() ? "1" : "0"})) .append("><span>Меню</span></a>"); } sb.append("</div></div>\n"); } private void addFooter(StringBuilder sb, Post post) { sb.append("<div class=\"post_footer") .append(post.getCanDelete() ? " delete" : "") .append(post.getCanEdit() ? " edit" : "") .append(getTopic().isPostVote() ? "" : " nopostvote") .append("\">"); if (m_Logined) { String nickParam = post.getNickParam(); String postNumber = post.getNumber(); try { postNumber = Integer.toString(Integer.parseInt(post.getNumber()) - 1); } catch (Throwable ignored) { } sb.append(String.format("<a class=\"link button claim\" href=\"/forum/index.php?act=report&t=%s&p=%s&st=%s\"><span>Жалоба</span></a>", m_Topic.getId(), post.getId(), postNumber)); sb.append("<a class=\"button nick\" ") .append(getHtmlout(m_IsWebviewAllowJavascriptInterface, "insertTextToPost", String.format("[SNAPBACK]%s[/SNAPBACK] [B]%s,[/B] \\n", post.getId(), nickParam))) .append("><span>Ник</span></a>"); sb.append("<a class=\"button quote\" ") .append(getHtmlout(m_IsWebviewAllowJavascriptInterface, "quote", new String[]{m_Topic.getForumId(), m_Topic.getId(), post.getId(), post.getDate(), post.getUserId(), nickParam})) .append("><span>Цитата</span></a>"); if (!Client.getInstance().UserId.equals(post.getUserId()) & getTopic().isPostVote()) { sb.append("<a class=\"button vote bad\" ") .append(getHtmlout(m_IsWebviewAllowJavascriptInterface, "postVoteBad", post.getId())) .append("><span>Плохо</span></a>"); sb.append("<a class=\"button vote good\" ") .append(getHtmlout(m_IsWebviewAllowJavascriptInterface, "postVoteGood", post.getId())) .append("><span>Хорошо</span></a>"); } if (post.getCanEdit()) sb.append(String.format("<a class=\"button edit\" id=\"edit-but-%s\" href=\"/forum/index.php?act=post&do=edit_post&f=%s&t=%s&p=%s&st=%s\"><span>Изменить</span></a>", post.getId(), m_Topic.getForumId(), m_Topic.getId(), post.getId(), postNumber)); if (post.getCanDelete()) sb.append(String.format("<a class=\"button delete\" href=\"/forum/index.php?act=Mod&CODE=04&f=%s&t=%s&p=%s&st=%s&auth_key=%s\"><span>Удалить</span></a>", m_Topic.getForumId(), m_Topic.getId(), post.getId(), postNumber, m_Topic.getAuthKey())); } sb.append("</div>\n\n"); } public ExtTopic getTopic() { return m_Topic; } public void setMMod(boolean MMod) { this.m_MMod = MMod; } @SuppressWarnings("UnusedDeclaration") public boolean isMMod() { return m_MMod; } }