package sagan.blog.support; import org.pegdown.Extensions; import org.pegdown.LinkRenderer; import org.pegdown.PegDownProcessor; import org.pegdown.VerbatimSerializer; import org.pegdown.ast.RootNode; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import sagan.support.markdown.MarkdownToHtmlSerializer; import sagan.support.markdown.PrettifyVerbatimSerializer; import java.util.Collections; /** * A {@link MarkdownService} based on the Pegdown library. */ @Service @Qualifier("pegdown") public class PegdownMarkdownService implements MarkdownService { private final PegDownProcessor pegdown; public PegdownMarkdownService() { pegdown = new PegDownProcessor(Extensions.ALL ^ Extensions.ANCHORLINKS); } @Override public String renderToHtml(String markdownSource) { // synchronizing on pegdown instance since neither the processor nor the underlying parser is thread-safe. synchronized (pegdown) { RootNode astRoot = pegdown.parseMarkdown(markdownSource.toCharArray()); MarkdownToHtmlSerializer serializer = new MarkdownToHtmlSerializer(new LinkRenderer(), Collections.singletonMap(VerbatimSerializer.DEFAULT, PrettifyVerbatimSerializer.INSTANCE)); return serializer.toHtml(astRoot); } } }