/******************************************************************************
* Copyright (c) 2012 GitHub Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Kevin Sawicki (GitHub Inc.) - initial API and implementation
*****************************************************************************/
package org.eclipse.egit.github.core.service;
import static org.eclipse.egit.github.core.client.IGitHubConstants.CHARSET_UTF8;
import static org.eclipse.egit.github.core.client.IGitHubConstants.SEGMENT_MARKDOWN;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.egit.github.core.IRepositoryIdProvider;
import org.eclipse.egit.github.core.client.GitHubClient;
/**
* Service to request Markdown text to be rendered as HTML
*
* @see <a href="http://developer.github.com/v3/markdown/">GitHub Markdown API
* documentation</a>
*/
public class MarkdownService extends GitHubService {
/**
* GitHub-flavored Markdown mode
*/
public static final String MODE_GFM = "gfm";
/**
* Default Markdown mode
*/
public static final String MODE_MARKDOWN = "markdown";
/**
* Create Markdown service
*/
public MarkdownService() {
super();
}
/**
* Create Markdown service for client
*
* @param client
*/
public MarkdownService(final GitHubClient client) {
super(client);
}
private String readStream(final InputStream stream) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(
stream, CHARSET_UTF8));
try {
StringBuilder output = new StringBuilder();
char[] buffer = new char[8192];
int read;
while ((read = reader.read(buffer)) != -1)
output.append(buffer, 0, read);
return output.toString();
} finally {
try {
reader.close();
} catch (IOException ignored) {
// Ignored
}
}
}
/**
* Get stream of HTML for given Markdown text scoped to given repository
* context
*
* @param repo
* @param text
* @return stream of HTML
* @throws IOException
*/
public InputStream getRepositoryStream(final IRepositoryIdProvider repo,
final String text) throws IOException {
String context = getId(repo);
Map<String, String> params = new HashMap<String, String>(3, 1);
params.put("context", context);
params.put("text", text);
params.put("mode", MODE_GFM);
return client.postStream(SEGMENT_MARKDOWN, params);
}
/**
* Get HTML for given Markdown text scoped to given repository context
*
* @param repo
* @param text
* @return HTML
* @throws IOException
*/
public String getRepositoryHtml(final IRepositoryIdProvider repo,
final String text) throws IOException {
return readStream(getRepositoryStream(repo, text));
}
/**
* Get stream of HTML for given Markdown text
* <p>
* Use {@link #getRepositoryStream(IRepositoryIdProvider, String)} if you
* want the Markdown scoped to a specific repository.
*
* @param text
* @param mode
* @return stream of HTML
* @throws IOException
*/
public InputStream getStream(final String text, final String mode)
throws IOException {
Map<String, String> params = new HashMap<String, String>(2, 1);
params.put("text", text);
params.put("mode", mode);
return client.postStream(SEGMENT_MARKDOWN, params);
}
/**
* Get HTML for given Markdown text
* <p>
* Use {@link #getRepositoryHtml(IRepositoryIdProvider, String)} if you want
* the Markdown scoped to a specific repository.
*
* @param text
* @param mode
* @return HTML
* @throws IOException
*/
public String getHtml(final String text, final String mode)
throws IOException {
return readStream(getStream(text, mode));
}
}