package gutenberg.itext.emitter; import com.itextpdf.text.Element; import gutenberg.itext.Emitter; import gutenberg.itext.ITextContext; import gutenberg.itext.PygmentsAdapter; import gutenberg.itext.model.SourceCode; import gutenberg.util.WrappedRuntimeException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Arrays; import java.util.List; /** * @author <a href="http://twitter.com/aloyer">@aloyer</a> */ public class SourceCodeEmitter implements Emitter<SourceCode> { private final Logger log = LoggerFactory.getLogger(SourceCodeEmitter.class); private final PygmentsAdapter pygmentsAdapter; private final List<SourceCodeEmitterExtension> extensions; public SourceCodeEmitter(PygmentsAdapter pygmentsAdapter, SourceCodeEmitterExtension... extensions) { this(pygmentsAdapter, Arrays.asList(extensions)); } public SourceCodeEmitter(PygmentsAdapter pygmentsAdapter, List<SourceCodeEmitterExtension> extensions) { if(pygmentsAdapter==null) throw new IllegalArgumentException("No pygments adapter provided"); this.pygmentsAdapter = pygmentsAdapter; this.extensions = extensions; } @Override public void emit(SourceCode sourceCode, ITextContext context) { String lang = sourceCode.lang(); try { for (SourceCodeEmitterExtension extension : extensions) { if (extension.accepts(lang)) { extension.emit(sourceCode, context); return; } } } catch (WrappedRuntimeException wre) { log.warn("Failed to invoke extension, fallback on raw rendering", wre.getCause()); } // still there? no extension or error, let's rely directly on pygments List<Element> elements = pygmentsAdapter.process(sourceCode); context.appendAll(elements); } }