* Bug 16065 fixed: Buildoc used on-screen figures for <scilab:image>
[scilab.git] / scilab / modules / helptools / src / java / org / scilab / modules / helptools / image / ScilabImageConverter.java
1
2 /*
3  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
4  * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
5  *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16
17 package org.scilab.modules.helptools.image;
18
19 import java.io.BufferedReader;
20 import java.io.BufferedWriter;
21 import java.io.File;
22 import java.io.FileOutputStream;
23 import java.io.IOException;
24 import java.io.InputStreamReader;
25 import java.io.FileInputStream;
26 import java.io.OutputStreamWriter;
27 import java.io.Writer;
28 import java.util.Map;
29 import java.util.logging.Level;
30 import java.util.logging.Logger;
31
32 import org.scilab.modules.commons.ScilabCommons;
33 import org.scilab.modules.helptools.DocbookTagConverter;
34
35 /**
36  * Scilab code to PNG converter
37  */
38 public class ScilabImageConverter implements ExternalImageConverter {
39
40     private static final byte[] BOM = { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
41     private final StringBuilder buffer;
42     private final DocbookTagConverter conv;
43
44     public ScilabImageConverter(DocbookTagConverter conv) {
45         buffer = new StringBuilder(8192);
46         this.conv = conv;
47     }
48
49     public String getMimeType() {
50         return "image/scilab";
51     }
52
53     /**
54      * {@inheritDoc}
55      */
56     public boolean mustRegenerate() {
57         return false;
58     }
59
60     public String getFileWithScilabCode() {
61         if (buffer.length() != 0) {
62             File f;
63             try {
64                 f = File.createTempFile("help-", ".sce", new File(ScilabCommons.getTMPDIR()));
65             } catch (IOException e) {
66                 System.err.println("Cannot generate the file with Scilab code to execute:\n" + e);
67                 return null;
68             }
69
70             try (
71                     FileOutputStream fos = new FileOutputStream(f);
72                     BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8"))) {
73                 fos.write(BOM);
74                 out.write(buffer.toString());
75                 out.flush();
76
77                 return f.getAbsolutePath();
78             } catch (Exception e) {
79                 System.err.println("Cannot generate the file with Scilab code to execute:\n" + e);
80                 return null;
81             }
82         }
83
84         return null;
85     }
86
87     /**
88      * {@inheritDoc}
89      */
90     public String convertToImage(String currentFile, String code, Map<String, String> attributes, File imageFile, String imageName) {
91         return convertToPNG(currentFile, code, attributes, imageFile, imageName);
92     }
93
94     /**
95      * {@inheritDoc}
96      */
97     public String convertToImage(File code, Map<String, String> attributes, File imageFile, String imageName) {
98         try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(code), "UTF-8"))) {
99             StringBuilder buffer = new StringBuilder(8192);
100             String line;
101
102             while ((line = in.readLine()) != null) {
103                 buffer.append(line).append("\n");
104             }
105
106
107             return convertToPNG(code.getName(), buffer.toString(), attributes, imageFile, imageName);
108         } catch (Exception e) {
109             System.err.println("Problem when exporting Scilab code to " + imageFile + "!\n" + e.toString());
110         }
111
112         return null;
113     }
114
115
116     private final String convertToPNG(String currentFile, String code, Map<String, String> attributes, File imageFile, String imageName) {
117
118         buffer.append("function _generate_image_from_doc\n");
119
120         buffer.append("__olddrv__=driver();\n");
121         buffer.append("mprintf(\"Generate image " + imageName + " from Scilab code from file " + new File(currentFile).getName() + "\\n\");");
122         buffer.append("driver(\"png\");\n");
123         buffer.append("xinit(\"").append(imageFile.getAbsolutePath()).append("\");\n");
124         buffer.append("scf();\n");
125         buffer.append(code).append("\n");
126         buffer.append("gcf().anti_aliasing=\"2x\";\n");
127         buffer.append("xend();\n");
128         buffer.append("driver(__olddrv__);\n");
129
130         buffer.append("endfunction\n");
131         buffer.append("_generate_image_from_doc();\n");
132         buffer.append("clear _generate_image_from_doc;\n");
133
134         return conv.generateImageCode(code, conv.getBaseImagePath() + imageName, attributes);
135     }
136 }