diff options
author | Freddy Mallet <freddy.mallet@gmail.com> | 2011-04-23 00:46:05 +0200 |
---|---|---|
committer | Freddy Mallet <freddy.mallet@gmail.com> | 2011-04-23 00:46:05 +0200 |
commit | 84159b5d85a0b99790ba8ea90e463076d541ed5c (patch) | |
tree | c6f52c84eb62aa8e287b48d07765297daf61f9f2 /sonar-markdown | |
parent | b6f08e746d29a10f73c9e37ea828f093d68a89bd (diff) | |
download | sonarqube-84159b5d85a0b99790ba8ea90e463076d541ed5c.tar.gz sonarqube-84159b5d85a0b99790ba8ea90e463076d541ed5c.zip |
SONAR-2384 First implementation : Create a markdown dedicated to Sonar needs
Diffstat (limited to 'sonar-markdown')
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 ''")); + } + +} |