package gutenberg.itext; import com.google.common.base.Optional; import com.google.common.collect.Maps; import com.itextpdf.text.BaseColor; import com.itextpdf.text.Chunk; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Font; import com.itextpdf.text.FontFactory; import com.itextpdf.text.pdf.BaseFont; import java.io.IOException; import java.util.Map; import static com.itextpdf.text.FontFactory.HELVETICA; import static gutenberg.itext.FontDescriptor.fontDescriptor; import static gutenberg.itext.ITextUtils.inconsolata; /** * @author <a href="http://twitter.com/aloyer">@aloyer</a> */ public class Styles { public static final String DEFAULT_COLOR = "default-color"; public static final String DEFAULT_FONT = "default-font"; // public static final String CODE_FONT = "code-font"; public static final String SYMBOL_FONT = "symbol-font"; // public static final String INLINE_CODE_FONT = "inline-code-font"; public static final String INLINE_CODE_BACKGROUND = "inline-code-background"; // public static final String H1_FONT = "H1-font"; public static final String H2_FONT = "H2-font"; public static final String H3_FONT = "H3-font"; public static final String H4_FONT = "H4-font"; // public static final String TABLE_ALTERNATE_BACKGROUND = "table-alternate-background"; public static final String TABLE_HEADER_FONT = "table-header-font"; public static final String TABLE_HEADER_BACKGROUD = "table-header-background"; public static final String TABLE_BODY_FONT = "table-body-font"; public static final String TABLE_BODY_CELL_BORDER_COLOR = "table-body-cell-border"; // public static final String GENERIC_SYMBOL_COLOR = "genericsymbol-color"; public static final String BLOCKQUOTE_COLOR = "blockquote-color"; // private Map<Object, FontModifier> registeredFontModifiers = Maps.newConcurrentMap(); private Map<Object, FontDescriptor> registeredFonts = Maps.newConcurrentMap(); private Map<Object, BaseColor> registeredColors = Maps.newConcurrentMap(); private BaseFont symbolFont; private Chunk bulletSymbol; public Styles initDefaults() { FontDescriptor defaultFont = fontDescriptor(defaultFontName(), defaultFontSize(), Font.NORMAL, BaseColor.BLACK); registeredColors.put(DEFAULT_COLOR, BaseColor.BLACK); registeredFonts.put(DEFAULT_FONT, defaultFont); registeredFonts.put(CODE_FONT, fontDescriptor(verbatimBaseFont(), defaultFontSize(), Font.NORMAL, BaseColor.BLACK)); registeredFonts.put(INLINE_CODE_FONT, fontDescriptor(verbatimBaseFont(), defaultFontSize(), Font.NORMAL, BaseColor.BLACK)); registeredColors.put(INLINE_CODE_BACKGROUND, Colors.VERY2_LIGHT_GRAY); registeredFonts.put(H1_FONT, fontDescriptor(defaultFontName(), 18.0f, Font.BOLD, BaseColor.BLACK)); registeredFonts.put(H2_FONT, fontDescriptor(defaultFontName(), 16.0f, Font.BOLD, BaseColor.DARK_GRAY)); registeredFonts.put(H3_FONT, fontDescriptor(defaultFontName(), 14.0f, Font.BOLD, BaseColor.DARK_GRAY)); registeredFonts.put(H4_FONT, fontDescriptor(defaultFontName(), 14.0f, Font.ITALIC, BaseColor.DARK_GRAY)); registeredColors.put(TABLE_ALTERNATE_BACKGROUND, Colors.VERY2_LIGHT_GRAY); registeredFonts.put(TABLE_HEADER_FONT, fontDescriptor(defaultFontName(), 14.0f, Font.ITALIC, BaseColor.WHITE)); registeredColors.put(TABLE_HEADER_BACKGROUD, BaseColor.BLACK); registeredFonts.put(TABLE_BODY_FONT, defaultFont); registeredColors.put(TABLE_BODY_CELL_BORDER_COLOR, Colors.LIGHT_GRAY); registeredColors.put(BLOCKQUOTE_COLOR, Colors.LIGHT_GRAY); return this; } protected BaseFont verbatimBaseFont() { try { return inconsolata(); } catch (IOException e) { return FontFactory.getFont(FontFactory.COURIER).getBaseFont(); } catch (DocumentException e) { return FontFactory.getFont(FontFactory.COURIER).getBaseFont(); } } public BaseColor defaultColor() { return getColor(DEFAULT_COLOR).or(BaseColor.BLACK); } public Font defaultFont() { return FontFactory.getFont(defaultFontName(), defaultFontSize(), Font.NORMAL); } public float defaultFontSize() { return 10.0f; } protected String defaultFontName() { return HELVETICA; } public Font sectionTitleFontForLevel(int hLevel) { FontDescriptor descriptor = null; for (int i = 0; i < hLevel; i++) { FontDescriptor d = registeredFonts.get("H" + hLevel + "-font"); if (d != null) { descriptor = d; } } return descriptor == null ? defaultFont() : descriptor.font(); } public Optional<Font> getFont(Object key) { FontDescriptor fontDescriptor = registeredFonts.get(key); FontModifier modifier = registeredFontModifiers.get(key); if (modifier == null) modifier = FontModifier.NULL_MODIFIER; if (fontDescriptor == null) return Optional.absent(); else return Optional.of(modifier.modify(fontDescriptor.font())); } public Optional<Font> getFont(Object key, int style, BaseColor color) { FontDescriptor fontDescriptor = registeredFonts.get(key); FontModifier modifier = registeredFontModifiers.get(key); if (modifier == null) modifier = FontModifier.NULL_MODIFIER; if (fontDescriptor == null) return Optional.absent(); else return Optional.of(modifier.modify(fontDescriptor.font(style, color))); } public Font getFontOrDefault(Object key) { Optional<Font> fontOpt = getFont(key); if (fontOpt.isPresent()) return fontOpt.get(); else return defaultFont(); } public Font getSymbolFont() { Optional<Font> fontOpt = getFont(SYMBOL_FONT); if (fontOpt.isPresent()) return fontOpt.get(); else if (symbolFont == null) { try { symbolFont = ITextUtils.dejavuSansMono(); } catch (DocumentException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } return new Font(symbolFont, defaultFontSize(), Font.NORMAL, defaultColor()); } public Font getFontOrDefault(Object key, int style, BaseColor color) { Optional<Font> fontOpt = getFont(key, style, color); if (fontOpt.isPresent()) return fontOpt.get(); else return new FontCopier(defaultFont()).style(style).color(color).get(); } public void registerFont(Object key, Font font) { registeredFonts.put(key, fontDescriptor(font)); } public void registerFontModifier(Object key, FontModifier modifier) { registeredFontModifiers.put(key, modifier); } public Optional<BaseColor> getColor(Object key) { BaseColor color = registeredColors.get(key); if (color == null) return Optional.absent(); else return Optional.of(color); } public BaseColor getColorOrDefault(Object key) { Optional<BaseColor> color = getColor(key); if (color.isPresent()) return color.get(); else return defaultColor(); } public void registerColor(Object key, BaseColor color) { registeredColors.put(key, color); } public Chunk bulletSymbol() { if(bulletSymbol==null) bulletSymbol = new Chunk("• ", new FontCopier(getSymbolFont()).size(10f).get()); return bulletSymbol; } }