From 84159b5d85a0b99790ba8ea90e463076d541ed5c Mon Sep 17 00:00:00 2001 From: Freddy Mallet Date: Sat, 23 Apr 2011 00:46:05 +0200 Subject: [PATCH] SONAR-2384 First implementation : Create a markdown dedicated to Sonar needs --- pom.xml | 1 + sonar-channel/pom.xml | 28 +++++++---- .../org/sonar/channel/ChannelDispatcher.java | 14 ++++-- sonar-markdown/pom.xml | 43 ++++++++++++++++ .../org/sonar/markdown/BlackholeChannel.java | 32 ++++++++++++ .../sonar/markdown/HtmlEmphasisChannel.java | 34 +++++++++++++ .../sonar/markdown/HtmlEndOfLineChannel.java | 34 +++++++++++++ .../org/sonar/markdown/HtmlUrlChannel.java | 34 +++++++++++++ .../markdown/IdentifierAndNumberChannel.java | 34 +++++++++++++ .../org/sonar/markdown/MarkdownEngine.java | 50 +++++++++++++++++++ .../org/sonar/markdown/MarkdownOutput.java | 37 ++++++++++++++ .../sonar/markdown/MarkdownEngineTest.java | 50 +++++++++++++++++++ 12 files changed, 376 insertions(+), 15 deletions(-) create mode 100644 sonar-markdown/pom.xml create mode 100644 sonar-markdown/src/main/java/org/sonar/markdown/BlackholeChannel.java create mode 100644 sonar-markdown/src/main/java/org/sonar/markdown/HtmlEmphasisChannel.java create mode 100644 sonar-markdown/src/main/java/org/sonar/markdown/HtmlEndOfLineChannel.java create mode 100644 sonar-markdown/src/main/java/org/sonar/markdown/HtmlUrlChannel.java create mode 100644 sonar-markdown/src/main/java/org/sonar/markdown/IdentifierAndNumberChannel.java create mode 100644 sonar-markdown/src/main/java/org/sonar/markdown/MarkdownEngine.java create mode 100644 sonar-markdown/src/main/java/org/sonar/markdown/MarkdownOutput.java create mode 100644 sonar-markdown/src/test/java/org/sonar/markdown/MarkdownEngineTest.java diff --git a/pom.xml b/pom.xml index a845a45a733..9e4210fab3b 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,7 @@ sonar-graph sonar-gwt-api sonar-java-api + sonar-markdown sonar-maven-plugin sonar-maven3-plugin sonar-plugin-api diff --git a/sonar-channel/pom.xml b/sonar-channel/pom.xml index f61178ddd83..517bc38f164 100644 --- a/sonar-channel/pom.xml +++ b/sonar-channel/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 org.codehaus.sonar @@ -20,15 +21,20 @@ org.slf4j slf4j-api - - junit - junit - test - - - org.hamcrest - hamcrest-all - test - + + junit + junit + test + + + org.hamcrest + hamcrest-all + test + + + ch.qos.logback + logback-classic + test + \ No newline at end of file diff --git a/sonar-channel/src/main/java/org/sonar/channel/ChannelDispatcher.java b/sonar-channel/src/main/java/org/sonar/channel/ChannelDispatcher.java index aaab3cf97c8..d772d81ffd5 100644 --- a/sonar-channel/src/main/java/org/sonar/channel/ChannelDispatcher.java +++ b/sonar-channel/src/main/java/org/sonar/channel/ChannelDispatcher.java @@ -20,6 +20,7 @@ package org.sonar.channel; +import java.util.Arrays; import java.util.List; import org.slf4j.Logger; @@ -34,13 +35,18 @@ public class ChannelDispatcher extends Channel { private final Channel[] channels; @SuppressWarnings("rawtypes") - public ChannelDispatcher(List tokenizers) { - this(tokenizers, false); + public ChannelDispatcher(List channels) { + this(channels, false); } @SuppressWarnings("rawtypes") - public ChannelDispatcher(List tokenizers, boolean failIfNoChannelToConsumeOneCharacter) { - this.channels = tokenizers.toArray(new Channel[0]); // NOSONAR, lack of performance is not an issue here + public ChannelDispatcher(Channel... channels) { + this(Arrays.asList(channels), false); + } + + @SuppressWarnings("rawtypes") + public ChannelDispatcher(List channels, boolean failIfNoChannelToConsumeOneCharacter) { + this.channels = channels.toArray(new Channel[0]); // NOSONAR, lack of performance is not an issue here this.failIfNoChannelToConsumeOneCharacter = failIfNoChannelToConsumeOneCharacter; } 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 @@ + + + 4.0.0 + + org.codehaus.sonar + sonar + 2.8-SNAPSHOT + .. + + sonar-markdown + Sonar :: Markdown + + + + org.codehaus.sonar + sonar-channel + + + commons-io + commons-io + + + org.slf4j + slf4j-api + + + junit + junit + test + + + ch.qos.logback + logback-classic + test + + + org.hamcrest + hamcrest-all + test + + + \ 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 { + + @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 { + + public HtmlEmphasisChannel() { + super("\\*[^\n\r]*\\*"); + } + + @Override + protected void consume(CharSequence token, MarkdownOutput output) { + output.append("" + token.subSequence(1, token.length() - 1) + ""); + } +} 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 { + + public HtmlEndOfLineChannel() { + super("(\r?\n)|(\r)"); + } + + @Override + protected void consume(CharSequence token, MarkdownOutput output) { + output.append("
"); + } +} 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 { + + public HtmlUrlChannel() { + super("https?://[\\w\\d:#@%/;$()~_?\\+-=\\.&]*"); + } + + @Override + protected void consume(CharSequence token, MarkdownOutput output) { + output.append("" + token + ""); + } +} 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 { + + 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 dispatcher; + + private MarkdownEngine() { + output = new MarkdownOutput(); + List markdownChannels = new ArrayList(); + markdownChannels.add(new HtmlUrlChannel()); + markdownChannels.add(new HtmlEndOfLineChannel()); + markdownChannels.add(new HtmlEmphasisChannel()); + markdownChannels.add(new IdentifierAndNumberChannel()); + markdownChannels.add(new BlackholeChannel()); + dispatcher = new ChannelDispatcher(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("http://google.com")); + } + + @Test + public void shouldDecorateEndOfLine() { + assertThat(MarkdownEngine.convertToHtml("1\r2\r\n3\n"), is("1
2
3
")); + } + + @Test + public void shouldEmphaseText() { + assertThat(MarkdownEngine.convertToHtml("This is *important*"), is("This is important")); + assertThat(MarkdownEngine.convertToHtml("This should not be * \n emphase"), is("This should not be *
emphase")); + } + + @Test + public void shouldNotChangeAnythingInTheText() { + assertThat(MarkdownEngine.convertToHtml("My text is $123 ''"), is("My text is $123 ''")); + } + +} -- 2.39.5