package gutenberg.itext.emitter; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Paragraph; import gutenberg.itext.Emitter; import gutenberg.itext.ITextContext; import gutenberg.itext.model.Markdown; import gutenberg.itext.pegdown.InvocationContext; import gutenberg.pegdown.plugin.AttributesPlugin; import gutenberg.pegdown.plugin.GenericBoxPlugin; import org.apache.commons.lang3.StringUtils; import org.parboiled.common.Reference; import org.pegdown.Extensions; import org.pegdown.Parser; import org.pegdown.PegDownProcessor; import org.pegdown.ast.RootNode; import org.pegdown.plugins.PegDownPlugins; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; /** * @author <a href="http://twitter.com/aloyer">@aloyer</a> */ public class MarkdownEmitter implements Emitter<Markdown> { private Logger log = LoggerFactory.getLogger(MarkdownEmitter.class); @Override public void emit(Markdown value, ITextContext context) { String raw = value.raw(); if (StringUtils.isEmpty(raw)) { return; } Reference<Parser> parserRef = new Reference<Parser>(); PegDownPlugins plugins = PegDownPlugins .builder() .withPlugin(AttributesPlugin.class) .withPlugin(GenericBoxPlugin.class, parserRef) .build(); PegDownProcessor processor = new PegDownProcessor(Extensions.ALL, plugins); parserRef.set(processor.parser); RootNode rootNode = processor.parseMarkdown(raw.toCharArray()); try { InvocationContext invocationContext = new InvocationContext(context); invocationContext.process(0, rootNode); if (value.flushChapter()) invocationContext.flushPendingChapter(); } catch (IOException e) { log.error("Fail to generate markdown", e); emitRaw(value, context); } catch (DocumentException e) { log.error("Fail to generate markdown", e); emitRaw(value, context); } } private void emitRaw(Markdown value, ITextContext emitterContext) { emitterContext.append(new Paragraph(value.raw())); } }