private void showDoc( HttpServletRequest req, HttpServletResponse res, GitilesView view, MarkdownConfig cfg, MarkdownToHtml.Builder fmt, MarkdownFile navFile, MarkdownFile srcFile) throws IOException { Map<String, Object> data = new HashMap<>(); Navbar navbar = new Navbar(); if (navFile != null) { navbar.setFormatter(fmt.setFilePath(navFile.path).build()); navbar.setMarkdown(navFile.content); } data.putAll(navbar.toSoyData()); Node doc = GitilesMarkdown.parse(srcFile.content); data.put("pageTitle", pageTitle(doc, srcFile)); if (view.getType() != GitilesView.Type.ROOTED_DOC) { data.put("sourceUrl", GitilesView.show().copyFrom(view).toUrl()); data.put("logUrl", GitilesView.log().copyFrom(view).toUrl()); data.put("blameUrl", GitilesView.blame().copyFrom(view).toUrl()); } if (cfg.analyticsId != null) { data.put("analyticsId", cfg.analyticsId); } data.put("bodyHtml", fmt.setFilePath(srcFile.path).build().toSoyHtml(doc)); String page = renderer.render(SOY_TEMPLATE, data); byte[] raw = page.getBytes(UTF_8); res.setContentType(FormatType.HTML.getMimeType()); res.setCharacterEncoding(UTF_8.name()); setCacheHeaders(res); if (acceptsGzipEncoding(req)) { res.addHeader(HttpHeaders.VARY, HttpHeaders.ACCEPT_ENCODING); res.setHeader(HttpHeaders.CONTENT_ENCODING, "gzip"); raw = gzip(raw); } res.setContentLength(raw.length); res.setStatus(HttpServletResponse.SC_OK); res.getOutputStream().write(raw); }