package gutenberg.itext.support; import com.google.common.base.Optional; import gutenberg.itext.ITextContext; import gutenberg.itext.PygmentsAdapter; import gutenberg.itext.Styles; import gutenberg.itext.emitter.MarkdownEmitter; import gutenberg.itext.emitter.RichTextEmitter; import gutenberg.itext.emitter.SourceCodeDitaaExtension; import gutenberg.itext.emitter.SourceCodeEmitter; import gutenberg.itext.emitter.SourceCodeLaTeXExtension; import gutenberg.itext.model.Markdown; import gutenberg.itext.model.RichText; import gutenberg.itext.model.SourceCode; import gutenberg.pygments.Pygments; import gutenberg.pygments.StyleSheet; import gutenberg.pygments.styles.FriendlyStyle; import gutenberg.util.KeyValues; import gutenberg.util.Margin; import gutenberg.util.SimpleKeyValues; /** * @author <a href="http://twitter.com/aloyer">@aloyer</a> */ public class ITextContextBuilder { private Styles styles; private PygmentsAdapter pygmentsAdapter; private StyleSheet pygmentsStyleSheet = new FriendlyStyle(); private KeyValues keyValues = new SimpleKeyValues(); private Margin margin; public ITextContextBuilder usingStyles(Styles styles) { this.styles = styles; this.keyValues.declare(Styles.class, styles); return this; } public ITextContextBuilder usingPygmentsStyleSheet(StyleSheet pygmentsStyleSheet) { this.pygmentsStyleSheet = pygmentsStyleSheet; return this; } public ITextContextBuilder usingPygmentsAdapter(PygmentsAdapter pygmentsAdapter) { this.pygmentsAdapter = pygmentsAdapter; return this; } public ITextContextBuilder usingDocumentMargin(Margin margin) { this.margin = margin; return this; } public ITextContext build() { ITextContext context = new ITextContext(keyValues, getStyles(), margin); registerEmitters(context); return context; } private Styles getStyles() { if (styles == null) { Optional<Styles> stylesOpt = keyValues.getNullable(Styles.class); if (!stylesOpt.isPresent()) { styles = new Styles().initDefaults(); keyValues.declare(Styles.class, styles); } } return styles; } protected void registerEmitters(ITextContext context) { context.register( SourceCode.class, new SourceCodeEmitter(getPygmentsAdapter(), new SourceCodeDitaaExtension(getPygmentsAdapter()), new SourceCodeLaTeXExtension(getPygmentsAdapter()))); context.register(Markdown.class, new MarkdownEmitter()); context.register(RichText.class, new RichTextEmitter()); } protected PygmentsAdapter getPygmentsAdapter() { if (pygmentsAdapter == null) { pygmentsAdapter = new PygmentsAdapter(new Pygments(), pygmentsStyleSheet, getStyles()); } return pygmentsAdapter; } }