Asciidoctor mit Neon transformieren
ulrich
2021-06-20 5ca8131e61226dda11d3ff81e12f9fbd39b99a1a
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
20 import java.io.File;
21 import java.util.Map;
5ca813 22 import java.util.logging.Level;
9c5db9 23 import java.util.logging.Logger;
U 24
25 import static org.asciidoctor.Asciidoctor.Factory.create;
26 import org.asciidoctor.Asciidoctor;
27 import static org.asciidoctor.AttributesBuilder.attributes;
28 import static org.asciidoctor.OptionsBuilder.options;
29 import org.asciidoctor.SafeMode;
30
31 /**
32  * Der AdocActor transformiert den Asciidoctor-Quellcode aus einer 
33  * gegebenen Datei zu HTML oder PDF und legt das Ergebnis als HTML- oder 
34  * PDF-Datei ab.
35  * 
36  * Der AdocActor benötigt AsciidoctorJ im Classpath.
37  * 
38  * @author Ulrich Hilger
39  * @version 1, 16.06.2021
40  */
41 public class AdocActor {
42   
43   private static final Logger logger = Logger.getLogger(AdocActor.class.getName());
44   
45   private static final String DOT = ".";
5ca813 46   public static final String HTML = "html";
U 47   public static final String PDF = "pdf";
9c5db9 48   
5ca813 49   public File getTargetFile(File adocfile, String ext) {
U 50     String nameext = adocfile.getName();
51     String fname = nameext.substring(0, nameext.lastIndexOf(DOT));
52     File outfile = new File(adocfile.getParentFile(), fname + DOT + ext);
53     logger.log(Level.FINE, "out: {0}", outfile.getAbsolutePath());
54     return outfile;
55   }
9c5db9 56   
U 57   public void processAdocFile(File adocfile, String pdf) {
58     
59     String absname = adocfile.getAbsolutePath();
5ca813 60     logger.log(Level.FINE, "in: {0}", absname);
9c5db9 61  
U 62     // HTML-Datei ermitteln
5ca813 63     //String nameext = adocfile.getName();
U 64     //String fname = nameext.substring(0, nameext.lastIndexOf(DOT));
65     //File htmlfile = new File(adocfile.getParentFile(), fname + DOT + HTML);
66     //File outfile = htmlfile; // Standardmaessig wird HTML zurueckgegeben
67     //logger.fine("out: " + outfile.getAbsolutePath());
9c5db9 68     //response.setCharacterEncoding("UTF-8");
5ca813 69     File outfile = getTargetFile(adocfile, HTML);
U 70     File htmlfile = outfile;
9c5db9 71     
U 72     /*
73       nach HTML transformieren, wenn die Quelle sich geandert hat oder 
74       die HTML-Datei noch nicht existiert
75     */
76     if(!htmlfile.exists() || adocfile.lastModified() > htmlfile.lastModified()) {
77       transform(absname);
78     }
79  
80     /*
81       nach PDF transformieren, wenn der Parameter pdf=true existiert und 
82       wenn die Quelle sich geandert hat oder 
83       die PDF-Datei noch nicht existiert
84     */
85     
86     if(null != pdf && pdf.equalsIgnoreCase(Boolean.TRUE.toString())) {
5ca813 87       //File pdffile = new File(adocfile.getParentFile(), fname + DOT + PDF);
U 88       File pdffile = getTargetFile(adocfile, PDF);
9c5db9 89       outfile = pdffile; // PDF soll zurueckgegeben werden
U 90       if(!pdffile.exists() || adocfile.lastModified() > pdffile.lastModified()) {
91         //response.setContentType("application/pdf");
92         transform(absname, PDF);
93       }
94       //ServletOutputStream os = response.getOutputStream();
95       //InputStream bytes = new FileInputStream(outfile);
96       //int b = bytes.read();
97       //while(b > -1 ) {
98       //  os.write(b);
99       //  b = bytes.read();
100       //}
101     } else {
102       //PrintWriter out = response.getWriter();
103       //InputStreamReader in = new InputStreamReader(new FileInputStream(outfile), "UTF-8");
104       //in.transferTo(out);
105     }
106   }
107   
108   /**
109    * Nach HTML transformieren
110    * @param fileName der Dateiname der Quelldatei samt absoluter Pfadangabe
111    */
112   private void transform(String fileName) {
113     transform(fileName, null);
114   }  
115   
116   /**
117    * In ein Format transformieren, das von einem 'Backend' von Asciidoctor 
118    * unterstuetzt wird
119    * @param fileName der Dateiname der Quelldatei samt absoluter Pfadangabe
120    * @param backend das Kuerzel des Backends, z.B. der String 'pdf', wenn 
121    * nach PDF transformiert werden soll
122    */
123   private void transform(String fileName, String backend) {    
124     Map<String, Object> attributes;
125     File outFile = new File(fileName);
126     String thisDirName = outFile.getParent();
127     File pdfStyles = new File(outFile.getParentFile(), "custom-theme.yml");
128     if(pdfStyles.exists()) {
129       attributes = attributes()
130               .attribute("pdf-themesdir", thisDirName)
131               .attribute("pdf-theme","custom")
132               .attribute("pdf-fontsdir", thisDirName + "/fonts")
133               .attribute("allow-uri-read")
134               .sourceHighlighter("highlightjs")
135               .asMap();
136     } else {
137       attributes = attributes()
138               .sourceHighlighter("highlightjs")
139               .asMap();
140     }
141     Map<String, Object> options;
142     if(null != backend) {
143       options = options().inPlace(false)
144               .safe(SafeMode.SERVER)
145               .backend(backend).attributes(attributes).asMap();
146       
147     } else {
148       options = options().inPlace(false)
149               .safe(SafeMode.SERVER)
150               .attributes(attributes).asMap();
151     }
152     
153     Asciidoctor asciidoctor = create();    
154     asciidoctor.requireLibrary("asciidoctor-diagram");
155     asciidoctor.convertFile(new File(fileName), options);    
156   }
157   
158 }