NoFollowPlugin.java [plain text]
package org.blojsom.plugin.nofollow;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.blojsom.blog.*;
import org.blojsom.plugin.BlojsomPlugin;
import org.blojsom.plugin.BlojsomPluginException;
import org.blojsom.util.BlojsomUtils;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class NoFollowPlugin implements BlojsomPlugin {
private Log _logger = LogFactory.getLog(NoFollowPlugin.class);
private static final String HYPERLINK_REGEX = "<a\\s([^>]*\\s*href\\s*=[^>]*)>";
private static final String ATTRIBUTE_REGEX = "[^=[\\p{Space}]]*\\s*=\\s*\"[^\"]*\"|[^=[\\p{Space}]]*\\s*=\\s*'[^']*'|[^=[\\p{Space}]]*\\s*=[^[\\p{Space}]]*";
private static final String NOFOLLOW_REGEX = "\\s*nofollow\\s*";
private static final String REL_ATTR_REGEX = "rel\\s*=";
private static final String REL_NOFOLLOW = " rel=\"nofollow\"";
public NoFollowPlugin() {
}
public void init(ServletConfig servletConfig, BlojsomConfiguration blojsomConfiguration) throws BlojsomPluginException {
_logger.debug("Initialized nofollow plugin");
}
protected String noFollowFy(String text) {
if (BlojsomUtils.checkNullOrBlank(text)) {
return text;
}
StringBuffer updatedText = new StringBuffer();
Pattern hyperlinkPattern = Pattern.compile(HYPERLINK_REGEX, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.UNICODE_CASE | Pattern.DOTALL);
Matcher hyperlinkMatcher = hyperlinkPattern.matcher(text);
Pattern attributePattern = Pattern.compile(ATTRIBUTE_REGEX, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.UNICODE_CASE | Pattern.DOTALL);
Pattern relAttrPattern = Pattern.compile(REL_ATTR_REGEX, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.UNICODE_CASE | Pattern.DOTALL);
Pattern noFollow = Pattern.compile(NOFOLLOW_REGEX, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.UNICODE_CASE | Pattern.DOTALL);
Matcher noFollowMatcher;
Matcher attributeMatcher;
int lastIndex = 0;
while (hyperlinkMatcher.find()) {
updatedText.append(text.substring(lastIndex, hyperlinkMatcher.start()));
String link = hyperlinkMatcher.group();
attributeMatcher = attributePattern.matcher(link);
StringBuffer updatedLink = new StringBuffer();
boolean shouldAddAttr = true;
while (attributeMatcher.find()) {
String attr = attributeMatcher.group();
Matcher relAttrMatcher = relAttrPattern.matcher(attr);
while (relAttrMatcher.find()) {
noFollowMatcher = noFollow.matcher(attr);
if (!noFollowMatcher.matches()) {
int indexOfQuote = attr.lastIndexOf("\"");
if (indexOfQuote != -1) {
attr = attr.substring(0, indexOfQuote) + " nofollow\"";
shouldAddAttr = false;
}
}
}
updatedLink.append(attr);
}
if (shouldAddAttr) {
updatedLink.append(REL_NOFOLLOW);
}
updatedLink.append((">"));
updatedText.append(updatedLink);
lastIndex = hyperlinkMatcher.end();
}
updatedText.append(text.substring(lastIndex));
return updatedText.toString();
}
public BlogEntry[] process(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlogUser user, Map context, BlogEntry[] entries) throws BlojsomPluginException {
for (int i = 0; i < entries.length; i++) {
BlogEntry entry = entries[i];
Iterator commentsIterator = entry.getComments().iterator();
String commentText;
while (commentsIterator.hasNext()) {
BlogComment blogComment = (BlogComment) commentsIterator.next();
commentText = blogComment.getComment();
commentText = noFollowFy(commentText);
blogComment.setComment(commentText);
}
Iterator trackbacksIterator = entry.getTrackbacks().iterator();
String trackbackText;
while (trackbacksIterator.hasNext()) {
Trackback trackback = (Trackback) trackbacksIterator.next();
trackbackText = trackback.getExcerpt();
trackbackText = noFollowFy(trackbackText);
trackback.setExcerpt(trackbackText);
}
}
return entries;
}
public void cleanup() throws BlojsomPluginException {
}
public void destroy() throws BlojsomPluginException {
}
}