package cn.jcenterhome.util;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JcHomeCode {
private Map<String, Object> jcHomeCode = null;
public JcHomeCode() {
jcHomeCode = new HashMap<String, Object>();
jcHomeCode.put("pcodecount", -1);
jcHomeCode.put("codecount", 0);
jcHomeCode.put("codehtml", null);
}
private String codeDisp(String code) {
jcHomeCode.put("pcodecount", (Integer) jcHomeCode.get("pcodecount") + 1);
code = code.replaceAll("(?is)^[\n\r]*(.+?)[\n\r]*$", "$1").replace("\\\"", "\"");
Map temp = (Map) jcHomeCode.get("codehtml");
if (temp == null) {
temp = new HashMap();
}
temp.put(jcHomeCode.get("pcodecount"), tplCodeDisp(code));
jcHomeCode.put("codehtml", temp);
jcHomeCode.put("codecount", (Integer) jcHomeCode.get("codecount") + 1);
return "[\tJCHOME_CODE_" + jcHomeCode.get("pcodecount") + "\t]";
}
public String complie(String message) {
if (message == null || message.length() == 0) {
return message;
}
Matcher matcher = null;
if (message.indexOf("[/code]") >= 0) {
matcher = Pattern.compile("(?is)\\s*\\[code\\](.+?)\\[\\/code\\]\\s*").matcher(message);
StringBuffer b = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(b, codeDisp(matcher.group(1)));
}
matcher.appendTail(b);
message = b.toString();
}
if (message.indexOf("[/url]") >= 0) {
matcher = Pattern
.compile(
"(?is)\\[url(=((https?|ftp|gopher|news|telnet|rtsp|mms|callto|bctp|ed2k|thunder|synacast){1}:\\/\\/|www\\.)([^\\[\\\"']+?))?\\](.+?)\\[\\/url\\]")
.matcher(message);
StringBuffer b = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(b, parseURL(matcher.group(1), matcher.group(5)));
}
matcher.appendTail(b);
message = b.toString();
}
if (message.indexOf("[/email]") >= 0) {
matcher = Pattern
.compile(
"(?is)\\[email(=([a-z0-9\\-_.+]+)@([a-z0-9\\-_]+[.][a-z0-9\\-_.]+))?\\](.+?)\\[\\/email\\]")
.matcher(message);
StringBuffer b = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(b, parseEmail(matcher.group(1), matcher.group(4)));
}
matcher.appendTail(b);
message = b.toString();
}
String[] search = new String[] {"[/color]", "[/size]", "[/font]", "[/align]", "[b]", "[/b]", "[i]",
"[/i]", "[u]", "[/u]", "[list]", "[list=1]", "[list=a]", "[list=A]", "[*]", "[/list]",
"[indent]", "[/indent]", "[/float]"};
String[] replace = new String[] {"</font>", "</font>", "</font>", "</p>", "<strong>", "</strong>",
"<i>", "</i>", "<u>", "</u>", "<ul>", "<ul type=\"1\">", "<ul type=\"a\">",
"<ul type=\"A\">", "<li>", "</ul>", "<blockquote>", "</blockquote>", "</span>"};
for (int i = 0; i < replace.length; i++) {
message = message.replace(search[i], replace[i]);
}
String[] search_exp = new String[] {"\\[color=([#\\w]+?)\\](?i)", "\\[size=(\\d+?)\\](?i)",
"\\[size=(\\d+(\\.\\d+)?(px|pt|in|cm|mm|pc|em|ex|%)+?)\\](?i)",
"\\[font=([^\\[\\<]+?)\\](?i)", "\\[align=(left|center|right)\\](?i)",
"\\[float=(left|right)\\](?i)"};
String[] replace_exp = new String[] {"<font color=\"$1\">", "<font size=\"$1\">",
"<font style=\"font-size: $1\">", "<font face=\"$1 \">", "<p align=\"$1\">",
"<span style=\"float: $1;\">"};
for (int i = 0; i < replace_exp.length; i++) {
message = message.replaceAll(search_exp[i], replace_exp[i]);
}
if (message.indexOf("[/quote]") >= 0) {
message = message.replaceAll("\\s*\\[quote\\][\\n\\r]*(.+?)[\\n\\r]*\\[\\/quote\\]\\s*(?is)",
tplQuote());
}
if (message.indexOf("[/img]") >= 0) {
matcher = Pattern.compile("\\[img\\]\\s*([^\\[\\<\\r\\n]+?)\\s*\\[/img\\](?is)").matcher(message);
StringBuffer b = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(b, bbcodeURL(matcher.group(1),
"<img src=\"%s\" border=\"0\" alt=\"\" />"));
}
matcher.appendTail(b);
message = b.toString();
matcher = Pattern.compile(
"\\[img=(\\d{1,4})[x|\\,](\\d{1,4})\\]\\s*([^\\[\\<\\r\\n]+?)\\s*\\[/img\\](?is)")
.matcher(message);
b = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(b, bbcodeURL(matcher.group(3), "<img width=\"" + matcher.group(1)
+ "\" height=\"" + matcher.group(2) + "\" src=\"%s\" border=\"0\" alt=\"\" />"));
}
matcher.appendTail(b);
message = b.toString();
}
int pcodeCount = (Integer) jcHomeCode.get("pcodecount");
Map codeHtmlMap = (Map) jcHomeCode.get("codehtml");
for (int i = 0; i <= pcodeCount; i++) {
message = message.replace("[\tJCHOME_CODE_" + i + "\t]", (String) codeHtmlMap.get(i));
}
message = message.replace("\t", " ");
message = message.replace(" ", " ");
message = message.replace(" ", " ");
return Common.nl2br(message);
}
private String tplCodeDisp(String code) {
return "<div class=\"blockcode\"><code id=\"code" + jcHomeCode.get("codecount") + "\">" + code
+ "</code></div>";
}
private String parseURL(String url, String text) {
Matcher matcher = null;
if (url == null) {
Pattern pattern = Pattern
.compile("((https?|ftp|gopher|news|telnet|rtsp|mms|callto|bctp|ed2k|thunder|synacast){1}:\\/\\/|www\\.)[^\\[\\\"']+(?i)");
matcher = pattern.matcher(text.trim());
}
if (matcher != null && matcher.find()) {
url = matcher.group(0);
int length = 65;
if (Common.strlen(url) > length) {
text = url.substring(0, (int) (length * 0.5)) + " ... "
+ url.substring(url.length() - (int) (length * 0.3), url.length());
}
return "<a href=\"" + (url.substring(0, 4).toLowerCase().equals("www.") ? "http://" + url : url)
+ "\" target=\"_blank\">" + text + "</a>";
} else {
if (url == null) {
url = "";
} else {
url = url.substring(1, url.length());
if (url.substring(0, 4).toLowerCase().equals("www.")) {
url = "http://" + url;
}
}
return "<a href=\"" + url + "\" target=\"_blank\">" + text + "</a>";
}
}
private String parseEmail(String email, String text) {
Matcher matcher = null;
if (email == null) {
Pattern pattern = Pattern
.compile("\\s*([a-z0-9\\-_.+]+)@([a-z0-9\\-_]+[.][a-z0-9\\-_.]+)\\s*(?i)");
matcher = pattern.matcher(text);
}
if (matcher != null && matcher.find()) {
email = matcher.group(0).trim();
return "<a href=\"mailto:" + email + "\">" + email + "</a>";
} else {
return "<a href=\"mailto:" + (email == null ? "" : email.substring(1, email.length())) + "\">"
+ text + "</a>";
}
}
private String tplQuote() {
return "<div class=\"quote\"><blockquote>$1</blockquote></div>";
}
private String bbcodeURL(String url, String tags) {
if (!url.matches("<.+?>(?s)")) {
int urlLength = url.length() >= 6 ? 6 : url.length();
if (!Common.in_array(new String[] {"http:/", "https:", "ftp://", "rtsp:/", "mms://"}, url
.substring(0, urlLength).toLowerCase())) {
url = "http://" + url;
}
return String.format(tags, url, Common.addSlashes(url)).replace("submit", "").replace(
"logging.jsp", "");
} else {
return " " + url;
}
}
}