Generate the image export through a function instead of use the same namespace
[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     /**
48      * {@inheritDoc}
49      */
50     public boolean mustRegenerate() {
51         return false;
52     }
53
54     public static String getFileWithScilabCode() {
55         if (instance.buffer.length() != 0) {
56             try {
57                 File f = File.createTempFile("help-", ".sce", new File(ScilabCommons.getTMPDIR()));
58                 BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(f));
59                 byte[] arr = instance.buffer.toString().getBytes();
60                 out.write(arr, 0, arr.length);
61                 out.flush();
62                 out.close();
63
64                 return f.getAbsolutePath();
65             } catch (Exception e) {
66                 System.err.println("Cannot generate the file with Scilab code to execute:\n" + e);
67             } finally {
68                 instance = null;
69             }
70         }
71
72         instance = null;
73
74         return null;
75     }
76
77     /**
78      * Since this a singleton class...
79      * @return this
80      */
81     public static ScilabImageConverter getInstance(HTMLDocbookTagConverter.GenerationType type) {
82         if (instance == null) {
83             instance = new ScilabImageConverter(type);
84         }
85
86         return instance;
87     }
88
89     public static ScilabImageConverter getInstance() {
90         return instance;
91     }
92
93     /**
94      * {@inheritDoc}
95      */
96     public String convertToImage(String currentFile, String code, Map<String, String> attributes, File imageFile, String imageName) {
97         return convertToPNG(currentFile, code, imageFile, imageName);
98     }
99
100     /**
101      * {@inheritDoc}
102      */
103     public String convertToImage(File code, Map<String, String> attributes, File imageFile, String imageName) {
104         try {
105             BufferedReader in = new BufferedReader(new FileReader(code));
106             StringBuilder buffer = new StringBuilder(8192);
107             String line;
108
109             while ((line = in.readLine()) != null) {
110                 buffer.append(line).append("\n");
111             }
112
113             in.close();
114
115             return convertToPNG(code.getName(), buffer.toString(), imageFile, imageName);
116         } catch (Exception e) {
117             System.err.println("Problem when exporting Scilab code to " + imageFile + "!\n" + e.toString());
118         }
119
120         return null;
121     }
122
123     private final String convertToPNG(String currentFile, String code, File imageFile, String imageName) {
124         buffer.append("function _generate_image_from_doc\n");
125         buffer.append("__olddrv__=driver();\n");
126         buffer.append("disp(\"Generate image " + imageName + " from Scilab code from file " + new File(currentFile).getName() + "\");\n");
127         buffer.append("driver(\"png\");\n");
128         buffer.append("xinit(\"").append(imageFile.getAbsolutePath()).append("\");\n");
129         buffer.append(code).append("\n");
130         buffer.append("___f___=gcf();___f___.anti_aliasing=\"2x\";clear(\"___f___\");\n");
131         buffer.append("xend();\n");
132         buffer.append("driver(__olddrv__);\n");
133         buffer.append("endfunction\n");
134         buffer.append("_generate_image_from_doc();\n");
135         buffer.append("clear _generate_image_from_doc;\n");
136
137         return getHTMLCodeToReturn(code, "<img src=\'" + imageName + "\'/>");
138     }
139
140     public String getHTMLCodeToReturn(String code, String imageTag) {
141         if (type == HTMLDocbookTagConverter.GenerationType.WEB) {
142             /* Prepare the code for the html inclusion */
143             code = convertCode(code);
144             /* Provide a tooltip */
145             return "<div rel='tooltip' title='" + code + "'>" + imageTag + "</div>";
146         } else {
147             /* No tooltip in the javahelp browser ...
148              * too limited html capabilities */
149             return imageTag;
150         }
151     }
152
153     private static final String convertCode(String code) {
154         if (code == null || code.length() == 0) {
155             return "";
156         }
157
158         StringBuffer buffer = new StringBuffer(2 * code.length());
159         int start = 0;
160         int end = code.length() - 1;
161         char c = code.charAt(0);
162
163         // first we trim
164         while (c == ' ' || c == '\t' || c == '\n' || c == '\r') {
165             if (start < end) {
166                 c = code.charAt(++start);
167             } else {
168                 break;
169             }
170         }
171         c = code.charAt(end);
172         while (c == ' ' || c == '\t' || c == '\n' || c == '\r') {
173             if (end > 0) {
174                 c = code.charAt(--end);
175             } else {
176                 break;
177             }
178         }
179
180         // replace chars by their html entities equivalent
181         for (int j = start; j <= end; j++) {
182             c = code.charAt(j);
183             switch (c) {
184                 case '&':
185                     buffer.append("&amp;");
186                     break;
187                 case '<':
188                     buffer.append("&lt;");
189                     break;
190                 case '>':
191                     buffer.append("&gt;");
192                     break;
193                 case '\n':
194                     buffer.append("<br />");
195                     break;
196                 case '\'':
197                     buffer.append("&#039;");
198                     break;
199                 case '\"':
200                     buffer.append("&quot;");
201                     break;
202                 default:
203                     buffer.append(c);
204             }
205         }
206
207         return buffer.toString();
208     }
209 }