package org.softeg.slartus.forpdaapi;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* Created by slartus on 05.06.2014.
*/
public class TopicBodyParser implements Parcelable {
private String forumId;
private String topicTitle;
private String topicDescription;
private String postsBody;
private Uri uri;
private int pagesCount = 1, postsPerPage = 1, currentPage = 1;
public TopicBodyParser(String url) {
this.uri = Uri.parse(url);
}
public void parse(String pageBody) {
Matcher m = Pattern.compile("^([\\s\\S]*?)<a[^>]*name=\"entry([\\s\\S]*?)<div[^>]*class=\"[^\"]*topic_foot_nav[^\"]*\"[^>]*>",
Pattern.CASE_INSENSITIVE).matcher(pageBody);
String headerBody;
String postsBody;
if (m.find()) {
headerBody = m.group(1);
postsBody = "<a name=\"entry" + m.group(2);
} else {
m = Pattern.compile("^([\\s\\S]*?)<body[^>]*>([\\s\\S]*?)</body>", Pattern.CASE_INSENSITIVE)
.matcher(pageBody);
if (m.find()) {
headerBody = m.group(1);
postsBody = m.group(2);
} else {
headerBody = pageBody;
postsBody = pageBody;
}
}
parseHeader(headerBody);
parseBody(postsBody);
}
private void parseBody(String postsBody) {
this.postsBody = postsBody;
}
private void parseHeader(String headerBody) {
Matcher m;
m = Pattern.compile("<title>(.*?)\\s*-\\s*4PDA\\s*</title>", Pattern.CASE_INSENSITIVE).matcher(headerBody);
if (m.find())
topicTitle = m.group(1);
m = Pattern.compile("<div[^>]*class=\"topic_title_post\"[^>]*>([^<]*)<", Pattern.CASE_INSENSITIVE).matcher(headerBody);
if (m.find())
topicDescription = m.group(1);
m = Pattern.compile("<div[^>]*class=\"pagination\">[^>]*>(\\d+) страниц.?</a>.*?<span[^>]*class=\"pagecurrent\"[^>]*>(\\d+)</span>.*?\"/forum/index.php\\?showtopic=\\d+&st=(\\d+)\">»</a>",
Pattern.CASE_INSENSITIVE).matcher(headerBody);
if (m.find()) {
currentPage = Integer.parseInt(m.group(2));
pagesCount = Integer.parseInt(m.group(1));
postsPerPage = Integer.parseInt(m.group(3)) / (pagesCount - 1);
}
m = Pattern.compile("<div[^>]*id=\"navstrip\"[^>]*>.*?showforum=(\\d+).*?</div>", Pattern.CASE_INSENSITIVE).matcher(headerBody);
if (m.find())
forumId = m.group(1);
}
public static final Parcelable.Creator<TopicBodyParser> CREATOR
= new Parcelable.Creator<TopicBodyParser>() {
public TopicBodyParser createFromParcel(Parcel in) {
return new TopicBodyParser(in);
}
public TopicBodyParser[] newArray(int size) {
return new TopicBodyParser[size];
}
};
public String getTopicId() {
return uri.getQueryParameter("showtopic");
}
public String getFragment() {
return uri.getFragment();
}
public String getTopicTitle() {
return topicTitle;
}
public String getTopicDescription() {
return topicDescription;
}
public String getPostsBody() {
return postsBody;
}
public int getCurrentPage() {
return currentPage;
}
public int getPagesCount() {
return pagesCount;
}
public int getPostsPerPage() {
return postsPerPage;
}
private TopicBodyParser(Parcel parcel) {
topicTitle = parcel.readString();
topicDescription = parcel.readString();
postsBody = parcel.readString();
uri = Uri.parse(parcel.readString());
pagesCount = parcel.readInt();
postsPerPage = parcel.readInt();
currentPage = parcel.readInt();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(topicTitle);
parcel.writeString(topicDescription);
parcel.writeString(postsBody);
parcel.writeString(uri.toString());
parcel.writeInt(pagesCount);
parcel.writeInt(postsPerPage);
parcel.writeInt(currentPage);
}
public String getForumId() {
return forumId;
}
public String getUrl() {
return uri.toString();
}
public String getNextPageUrl() {
return String.format("http://4pda.ru/forum/index.php?showtopic=%s&st=%d", getTopicId(), currentPage * postsPerPage);
}
public String getPrevPageUrl() {
return String.format("http://4pda.ru/forum/index.php?showtopic=%s&st=%d", getTopicId(), (currentPage - 2) * postsPerPage);
}
public String getLastPageUrl() {
return String.format("http://4pda.ru/forum/index.php?showtopic=%s&st=%d", getTopicId(), (pagesCount - 1) * postsPerPage);
}
public String getFirstPageUrl() {
return String.format("http://4pda.ru/forum/index.php?showtopic=%s", getTopicId());
}
public String getPageUrl(int pageNum) {
return String.format("http://4pda.ru/forum/index.php?showtopic=%s&st=%d", getTopicId(), (pageNum - 1) * postsPerPage);
}
}