Asciidoctor mit Neon transformieren
ulrich
2021-06-30 93ae557d9e0056eb219aff32e2ae9d7e8d71713e
commit | author | age
9c5db9 1 /*
U 2   http-adoc - Asciidoctor extensions to jdk.httpserver
3   Copyright (C) 2021  Ulrich Hilger
4
5   This program is free software: you can redistribute it and/or modify
6   it under the terms of the GNU Affero General Public License as
7   published by the Free Software Foundation, either version 3 of the
8   License, or (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU Affero General Public License for more details.
14
15   You should have received a copy of the GNU Affero General Public License
16   along with this program.  If not, see <https://www.gnu.org/licenses/>.
17  */
18 package de.uhilger.httpserver.adoc;
19
f5adf5 20 import com.sun.net.httpserver.HttpExchange;
U 21 import de.uhilger.httpserver.base.HttpResponder;
9c5db9 22 import java.io.File;
f5adf5 23 import java.io.IOException;
9c5db9 24 import java.util.Map;
5ca813 25 import java.util.logging.Level;
9c5db9 26 import java.util.logging.Logger;
U 27
28 import static org.asciidoctor.Asciidoctor.Factory.create;
29 import org.asciidoctor.Asciidoctor;
30 import static org.asciidoctor.AttributesBuilder.attributes;
31 import static org.asciidoctor.OptionsBuilder.options;
32 import org.asciidoctor.SafeMode;
33
34 /**
35  * Der AdocActor transformiert den Asciidoctor-Quellcode aus einer 
36  * gegebenen Datei zu HTML oder PDF und legt das Ergebnis als HTML- oder 
37  * PDF-Datei ab.
38  * 
39  * Der AdocActor benötigt AsciidoctorJ im Classpath.
40  * 
41  * @author Ulrich Hilger
42  * @version 1, 16.06.2021
43  */
44 public class AdocActor {
45   
46   private static final Logger logger = Logger.getLogger(AdocActor.class.getName());
47   
48   private static final String DOT = ".";
5ca813 49   public static final String HTML = "html";
U 50   public static final String PDF = "pdf";
9c5db9 51   
f5adf5 52   public void handle(HttpExchange e, String fileBase, String fileName) throws IOException {
U 53     File adocfile = new File(fileBase, fileName);
54     logger.fine("adocfile: " + adocfile.getAbsolutePath());
55     AdocActor actor = new AdocActor();
56     File outfile = actor.getTargetFile(adocfile, AdocActor.HTML);
57     logger.fine("outfile: " + outfile.getAbsolutePath());
58     HttpResponder fs = new HttpResponder();
59     fs.serveFile(e, outfile);
60   }
61   
5ca813 62   public File getTargetFile(File adocfile, String ext) {
U 63     String nameext = adocfile.getName();
64     String fname = nameext.substring(0, nameext.lastIndexOf(DOT));
65     File outfile = new File(adocfile.getParentFile(), fname + DOT + ext);
66     logger.log(Level.FINE, "out: {0}", outfile.getAbsolutePath());
67     return outfile;
68   }
9c5db9 69   
U 70   public void processAdocFile(File adocfile, String pdf) {
71     
72     String absname = adocfile.getAbsolutePath();
5ca813 73     logger.log(Level.FINE, "in: {0}", absname);
9c5db9 74  
U 75     // HTML-Datei ermitteln
5ca813 76     File outfile = getTargetFile(adocfile, HTML);
U 77     File htmlfile = outfile;
9c5db9 78     
U 79     /*
80       nach HTML transformieren, wenn die Quelle sich geandert hat oder 
81       die HTML-Datei noch nicht existiert
82     */
83     if(!htmlfile.exists() || adocfile.lastModified() > htmlfile.lastModified()) {
4ed0b2 84       logger.fine("calling transform for " + absname);
9c5db9 85       transform(absname);
U 86     }
87  
88     /*
89       nach PDF transformieren, wenn der Parameter pdf=true existiert und 
90       wenn die Quelle sich geandert hat oder 
91       die PDF-Datei noch nicht existiert
92     */
93     
94     if(null != pdf && pdf.equalsIgnoreCase(Boolean.TRUE.toString())) {
5ca813 95       //File pdffile = new File(adocfile.getParentFile(), fname + DOT + PDF);
U 96       File pdffile = getTargetFile(adocfile, PDF);
9c5db9 97       outfile = pdffile; // PDF soll zurueckgegeben werden
U 98       if(!pdffile.exists() || adocfile.lastModified() > pdffile.lastModified()) {
99         //response.setContentType("application/pdf");
100         transform(absname, PDF);
101       }
102     }
103   }
104   
105   /**
106    * Nach HTML transformieren
107    * @param fileName der Dateiname der Quelldatei samt absoluter Pfadangabe
108    */
109   private void transform(String fileName) {
110     transform(fileName, null);
111   }  
112   
113   /**
114    * In ein Format transformieren, das von einem 'Backend' von Asciidoctor 
115    * unterstuetzt wird
116    * @param fileName der Dateiname der Quelldatei samt absoluter Pfadangabe
117    * @param backend das Kuerzel des Backends, z.B. der String 'pdf', wenn 
118    * nach PDF transformiert werden soll
119    */
120   private void transform(String fileName, String backend) {    
4ed0b2 121     logger.fine("fileName: " + fileName + ", backend: " + backend);
9c5db9 122     Map<String, Object> attributes;
U 123     File outFile = new File(fileName);
124     String thisDirName = outFile.getParent();
125     File pdfStyles = new File(outFile.getParentFile(), "custom-theme.yml");
126     if(pdfStyles.exists()) {
127       attributes = attributes()
128               .attribute("pdf-themesdir", thisDirName)
129               .attribute("pdf-theme","custom")
130               .attribute("pdf-fontsdir", thisDirName + "/fonts")
131               .attribute("allow-uri-read")
132               .sourceHighlighter("highlightjs")
133               .asMap();
134     } else {
135       attributes = attributes()
136               .sourceHighlighter("highlightjs")
137               .asMap();
138     }
139     Map<String, Object> options;
140     if(null != backend) {
141       options = options().inPlace(false)
142               .safe(SafeMode.SERVER)
143               .backend(backend).attributes(attributes).asMap();
144       
145     } else {
146       options = options().inPlace(false)
147               .safe(SafeMode.SERVER)
148               .attributes(attributes).asMap();
149     }
150     
4ed0b2 151     File adcf = new File(fileName);
U 152     logger.fine("before asciidoctor create, adcf: " + adcf.getAbsolutePath());
9c5db9 153     Asciidoctor asciidoctor = create();    
4ed0b2 154     logger.fine("asciidoctor created.");
9c5db9 155     asciidoctor.requireLibrary("asciidoctor-diagram");
4ed0b2 156     logger.fine("asciidoctor requireLibrary diagram passed.");
U 157     logger.fine("calling asciidoctor.convert for file " + adcf.getAbsolutePath());
158     asciidoctor.convertFile(adcf, options);    
9c5db9 159   }
U 160   
161 }