aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-markdown
diff options
context:
space:
mode:
Diffstat (limited to 'sonar-markdown')
-rw-r--r--sonar-markdown/src/main/java/org/sonar/markdown/HtmlLinkChannel.java56
-rw-r--r--sonar-markdown/src/main/java/org/sonar/markdown/Markdown.java1
-rw-r--r--sonar-markdown/src/test/java/org/sonar/markdown/MarkdownTest.java7
3 files changed, 64 insertions, 0 deletions
diff --git a/sonar-markdown/src/main/java/org/sonar/markdown/HtmlLinkChannel.java b/sonar-markdown/src/main/java/org/sonar/markdown/HtmlLinkChannel.java
new file mode 100644
index 00000000000..bcaada38172
--- /dev/null
+++ b/sonar-markdown/src/main/java/org/sonar/markdown/HtmlLinkChannel.java
@@ -0,0 +1,56 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.markdown;
+
+import org.sonar.channel.RegexChannel;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Markdown interprets text in brackets followed by text in parentheses to generate documented links.
+ *
+ * E.g., the input [See documentation](http://docs.codehaus.org/display/SONAR) will produce
+ * {@literal<a href="http://docs.codehaus.org/display/SONAR">}See documentation{@literal</a>}
+ */
+class HtmlLinkChannel extends RegexChannel<MarkdownOutput> {
+
+ private static final String LINK_REGEX = "\\[([^\\]]+)\\]\\(([^\\)]+)\\)";
+
+ private static final Pattern LINK_PATTERN = Pattern.compile(LINK_REGEX);
+
+ public HtmlLinkChannel() {
+ super(LINK_REGEX);
+ }
+
+ @Override
+ protected void consume(CharSequence token, MarkdownOutput output) {
+ Matcher matcher = LINK_PATTERN.matcher(token);
+ // Initialize match groups
+ matcher.matches();
+ String content = matcher.group(1);
+ String url = matcher.group(2);
+ output.append("<a href=\"");
+ output.append(url);
+ output.append("\" target=\"_blank\">");
+ output.append(content);
+ output.append("</a>");
+ }
+}
diff --git a/sonar-markdown/src/main/java/org/sonar/markdown/Markdown.java b/sonar-markdown/src/main/java/org/sonar/markdown/Markdown.java
index acdb58a6ebd..5323a3966d5 100644
--- a/sonar-markdown/src/main/java/org/sonar/markdown/Markdown.java
+++ b/sonar-markdown/src/main/java/org/sonar/markdown/Markdown.java
@@ -31,6 +31,7 @@ public final class Markdown {
private Markdown() {
dispatcher = ChannelDispatcher.builder()
+ .addChannel(new HtmlLinkChannel())
.addChannel(new HtmlUrlChannel())
.addChannel(new HtmlEndOfLineChannel())
.addChannel(new HtmlEmphasisChannel())
diff --git a/sonar-markdown/src/test/java/org/sonar/markdown/MarkdownTest.java b/sonar-markdown/src/test/java/org/sonar/markdown/MarkdownTest.java
index 0f96cf2a59f..909fda8c539 100644
--- a/sonar-markdown/src/test/java/org/sonar/markdown/MarkdownTest.java
+++ b/sonar-markdown/src/test/java/org/sonar/markdown/MarkdownTest.java
@@ -32,6 +32,13 @@ public class MarkdownTest {
}
@Test
+ public void shouldDecorateDocumentedLink() {
+ assertThat(Markdown.convertToHtml("For more details, please [check online documentation](http://docs.codehaus.org/display/SONAR)."))
+ .isEqualTo("For more details, please <a href=\"http://docs.codehaus.org/display/SONAR\" target=\"_blank\">check online documentation</a>.");
+ }
+
+
+ @Test
public void shouldDecorateEndOfLine() {
assertThat(Markdown.convertToHtml("1\r2\r\n3\n")).isEqualTo("1<br/>2<br/>3<br/>");
}