diff --git a/core/src/main/java/hudson/AbstractMarkupText.java b/core/src/main/java/hudson/AbstractMarkupText.java index a25e3fed24..4f1062615b 100644 --- a/core/src/main/java/hudson/AbstractMarkupText.java +++ b/core/src/main/java/hudson/AbstractMarkupText.java @@ -49,6 +49,10 @@ public abstract class AbstractMarkupText { */ public abstract String getText(); + public char charAt(int idx) { + return getText().charAt(idx); + } + /** * Length of the plain text. */ @@ -56,6 +60,14 @@ public abstract class AbstractMarkupText { return getText().length(); } + /** + * Returns a subtext. + * + * @param end + * If negative, -N means "trim the last N-1 chars". That is, (s,-1) is the same as (s,length) + */ + public abstract MarkupText.SubText subText(int start, int end); + /** * Adds a start tag and end tag at the specified position. * diff --git a/core/src/main/java/hudson/MarkupText.java b/core/src/main/java/hudson/MarkupText.java index 28d88e18a4..138dc6202d 100644 --- a/core/src/main/java/hudson/MarkupText.java +++ b/core/src/main/java/hudson/MarkupText.java @@ -89,6 +89,18 @@ public class MarkupText extends AbstractMarkupText { } } + public SubText(int start, int end) { + this.start = start; + this.end = end; + groups = new int[0]; + } + + @Override + public SubText subText(int start, int end) { + return MarkupText.this.subText(this.start+start, + end<0 ? this.end+1+end : this.end+end); + } + @Override public String getText() { return text.substring(start,end); @@ -224,6 +236,16 @@ public class MarkupText extends AbstractMarkupText { return text; } + /** + * Returns a subtext. + * + * @param end + * If negative, -N means "trim the last N-1 chars". That is, (s,-1) is the same as (s,length) + */ + public SubText subText(int start, int end) { + return new SubText(start, end<0 ? text.length()+1+end : end); + } + @Override public void addMarkup( int startPos, int endPos, String startTag, String endTag ) { rangeCheck(startPos); diff --git a/core/src/main/java/hudson/console/UrlAnnotator.java b/core/src/main/java/hudson/console/UrlAnnotator.java index 14634d5d35..99e422307b 100644 --- a/core/src/main/java/hudson/console/UrlAnnotator.java +++ b/core/src/main/java/hudson/console/UrlAnnotator.java @@ -20,8 +20,15 @@ public class UrlAnnotator extends ConsoleAnnotatorFactory { private static class UrlConsoleAnnotator extends ConsoleAnnotator { public ConsoleAnnotator annotate(Object context, MarkupText text) { - for (SubText t : text.findTokens(URL)) + for (SubText t : text.findTokens(URL)) { + int prev = t.start() - 1; + char ch = prev>=0 ? text.charAt(prev) : ' '; + int idx = OPEN.indexOf(ch); + if (idx>=0) {// if inside a bracket, exclude the end bracket. + t=t.subText(0,t.getText().indexOf(CLOSE.charAt(idx))); + } t.href(t.getText()); + } return this; } @@ -34,5 +41,8 @@ public class UrlAnnotator extends ConsoleAnnotatorFactory { * to URL in plain text (e.g., test="http://www.example.com/") */ private static final Pattern URL = Pattern.compile("\\b(http|https|ftp)://[^\\s<>]+[^\\s<>,:\"'()\\[\\]=]"); + + private static final String OPEN = "'\"([<"; + private static final String CLOSE= "'\")]>"; } }