package gutenberg.itext.pegdown;
import com.google.common.base.Supplier;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import gutenberg.itext.ITextUtils;
import gutenberg.itext.Styles;
import gutenberg.itext.model.RichText;
import org.pegdown.ast.CodeNode;
import org.pegdown.ast.Node;
import java.util.List;
/**
* @author <a href="http://twitter.com/aloyer">@aloyer</a>
*/
public class CodeNodeProcessor extends Processor {
private final Styles styles;
public CodeNodeProcessor(Styles styles) {
this.styles = styles;
}
@Override
public void process(int level, Node node, InvocationContext context) {
CodeNode cNode = (CodeNode) node;
Font font = styles.getFont(Styles.INLINE_CODE_FONT).or(inlineCodeFont(styles));
List<Element> elements = context.iTextContext().emitButCollectElements(new RichText(cNode.getText(), font));
for (Element element : elements) {
if (element instanceof Chunk) {
Chunk chunk = (Chunk) element;
chunk.setBackground(styles.getColor(Styles.INLINE_CODE_BACKGROUND).or(BaseColor.GRAY));
chunk.setGenericTag("code");
}
context.append(element);
}
}
private Supplier<? extends Font> inlineCodeFont(final Styles styles) {
return new Supplier<Font>() {
@Override
public Font get() {
try {
return new Font(ITextUtils.inconsolata(), styles.defaultFontSize());
} catch (Exception e) {
log.warn("Fail to retrieve font", e);
return FontFactory.getFont(FontFactory.COURIER, styles.defaultFontSize());
}
}
};
}
}