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 | 182 ++++++++++++++++++++++++++------------------- 1 files changed, 106 insertions(+), 76 deletions(-) diff --git a/src/de/uhilger/wbx/web/AdocServlet.java b/src/de/uhilger/wbx/web/AdocServlet.java index e0c43d2..f89b21f 100644 --- a/src/de/uhilger/wbx/web/AdocServlet.java +++ b/src/de/uhilger/wbx/web/AdocServlet.java @@ -24,16 +24,17 @@ 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; @@ -41,60 +42,67 @@ * Das AdocServlet wandelt AsciiDoc-Inhalte (*.adoc) * zu HTML-Seiten und PDF-Dokumenten * - * ?pdf=true im URL fuegt PDF-Ausgabe hinzu + * 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 PDFEXT = ".pdf"; + 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, htmlfile); + // 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); } - - String pdf = request.getParameter(PDF); - if(null != pdf && pdf.length() > 0 && pdf.equalsIgnoreCase(Boolean.TRUE.toString())) { - File pdffile = new File(adocfile.getParentFile(), fname + PDFEXT); - if(!pdffile.exists() || adocfile.lastModified() > pdffile.lastModified()) { - transform(absname, pdffile); - } - } + } - // HTML-Datei ausgeben - 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); @@ -102,39 +110,61 @@ } } - private void transform(String absoluteFileName, File target) { - Map<String, Object> options = null; - Map<String, Object> attributes; - Asciidoctor asciidoctor = create(); - String fname = target.getName().toLowerCase(); - - if(fname.endsWith(HTMLEXT)) { - attributes = attributes().noFooter(false) - .sourceHighlighter("highlightjs") - //.tableOfContents(true) - //.sectionNumbers(true) - .asMap(); - options = options().inPlace(false) - .attributes(attributes) - .asMap(); - } else if(fname.endsWith(PDFEXT)) { - attributes = attributes().noFooter(false) - .asMap(); - options = options().inPlace(false) - .attributes(attributes) - .backend("pdf") - .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); } + + /** + * 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(); + + } else { + options = options().inPlace(false) + .attributes(attributes).asMap(); + } + + Asciidoctor asciidoctor = create(); + asciidoctor.requireLibrary("asciidoctor-diagram"); + asciidoctor.convertFile(new File(fileName), options); + } /** - * 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) @@ -143,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) @@ -157,9 +187,9 @@ } /** - * 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() { -- Gitblit v1.9.3