James Moger
2014-02-21 aa61fc86db4f5ebf645ecf69c6f5ec36f2973e5a
src/main/java/com/gitblit/utils/MarkdownUtils.java
@@ -15,67 +15,79 @@
 */
package com.gitblit.utils;
import static org.pegdown.Extensions.ALL;
import static org.pegdown.Extensions.SMARTYPANTS;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import org.slf4j.LoggerFactory;
import org.tautua.markdownpapers.Markdown;
import org.tautua.markdownpapers.parser.ParseException;
import org.apache.commons.io.IOUtils;
import org.pegdown.LinkRenderer;
import org.pegdown.PegDownProcessor;
/**
 * Utility methods for transforming raw markdown text to html.
 *
 *
 * @author James Moger
 *
 *
 */
public class MarkdownUtils {
   /**
    * Returns the html version of the plain source text.
    *
    * @param text
    * @return html version of plain text
    * @throws java.text.ParseException
    */
   public static String transformPlainText(String text) {
      // url auto-linking
      text = text.replaceAll("((http|https)://[0-9A-Za-z-_=\\?\\.\\$#&/]*)", "<a href=\"$1\">$1</a>");
      String html = "<pre>" + text + "</pre>";
      return html;
   }
   /**
    * Returns the html version of the markdown source text.
    *
    *
    * @param markdown
    * @return html version of markdown text
    * @throws java.text.ParseException
    */
   public static String transformMarkdown(String markdown) throws java.text.ParseException {
      try {
         StringReader reader = new StringReader(markdown);
         String html = transformMarkdown(reader);
         reader.close();
         return html;
      } catch (IllegalArgumentException e) {
         throw new java.text.ParseException(e.getMessage(), 0);
      } catch (NullPointerException p) {
         throw new java.text.ParseException("Markdown string is null!", 0);
      }
   public static String transformMarkdown(String markdown) {
      return transformMarkdown(markdown, null);
   }
   /**
    * Returns the html version of the markdown source text.
    *
    * @param markdown
    * @return html version of markdown text
    * @throws java.text.ParseException
    */
   public static String transformMarkdown(String markdown, LinkRenderer linkRenderer) {
      PegDownProcessor pd = new PegDownProcessor(ALL & ~SMARTYPANTS);
      String html = pd.markdownToHtml(markdown, linkRenderer == null ? new LinkRenderer() : linkRenderer);
      return html;
   }
   /**
    * Returns the html version of the markdown source reader. The reader is
    * closed regardless of success or failure.
    *
    *
    * @param markdownReader
    * @return html version of the markdown text
    * @throws java.text.ParseException
    */
   public static String transformMarkdown(Reader markdownReader) throws java.text.ParseException {
   public static String transformMarkdown(Reader markdownReader) throws IOException {
      // Read raw markdown content and transform it to html
      StringWriter writer = new StringWriter();
      try {
         Markdown md = new Markdown();
         md.transform(markdownReader, writer);
         return writer.toString().trim();
      } catch (StringIndexOutOfBoundsException e) {
         LoggerFactory.getLogger(MarkdownUtils.class).error("MarkdownPapers failed to parse Markdown!", e);
         throw new java.text.ParseException(e.getMessage(), 0);
      } catch (ParseException p) {
         LoggerFactory.getLogger(MarkdownUtils.class).error("MarkdownPapers failed to parse Markdown!", p);
         throw new java.text.ParseException(p.getMessage(), 0);
      } catch (Exception e) {
         LoggerFactory.getLogger(MarkdownUtils.class).error("MarkdownPapers failed to parse Markdown!", e);
         throw new java.text.ParseException(e.getMessage(), 0);
         IOUtils.copy(markdownReader, writer);
         String markdown = writer.toString();
         return transformMarkdown(markdown);
      } finally {
         try {
            writer.close();