Update jflex to 1.8.2
[scilab.git] / scilab / modules / helptools / src / java / org / scilab / modules / helptools / FODocbookTagConverter.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2013 - Scilab Enterprises - Clement DAVID
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 package org.scilab.modules.helptools;
17
18 import java.io.File;
19 import java.io.FileNotFoundException;
20 import java.io.IOException;
21
22 import javax.xml.transform.Transformer;
23 import javax.xml.transform.TransformerConfigurationException;
24 import javax.xml.transform.TransformerException;
25 import javax.xml.transform.TransformerFactory;
26 import javax.xml.transform.TransformerFactoryConfigurationError;
27 import javax.xml.transform.stream.StreamResult;
28 import javax.xml.transform.stream.StreamSource;
29
30 import org.scilab.modules.helptools.image.ImageConverter;
31 import org.xml.sax.SAXException;
32 import org.xml.sax.SAXParseException;
33
34 /**
35  * Implement a docbook to fo converter.
36  *
37  * FIXME: Currently it use an externel xsl stylesheet to convert the tag. It should implement the Scilab subset by extending {@link DocbookTagConverter}.
38  */
39 public class FODocbookTagConverter implements Converter {
40
41     private static final String SCI = System.getenv("SCI");
42     public static final boolean IS_WINDOWS = (File.pathSeparatorChar == ';');
43     private static final String CANNOT_COPY_CONVERT = "Cannot copy/convert '";
44     private static final String TO_WITH_QUOTES = "' to '";
45     private static final String COLON_WITH_QUOTES = "': ";
46
47     private final String inName;
48     private final SciDocMain sciDocMain;
49
50     private final File docbookPath;
51     private final File styleDoc;
52
53     public FODocbookTagConverter(String inName, SciDocMain sciDocMain, final ImageConverter imgConvert) throws IOException {
54
55         this.inName = inName;
56         this.sciDocMain = sciDocMain;
57
58         String localDocbookPath = System.getenv("DOCBOOK_ROOT");
59         if (localDocbookPath == null) {
60             localDocbookPath = SCI + "/thirdparty/docbook";
61         }
62         docbookPath = new File(localDocbookPath);
63         if (!docbookPath.isDirectory()) {
64             throw new FileNotFoundException("Could not find variable DOCBOOK_ROOT defining Docbook root directory");
65         }
66
67         styleDoc = new File(new File(docbookPath, "fo"), "docbook.xsl");
68         if (!styleDoc.isFile()) {
69             throw new FileNotFoundException("Could not find " + styleDoc);
70         }
71     }
72
73     @Override
74     public void registerAllExternalXMLHandlers() {
75     }
76
77     @Override
78     public void convert() throws SAXException, IOException {
79         final File processedStyle = generateExtendedStyle();
80
81         final File sourceDocProcessed = preProcessMaster(inName);
82         if (!sourceDocProcessed.isFile()) {
83             throw new FileNotFoundException("Unable to parse generated master file : " + inName + " .");
84         }
85
86         final StreamResult outputTarget = new StreamResult(new File(Helpers.getTemporaryNameFo(sciDocMain.getOutputDirectory())));
87         final StreamSource xmlSource = new StreamSource(sourceDocProcessed);
88
89         /*
90          * We rely on the saxon implementation to compile xsl files (the default JVM implementation failed).
91          *
92          * Supported version :
93          *  * Saxon-HE 9.5 (and may be 8.x too) which handle xinclude, XSLT-2 and has better performances
94          *  * Saxon 6.5 if on the classpath
95          *  * JVM Apache-xerces as a fallback but may probably fail to compile docbook.xsl
96          */
97         TransformerFactory tfactory;
98         try {
99             tfactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", null);
100         } catch (TransformerFactoryConfigurationError e) {
101             // switch back to the default implementation which may be saxon 6.5 if found on the classpath or the JVM default implementation otherwise
102             tfactory = TransformerFactory.newInstance();
103         }
104
105         try {
106             final Transformer transform = tfactory.newTransformer(new StreamSource(processedStyle));
107
108             transform.setParameter("base.dir", sciDocMain.getOutputDirectory());
109
110             // FO specific parameters
111             transform.setParameter("use.extensions", "1");
112             transform.setParameter("graphicsize.extension", "0");
113             transform.setParameter("paper.type", "A4");
114             transform.setParameter("generate.toc", "book toc,title,figure,table,example,equation part toc,title reference toc,title");
115             transform.setParameter("toc.section.depth", "3");
116             transform.setParameter("section.autolabel", "1");
117             transform.setParameter("variablelist.as.blocks", "1");
118             transform.setParameter("shade.verbatim", "1");
119             transform.setParameter("img.src.path", sciDocMain.getOutputDirectory());
120
121             transform.transform(xmlSource, outputTarget);
122
123             /* Delete the master temp file to avoid to be shipped with the rest */
124             sourceDocProcessed.delete();
125             processedStyle.delete();
126
127         } catch (TransformerException | NullPointerException e) {
128             e.printStackTrace();
129         }
130
131
132     }
133
134     @Override
135     public void install() throws IOException {
136
137     }
138
139     /**
140      * Preprocess the extendedStyle.xsl file
141      * Basically, we load the xsl and replace STYLE_DOC by the actual path
142      * to the xsl file since docbook cannot replace env variables
143      * @return the path to the preprocessed file
144      */
145     private File generateExtendedStyle() throws IOException {
146         File mainStyleDoc = new File(SCI + "/modules/helptools/schema/extendedStyle.xsl");
147         try {
148             String contentMainStyleDoc = Helpers.loadString(mainStyleDoc, "UTF-8");
149
150             /* STYLE_DOC is a predefined variable */
151             contentMainStyleDoc = contentMainStyleDoc.replaceAll("STYLE_DOC", this.styleDoc.toURI().toString());
152
153             File temporaryStyleFile = File.createTempFile("style_", ".xsl");
154
155             Helpers.saveString(contentMainStyleDoc, temporaryStyleFile, "UTF-8");
156             return temporaryStyleFile;
157         } catch (java.io.IOException e) {
158             System.err.println("Could not convert " + mainStyleDoc);
159             throw e;
160         }
161     }
162
163     /**
164      * Replace links by the contents of the XML files in the master
165      * @param masterXML name of the master file
166      * @param styleSheet CSS to be used
167      * @return the new master file
168      */
169     private File preProcessMaster(String masterXML) throws IOException {
170
171         String filename = new File(masterXML).getName();
172         /* Create the output file which will be created by copyconvert.run into the working directory  */
173         File masterXMLTransformed = new File(sciDocMain.getOutputDirectory()
174                                              + File.separator + filename.substring(0, filename.lastIndexOf(".")) + "-processed.xml");
175
176         CopyConvert copyConvert = new CopyConvert();
177         copyConvert.setVerbose(true);
178         copyConvert.setPrintFormat(sciDocMain.getFormat().name());
179         copyConvert.setLatexConverted(false);
180
181         try {
182             copyConvert.run(new File(masterXML), masterXMLTransformed);
183         } catch (SAXParseException e) {
184             System.err.println(CANNOT_COPY_CONVERT + masterXML + TO_WITH_QUOTES
185                                + masterXMLTransformed + COLON_WITH_QUOTES + Helpers.reason(e));
186             System.err.println("Line: " + e.getLineNumber());
187             System.err.println("Column: " + e.getColumnNumber());
188             System.err.println("Public ID: " + e.getPublicId());
189             System.err.println("System Id: " + e.getSystemId());
190             throw new IOException(e);
191         } catch (SAXException e) {
192             System.err.println(CANNOT_COPY_CONVERT + masterXML + TO_WITH_QUOTES
193                                + masterXMLTransformed + COLON_WITH_QUOTES + Helpers.reason(e));
194             throw new IOException(e);
195
196         } catch (IOException e) {
197             System.err.println(CANNOT_COPY_CONVERT + masterXML + TO_WITH_QUOTES
198                                + masterXMLTransformed + COLON_WITH_QUOTES + Helpers.reason(e));
199             throw e;
200         }
201
202         return masterXMLTransformed;
203
204     }
205 }