Only add the tooltip when building the online help
[scilab.git] / scilab / modules / helptools / src / java / org / scilab / modules / helptools / external / HTMLScilabHandler.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - 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.external;
14
15 import java.io.File;
16 import java.io.FileFilter;
17 import java.io.IOException;
18 import java.util.HashMap;
19 import java.util.Map;
20
21 import org.xml.sax.Attributes;
22
23 import org.scilab.modules.helptools.image.ImageConverter;
24 import org.scilab.modules.helptools.image.ScilabImageConverter;
25
26 /**
27  * Handle the included SCILAB code
28  * @author Calixte DENIZET
29  */
30 public class HTMLScilabHandler extends ExternalXMLHandler {
31
32     private static final String IMAGE = "image";
33     private static final String BASENAME = "_";
34
35     private static HTMLScilabHandler instance;
36
37     private int compt = 1;
38     private StringBuilder buffer = new StringBuilder(8192);
39     private String baseDir;
40     private String outputDir;
41     private boolean isLocalized;
42
43     /**
44      * Constructor
45      * @param baseDir the base directory where to put the generated images
46      */
47     private HTMLScilabHandler(String outputDir, String baseDir) {
48         this.outputDir = outputDir + File.separator + baseDir;
49         this.baseDir = baseDir + "/";
50     }
51
52     public static HTMLScilabHandler getInstance(String outputDir, String baseDir) {
53         if (instance == null) {
54             instance = new HTMLScilabHandler(outputDir, baseDir);
55         }
56
57         return instance;
58     }
59
60     public static HTMLScilabHandler getInstance() {
61         return instance;
62     }
63
64     public void resetCompt() {
65         compt = 1;
66     }
67
68     /**
69      * {@inheritDoc}
70      */
71     public String getURI() {
72         return "http://www.scilab.org";
73     }
74
75     /**
76      * {@inheritDoc}
77      */
78     public StringBuilder startExternalXML(String localName, Attributes attributes) {
79         if (localName.equals("image")) {
80             String v = attributes.getValue("localized");
81             isLocalized = "true".equalsIgnoreCase(v);
82         }
83
84         if (IMAGE.equals(localName)) {
85             return buffer;
86         } else {
87             recreateTag(buffer, localName, attributes);
88         }
89
90         return null;
91     }
92
93     /**
94      * {@inheritDoc}
95      */
96     public String endExternalXML(String localName) {
97         if (IMAGE.equals(localName)) {
98             String currentFileName = getConverter().getCurrentFileName();
99             String baseName = new File(currentFileName).getName();
100             int dotpos = baseName.lastIndexOf('.');
101             if (dotpos != -1) {
102                 baseName = baseName.substring(0, dotpos);
103             }
104             String fileName = baseName + BASENAME + (compt++) + ".png";
105             File f = new File(outputDir, fileName);
106             Map<String, String> attributes = new HashMap<String, String>();
107
108             String ret;
109             File existing;
110             if (isLocalized || (existing = getExistingFile(outputDir, fileName)) == null) {
111                 ret = ImageConverter.getImageByCode(currentFileName, buffer.toString(), attributes, "image/scilab", f, baseDir + f.getName());
112             } else {
113                 ret = ImageConverter.getImageByFile(attributes, null, existing.getAbsolutePath(), outputDir, ".");
114                 ret = ScilabImageConverter.getInstance().getHTMLCodeToReturn(buffer.toString(), ret);
115             }
116
117             buffer.setLength(0);
118
119             return ret;
120         }
121
122         recreateTag(buffer, localName, null);
123
124         return null;
125     }
126
127     private static File getExistingFile(String outputDir, String filename) {
128         try {
129             final File outDir = new File(outputDir).getCanonicalFile();
130             FileFilter filter = new FileFilter() {
131                     public boolean accept(File f) {
132                         return f.isDirectory() && !f.equals(outDir);
133                     }
134                 };
135             File[] dirs = outDir.getParentFile().listFiles(filter);
136             File im = new File(filename);
137             for (File dir : dirs) {
138                 File f = new File(dir, im.getName());
139                 if (f.exists() && f.canRead()) {
140                     return f;
141                 }
142             }
143         } catch (IOException e) { }
144
145         return null;
146     }
147 }