Asciidoctor mit Neon transformieren
ulrich
2022-01-09 1d695f99b80503bd6efbf181e6b8733ba3d1fb25
src/de/uhilger/httpserver/adoc/AdocActor.java
@@ -17,9 +17,11 @@
 */
package de.uhilger.httpserver.adoc;
import com.sun.net.httpserver.HttpExchange;
import de.uhilger.httpserver.base.HttpResponder;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.logging.Logger;
import static org.asciidoctor.Asciidoctor.Factory.create;
import org.asciidoctor.Asciidoctor;
@@ -39,31 +41,48 @@
 */
public class AdocActor {
  
  private static final Logger logger = Logger.getLogger(AdocActor.class.getName());
  private static final String DOT = ".";
  private static final String HTML = "html";
  private static final String PDF = "pdf";
  public static final String HTML = "html";
  public static final String PDF = "pdf";
  
  public void handle(HttpExchange e, String fileBase, String fileName, boolean pdf) throws IOException {
    File adocfile = new File(fileBase, fileName);
    //logger.fine("adocfile: " + adocfile.getAbsolutePath());
    AdocActor actor = new AdocActor();
    File outfile;
    if(pdf) {
      outfile = actor.getTargetFile(adocfile, AdocActor.PDF);
    } else {
      outfile = actor.getTargetFile(adocfile, AdocActor.HTML);
    }
    //logger.fine("outfile: " + outfile.getAbsolutePath());
    HttpResponder fs = new HttpResponder();
    fs.serveFile(e, outfile);
  }
  public File getTargetFile(File adocfile, String ext) {
    String nameext = adocfile.getName();
    String fname = nameext.substring(0, nameext.lastIndexOf(DOT));
    File outfile = new File(adocfile.getParentFile(), fname + DOT + ext);
    //logger.log(Level.FINE, "out: {0}", outfile.getAbsolutePath());
    return outfile;
  }
  
  public void processAdocFile(File adocfile, String pdf) {
    
    String absname = adocfile.getAbsolutePath();
    logger.fine("in: " + absname);
    //logger.log(Level.FINE, "in: {0}", 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
    logger.fine("out: " + outfile.getAbsolutePath());
    //response.setCharacterEncoding("UTF-8");
    File outfile = getTargetFile(adocfile, HTML);
    File htmlfile = outfile;
    
    /*
      nach HTML transformieren, wenn die Quelle sich geandert hat oder 
      die HTML-Datei noch nicht existiert
    */
    if(!htmlfile.exists() || adocfile.lastModified() > htmlfile.lastModified()) {
      //logger.fine("calling transform for " + absname);
      transform(absname);
    }
 
@@ -74,23 +93,13 @@
    */
    
    if(null != pdf && pdf.equalsIgnoreCase(Boolean.TRUE.toString())) {
      File pdffile = new File(adocfile.getParentFile(), fname + DOT + PDF);
      //File pdffile = new File(adocfile.getParentFile(), fname + DOT + PDF);
      File pdffile = getTargetFile(adocfile, PDF);
      outfile = pdffile; // PDF soll zurueckgegeben werden
      if(!pdffile.exists() || adocfile.lastModified() > pdffile.lastModified()) {
        //response.setContentType("application/pdf");
        transform(absname, PDF);
      }
      //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);
    }
  }
  
@@ -110,6 +119,7 @@
   * nach PDF transformiert werden soll
   */
  private void transform(String fileName, String backend) {    
    //logger.fine("fileName: " + fileName + ", backend: " + backend);
    Map<String, Object> attributes;
    File outFile = new File(fileName);
    String thisDirName = outFile.getParent();
@@ -139,9 +149,14 @@
              .attributes(attributes).asMap();
    }
    
    File adcf = new File(fileName);
    //logger.fine("before asciidoctor create, adcf: " + adcf.getAbsolutePath());
    Asciidoctor asciidoctor = create();    
    //logger.fine("asciidoctor created.");
    asciidoctor.requireLibrary("asciidoctor-diagram");
    asciidoctor.convertFile(new File(fileName), options);
    //logger.fine("asciidoctor requireLibrary diagram passed.");
    //logger.fine("calling asciidoctor.convert for file " + adcf.getAbsolutePath());
    asciidoctor.convertFile(adcf, options);
  }
  
}