package hudson.plugins.googlecode; import hudson.Extension; import hudson.MarkupText; import hudson.MarkupText.SubText; import hudson.model.AbstractBuild; import hudson.scm.ChangeLogAnnotator; import hudson.scm.ChangeLogSet.Entry; import java.util.regex.Pattern; /** * Annotates <a href="http://code.google.com/p/support/wiki/WikiSyntax">WikiSyntax</a> * notation in changelog messages. * * @author Kohsuke Kawaguchi * @author Erik Ramfelt */ @Extension public class GoogleCodeLinkAnnotator extends ChangeLogAnnotator { private GoogleCodeProjectProperty.PropertyRetriever propertyRetriever; public GoogleCodeLinkAnnotator() { this(new GoogleCodeProjectProperty.PropertyRetrieverImpl()); } public GoogleCodeLinkAnnotator(GoogleCodeProjectProperty.PropertyRetriever propertyRetriever) { this.propertyRetriever = propertyRetriever; } @Override public void annotate(AbstractBuild<?,?> build, Entry change, MarkupText text) { GoogleCodeProjectProperty property = propertyRetriever.getProperty(build); if(property==null || property.googlecodeWebsite==null) return; // not configured String url = property.googlecodeWebsite; for (LinkMarkup markup : MARKUPS) markup.process(text, url); } static final class LinkMarkup { private final Pattern pattern; private final String href; LinkMarkup(String pattern, String href) { pattern = NUM_PATTERN.matcher(pattern).replaceAll("(\\\\d+)"); // \\\\d becomes \\d when in the expanded text. pattern = ANYWORD_PATTERN.matcher(pattern).replaceAll("((?:\\\\w|[._-])+)"); this.pattern = Pattern.compile(pattern); this.href = href; } void process(MarkupText text, String url) { for(SubText st : text.findTokens(pattern)) { st.surroundWith( "<a href='"+url+href+"'>", "</a>"); } } private static final Pattern NUM_PATTERN = Pattern.compile("NUM"); private static final Pattern ANYWORD_PATTERN = Pattern.compile("ANYWORD"); } static final LinkMarkup[] MARKUPS = new LinkMarkup[] { new LinkMarkup( "(?:#|issue )NUM", "issues/detail?id=$1"), new LinkMarkup( "issue #?NUM:NUM", "issues/detail?id=$1#$2"), new LinkMarkup( "((?:[A-Z][a-z]+){2,})|wiki:ANYWORD", "wiki/$1$2") }; }