package org.jbake.parser; import org.pegdown.Extensions; import org.pegdown.PegDownProcessor; /** * Renders documents in the Markdown format. * * @author Cédric Champeau */ public class MarkdownEngine extends MarkupEngine { public MarkdownEngine() { Class engineClass = PegDownProcessor.class; assert engineClass!=null; } @Override public void processBody(final ParserContext context) { String[] mdExts = context.getConfig().getStringArray("markdown.extensions"); int extensions = Extensions.NONE; if (mdExts.length > 0) { for (int index = 0; index < mdExts.length; index++) { String ext = mdExts[index]; if (ext.startsWith("-")) { ext = ext.substring(1); extensions=removeExtension(extensions, extensionFor(ext)); } else { if (ext.startsWith("+")) { ext = ext.substring(1); } extensions=addExtension(extensions, extensionFor(ext)); } } } long maxParsingTime = context.getConfig().getLong("markdown.maxParsingTimeInMillis", PegDownProcessor.DEFAULT_MAX_PARSING_TIME); PegDownProcessor pegdownProcessor = new PegDownProcessor(extensions, maxParsingTime); context.setBody(pegdownProcessor.markdownToHtml(context.getBody())); } private int extensionFor(String name) { int extension = Extensions.NONE; if (name.equals("HARDWRAPS")) { extension = Extensions.HARDWRAPS; } else if (name.equals("AUTOLINKS")) { extension = Extensions.AUTOLINKS; } else if (name.equals("FENCED_CODE_BLOCKS")) { extension = Extensions.FENCED_CODE_BLOCKS; } else if (name.equals("DEFINITIONS")) { extension = Extensions.DEFINITIONS; } else if (name.equals("ABBREVIATIONS")) { extension = Extensions.ABBREVIATIONS; } else if (name.equals("QUOTES")) { extension = Extensions.QUOTES; } else if (name.equals("SMARTS")) { extension = Extensions.SMARTS; } else if (name.equals("SMARTYPANTS")) { extension = Extensions.SMARTYPANTS; } else if (name.equals("SUPPRESS_ALL_HTML")) { extension = Extensions.SUPPRESS_ALL_HTML; } else if (name.equals("SUPPRESS_HTML_BLOCKS")) { extension = Extensions.SUPPRESS_HTML_BLOCKS; } else if (name.equals("SUPPRESS_INLINE_HTML")) { extension = Extensions.SUPPRESS_INLINE_HTML; } else if (name.equals("TABLES")) { extension = Extensions.TABLES; } else if (name.equals("WIKILINKS")) { extension = Extensions.WIKILINKS; } else if (name.equals("ANCHORLINKS")) { extension = Extensions.ANCHORLINKS; } else if (name.equals("STRIKETHROUGH")) { extension = Extensions.STRIKETHROUGH; }else if (name.equals("ATXHEADERSPACE")) { extension = Extensions.ATXHEADERSPACE; }else if (name.equals("FORCELISTITEMPARA")) { extension = Extensions.FORCELISTITEMPARA; }else if (name.equals("RELAXEDHRULES")) { extension = Extensions.RELAXEDHRULES; }else if (name.equals("TASKLISTITEMS")) { extension = Extensions.TASKLISTITEMS; }else if (name.equals("EXTANCHORLINKS")) { extension = Extensions.EXTANCHORLINKS; } else if (name.equals("ALL")) { extension = Extensions.ALL; } else if (name.equals("ALL_OPTIONALS")) { extension = Extensions.ALL_OPTIONALS; } else if (name.equals("ALL_WITH_OPTIONALS")) { extension = Extensions.ALL_WITH_OPTIONALS; } return extension; } private int addExtension(int previousExtensions, int additionalExtension) { return previousExtensions | additionalExtension; } private int removeExtension(int previousExtensions, int unwantedExtension) { return previousExtensions & (~unwantedExtension); } }