diff --git a/src/main/java/org/kohsuke/github/GHRepository.java b/src/main/java/org/kohsuke/github/GHRepository.java index 7c7e55d32..1c9fcc7b3 100644 --- a/src/main/java/org/kohsuke/github/GHRepository.java +++ b/src/main/java/org/kohsuke/github/GHRepository.java @@ -30,7 +30,9 @@ import org.apache.commons.lang.StringUtils; import javax.xml.bind.DatatypeConverter; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStreamReader; import java.io.InterruptedIOException; +import java.io.Reader; import java.net.URL; import java.util.*; @@ -1149,7 +1151,25 @@ public class GHRepository extends GHObject { return contributions; } } - + + /** + * Render a Markdown document. + * + * In {@linkplain MarkdownMode#GFM GFM mode}, issue numbers and user mentions + * are linked accordingly. + * + * @see GitHub#renderMarkdown(String) + */ + public Reader renderMarkdown(String text, MarkdownMode mode) throws IOException { + return new InputStreamReader( + new Requester(root) + .with("text", text) + .with("mode",mode==null?null:mode.toString()) + .with("context", getFullName()) + .read("/markdown"), + "UTF-8"); + } + @Override diff --git a/src/main/java/org/kohsuke/github/GitHub.java b/src/main/java/org/kohsuke/github/GitHub.java index e94a47c94..4781f6915 100644 --- a/src/main/java/org/kohsuke/github/GitHub.java +++ b/src/main/java/org/kohsuke/github/GitHub.java @@ -26,8 +26,10 @@ package org.kohsuke.github; import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.ANY; import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE; +import java.io.ByteArrayInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStreamReader; import java.io.Reader; import java.net.MalformedURLException; import java.net.URL; @@ -470,6 +472,25 @@ public class GitHub { }; } + /** + * Render a Markdown document in raw mode. + * + *

+ * It takes a Markdown document as plaintext and renders it as plain Markdown + * without a repository context (just like a README.md file is rendered – this + * is the simplest way to preview a readme online). + * + * @see GHRepository#renderMarkdown(String, MarkdownMode) + */ + public Reader renderMarkdown(String text) throws IOException { + return new InputStreamReader( + new Requester(this) + .with(new ByteArrayInputStream(text.getBytes("UTF-8"))) + .contentType("text/plain;charset=UTF-8") + .read("/markdown/raw"), + "UTF-8"); + } + /*package*/ static URL parseURL(String s) { try { return s==null ? null : new URL(s); diff --git a/src/main/java/org/kohsuke/github/MarkdownMode.java b/src/main/java/org/kohsuke/github/MarkdownMode.java new file mode 100644 index 000000000..1d6376055 --- /dev/null +++ b/src/main/java/org/kohsuke/github/MarkdownMode.java @@ -0,0 +1,29 @@ +package org.kohsuke.github; + +import java.util.Locale; + +/** + * Rendering mode of markdown. + * + * @author Kohsuke Kawaguchi + * @see GitHub#renderMarkdown(String) + * @see GHRepository#renderMarkdown(String, MarkdownMode) + */ +public enum MarkdownMode { + /** + * Render a document as plain Markdown, just like README files are rendered. + */ + MARKDOWN, + /** + * Render a document as user-content, e.g. like user comments or issues are rendered. + * In GFM mode, hard line breaks are always taken into account, and issue and user + * mentions are linked accordingly. + * + * @see GHRepository#renderMarkdown(String, MarkdownMode) + */ + GFM; + + public String toString() { + return name().toLowerCase(Locale.ENGLISH); + } +} diff --git a/src/main/java/org/kohsuke/github/Requester.java b/src/main/java/org/kohsuke/github/Requester.java index 595b844dd..7f34e7214 100644 --- a/src/main/java/org/kohsuke/github/Requester.java +++ b/src/main/java/org/kohsuke/github/Requester.java @@ -251,7 +251,7 @@ class Requester { buildRequest(uc); try { - return uc.getInputStream(); + return wrapStream(uc,uc.getInputStream()); } catch (IOException e) { handleApiError(e,uc); } diff --git a/src/test/java/org/kohsuke/github/AppTest.java b/src/test/java/org/kohsuke/github/AppTest.java index 806d47322..31dfb5260 100755 --- a/src/test/java/org/kohsuke/github/AppTest.java +++ b/src/test/java/org/kohsuke/github/AppTest.java @@ -4,6 +4,7 @@ import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import org.apache.commons.io.IOUtils; import org.junit.Assume; import org.junit.Test; import org.kohsuke.github.GHCommit.File; @@ -758,11 +759,24 @@ public class AppTest extends AbstractGitHubApiTestBase { String content1 = content.getContent(); String content2 = r.getFileContent(content.getPath(), "gh-pages").getContent(); System.out.println(content.getPath()); - assertEquals(content1,content2); + assertEquals(content1, content2); } } } + @Test + public void markDown() throws Exception { + assertEquals("

Test日本語

", IOUtils.toString(gitHub.renderMarkdown("**Test日本語**")).trim()); + + String actual = IOUtils.toString(gitHub.getRepository("kohsuke/github-api").renderMarkdown("@kohsuke to fix issue #1", MarkdownMode.GFM)); + System.out.println(actual); + assertTrue(actual.contains("href=\"https://github.com/kohsuke\"")); + assertTrue(actual.contains("href=\"https://github.com/kohsuke/github-api/pull/1\"")); + assertTrue(actual.contains("class=\"user-mention\"")); + assertTrue(actual.contains("class=\"issue-link\"")); + assertTrue(actual.contains("to fix issue")); + } + private void kohsuke() { String login = getUser().getLogin(); Assume.assumeTrue(login.equals("kohsuke") || login.equals("kohsuke2"));