WebBox Klassenbibliothek
ulrich
2020-12-28 828ffa35841a585ddeeac9d934e3a4951e1702c0
src/de/uhilger/wbx/web/AdocServlet.java
@@ -22,6 +22,7 @@
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.HashMap;
@@ -30,11 +31,13 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import static org.asciidoctor.Asciidoctor.Factory.create;
import org.asciidoctor.Asciidoctor;
import static org.asciidoctor.AttributesBuilder.attributes;
import static org.asciidoctor.OptionsBuilder.options;
import org.asciidoctor.SafeMode;
@@ -74,8 +77,8 @@
    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.setContentType("text/html;charset=UTF-8");
    response.setCharacterEncoding("UTF-8");
    /*
      nach HTML transformieren, wenn die Quelle sich geandert hat oder 
      die HTML-Datei noch nicht existiert
@@ -89,24 +92,26 @@
      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
      response.setContentType("application/pdf;charset=UTF-8");
      if(!pdffile.exists() || adocfile.lastModified() > pdffile.lastModified()) {
        response.setContentType("application/pdf");
        transform(absname, PDF);
      }
    }
    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));
      String line;
      while ((line = reader.readLine()) != null) {
        out.println(line);
      ServletOutputStream os = response.getOutputStream();
      InputStream bytes = new FileInputStream(outfile);
      int b = bytes.read();
      while(b > -1 ) {
        os.write(b);
        b = bytes.read();
      }
    } else {
      PrintWriter out = response.getWriter();
      InputStreamReader in = new InputStreamReader(new FileInputStream(outfile), "UTF-8");
      in.transferTo(out);
    }
  }
  
@@ -126,19 +131,37 @@
   * nach PDF transformiert werden soll
   */
  private void transform(String fileName, String backend) {    
    Map<String, Object> attributes = attributes().sourceHighlighter("highlightjs")
                                       .asMap();
    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)
              .safe(SafeMode.SERVER)
              .backend(backend).attributes(attributes).asMap();
      
    } else {
      options = options().inPlace(false)
              .safe(SafeMode.SERVER)
              .attributes(attributes).asMap();
    }
    
    Asciidoctor asciidoctor = create();    
    asciidoctor.requireLibrary("asciidoctor-diagram");
    asciidoctor.convertFile(new File(fileName), options);    
  }