package com.lgq.rssreader.formatter;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import android.graphics.drawable.Drawable;
import android.util.Log;
import com.lgq.rssreader.entity.Blog;
import com.lgq.rssreader.entity.ImageRecord;
import com.lgq.rssreader.task.ImageTask;
import com.lgq.rssreader.utils.Helper;
import com.lgq.rssreader.utils.HtmlHelper;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.JsonHttpResponseHandler;
public abstract class SyncBlogFormatter
{
public static final String prefix = "../images";
public String BackgroundColor;
public String FontColor;
public boolean EnableCache;
public boolean NoImageMode;
protected abstract String LoadFromCache(Blog blog);
protected abstract String Download(Blog blog);
protected abstract String GetReadableString(String content);
public String Render(final Blog blog)
{
String content = LoadFromCache(blog);
if (content.length() == 0)
{
String e = Download(blog);
String readable = GetReadableString(e);
if(readable == null || readable.length() == 0){
return "";
}
if(blog.Link.contains("cnbeta")){
String sample = HtmlHelper.filterHtml(blog.Description).substring(0,10).replace(" ", "");
String puretext = HtmlHelper.trim(HtmlHelper.filterHtml(readable)).replace(" ", "");
if(!puretext.contains(sample))
readable = blog.Description + readable;
}
Document doc = Jsoup.parse(readable);
doc = dealFont(doc);
doc = dealStyle(doc);
doc = dealImageLazyLoading(doc);
return doc.body().html();
}
return content;
}
private Document dealFont(Document doc){
Elements fonts = doc.getElementsByTag("font");
for (int i=0, len=fonts.size(); i < len; i++){
Element spanFont = doc.createElement("span");
spanFont.html(fonts.get(i).html());
fonts.get(i).before(spanFont);
fonts.get(i).remove();
}
return doc;
}
private Document dealStyle(Document doc){
for(Element c : doc.getElementsByAttribute("style")){
c.attr("style", c.attr("style").toLowerCase().replace("width", "w"));
c.attr("style", c.attr("style").toLowerCase().replace("height", "h"));
c.attr("style", c.attr("style").toLowerCase().replace("font", "f"));
c.attr("style", c.attr("style").toLowerCase().replace("background", "b"));
}
return doc;
}
private Document dealImageLazyLoading(Document doc){
List<Element> imgs = new ArrayList<Element>();
for(Element d : doc.getElementsByTag("img")){
if (d.hasAttr("width"))
d.removeAttr("width");
if (d.hasAttr("height"))
d.removeAttr("height");
if(d.hasAttr("src") &&
(!d.hasAttr("xSrc") || !d.attr("xSrc").contains(prefix))
)
imgs.add(d);
}
for(Element img : imgs)
{
if (!img.hasAttr("xSrc") && img.hasAttr("src"))
{
img.attributes().put("xSrc", img.attr("src"));
img.attr("src", "Loading.gif");
}
if (img.hasAttr("style")){
img.attr("style", img.attr("style") + "margin:auto;");
}else{
img.attributes().put("style", "margin:auto;");
}
}
return doc;
}
}