📄 bookmarkplugin.java
字号:
/* * Created on Nov 2, 2003 * */package org.roller.presentation.velocity.plugins.bookmarks;import org.apache.commons.lang.StringEscapeUtils;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.apache.velocity.context.Context;import org.roller.RollerException;import org.roller.model.BookmarkManager;import org.roller.model.RollerFactory;import org.roller.pojos.BookmarkData;import org.roller.pojos.FolderData;import org.roller.pojos.WeblogEntryData;import org.roller.presentation.RollerRequest;import org.roller.presentation.velocity.PagePlugin;import java.util.regex.PatternSyntaxException;import java.util.regex.Matcher;import java.util.regex.Pattern;import java.util.Collection;import java.util.Iterator;/** * @author lance * @author Anil Gangolli (significant modifications) */public class BookmarkPlugin implements PagePlugin{ protected String name = "Bookmark Linker"; protected String description = "Automatically uses your Bookmarks to " + "create links. Simply use the Name of a Bookmark and it will be " + "converted into a hyperlink using the Bookmark's URL."; private static Log mLogger = LogFactory.getFactory().getInstance(BookmarkPlugin.class); public BookmarkPlugin() { mLogger.debug("BookmarkPlugin instantiated."); } public String toString() { return name; } /* (non-Javadoc) * @see org.roller.presentation.velocity.PagePlugin#init(org.roller.presentation.RollerRequest, org.apache.velocity.context.Context) */ public void init(RollerRequest rreq, Context ctx) throws RollerException { } /* * Without Website cannot lookup Folders & Bookmarks * (non-Javadoc) * @see org.roller.presentation.velocity.PagePlugin#render(java.lang.String) */ public String render(String text) { return text; } public String render(WeblogEntryData entry, boolean skipFlag) { String text = entry.getText(); try { BookmarkManager bMgr = RollerFactory.getRoller().getBookmarkManager(); FolderData rootFolder = bMgr.getRootFolder(entry.getWebsite()); text = matchBookmarks(text, rootFolder); text = lookInFolders(text, rootFolder.getFolders()); } catch (RollerException e) { // nothing much I can do, go with default "Weblog" value // could be RollerException or NullPointerException mLogger.warn(e); } return text; } /** * Recursively travel down Folder tree, attempting * to match up Bookmarks in each Folder. * * @param text * @param folders * @return */ private String lookInFolders(String text, Collection folders) { Iterator it = folders.iterator(); while (it.hasNext()) { FolderData folder = (FolderData)it.next(); text = matchBookmarks(text, folder); try { if (!folder.getFolders().isEmpty()) { lookInFolders(text, folder.getFolders()); } } catch (RollerException e) { mLogger.error("Error getting child Folders"); } } return text; } private String matchBookmarks(String text, FolderData folder) { Iterator bookmarks = folder.getBookmarks().iterator(); String workingText = text; while (bookmarks.hasNext()) { BookmarkData bookmark = (BookmarkData)bookmarks.next(); String bkDescription = bookmark.getDescription(); if (bkDescription == null) bkDescription = ""; String bookmarkLink = "<a href=\"" + bookmark.getUrl() + "\" title=\"" + bkDescription + "\">" + bookmark.getName() + "</a>"; try { // Replace all occurrences of bookmark name that don't occur within the bounds of an anchor tag // Notes: // - use reluctant quantifiers on the tags to avoid gobbling more than desired // - use non-capturing groups for boundaries to avoid replacing the boundary as well as the bookmark name. // - we depend on the numbering of the specific groups in this expression in the replacement code below. // TODO: should escape the bookmark name String regEx = "(<a(?:\\s.*?)??/>)|(<a(?:\\s.*?)??>)|(</a(?:\\s.*?)??>)|(?:\\b)(" + bookmark.getName() + ")(?:\\b)"; Matcher m = Pattern.compile(regEx).matcher(workingText); StringBuffer textBuf = new StringBuffer(workingText.length()); int inLink = 0; while (m.find()) { if (m.group(1) != null) { // self-closed anchor tag <a ... /> -- ignore } else if (m.group(2) != null) { // matched opening anchor tag <a ...> inLink++; } else if (m.group(3) != null) { // closing anchor tag </a>, but ignore nonmatching ones if (inLink > 0) inLink--; } else if (m.group(4) != null) { // matched the bookmark -- replace, but only if not within a link tag. if (inLink == 0) m.appendReplacement(textBuf, bookmarkLink); } // Any remaining case indicates a bug. One could add an else with assertion here. Conservatively don't substitute. } m.appendTail(textBuf); workingText = textBuf.toString(); } catch (PatternSyntaxException e) { // Can happen since we don't escape pattern the bookmark name to protect pattern characters. mLogger.warn("Failed to substitute for bookmark [" + bookmark.getName() + "] due to regular expression characters."); } } return workingText.toString(); } public String getName() { return name; } public String getDescription() { return StringEscapeUtils.escapeJavaScript(description); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -