aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-markdown
diff options
context:
space:
mode:
authorFreddy Mallet <freddy.mallet@gmail.com>2011-04-23 00:46:05 +0200
committerFreddy Mallet <freddy.mallet@gmail.com>2011-04-23 00:46:05 +0200
commit84159b5d85a0b99790ba8ea90e463076d541ed5c (patch)
treec6f52c84eb62aa8e287b48d07765297daf61f9f2 /sonar-markdown
parentb6f08e746d29a10f73c9e37ea828f093d68a89bd (diff)
downloadsonarqube-84159b5d85a0b99790ba8ea90e463076d541ed5c.tar.gz
sonarqube-84159b5d85a0b99790ba8ea90e463076d541ed5c.zip
SONAR-2384 First implementation : Create a markdown dedicated to Sonar needs
Diffstat (limited to 'sonar-markdown')
-rw-r--r--sonar-markdown/pom.xml43
-rw-r--r--sonar-markdown/src/main/java/org/sonar/markdown/BlackholeChannel.java32
-rw-r--r--sonar-markdown/src/main/java/org/sonar/markdown/HtmlEmphasisChannel.java34
-rw-r--r--sonar-markdown/src/main/java/org/sonar/markdown/HtmlEndOfLineChannel.java34
-rw-r--r--sonar-markdown/src/main/java/org/sonar/markdown/HtmlUrlChannel.java34
-rw-r--r--sonar-markdown/src/main/java/org/sonar/markdown/IdentifierAndNumberChannel.java34
-rw-r--r--sonar-markdown/src/main/java/org/sonar/markdown/MarkdownEngine.java50
-rw-r--r--sonar-markdown/src/main/java/org/sonar/markdown/MarkdownOutput.java37
-rw-r--r--sonar-markdown/src/test/java/org/sonar/markdown/MarkdownEngineTest.java50
9 files changed, 348 insertions, 0 deletions
diff --git a/sonar-markdown/pom.xml b/sonar-markdown/pom.xml
new file mode 100644
index 00000000000..76e2a7c3aef
--- /dev/null
+++ b/sonar-markdown/pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.codehaus.sonar</groupId>
+ <artifactId>sonar</artifactId>
+ <version>2.8-SNAPSHOT</version>
+ <relativePath>..</relativePath>
+ </parent>
+ <artifactId>sonar-markdown</artifactId>
+ <name>Sonar :: Markdown</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.codehaus.sonar</groupId>
+ <artifactId>sonar-channel</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-classic</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.hamcrest</groupId>
+ <artifactId>hamcrest-all</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project> \ No newline at end of file
diff --git a/sonar-markdown/src/main/java/org/sonar/markdown/BlackholeChannel.java b/sonar-markdown/src/main/java/org/sonar/markdown/BlackholeChannel.java
new file mode 100644
index 00000000000..e872e3e977a
--- /dev/null
+++ b/sonar-markdown/src/main/java/org/sonar/markdown/BlackholeChannel.java
@@ -0,0 +1,32 @@
+/*
+ * Sonar, open source software quality management tool.
+ * Copyright (C) 2008-2011 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * Sonar 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.
+ *
+ * Sonar 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 Sonar; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
+ */
+package org.sonar.markdown;
+
+import org.sonar.channel.Channel;
+import org.sonar.channel.CodeReader;
+
+class BlackholeChannel extends Channel<MarkdownOutput> {
+
+ @Override
+ public boolean consume(CodeReader code, MarkdownOutput output) {
+ output.append((char)code.pop());
+ return true;
+ }
+}
diff --git a/sonar-markdown/src/main/java/org/sonar/markdown/HtmlEmphasisChannel.java b/sonar-markdown/src/main/java/org/sonar/markdown/HtmlEmphasisChannel.java
new file mode 100644
index 00000000000..146797ed7e4
--- /dev/null
+++ b/sonar-markdown/src/main/java/org/sonar/markdown/HtmlEmphasisChannel.java
@@ -0,0 +1,34 @@
+/*
+ * Sonar, open source software quality management tool.
+ * Copyright (C) 2008-2011 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * Sonar 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.
+ *
+ * Sonar 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 Sonar; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
+ */
+package org.sonar.markdown;
+
+import org.sonar.channel.RegexChannel;
+
+class HtmlEmphasisChannel extends RegexChannel<MarkdownOutput> {
+
+ public HtmlEmphasisChannel() {
+ super("\\*[^\n\r]*\\*");
+ }
+
+ @Override
+ protected void consume(CharSequence token, MarkdownOutput output) {
+ output.append("<em>" + token.subSequence(1, token.length() - 1) + "</em>");
+ }
+}
diff --git a/sonar-markdown/src/main/java/org/sonar/markdown/HtmlEndOfLineChannel.java b/sonar-markdown/src/main/java/org/sonar/markdown/HtmlEndOfLineChannel.java
new file mode 100644
index 00000000000..d7ed7afcdbd
--- /dev/null
+++ b/sonar-markdown/src/main/java/org/sonar/markdown/HtmlEndOfLineChannel.java
@@ -0,0 +1,34 @@
+/*
+ * Sonar, open source software quality management tool.
+ * Copyright (C) 2008-2011 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * Sonar 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.
+ *
+ * Sonar 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 Sonar; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
+ */
+package org.sonar.markdown;
+
+import org.sonar.channel.RegexChannel;
+
+class HtmlEndOfLineChannel extends RegexChannel<MarkdownOutput> {
+
+ public HtmlEndOfLineChannel() {
+ super("(\r?\n)|(\r)");
+ }
+
+ @Override
+ protected void consume(CharSequence token, MarkdownOutput output) {
+ output.append("<br/>");
+ }
+}
diff --git a/sonar-markdown/src/main/java/org/sonar/markdown/HtmlUrlChannel.java b/sonar-markdown/src/main/java/org/sonar/markdown/HtmlUrlChannel.java
new file mode 100644
index 00000000000..6bfa51d8508
--- /dev/null
+++ b/sonar-markdown/src/main/java/org/sonar/markdown/HtmlUrlChannel.java
@@ -0,0 +1,34 @@
+/*
+ * Sonar, open source software quality management tool.
+ * Copyright (C) 2008-2011 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * Sonar 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.
+ *
+ * Sonar 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 Sonar; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
+ */
+package org.sonar.markdown;
+
+import org.sonar.channel.RegexChannel;
+
+class HtmlUrlChannel extends RegexChannel<MarkdownOutput> {
+
+ public HtmlUrlChannel() {
+ super("https?://[\\w\\d:#@%/;$()~_?\\+-=\\.&]*");
+ }
+
+ @Override
+ protected void consume(CharSequence token, MarkdownOutput output) {
+ output.append("<a href=\"" +token + "\">" + token + "</a>");
+ }
+}
diff --git a/sonar-markdown/src/main/java/org/sonar/markdown/IdentifierAndNumberChannel.java b/sonar-markdown/src/main/java/org/sonar/markdown/IdentifierAndNumberChannel.java
new file mode 100644
index 00000000000..cb94f4b205e
--- /dev/null
+++ b/sonar-markdown/src/main/java/org/sonar/markdown/IdentifierAndNumberChannel.java
@@ -0,0 +1,34 @@
+/*
+ * Sonar, open source software quality management tool.
+ * Copyright (C) 2008-2011 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * Sonar 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.
+ *
+ * Sonar 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 Sonar; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
+ */
+package org.sonar.markdown;
+
+import org.sonar.channel.RegexChannel;
+
+class IdentifierAndNumberChannel extends RegexChannel<MarkdownOutput> {
+
+ public IdentifierAndNumberChannel() {
+ super("[\\p{Alpha}\\d]++");
+ }
+
+ @Override
+ protected void consume(CharSequence token, MarkdownOutput output) {
+ output.append(token);
+ }
+}
diff --git a/sonar-markdown/src/main/java/org/sonar/markdown/MarkdownEngine.java b/sonar-markdown/src/main/java/org/sonar/markdown/MarkdownEngine.java
new file mode 100644
index 00000000000..fb51e9c4b2f
--- /dev/null
+++ b/sonar-markdown/src/main/java/org/sonar/markdown/MarkdownEngine.java
@@ -0,0 +1,50 @@
+/*
+ * Sonar, open source software quality management tool.
+ * Copyright (C) 2008-2011 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * Sonar 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.
+ *
+ * Sonar 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 Sonar; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
+ */
+package org.sonar.markdown;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.sonar.channel.Channel;
+import org.sonar.channel.ChannelDispatcher;
+import org.sonar.channel.CodeReader;
+
+public class MarkdownEngine {
+
+ private MarkdownOutput output;
+ private ChannelDispatcher<MarkdownOutput> dispatcher;
+
+ private MarkdownEngine() {
+ output = new MarkdownOutput();
+ List<Channel> markdownChannels = new ArrayList<Channel>();
+ markdownChannels.add(new HtmlUrlChannel());
+ markdownChannels.add(new HtmlEndOfLineChannel());
+ markdownChannels.add(new HtmlEmphasisChannel());
+ markdownChannels.add(new IdentifierAndNumberChannel());
+ markdownChannels.add(new BlackholeChannel());
+ dispatcher = new ChannelDispatcher<MarkdownOutput>(markdownChannels);
+ }
+
+ public static String convertToHtml(String input) {
+ MarkdownEngine engine = new MarkdownEngine();
+ engine.dispatcher.consume(new CodeReader(input), engine.output);
+ return engine.output.toString();
+ }
+}
diff --git a/sonar-markdown/src/main/java/org/sonar/markdown/MarkdownOutput.java b/sonar-markdown/src/main/java/org/sonar/markdown/MarkdownOutput.java
new file mode 100644
index 00000000000..c4d59e460de
--- /dev/null
+++ b/sonar-markdown/src/main/java/org/sonar/markdown/MarkdownOutput.java
@@ -0,0 +1,37 @@
+/*
+ * Sonar, open source software quality management tool.
+ * Copyright (C) 2008-2011 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * Sonar 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.
+ *
+ * Sonar 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 Sonar; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
+ */
+package org.sonar.markdown;
+
+class MarkdownOutput {
+
+ private StringBuilder ouput = new StringBuilder();
+
+ public Appendable append(CharSequence charSequence) {
+ return ouput.append(charSequence);
+ }
+
+ public Appendable append(char character) {
+ return ouput.append(character);
+ }
+
+ public String toString() {
+ return ouput.toString();
+ }
+}
diff --git a/sonar-markdown/src/test/java/org/sonar/markdown/MarkdownEngineTest.java b/sonar-markdown/src/test/java/org/sonar/markdown/MarkdownEngineTest.java
new file mode 100644
index 00000000000..e90b45a093f
--- /dev/null
+++ b/sonar-markdown/src/test/java/org/sonar/markdown/MarkdownEngineTest.java
@@ -0,0 +1,50 @@
+/*
+ * Sonar, open source software quality management tool.
+ * Copyright (C) 2008-2011 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * Sonar 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.
+ *
+ * Sonar 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 Sonar; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
+ */
+package org.sonar.markdown;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Test;
+
+public class MarkdownEngineTest {
+
+ @Test
+ public void shouldDecorateUrl() {
+ assertThat(MarkdownEngine.convertToHtml("http://google.com"), is("<a href=\"http://google.com\">http://google.com</a>"));
+ }
+
+ @Test
+ public void shouldDecorateEndOfLine() {
+ assertThat(MarkdownEngine.convertToHtml("1\r2\r\n3\n"), is("1<br/>2<br/>3<br/>"));
+ }
+
+ @Test
+ public void shouldEmphaseText() {
+ assertThat(MarkdownEngine.convertToHtml("This is *important*"), is("This is <em>important</em>"));
+ assertThat(MarkdownEngine.convertToHtml("This should not be * \n emphase"), is("This should not be * <br/> emphase"));
+ }
+
+ @Test
+ public void shouldNotChangeAnythingInTheText() {
+ assertThat(MarkdownEngine.convertToHtml("My text is $123 ''"), is("My text is $123 ''"));
+ }
+
+}