]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-4681 Add support for documented links
authorJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Fri, 9 May 2014 12:39:27 +0000 (14:39 +0200)
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Fri, 9 May 2014 13:15:53 +0000 (15:15 +0200)
sonar-markdown/src/main/java/org/sonar/markdown/HtmlLinkChannel.java [new file with mode: 0644]
sonar-markdown/src/main/java/org/sonar/markdown/Markdown.java
sonar-markdown/src/test/java/org/sonar/markdown/MarkdownTest.java

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 (file)
index 0000000..bcaada3
--- /dev/null
@@ -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>");
+  }
+}
index acdb58a6ebdf28f07f04b8e2bd612bb39a758528..5323a3966d5c60d954561a7588827117765cdcfb 100644 (file)
@@ -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())
index 0f96cf2a59f56542fe2a43b403887314decc7e2b..909fda8c5395ada8c561f940d864d925a65079cb 100644 (file)
@@ -31,6 +31,13 @@ public class MarkdownTest {
         .isEqualTo("<a href=\"http://google.com\" target=\"_blank\">http://google.com</a>");
   }
 
+  @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/>");