Doc generation: add a method HTMLDocbookTagConverter::getGenerationType() to know...
[scilab.git] / scilab / modules / helptools / src / java / org / scilab / modules / helptools / image / ScilabImageConverter.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 package org.scilab.modules.helptools.image;
14
15 import java.io.BufferedOutputStream;
16 import java.io.BufferedReader;
17 import java.io.File;
18 import java.io.FileInputStream;
19 import java.io.FileNotFoundException;
20 import java.io.FileOutputStream;
21 import java.io.FileReader;
22 import java.io.IOException;
23 import java.io.OutputStream;
24 import java.util.Map;
25
26 import org.scilab.modules.commons.ScilabCommons;
27 import org.scilab.modules.helptools.HTMLDocbookTagConverter;
28
29 /**
30  * Scilab code to PNG converter
31  */
32 public class ScilabImageConverter implements ExternalImageConverter {
33
34     private static ScilabImageConverter instance;
35     private final StringBuilder buffer;
36     private final HTMLDocbookTagConverter.GenerationType type;
37
38     private ScilabImageConverter(HTMLDocbookTagConverter.GenerationType type) {
39         buffer = new StringBuilder(8192);
40         this.type = type;
41     }
42
43     public String getMimeType() {
44         return "image/scilab";
45     }
46
47     public static String getFileWithScilabCode() {
48         if (instance.buffer.length() != 0) {
49             try {
50                 File f = File.createTempFile("help-", ".sce", new File(ScilabCommons.getTMPDIR()));
51                 BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(f));
52                 byte[] arr = instance.buffer.toString().getBytes();
53                 out.write(arr, 0, arr.length);
54                 out.flush();
55                 out.close();
56
57                 return f.getAbsolutePath();
58             } catch (Exception e) {
59                 System.err.println("Cannot generate the file with Scilab code to execute:\n" + e);
60             } finally {
61                 instance = null;
62             }
63         }
64
65         instance = null;
66
67         return null;
68     }
69
70     /**
71      * Since this a singleton class...
72      * @return this
73      */
74     public static ScilabImageConverter getInstance(HTMLDocbookTagConverter.GenerationType type) {
75         if (instance == null) {
76             instance = new ScilabImageConverter(type);
77         }
78
79         return instance;
80     }
81
82     /**
83      * {@inheritDoc}
84      */
85     public String convertToImage(String currentFile, String code, Map<String, String> attributes, File imageFile, String imageName) {
86         return convertToPNG(currentFile, code, imageFile, imageName);
87     }
88
89     /**
90      * {@inheritDoc}
91      */
92     public String convertToImage(File code, Map<String, String> attributes, File imageFile, String imageName) {
93         try {
94             BufferedReader in = new BufferedReader(new FileReader(code));
95             StringBuilder buffer = new StringBuilder(8192);
96             String line;
97
98             while ((line = in.readLine()) != null) {
99                 buffer.append(line).append("\n");
100             }
101
102             in.close();
103
104             return convertToPNG(code.getName(), buffer.toString(), imageFile, imageName);
105         } catch (Exception e) {
106             System.err.println("Problem when exporting Scilab code to " + imageFile + "!\n" + e.toString());
107         }
108
109         return null;
110     }
111
112     private final String convertToPNG(String currentFile, String code, File imageFile, String imageName) {
113         buffer.append("__olddrv__=driver();\n");
114         buffer.append("disp(\"Generate image " + imageName + " from Scilab code in file " + new File(currentFile).getName() + "\");\n");
115         buffer.append("driver(\"png\");\n");
116         buffer.append("xinit(\"").append(imageFile.getAbsolutePath()).append("\");\n");
117         buffer.append(code).append("\n");
118         buffer.append("xend();\n");
119         buffer.append("driver(__olddrv__);\n");
120
121
122         /* Prepare the code for the html inclusion */
123         code = code.trim().replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;").replace("\n", "<br />");
124
125         return " <div rel='tooltip' title='" + code + "'><img src=\'" + imageName + "\'/></div>";
126     }
127 }