From f2a70357272c7a2e61f724385e23b4c4fa2e69cb Mon Sep 17 00:00:00 2001 From: ulrich Date: Thu, 23 Jul 2020 13:09:13 +0000 Subject: [PATCH] In Arbeit: PDF Theme --- src/de/uhilger/wbx/web/AdocServlet.java | 191 +++++++++++++++++++++++++++-------------------- 1 files changed, 108 insertions(+), 83 deletions(-) diff --git a/src/de/uhilger/wbx/web/AdocServlet.java b/src/de/uhilger/wbx/web/AdocServlet.java index 7b219b6..f89b21f 100644 --- a/src/de/uhilger/wbx/web/AdocServlet.java +++ b/src/de/uhilger/wbx/web/AdocServlet.java @@ -24,64 +24,85 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; +import java.util.HashMap; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Map; -import static org.asciidoctor.AttributesBuilder.attributes; -import static org.asciidoctor.OptionsBuilder.options; import static org.asciidoctor.Asciidoctor.Factory.create; import org.asciidoctor.Asciidoctor; +import static org.asciidoctor.AttributesBuilder.attributes; +import static org.asciidoctor.OptionsBuilder.options; /** * Das AdocServlet wandelt AsciiDoc-Inhalte (*.adoc) - * zu HTML-Seiten + * zu HTML-Seiten und PDF-Dokumenten * + * Mit Angabe des Parameters ?pdf=true im URL wird PDF erzeugt, andernfalls HTML */ public class AdocServlet extends HttpServlet { private static final String DOT = "."; - private static final String HTMLEXT = ".html"; + private static final String HTML = "html"; + private static final String PDF = "pdf"; + private static final String SERVLET_NAME = "AdocServlet"; /** - * Processes requests for both HTTP <code>GET</code> and <code>POST</code> - * methods. + * Die Methode processRequest verarbeitet HTTP-Anfragen des Typs + * <code>GET</code> und <code>POST</code>. * - * @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet-specific error occurs - * @throws IOException if an I/O error occurs + * @param request die Servlet-Anfrage + * @param response die Servlet-Antwort + * @throws ServletException wenn ein Servlet-spezifischer Fehler passiert + * @throws IOException wenn ein Eingabe- oder Ausgabe-Fehler passiert */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - response.setContentType("text/html;charset=UTF-8"); - try (PrintWriter out = response.getWriter()) { - // Asciidoc-Quelldatei aus HTTP-Request ermitteln - String vPath = request.getServletPath(); - String absname = getServletContext().getRealPath(vPath); - File adocfile = new File(absname); - - // HTML-Datei ermitteln - String nameext = adocfile.getName(); - String fname = nameext.substring(0, nameext.lastIndexOf(DOT)); - File htmlfile = new File(adocfile.getParentFile(), fname + HTMLEXT); - - /* - transformieren, wenn die Quelle sich geandert hat oder - die HTML-Datei noch nicht existiert - */ - if(!htmlfile.exists() || adocfile.lastModified() > htmlfile.lastModified()) { - transform(absname); + // Asciidoc-Quelldatei aus HTTP-Request ermitteln + String vPath = request.getServletPath(); + String absname = getServletContext().getRealPath(vPath); + File adocfile = new File(absname); + + // HTML-Datei ermitteln + String nameext = adocfile.getName(); + String fname = nameext.substring(0, nameext.lastIndexOf(DOT)); + File htmlfile = new File(adocfile.getParentFile(), fname + DOT + HTML); + File outfile = htmlfile; // Standardmaessig wird HTML zurueckgegeben + response.setCharacterEncoding("UTF-8"); + + /* + nach HTML transformieren, wenn die Quelle sich geandert hat oder + die HTML-Datei noch nicht existiert + */ + if(!htmlfile.exists() || adocfile.lastModified() > htmlfile.lastModified()) { + transform(absname); + } + + /* + nach PDF transformieren, wenn der Parameter pdf=true existiert und + wenn die Quelle sich geandert hat oder + die PDF-Datei noch nicht existiert + */ + String pdf = request.getParameter(PDF); + if(null != pdf && pdf.equalsIgnoreCase(Boolean.TRUE.toString())) { + File pdffile = new File(adocfile.getParentFile(), fname + DOT + PDF); + outfile = pdffile; // PDF soll zurueckgegeben werden + if(!pdffile.exists() || adocfile.lastModified() > pdffile.lastModified()) { + response.setContentType("application/pdf"); + transform(absname, PDF); } + } - FileInputStream in = new FileInputStream(htmlfile); - BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + try (PrintWriter out = response.getWriter()) { + // abhaengig vom Parameter pdf HTML- oder PDF-Datei ausgeben + FileInputStream in = new FileInputStream(outfile); + BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); String line; while ((line = reader.readLine()) != null) { out.println(line); @@ -89,57 +110,61 @@ } } - private void transform(String absoluteFileName) { - Asciidoctor asciidoctor = create(); - Map<String, Object> attributes = attributes() - .noFooter(false) - //.tableOfContents(true) - //.sectionNumbers(true) - .asMap(); - Map<String, Object> options = options().inPlace(false) - .attributes(attributes) - .asMap(); - asciidoctor.convertFile(new File(absoluteFileName), options); + /** + * Nach HTML transformieren + * @param fileName der Dateiname der Quelldatei samt absoluter Pfadangabe + */ + private void transform(String fileName) { + transform(fileName, null); } - - private void test(HttpServletRequest request, HttpServletResponse response) - throws IOException - { - response.setContentType("text/html;charset=UTF-8"); - try (PrintWriter out = response.getWriter()) { - /* TODO output your page here. You may use following sample code. */ - out.println("<!DOCTYPE html>"); - out.println("<html>"); - out.println("<head>"); - out.println("<title>Servlet AdocServlet</title>"); - out.println("</head>"); - out.println("<body>"); - out.println("<h1>Servlet AdocServlet at " + request.getContextPath() + "</h1>"); + + /** + * In ein Format transformieren, das von einem 'Backend' von Asciidoctor + * unterstuetzt wird + * @param fileName der Dateiname der Quelldatei samt absoluter Pfadangabe + * @param backend das Kuerzel des Backends, z.B. der String 'pdf', wenn + * nach PDF transformiert werden soll + */ + private void transform(String fileName, String backend) { + Map<String, Object> attributes; + File outFile = new File(fileName); + String thisDirName = outFile.getParent(); + File pdfStyles = new File(outFile.getParentFile(), "custom-theme.yml"); + if(pdfStyles.exists()) { + attributes = attributes() + .attribute("pdf-themesdir", thisDirName) + .attribute("pdf-theme","custom") + .attribute("pdf-fontsdir", thisDirName + "/fonts") + .attribute("allow-uri-read") + .sourceHighlighter("highlightjs") + .asMap(); + } else { + attributes = attributes() + .sourceHighlighter("highlightjs") + .asMap(); + } + Map<String, Object> options; + if(null != backend) { + options = options().inPlace(false) + .backend(backend).attributes(attributes).asMap(); - out.println("<p>request.getRequestURI(): " + request.getRequestURI() + "</p>"); - out.println("<p>request.getRequestURL(): " + request.getRequestURL() + "</p>"); - out.println("<p>request.getServletPath(): " + request.getServletPath() + "</p>"); - out.println("<p>request.getPathInfo(): " + request.getPathInfo() + "</p>"); - - String vPath = request.getServletPath(); - out.println("<p>vPath: " + vPath); - out.println("<p>getServletContext().getRealPath(vPath): " + - getServletContext().getRealPath(vPath) + "</p>"); - - out.println("</body>"); - out.println("</html>"); + } else { + options = options().inPlace(false) + .attributes(attributes).asMap(); } + Asciidoctor asciidoctor = create(); + asciidoctor.requireLibrary("asciidoctor-diagram"); + asciidoctor.convertFile(new File(fileName), options); } - - // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> + /** - * Handles the HTTP <code>GET</code> method. + * Die HTTP-<code>GET</code>-Methode verarbeiten. * - * @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet-specific error occurs - * @throws IOException if an I/O error occurs + * @param request die Servlet-Anfrage + * @param response die Servlet-Antwort + * @throws ServletException wenn ein Servlet-spezifischer Fehler passiert + * @throws IOException wenn ein Eingabe- oder Ausgabe-Fehler passiert */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) @@ -148,12 +173,12 @@ } /** - * Handles the HTTP <code>POST</code> method. + * Die HTTP-<code>POST</code>-Methode verarbeiten. * - * @param request servlet request - * @param response servlet response - * @throws ServletException if a servlet-specific error occurs - * @throws IOException if an I/O error occurs + * @param request die Servlet-Anfrage + * @param response die Servlet-Antwort + * @throws ServletException wenn ein Servlet-spezifischer Fehler passiert + * @throws IOException wenn ein Eingabe- oder Ausgabe-Fehler passiert */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) @@ -162,13 +187,13 @@ } /** - * Returns a short description of the servlet. + * Eine Kurzbeschreibung des Servlets ausgeben. * - * @return a String containing servlet description + * @return einen String mit der Kurzbeschreibung des Servlets */ @Override public String getServletInfo() { - return "AdocServlet"; - }// </editor-fold> + return SERVLET_NAME; + } } -- Gitblit v1.9.3