package net.rubygrapefruit.docs.renderer; import net.rubygrapefruit.docs.model.Document; import net.rubygrapefruit.docs.theme.Theme; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; public abstract class MultiPageRenderer extends Renderer { private static final Logger LOGGER = LoggerFactory.getLogger(MultiPageRenderer.class); public void render(Document document, Theme theme, File outputFile) throws RenderException { RenderableDocument renderableDocument = new RenderableDocument(); theme.getDocumentBuilder().buildDocument(document, renderableDocument); PageRegistry registry = new PageRegistry(renderableDocument, outputFile); for (Chunk chunk : renderableDocument.getContents()) { Page page = registry.getPageFor(chunk); renderPage(theme, page); } } private void renderPage(Theme theme, Page page) { File outputFile = page.getFile(); LOGGER.info("Generating {}.", outputFile); try { outputFile.getParentFile().mkdirs(); BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(outputFile)); try { doRender(page, theme, stream); } finally { stream.close(); } } catch (Exception e) { throw new RenderException(String.format("Could not render document to '%s'.", outputFile), e); } } protected abstract void doRender(Page page, Theme theme, OutputStream stream) throws Exception; }