package hudson.plugins.codeplex; 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://www.codeplex.com/CodePlex/Wiki/View.aspx?title=CodePlex%20Wiki%20Markup%20Guide">CodePlex Wiki Markup Guide</a> * notation in changelog messages. * * @author Erik Ramfelt */ @Extension public class CodePlexChangeLogAnnotator extends ChangeLogAnnotator { /** * Return the property from the project for the build * @param build build to return property for * @return project property if it exists */ private CodePlexProjectProperty getProperty(AbstractBuild<?,?> build) { return build.getProject().getProperty(CodePlexProjectProperty.class); } @Override public void annotate(AbstractBuild<?,?> build, Entry change, MarkupText text) { CodePlexProjectProperty property = getProperty(build); if(property==null || property.projectName==null) return; // not configured String url = property.getProjectUrlString(); 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) { this(pattern, href, 0); } LinkMarkup(String pattern, String href, int flags) { 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, flags); 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( "\\[workitem:\\s*(NUM)]", "WorkItem/View.aspx?WorkItemId=$1", Pattern.CASE_INSENSITIVE), new LinkMarkup( "\\[discussion:\\s*(NUM)]", "Thread/View.aspx?ThreadId=$1", Pattern.CASE_INSENSITIVE), new LinkMarkup( "\\[([^:]+)]", "Wiki/View.aspx?title=$1"), new LinkMarkup( "wiki:(ANYWORD)", "Wiki/View.aspx?title=$1"), }; }