* Bug 15259 fixed: <latex alt='..'> provides formula as text
[scilab.git] / scilab / modules / helptools / src / java / org / scilab / modules / helptools / image / LaTeXImageConverter.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - Calixte DENIZET
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.image;
17
18 import java.io.BufferedReader;
19 import java.io.File;
20 import java.io.FileReader;
21 import java.io.IOException;
22 import java.util.Map;
23
24 import org.scilab.forge.jlatexmath.TeXConstants;
25 import org.scilab.forge.jlatexmath.TeXFormula;
26 import org.scilab.forge.jlatexmath.TeXIcon;
27 import org.scilab.forge.jlatexmath.ParseException;
28 import org.scilab.modules.helptools.DocbookTagConverter;
29
30 /**
31  * A LaTeX to PNG converter
32  * @author Calixte DENIZET
33  */
34 public class LaTeXImageConverter implements ExternalImageConverter {
35
36     private final DocbookTagConverter conv;
37
38     public LaTeXImageConverter(DocbookTagConverter conv) {
39         this.conv = conv;
40     }
41
42     /**
43      * {@inheritDoc}
44      */
45     public String getMimeType() {
46         return "image/latex";
47     }
48
49     /**
50      * {@inheritDoc}
51      */
52     public boolean mustRegenerate() {
53         return true;
54     }
55
56     /**
57      * {@inheritDoc}
58      */
59     public String convertToImage(String currentFile, String latex, Map<String, String> attributes, File imageFile, String imageName) {
60         TeXIcon icon = null;
61         try {
62             TeXFormula formula = new TeXFormula(latex);
63             String display = attributes.get("style");
64             String alt = attributes.get("alt");
65             if (alt == null) {
66                 attributes.put("alt", latex);
67             }
68             int style = TeXConstants.STYLE_DISPLAY;
69             if (display != null && display.equals("text")) {
70                 style = TeXConstants.STYLE_TEXT;
71             }
72             String fs = attributes.get("fontsize");
73             int ifs = 16;
74             if (fs != null) {
75                 try {
76                     ifs = Integer.parseInt(fs);
77                 } catch (Exception e) { }
78             }
79
80             icon = formula.createTeXIcon(style, ifs);
81
82             Image img = new Image(icon, icon.getIconWidth(), icon.getIconHeight(), icon.getIconHeight() - icon.getIconDepth(), icon.getIconDepth());
83             if (img != null && ImageConverter.convertIconToPNG(img.icon, imageFile)) {
84                 return conv.generateImageCode(img, conv.getBaseImagePath() + imageName, attributes);
85             }
86
87         } catch (ParseException e) {
88             System.err.println("LaTeX code in\n" + currentFile + "\nhas generated an error: " + e.getMessage());
89         }
90         return null;
91     }
92
93     /**
94      * {@inheritDoc}
95      */
96     public String convertToImage(File latex, Map<String, String> attributes, File imageFile, String imageName) {
97         BufferedReader input = null;
98         StringBuilder buffer = new StringBuilder();
99         boolean ok = false;
100         try {
101             input = new BufferedReader(new FileReader(latex));
102             String line = null;
103             while ((line = input.readLine()) != null) {
104                 buffer.append(line);
105                 buffer.append("\n");
106             }
107             ok = true;
108         } catch (IOException e) {
109             System.err.println(e);
110         }
111         if (input != null) {
112             try {
113                 input.close();
114             } catch (IOException e) {
115                 System.err.println(e);
116             }
117         }
118
119         if (ok) {
120             return convertToImage(latex.getName(), buffer.toString(), attributes, imageFile, imageName);
121         }
122
123         return null;
124     }
125 }