Helptools: refactor the HTML code generation 60/12060/2
Clément DAVID [Tue, 16 Jul 2013 08:10:05 +0000 (10:10 +0200)]
Add a 2 pass generation on buildDocv2 to handle Docbook->HTML then
HTML->Jar creation. This way we can implement en Docbook->FO then FO->PDF
generation using the same entry point.

Image converter are now convertion independent, we can reuse them for FO
generation.

Some static singleton pattern has been removed to let the GC works with
clean references between classes (Composition pattern).

Change-Id: I01700b207b7fb7ea3437fdc0b445a5a2f6d3e4a0

23 files changed:
scilab/modules/helptools/macros/xmltoformat.sci
scilab/modules/helptools/sci_gateway/cpp/sci_buildDocv2.cpp
scilab/modules/helptools/src/java/org/scilab/modules/helptools/BuildDocObject.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/CHMDocbookTagConverter.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/ContainerConverter.java [new file with mode: 0644]
scilab/modules/helptools/src/java/org/scilab/modules/helptools/Converter.java [new file with mode: 0644]
scilab/modules/helptools/src/java/org/scilab/modules/helptools/DocbookTagConverter.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/HTMLDocbookLinkResolver.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/HTMLDocbookTagConverter.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/JarOnlyConverter.java [moved from scilab/modules/helptools/src/java/org/scilab/modules/helptools/BuildJavaHelp.java with 81% similarity]
scilab/modules/helptools/src/java/org/scilab/modules/helptools/JavaHelpDocbookTagConverter.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/SciDocMain.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/TemplateHandler.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/external/ExternalXMLHandler.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/external/HTMLMathMLHandler.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/external/HTMLSVGHandler.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/external/HTMLScilabHandler.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/image/ImageConverter.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/image/LaTeXImageConverter.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/image/MathMLImageConverter.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/image/SVGImageConverter.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/image/ScilabImageConverter.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/image/XcosImageConverter.java

index 8a9f149..adc4e8e 100644 (file)
@@ -3,6 +3,7 @@
 // Copyright (C) 2008-2010 DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
 // Copyright (C) 2009 DIGITEO - Vincent COUVERT <vincent.couvert@scilab.org>
 // Copyright (C) 2010 - 2011 DIGITEO - Allan CORNET
+// Copyright (C) 2013 - Scilab Enterprises - Clement DAVID
 //
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
@@ -253,13 +254,8 @@ function generated_files = xmltoformat(output_format,dirs,titles,directory_langu
 
         // ast_tree : "Modules" Tree
 
-        if directory_language_m(1) == "fr_FR" then
-            scilab_manual = "Aide Scilab"
-        elseif directory_language_m(1) == "pt_BR" then
-            scilab_manual = "Ajuda Scilab"
-        else
-            scilab_manual = "Scilab help"
-        end
+        _("Scilab help"); // add localized string
+        scilab_manual = dgettext(directory_language_m(1), "Scilab help");
 
         modules_tree = struct();
         modules_tree("level")      = 0; // It's a book
@@ -433,13 +429,27 @@ function generated_files = xmltoformat(output_format,dirs,titles,directory_langu
     // -- scilab internal toolbox
     // =========================================================================
 
+    // target format modification :
+    //  * update the format extension (eg. the created dir)
+    //  * handle the second pass build (container management or second transform)
     select output_format
     case "javaHelp" then
         output_format_ext = "jar";
+        second_pass_format = "jar-only";
     case "web"
         output_format_ext = "html";
+        second_pass_format = [];
+    case "ps"
+        output_format_ext = output_format;
+        output_format = "fo"; // ps file is generated on a second pass from fo files
+        second_pass_format = "ps";
+    case "pdf"
+        output_format_ext = output_format;
+        output_format = "fo"; // pdf file is generated on a second pass from fo files
+        second_pass_format = "pdf";
     else
         output_format_ext = output_format;
+        second_pass_format = [];
     end
 
     is_html = (output_format == "html" | output_format == "web");
@@ -511,11 +521,9 @@ function generated_files = xmltoformat(output_format,dirs,titles,directory_langu
         fileToExec = buildDocv2(output_format,modules_tree("master_document"), my_wanted_language);
         if fileToExec ~= [] then
             exec(fileToExec, -1);
-            if output_format == "javaHelp" then
-                // We don't create the jar when building the online help
-                // or the PDF
-                buildDocv2("jar-only",modules_tree("master_document"), my_wanted_language);
-            end
+        end
+        if ~isempty(second_pass_format) then
+            buildDocv2(second_pass_format,modules_tree("master_document"), my_wanted_language);
         end
 
         check_move(buildDoc_file);
@@ -590,7 +598,9 @@ function generated_files = xmltoformat(output_format,dirs,titles,directory_langu
             fileToExec = buildDocv2(output_format,this_tree("master_document"),directory_language_c(k),dirs_c(k));
             if fileToExec ~= [] then
                 exec(fileToExec, -1);
-                buildDocv2("jar-only",this_tree("master_document"),directory_language_c(k),dirs_c(k));
+            end
+            if ~isempty(second_pass_format) then
+                buildDocv2(second_pass_format,this_tree("master_document"),directory_language_c(k),dirs_c(k));
             end
 
             check_move(buildDoc_file);
@@ -689,7 +699,9 @@ function generated_files = xmltoformat(output_format,dirs,titles,directory_langu
             fileToExec = buildDocv2(output_format,this_tree("master_document"),directory_language(k),dirs(k));
             if fileToExec ~= [] then
                 exec(fileToExec, -1);
-                buildDocv2("jar-only",this_tree("master_document"),directory_language(k),dirs(k));
+            end
+            if ~isempty(second_pass_format) then
+                buildDocv2(second_pass_format,this_tree("master_document"),directory_language(k),dirs(k));
             end
 
             check_move(buildDoc_file);
index 4dd1cd7..7894c29 100644 (file)
@@ -230,52 +230,23 @@ extern "C"
 
         try
         {
-            if (exportFormat == "javaHelp" || exportFormat == "html" || exportFormat == "chm" || exportFormat == "web")
-            {
-                org_scilab_modules_helptools::SciDocMain * doc = new org_scilab_modules_helptools::SciDocMain(getScilabJavaVM());
-
-                if (doc->setOutputDirectory((char *)outputDirectory.c_str()))
-                {
-                    doc->setWorkingLanguage((char *)language.c_str());
-                    doc->setExportFormat((char *)exportFormat.c_str());
-                    doc->setIsToolbox(Rhs == 4);
-                    fileToExec = doc->process((char *)masterXML.c_str(), (char *)styleSheet.c_str());
-                }
-                else
-                {
-                    Scierror(999, _("%s: Could find or create the working directory %s.\n"), fname, outputDirectory.c_str());
-                    return FALSE;
-                }
-                if (doc != NULL)
-                {
-                    delete doc;
-                }
+            org_scilab_modules_helptools::SciDocMain * doc = new org_scilab_modules_helptools::SciDocMain(getScilabJavaVM());
 
-            }
-            else if (exportFormat == "jar-only")
+            if (doc->setOutputDirectory((char *)outputDirectory.c_str()))
             {
-                org_scilab_modules_helptools::SciDocMain::generateJavahelp(getScilabJavaVM(), (char *)outputDirectory.c_str(), (char *)language.c_str(), Rhs == 4);
+                doc->setWorkingLanguage((char *)language.c_str());
+                doc->setExportFormat((char *)exportFormat.c_str());
+                doc->setIsToolbox(Rhs == 4);
+                fileToExec = doc->process((char *)masterXML.c_str(), (char *)styleSheet.c_str());
             }
             else
             {
-                org_scilab_modules_helptools::BuildDocObject * doc = new org_scilab_modules_helptools::BuildDocObject(getScilabJavaVM());
-
-                if (doc->setOutputDirectory((char *)outputDirectory.c_str()))
-                {
-                    doc->setWorkingLanguage((char *)language.c_str());
-                    doc->setExportFormat((char *)exportFormat.c_str());
-                    doc->process((char *)masterXML.c_str(), (char *)styleSheet.c_str());
-                }
-                else
-                {
-                    Scierror(999, _("%s: Could find or create the working directory %s.\n"), fname, outputDirectory.c_str());
-                    return FALSE;
-                }
-                if (doc != NULL)
-                {
-                    delete doc;
-                }
-
+                Scierror(999, _("%s: Could find or create the working directory %s.\n"), fname, outputDirectory.c_str());
+                return FALSE;
+            }
+            if (doc != NULL)
+            {
+                delete doc;
             }
         }
         catch (GiwsException::JniException ex)
index d1f4ac6..cd0dd38 100644 (file)
@@ -252,7 +252,7 @@ public class BuildDocObject {
      */
     private String postProcess() {
         if (this.format.equalsIgnoreCase(JH_FORMAT) || format.equalsIgnoreCase(JAVAHELP_FORMAT)) {
-            return BuildJavaHelp.buildJavaHelp(this.outputDirectory, this.language);
+            JarOnlyConverter.buildJar(this.outputDirectory, this.language);
         }
         if (format.equalsIgnoreCase(PDF_FORMAT) || format.equalsIgnoreCase(POSTSCRIPT_FORMAT)) {
             return BuildPDF.buildPDF(this.outputDirectory, this.language, format);
@@ -297,8 +297,6 @@ public class BuildDocObject {
      * @throws TransformerException
      */
     public String process(String sourceDoc, String styleSheet) throws FileNotFoundException, TransformerException {
-        ArrayList<String> args = new ArrayList<String>();
-
         if (!new File(sourceDoc).isFile()) {
             throw new FileNotFoundException("Could not find master document: " + sourceDoc);
         }
index 193023d..9f12ce5 100644 (file)
@@ -21,7 +21,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.xml.sax.SAXException;
-
+import org.scilab.modules.helptools.image.ImageConverter;
 import org.scilab.modules.localization.LocaleToLCID;
 
 /**
@@ -35,23 +35,17 @@ public class CHMDocbookTagConverter extends HTMLDocbookTagConverter {
     private List<String> filesList = new ArrayList<String>();
     private String docWebsite;
 
+
     /**
      * Constructor
      * @param inName the name of the input stream
      * @param outName the output directory
-     * @param primConf the file containing the primitives of Scilab
-     * @param macroConf the file containing the macros of Scilab
-     * @param template the template to use
-     * @param version the version
-     * @param imageDir the image directory (relative to outName)
-     * @param isToolbox is true when compile a toolbox' help
-     * @param urlBase the base url for external link
-     * @param language the language to use ('en_US', 'fr_FR', ...)
+     * @param imgConvert The associated image converter
      */
-    public CHMDocbookTagConverter(String inName, String outName, String[] primConf, String[] macroConf, String template, String version, String imageDir, String docWebsite, boolean isToolbox, String urlBase, String language) throws IOException, SAXException {
-        super(inName, outName, primConf, macroConf, template, version, imageDir, isToolbox, urlBase, language, HTMLDocbookTagConverter.GenerationType.CHM);
+    public CHMDocbookTagConverter(String inName, SciDocMain sciDocMain, ImageConverter imgConvert) throws IOException, SAXException {
+        super(inName, sciDocMain, imgConvert);
         this.outName = new File(outName).getCanonicalPath() + File.separator;
-        this.docWebsite = docWebsite;
+        this.docWebsite = sciDocMain.getConf().getWebSiteURL();
     }
 
     /**
diff --git a/scilab/modules/helptools/src/java/org/scilab/modules/helptools/ContainerConverter.java b/scilab/modules/helptools/src/java/org/scilab/modules/helptools/ContainerConverter.java
new file mode 100644 (file)
index 0000000..76f3baf
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2013 - Scilab Enterprises - Clement DAVID
+ *
+ *  This file must be used under the terms of the CeCILL.
+ *  This source file is licensed as described in the file COPYING, which
+ *  you should have received as part of this distribution.  The terms
+ *  are also available at
+ *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+package org.scilab.modules.helptools;
+
+/**
+ * Common class for container only converters
+ */
+public abstract class ContainerConverter implements Converter {
+    protected final String outputDirectory;
+    protected final String language;
+
+    public ContainerConverter(String outputDirectory, String language) {
+        this.outputDirectory = outputDirectory;
+        this.language = language;
+    }
+
+    /*
+     * Empty method declaration for optional ones
+     */
+
+    @Override
+    public void registerAllExternalXMLHandlers() {
+    }
+}
diff --git a/scilab/modules/helptools/src/java/org/scilab/modules/helptools/Converter.java b/scilab/modules/helptools/src/java/org/scilab/modules/helptools/Converter.java
new file mode 100644 (file)
index 0000000..d9a4516
--- /dev/null
@@ -0,0 +1,34 @@
+package org.scilab.modules.helptools;
+
+import java.io.IOException;
+
+import org.xml.sax.SAXException;
+
+public interface Converter {
+
+    /**
+     * List all supported Converters backends for doc generation
+     */
+    public static enum Backend {
+        JAVAHELP,
+        HTML,
+        WEB,
+        CHM,
+        JAR_ONLY
+    }
+
+    /**
+     * Register all the converter related external xml handlers
+     */
+    void registerAllExternalXMLHandlers();
+
+    /**
+     * Convert the document
+     */
+    void convert() throws SAXException, IOException;
+
+    /**
+     * Install converted files and other data to the target directory
+     */
+    void install() throws IOException;
+}
index c997d09..0a0989d 100644 (file)
@@ -26,29 +26,35 @@ import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 
+import org.scilab.modules.commons.ScilabConstants;
+import org.scilab.modules.helptools.external.ExternalXMLHandler;
+import org.scilab.modules.helptools.image.Image;
+import org.scilab.modules.helptools.image.ImageConverter;
+import org.scilab.modules.helptools.image.LaTeXImageConverter;
+import org.scilab.modules.helptools.image.MathMLImageConverter;
+import org.scilab.modules.helptools.image.SVGImageConverter;
+import org.scilab.modules.helptools.image.ScilabImageConverter;
+import org.scilab.modules.helptools.image.XcosImageConverter;
 import org.xml.sax.Attributes;
 import org.xml.sax.InputSource;
 import org.xml.sax.Locator;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
 
-import org.scilab.modules.helptools.external.ExternalXMLHandler;
-import org.scilab.modules.helptools.external.HTMLMathMLHandler;
-import org.scilab.modules.helptools.external.HTMLScilabHandler;
-import org.scilab.modules.helptools.external.HTMLSVGHandler;
-
 /**
  * Class the convert a DocBook xml file
  * @author Calixte DENIZET
  */
-public class DocbookTagConverter extends DefaultHandler {
+public abstract class DocbookTagConverter extends DefaultHandler implements Converter {
 
     private static final String DOCBOOKURI = "http://docbook.org/ns/docbook";
-    private static final Class[] argsType = new Class[] {Map.class, String.class};
+    private static final Class<?>[] argsType = new Class[] {Map.class, String.class};
+    protected static final String SCI = ScilabConstants.SCI.getPath();
 
     private Map<String, Method> mapMeth = new HashMap<String, Method>();
     private Map<String, ExternalXMLHandler> externalHandlers = new HashMap<String, ExternalXMLHandler>();
     private List<DocbookTagConverter> converters;
+    private final ImageConverter imgConvert;
     private final File in;
     private DocbookElement baseElement = new DocbookElement(null, null, null);
     private Stack<DocbookElement> stack = new Stack<DocbookElement>();
@@ -78,12 +84,19 @@ public class DocbookTagConverter extends DefaultHandler {
      * Constructor
      * @param in the input file path
      */
-    public DocbookTagConverter(String in) throws IOException {
+    public DocbookTagConverter(String in, final ImageConverter imgConvert) throws IOException {
         if (in != null && !in.isEmpty()) {
             this.in = new File(in);
         } else {
             this.in = null;
         }
+
+        this.imgConvert = imgConvert;
+        imgConvert.registerExternalImageConverter(new LaTeXImageConverter(this));
+        imgConvert.registerExternalImageConverter(new MathMLImageConverter(this));
+        imgConvert.registerExternalImageConverter(new SVGImageConverter(this));
+        imgConvert.registerExternalImageConverter(new ScilabImageConverter(this));
+        imgConvert.registerExternalImageConverter(new XcosImageConverter(this));
     }
 
     /**
@@ -91,11 +104,45 @@ public class DocbookTagConverter extends DefaultHandler {
      * @param in the inputstream
      * @param inName the name of the input file
      */
-    public DocbookTagConverter(String inName, DocbookElement elem) throws IOException {
-        this(inName);
+    public DocbookTagConverter(String inName, DocbookElement elem, final ImageConverter imgConvert) throws IOException {
+        this(inName, imgConvert);
         baseElement = elem;
     }
 
+    public ImageConverter getImageConverter() {
+        return imgConvert;
+    }
+
+    public String getBaseImagePath() {
+        return "";
+    }
+
+    /**
+     * Hook used by {@link ImageConverter}s to emit format specific code from any docbook image element
+     * @param code the code to translate
+     * @param fileName the filename
+     * @param attrs the attribute of the image
+     * @return a {@link Converter} specific code which embed the image and the source code
+     */
+    public abstract String generateImageCode(String code, String fileName, Map<String, String> attrs);
+
+    /**
+     * Hook used by {@link ImageConverter}s to emit format specific code from any docbook image element
+     * @param img image information
+     * @param fileName the filename
+     * @param attrs the attribute of the image
+     * @return a {@link Converter} specific code which embed the image and the source code
+     */
+    public abstract String generateImageCode(Image img, String fileName, Map<String, String> attrs);
+
+    /**
+     * Hook used by {@link ImageConverter}s to emit format specific code from any docbook image element
+     * @param fileName the filename
+     * @param attrs the attribute of the image
+     * @return a {@link Converter} specific code which embed the image and the source code
+     */
+    public abstract String generateImageCode(String fileName, Map<String, String> attrs);
+
     /**
      * Handle the tag
      * @param tag the tag to handle
@@ -104,7 +151,7 @@ public class DocbookTagConverter extends DefaultHandler {
      * @return the HTML code
      * @throws UnhandledDocbookTagException if an handled tga is encountered
      */
-    public String handleDocbookTag(String tag, Map attributes, String contents) throws SAXException {
+    public String handleDocbookTag(String tag, Map<String, String> attributes, String contents) throws SAXException {
         if (tag != null && tag.length() > 0) {
             Method method = mapMeth.get(tag);
             if (method == null) {
@@ -173,7 +220,7 @@ public class DocbookTagConverter extends DefaultHandler {
      * Register an XMLHandler for external XML
      * @param h the external XML handler
      */
-    public void registerExternalXMLHandler(ExternalXMLHandler h) {
+    protected void registerExternalXMLHandler(ExternalXMLHandler h) {
         if (externalHandlers.get(h.getURI()) == null) {
             externalHandlers.put(h.getURI(), h);
             h.setConverter(this);
@@ -181,6 +228,23 @@ public class DocbookTagConverter extends DefaultHandler {
     }
 
     /**
+     * Register all needed External XML Handler.
+     */
+    @Override
+    public void registerAllExternalXMLHandlers() {
+    }
+
+    /**
+     * Unregister all External XML Handler
+     */
+    public void unregisterAllExternalXMLHandler() {
+        for (ExternalXMLHandler h : externalHandlers.values()) {
+            h.setConverter(null);
+        }
+        externalHandlers.clear();
+    }
+
+    /**
      * @param tagName the tag name
      * @return true if the contents of the tag must be escaped
      */
@@ -241,14 +305,22 @@ public class DocbookTagConverter extends DefaultHandler {
     }
 
     /**
+     * Install not converted files (templates, images) to the converted directory
+     */
+    public void install() {
+    }
+
+    /**
      * {@inheritDoc}
      */
     public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
         currentFileName = systemId;
         currentBaseName = new File(systemId).getName();
-        HTMLMathMLHandler.getInstance().resetCompt();
-        HTMLSVGHandler.getInstance().resetCompt();
-        HTMLScilabHandler.getInstance().resetCompt();
+
+        for (ExternalXMLHandler h : externalHandlers.values()) {
+            h.resetCompt();
+        }
+
         if (converters != null) {
             for (DocbookTagConverter conv : converters) {
                 conv.resolveEntity(publicId, systemId);
@@ -486,7 +558,6 @@ public class DocbookTagConverter extends DefaultHandler {
      * @return a trimed StringBuilder
      */
     private static StringBuilder trim(StringBuilder buf) {
-        int start = 0;
         int i = 0;
         int end = buf.length();
         char c;
index 48496e7..4ab6226 100644 (file)
@@ -61,7 +61,6 @@ public class HTMLDocbookLinkResolver extends DefaultHandler {
     private boolean getContents;
     private boolean idInRefentry;
     private final File in;
-    private int level;
     private StringBuilder buffer = new StringBuilder(256);
 
     /**
index cb49a0a..a5d1a70 100644 (file)
@@ -14,7 +14,6 @@ package org.scilab.modules.helptools;
 
 import java.io.File;
 import java.io.IOException;
-import java.lang.Character.UnicodeBlock;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Date;
@@ -22,25 +21,23 @@ import java.util.Map;
 import java.util.Stack;
 import java.util.regex.Pattern;
 
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-import org.scilab.modules.commons.ScilabConstants;
-import org.scilab.modules.helptools.image.ImageConverter;
-import org.scilab.modules.helptools.image.LaTeXImageConverter;
-import org.scilab.modules.helptools.image.MathMLImageConverter;
-import org.scilab.modules.helptools.image.ScilabImageConverter;
-import org.scilab.modules.helptools.image.SVGImageConverter;
-import org.scilab.modules.helptools.image.XcosImageConverter;
-import org.scilab.modules.helptools.scilab.ScilabLexer;
-import org.scilab.modules.helptools.scilab.HTMLScilabCodeHandler;
-import org.scilab.modules.helptools.scilab.AbstractScilabCodeHandler;
-import org.scilab.modules.helptools.XML.XMLLexer;
+import org.scilab.modules.commons.ScilabCommonsUtils;
 import org.scilab.modules.helptools.XML.HTMLXMLCodeHandler;
+import org.scilab.modules.helptools.XML.XMLLexer;
 import org.scilab.modules.helptools.c.CLexer;
 import org.scilab.modules.helptools.c.HTMLCCodeHandler;
+import org.scilab.modules.helptools.external.HTMLMathMLHandler;
+import org.scilab.modules.helptools.external.HTMLSVGHandler;
+import org.scilab.modules.helptools.external.HTMLScilabHandler;
+import org.scilab.modules.helptools.image.Image;
+import org.scilab.modules.helptools.image.ImageConverter;
 import org.scilab.modules.helptools.java.JavaLexer;
+import org.scilab.modules.helptools.scilab.AbstractScilabCodeHandler;
+import org.scilab.modules.helptools.scilab.HTMLScilabCodeHandler;
+import org.scilab.modules.helptools.scilab.ScilabLexer;
 import org.scilab.modules.localization.Messages;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
 
 /**
  * Class to convert DocBook to HTML
@@ -55,30 +52,31 @@ public class HTMLDocbookTagConverter extends DocbookTagConverter implements Temp
     private static final String VERSION = Messages.gettext("Version");
     private static final String DESCRIPTION = Messages.gettext("Description");
 
-    private StringBuilder buffer = new StringBuilder(8192);
+    private final StringBuilder buffer = new StringBuilder(8192);
     private int latexCompt = 1;
-    private String imageDir;
-    private String urlBase;
-    private boolean linkToTheWeb;
     private boolean hasExamples;
     private int warnings;
     private int nbFiles;
-    protected String outName;
+
+    private final String imageDir;
+    protected String urlBase;
+    protected boolean linkToTheWeb;
+    protected final String outName;
     protected String outImages;
 
-    protected Map<String, String> mapId;
-    protected Map<String, String> tocitem;
-    protected HTMLDocbookLinkResolver.TreeId tree;
-    protected Map<String, HTMLDocbookLinkResolver.TreeId> mapTreeId;
-    protected Map<String, String> mapIdPurpose;
-    protected Map<String, String> mapIdRefname;
+    protected final Map<String, String> mapId;
+    protected final Map<String, String> tocitem;
+    protected final HTMLDocbookLinkResolver.TreeId tree;
+    protected final Map<String, HTMLDocbookLinkResolver.TreeId> mapTreeId;
+    protected final Map<String, String> mapIdPurpose;
+    protected final Map<String, String> mapIdRefname;
 
-    protected TemplateHandler templateHandler;
+    protected final TemplateHandler templateHandler;
 
-    protected ScilabLexer scilabLexer;
-    protected XMLLexer xmlLexer;
-    protected CLexer cLexer;
-    protected JavaLexer javaLexer;
+    protected final ScilabLexer scilabLexer;
+    protected final XMLLexer xmlLexer;
+    protected final CLexer cLexer;
+    protected final JavaLexer javaLexer;
 
     protected String bookTitle = "";
     protected String partTitle = "";
@@ -94,31 +92,28 @@ public class HTMLDocbookTagConverter extends DocbookTagConverter implements Temp
     protected String prependToProgramListing;
     protected String currentId;
     protected String indexFilename = "index" /*UUID.randomUUID().toString()*/ + ".html";
-    protected String language;
+    protected final String language;
 
-    protected boolean isToolbox;
-    protected final GenerationType type;
+    protected final boolean isToolbox;
+    protected final Backend type;
 
     /**
      * Constructor
      * @param inName the name of the input stream
-     * @param outName the output directory
-     * @param primConf the file containing the primitives of Scilab
-     * @param macroConf the file containing the macros of Scilab
-     * @param template the template to use
-     * @param version the version
-     * @param imageDir the image directory (relative to outName)
-     * @param isToolbox is true when compile a toolbox' help
-     * @param urlBase the base url for external link
-     */
-    public HTMLDocbookTagConverter(String inName, String outName, String[] primConf, String[] macroConf, String template, String version, String imageDir, boolean isToolbox, String urlBase, String language, GenerationType type) throws IOException, SAXException {
-        super(inName);
-
-        this.version = version;
-        this.imageDir = imageDir;
-        this.outName = outName + File.separator;
+     * @param sciDocMain provide useful doc generation properties
+     * @param imgConvert the shared image converter for all generation
+     */
+    public HTMLDocbookTagConverter(String inName, SciDocMain sciDocMain, ImageConverter imgConvert) throws IOException, SAXException {
+        super(inName, imgConvert);
+
+        this.version = sciDocMain.getConf().getVersion();
+        this.imageDir = sciDocMain.getImagedir();
+        this.outName = sciDocMain.getOutputDirectory() + File.separator;
         this.outImages = this.outName;
+
+        imgConvert.setDocbookTagConverter(this);
         HTMLDocbookLinkResolver resolver = new HTMLDocbookLinkResolver(inName);
+
         mapId = resolver.getMapId();
         tocitem = resolver.getToc();
         tree = resolver.getTree();
@@ -126,12 +121,18 @@ public class HTMLDocbookTagConverter extends DocbookTagConverter implements Temp
         mapIdPurpose = resolver.getMapIdPurpose();
         mapIdRefname = resolver.getMapIdRefname();
 
-        scilabLexer = new ScilabLexer(primConf, macroConf);
-        this.urlBase = urlBase;
-        this.linkToTheWeb = urlBase != null && !urlBase.equals("scilab://");
-        this.isToolbox = isToolbox;
-        this.language = language;
-        this.type = type;
+        this.isToolbox = sciDocMain.isToolbox();
+        this.language = sciDocMain.getLanguage();
+        this.type = sciDocMain.getFormat();
+
+        if (isToolbox) {
+            urlBase = sciDocMain.getConf().getWebSiteURL() + language + "/";
+            linkToTheWeb = true;
+        } else {
+            urlBase = null;
+            linkToTheWeb = false;
+        }
+
         if (isToolbox) {// we generate a toolbox's help
             HTMLScilabCodeHandler.setLinkWriter(new AbstractScilabCodeHandler.LinkWriter() {
                 public String getLink(String id) {
@@ -157,16 +158,19 @@ public class HTMLDocbookTagConverter extends DocbookTagConverter implements Temp
             });
         }
 
+        scilabLexer = new ScilabLexer(sciDocMain.getConf().getBuiltins(), sciDocMain.getConf().getMacros());
         xmlLexer = new XMLLexer();
         cLexer = new CLexer();
         javaLexer = new JavaLexer();
+
+        final String template = sciDocMain.getConf().getTemplate(sciDocMain.getFormat().toString().toLowerCase());
         File tpl = new File(template);
+        if (!tpl.isFile()) {
+            final String msg = "Could not find template document: " + template;
+            System.err.println(msg);
+            throw new RuntimeException();
+        }
         templateHandler = new TemplateHandler(this, tpl, language);
-        ImageConverter.registerExternalImageConverter(LaTeXImageConverter.getInstance(this));
-        ImageConverter.registerExternalImageConverter(MathMLImageConverter.getInstance(this));
-        ImageConverter.registerExternalImageConverter(SVGImageConverter.getInstance(this));
-        ImageConverter.registerExternalImageConverter(ScilabImageConverter.getInstance(this));
-        ImageConverter.registerExternalImageConverter(XcosImageConverter.getInstance(this));
     }
 
     public static boolean containsCJK(CharSequence seq) {
@@ -217,18 +221,33 @@ public class HTMLDocbookTagConverter extends DocbookTagConverter implements Temp
      * Get the type of the generation
      * @return the generation type
      */
-    public final GenerationType getGenerationType() {
+    public final Backend getGenerationType() {
         return type;
     }
 
-    public String getBaseImagePath() {
-        return "";
-    }
-
     public String getLanguage() {
         return language;
     }
 
+    @Override
+    public void registerAllExternalXMLHandlers() {
+        super.registerAllExternalXMLHandlers();
+
+        registerExternalXMLHandler(new HTMLMathMLHandler(outName, imageDir));
+        registerExternalXMLHandler(new HTMLSVGHandler(outName, imageDir));
+        registerExternalXMLHandler(new HTMLScilabHandler(outName, imageDir));
+    }
+
+    @Override
+    public void install() {
+        super.install();
+
+        ScilabCommonsUtils.copyFile(new File(SCI + "/modules/helptools/data/css/scilab_code.css"), new File(outName + "/scilab_code.css"));
+        ScilabCommonsUtils.copyFile(new File(SCI + "/modules/helptools/data/css/xml_code.css"), new File(outName + "/xml_code.css"));
+        ScilabCommonsUtils.copyFile(new File(SCI + "/modules/helptools/data/css/c_code.css"), new File(outName + "/c_code.css"));
+        ScilabCommonsUtils.copyFile(new File(SCI + "/modules/helptools/data/css/style.css"), new File(outName + "/style.css"));
+    }
+
     /**
      * @return the buffer used
      */
@@ -336,6 +355,38 @@ public class HTMLDocbookTagConverter extends DocbookTagConverter implements Temp
         }
     }
 
+
+
+    /**
+     * @param code the code to translate
+     * @param img image information
+     * @param fileName the filename
+     * @param attrs the attribute of the image
+     * @return the HTML code to insert the image
+     */
+    public String generateCode(Image img, String fileName, Map<String, String> attrs, final String tooltipString) {
+        String style = attrs.get("style");
+        String top = "";
+        boolean display = style != null && style.equals("display");
+
+        if (!display) {
+            top = "top:" + img.descent + "px;";
+        }
+
+        String alignAttr = attrs.get("align");
+        String align = "";
+        String div = "div";
+        if (alignAttr != null) {
+            align = " style=\'text-align:" + alignAttr + "\'";
+        } else if (display) {
+            align = " style=\'text-align:center\'";
+        } else {
+            div = "span";
+        }
+
+        return "<" + div + align + "><img src=\'" + fileName + "\' style=\'position:relative;" + top  + "width:" + img.width + "px;height:" + img.height + "px\'/></" + div + ">";
+    }
+
     /**
      * {@inheritDoc}
      */
@@ -553,6 +604,118 @@ public class HTMLDocbookTagConverter extends DocbookTagConverter implements Temp
         return buffer.toString();
     }
 
+    @Override
+    public String generateImageCode(String code, String fileName, Map<String, String> attrs) {
+        final String imageTag = "<img src=\'" + fileName + "\'/>";
+        if (getGenerationType() == Backend.WEB) {
+            /* Prepare the code for the html inclusion */
+            code = convertCode(code);
+            /* Provide a tooltip */
+            return "<div rel='tooltip' title='" + code + "'>" + imageTag + "</div>";
+        } else {
+            /* No tooltip in the javahelp browser ...
+             * too limited html capabilities */
+            return imageTag;
+        }
+    }
+
+    private static final String convertCode(String code) {
+        if (code == null || code.length() == 0) {
+            return "";
+        }
+
+        StringBuffer buffer = new StringBuffer(2 * code.length());
+        int start = 0;
+        int end = code.length() - 1;
+        char c = code.charAt(0);
+
+        // first we trim
+        while (c == ' ' || c == '\t' || c == '\n' || c == '\r') {
+            if (start < end) {
+                c = code.charAt(++start);
+            } else {
+                break;
+            }
+        }
+        c = code.charAt(end);
+        while (c == ' ' || c == '\t' || c == '\n' || c == '\r') {
+            if (end > 0) {
+                c = code.charAt(--end);
+            } else {
+                break;
+            }
+        }
+
+        // replace chars by their html entities equivalent
+        for (int j = start; j <= end; j++) {
+            c = code.charAt(j);
+            switch (c) {
+                case '&':
+                    buffer.append("&amp;");
+                    break;
+                case '<':
+                    buffer.append("&lt;");
+                    break;
+                case '>':
+                    buffer.append("&gt;");
+                    break;
+                case '\n':
+                    buffer.append("<br />");
+                    break;
+                case '\'':
+                    buffer.append("&#039;");
+                    break;
+                case '\"':
+                    buffer.append("&quot;");
+                    break;
+                default:
+                    buffer.append(c);
+            }
+        }
+
+        return buffer.toString();
+    }
+
+    @Override
+    public String generateImageCode(Image img, String fileName, Map<String, String> attrs) {
+        String style = attrs.get("style");
+        String top = "";
+        boolean display = style != null && style.equals("display");
+
+        if (!display) {
+            top = "top:" + img.descent + "px;";
+        }
+
+        String alignAttr = attrs.get("align");
+        String align = "";
+        String div = "div";
+        if (alignAttr != null) {
+            align = " style=\'text-align:" + alignAttr + "\'";
+        } else if (display) {
+            align = " style=\'text-align:center\'";
+        } else {
+            div = "span";
+        }
+
+        return "<" + div + align + "><img src=\'" + fileName + "\' style=\'position:relative;" + top  + "width:" + img.width + "px;height:" + img.height + "px\'/></" + div + ">";
+    }
+
+    @Override
+    public String generateImageCode(String fileName, Map<String, String> attrs) {
+        String alignAttr = attrs.get("align");
+
+        final StringBuilder str = new StringBuilder(128);
+        if (alignAttr != null) {
+            str.append("<div style=\'text-align:").append(alignAttr).append("\'>");
+        }
+        str.append("<img src=\'").append(fileName).append("\'/>");
+        if (alignAttr != null) {
+            str.append("</div>");
+        }
+
+        return str.toString();
+    }
+
     public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
         latexCompt = 1;
         return super.resolveEntity(publicId, systemId);
@@ -1020,7 +1183,7 @@ public class HTMLDocbookTagConverter extends DocbookTagConverter implements Temp
         String type = attributes.get("type");
         String id;
         if (type != null && type.equals("scilab")) {
-            if (this.type == GenerationType.JAVAHELP || this.type == GenerationType.HTML) {
+            if (this.type == Backend.JAVAHELP || this.type == Backend.HTML) {
                 id = resolvScilabLink(link);
             } else {
                 return contents;
@@ -1033,13 +1196,13 @@ public class HTMLDocbookTagConverter extends DocbookTagConverter implements Temp
 
         if (id == null) {
             if (isToolbox) {
-                if (this.type == GenerationType.HTML) {
+                if (this.type == Backend.HTML) {
                     id = urlBase + link;
                     if (linkToTheWeb) {
                         id += ".html";
                     }
                 }
-                if (this.type == GenerationType.JAVAHELP) {
+                if (this.type == Backend.JAVAHELP) {
                     id = urlBase + link;
                 }
             } else {
@@ -1190,7 +1353,8 @@ public class HTMLDocbookTagConverter extends DocbookTagConverter implements Temp
         if (fs == null) {
             attributes.put("fontsize", "16");
         }
-        return ImageConverter.getImageByCode(currentFileName, contents, attributes, "image/latex", f, imageDir + "/" + f.getName(), getBaseImagePath(), locator.getLineNumber(), language, isLocalized);
+
+        return getImageConverter().getImageByCode(currentFileName, contents, attributes, "image/latex", f, imageDir + "/" + f.getName(), getBaseImagePath(), locator.getLineNumber(), language, isLocalized);
     }
 
     /**
@@ -1317,7 +1481,6 @@ public class HTMLDocbookTagConverter extends DocbookTagConverter implements Temp
      */
     public String handleInformaltable(final Map<String, String> attributes, final String contents) throws SAXException {
         String id = attributes.get("id");
-        String bgcolor = attributes.get("bgcolor");
         String border = attributes.get("border");
         String cellpadding = attributes.get("cellpadding");
         String width = attributes.get("width");
@@ -1352,7 +1515,7 @@ public class HTMLDocbookTagConverter extends DocbookTagConverter implements Temp
                 throw new SAXException("The given fileref is not on an existing image file:\n" + fileref + " [" + file + "]");
             }
 
-            return ImageConverter.getImageByFile(attributes, path, fileref, outImages, imageDir, getBaseImagePath());
+            return getImageConverter().getImageByFile(attributes, path, fileref, outImages, imageDir, getBaseImagePath());
         }  catch (URISyntaxException e) {
             System.err.println(e);
         }
@@ -1,6 +1,7 @@
 /*
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA - Sylvestre LEDRU
+ * Copyright (C) 2013 - Scilab Enterprises - Clement DAVID
  *
  *  This file must be used under the terms of the CeCILL.
  *  This source file is licensed as described in the file COPYING, which
  */
 package org.scilab.modules.helptools;
 
-import com.sun.java.help.search.Indexer; /* jhall (Java Help) */
-
 import java.io.File;
-import java.io.FilenameFilter;
-import java.io.FileOutputStream;
 import java.io.FileInputStream;
-import java.util.zip.ZipEntry;
+import java.io.FileOutputStream;
+import java.io.FilenameFilter;
+import java.util.ArrayList;
 import java.util.jar.JarOutputStream;
+import java.util.zip.ZipEntry;
 
-import java.util.ArrayList;
+import org.scilab.modules.commons.ScilabConstants;
 
-/**
- * This class manages the build of the Java Help
- */
-public final class BuildJavaHelp {
+import com.sun.java.help.search.Indexer;
+
+public class JarOnlyConverter extends ContainerConverter {
+
+    private static final String SCI = ScilabConstants.SCI.getPath();
 
     private static final String JAVAHELPSEARCH_DIR = "/JavaHelpSearch/";
     private static final String COULD_NOT_FIND = "buildDoc: Could not find/access to ";
@@ -36,44 +37,70 @@ public final class BuildJavaHelp {
     private static final int JAR_COMPRESSION_LEVEL = 9;
     private static Indexer indexer = new Indexer();
 
-    /**
-     * Default constructor (must no be used)
-     */
-    private BuildJavaHelp() {
-        throw new UnsupportedOperationException();
+    private final boolean isToolbox;
+    private final String outImages;
+
+    public JarOnlyConverter(SciDocMain sciDocMain) {
+        super(sciDocMain.getOutputDirectory(), sciDocMain.getLanguage());
+
+        isToolbox = sciDocMain.isToolbox();
+
+        /*
+         * Reuse the shared generated images directory from scilab
+         */
+        String images = sciDocMain.getOutputDirectory() + File.separator;
+        if (!isToolbox) {
+            images = ScilabConstants.SCI.getPath() + "/modules/helptools/images";
+            File dir = new File(images);
+            if (!dir.exists()) {
+                dir.mkdir();
+            }
+        }
+        outImages = images;
     }
 
     /**
-     * Get the list of the files in a directory
-     * @param directory the directory where files have to be searched
-     * @param language String 'fr_FR'
-     * @return the list of the files found
+     * Embed the javahelp html files to a jar
      */
-    private static ArrayList<File> buildFileList(File directory,  String language) {
-        final String baseNameJar = Helpers.getBaseName(language) + JAR_EXT;
-        ArrayList<File> listFile = new ArrayList<File>();
+    @Override
+    public void convert() {
+        String outputJavaHelp = new String(outputDirectory + JAVAHELPSEARCH_DIR);
 
-        File[] files = directory.listFiles(new FilenameFilter() {
-            public boolean accept(File dir, String name) {
-                return !name.equals(baseNameJar);
-            }
-        });
-        for (int i = 0; i < files.length; i++) {
-            if (files[i].isDirectory()) {
-                listFile.addAll(buildFileList(files[i], language));
-            } else {
-                listFile.add(files[i]);
-            }
+        try {
+            /* Purge the directory before launching the index */
+            /* because the JavaHelp Indexer failed when launched twice on the same directory */
+            Helpers.deleteDirectory(outputJavaHelp);
+            File directory = new File(outputJavaHelp);
+            directory.mkdirs();
+
+            String[] args = new String[] {"-nostopwords", "."};
+
+            indexer.compile(args);
+        } catch (Exception e) {
+            System.err.println("buildDoc: Error building search index: " + e.getLocalizedMessage());
+            return;
         }
-        return listFile;
+
+        buildJar(outputDirectory, language);
     }
 
-    public static boolean buildJarImages(String inputDirectory, String outputDirectory) {
+    /**
+     * Embed the images files to another jar for non-toolboxes
+     */
+    @Override
+    public void install() {
+        /*
+         * Toolboxes images are not in a separate jar.
+         */
+        if (isToolbox) {
+            return;
+        }
+
         JarOutputStream jarFile = null;
         FileOutputStream fileOutputStream = null;
 
         /* Stored into SCI/modules/helptools/jar */
-        String fileName = outputDirectory + SLASH + "scilab_images" + JAR_EXT;
+        String fileName = SCI + "/modules/helptools/jar" + SLASH + "scilab_images" + JAR_EXT;
         try {
             fileOutputStream = new FileOutputStream(fileName);
             jarFile = new JarOutputStream(fileOutputStream);
@@ -84,7 +111,7 @@ public final class BuildJavaHelp {
             System.err.println(COULD_NOT_FIND + fileName + LEFT_PAR + e.getLocalizedMessage() + RIGHT_PAR);
         }
 
-        File[] allFiles = new File(inputDirectory).listFiles();
+        File[] allFiles = new File(outImages).listFiles();
         for (int i = 0; i < allFiles.length; i++) {
             try {
                 File workingFile = allFiles[i];
@@ -111,8 +138,31 @@ public final class BuildJavaHelp {
         } catch (java.io.IOException e) {
             System.err.println("buildDoc: An error occurs while closing the JavaHelp ( " + e.getLocalizedMessage() + RIGHT_PAR);
         }
+    }
 
-        return true;
+    /**
+     * Get the list of the files in a directory
+     * @param directory the directory where files have to be searched
+     * @param language String 'fr_FR'
+     * @return the list of the files found
+     */
+    private static ArrayList<File> buildFileList(File directory,  String language) {
+        final String baseNameJar = Helpers.getBaseName(language) + JAR_EXT;
+        ArrayList<File> listFile = new ArrayList<File>();
+
+        File[] files = directory.listFiles(new FilenameFilter() {
+            public boolean accept(File dir, String name) {
+                return !name.equals(baseNameJar);
+            }
+        });
+        for (int i = 0; i < files.length; i++) {
+            if (files[i].isDirectory()) {
+                listFile.addAll(buildFileList(files[i], language));
+            } else {
+                listFile.add(files[i]);
+            }
+        }
+        return listFile;
     }
 
     /**
@@ -122,7 +172,7 @@ public final class BuildJavaHelp {
      * @param language In which language (for the file name)
      * @return The result of the operation
      */
-    private static boolean buildJar(String outputDirectory, String language) {
+    static boolean buildJar(String outputDirectory, String language) {
         String baseName = Helpers.getBaseName(language);
         JarOutputStream jarFile = null;
         FileOutputStream fileOutputStream = null;
@@ -131,7 +181,7 @@ public final class BuildJavaHelp {
         String fileName = outputDirectory + SLASH + baseName + JAR_EXT;
         /* bug 4407 */
         /* we do list of files before to create scilab_xx_XX_help.jar */
-        ArrayList<File> fileList = BuildJavaHelp.buildFileList(new File(outputDirectory), language);
+        ArrayList<File> fileList = buildFileList(new File(outputDirectory), language);
 
         try {
             fileOutputStream = new FileOutputStream(fileName);
@@ -181,36 +231,4 @@ public final class BuildJavaHelp {
         }
         return true;
     }
-
-    /**
-     * After the saxon process, create the Jar
-     *
-     * @param outputDirectory Where the files are available and
-     * @param language In which language (for the file name)
-     * @return The result of the process
-     */
-    public static String buildJavaHelp(String outputDirectory, String language) {
-
-        String outputJavaHelp = new String(outputDirectory + JAVAHELPSEARCH_DIR);
-
-        try {
-            /* Purge the directory before launching the index */
-            /* because the JavaHelp Indexer failed when launched twice on the same directory */
-            Helpers.deleteDirectory(outputJavaHelp);
-            File directory = new File(outputJavaHelp);
-            directory.mkdirs();
-
-            String[] args = new String[] {"-nostopwords", "."};
-
-            indexer.compile(args);
-        } catch (Exception e) {
-            System.err.println("buildDoc: Error building search index: " + e.getLocalizedMessage());
-            return null;
-        }
-
-        BuildJavaHelp.buildJar(outputDirectory, language);
-
-        return outputDirectory;
-    }
-
 }
index f584717..0287f85 100644 (file)
@@ -20,8 +20,9 @@ import java.nio.charset.Charset;
 import java.util.Iterator;
 
 import org.xml.sax.SAXException;
-
+import org.scilab.modules.commons.ScilabCommonsUtils;
 import org.scilab.modules.commons.ScilabConstants;
+import org.scilab.modules.gui.utils.ScilabSwingUtilities;
 import org.scilab.modules.helptools.image.ImageConverter;
 
 /**
@@ -37,30 +38,56 @@ public class JavaHelpDocbookTagConverter extends HTMLDocbookTagConverter {
     /**
      * Constructor
      * @param inName the name of the input stream
-     * @param outName the output directory
-     * @param primConf the file containing the primitives of Scilab
-     * @param macroConf the file containing the macros of Scilab
-     * @param template the template to use
-     * @param version the version
-     * @param imageDir the image directory (relative to outName)
-     * @param isToolbox is true when compile a toolbox' help
-     * @param urlBase the base url for external link
+     * @param sciDocMain provide useful doc generation properties
+     * @param imgConvert the shared image converter for all generation
      */
-    public JavaHelpDocbookTagConverter(String inName, String outName, String[] primConf, String[] macroConf, String template, String version, String imageDir, boolean isToolbox, String urlBase, String language) throws IOException, SAXException {
-        super(inName, outName, primConf, macroConf, template, version, imageDir, isToolbox, urlBase, language, HTMLDocbookTagConverter.GenerationType.JAVAHELP);
+    public JavaHelpDocbookTagConverter(String inName, SciDocMain sciDocMain, ImageConverter imgConvert) throws IOException, SAXException {
+        super(inName, sciDocMain, imgConvert);
+
+        urlBase = "scilab://";
+        linkToTheWeb = false;
+
         if (!isToolbox) {
             this.outImages = ScilabConstants.SCI.getPath() + "/modules/helptools/images";
             File dir = new File(this.outImages);
             if (!dir.exists()) {
                 dir.mkdir();
             }
-            ImageConverter.loadMD5s(ScilabConstants.SCI.getPath() + "/modules/helptools/etc");
         }
+
         prependToProgramListing = "<table border=\"0\" width=\"100%\"><tr><td width=\"98%\">";
         appendToProgramListing = "</td><td valign=\"top\"><a href=\"scilab://scilab.execexample/\"><img src=\"" + getBaseImagePath() + "ScilabExecute.png\" border=\"0\"/></a></td><td valign=\"top\"><a href=\"scilab://scilab.editexample/\"><img src=\"" + getBaseImagePath() + "ScilabEdit.png\" border=\"0\"/></a></td><td></td></tr></table>";
         appendForExecToProgramListing = "</td><td valign=\"top\"><a href=\"scilab://scilab.execexample/\"><img src=\"" + getBaseImagePath() + "ScilabExecute.png\" border=\"0\"/></a></td><td></td></tr></table>";
     }
 
+    @Override
+    public void install() {
+        super.install();
+
+        ScilabCommonsUtils.copyFile(new File(ScilabSwingUtilities.findIcon("media-playback-start")), new File(outImages + "/ScilabExecute.png"));
+        ScilabCommonsUtils.copyFile(new File(ScilabSwingUtilities.findIcon("accessories-text-editor")), new File(outImages + "/ScilabEdit.png"));
+        ScilabCommonsUtils.copyFile(new File(ScilabSwingUtilities.findIcon("dialog-information")), new File(outImages + "/ScilabNote.png"));
+        ScilabCommonsUtils.copyFile(new File(ScilabSwingUtilities.findIcon("dialog-warning")), new File(outImages + "/ScilabWarning.png"));
+        ScilabCommonsUtils.copyFile(new File(ScilabSwingUtilities.findIcon("dialog-warning")), new File(outImages + "/ScilabCaution.png"));
+        ScilabCommonsUtils.copyFile(new File(ScilabSwingUtilities.findIcon("dialog-information")), new File(outImages + "/ScilabTip.png"));
+        ScilabCommonsUtils.copyFile(new File(ScilabSwingUtilities.findIcon("emblem-important")), new File(outImages + "/ScilabImportant.png"));
+        if (!isToolbox) {
+            ScilabCommonsUtils.copyFile(new File(SCI + "/modules/helptools/data/pages/error.html"), new File(outName + "/ScilabErrorPage.html"));
+            File homepage = new File(SCI + "/modules/helptools/data/pages/homepage-" + language + ".html");
+            if (!homepage.isFile()) {
+                /* could not find the localized homepage. Switch to english */
+                homepage = new File(SCI + "/modules/helptools/data/pages/homepage-en_US.html");
+            }
+            ScilabCommonsUtils.copyFile(homepage, new File(outName + "/ScilabHomePage.html"));
+
+            File homepageImage = new File(SCI + "/modules/helptools/data/pages/ban-" + language + ".png");
+            if (!homepageImage.isFile()) {
+                homepageImage = new File(SCI + "/modules/helptools/data/pages/ban-en_US.png");
+            }
+            ScilabCommonsUtils.copyFile(homepageImage, new File(outImages + "/ban_en_US.png"));
+        }
+    }
+
     /**
      * {@inheritDoc}
      */
@@ -106,7 +133,7 @@ public class JavaHelpDocbookTagConverter extends HTMLDocbookTagConverter {
             outIndex.close();
 
             if (!isToolbox) {
-                ImageConverter.saveMD5s(ScilabConstants.SCI.getPath() + "/modules/helptools/etc");
+                getImageConverter().saveMD5s(ScilabConstants.SCI.getPath() + "/modules/helptools/etc");
             }
         } catch (IOException e) {
             fatalExceptionOccurred(e);
index fd5e7ba..fa8a554 100644 (file)
 package org.scilab.modules.helptools;
 
 import java.io.File;
-
-import org.xml.sax.SAXException;
-
-import org.scilab.modules.commons.ScilabCommonsUtils;
 import org.scilab.modules.commons.ScilabConstants;
-import org.scilab.modules.gui.utils.ScilabSwingUtilities;
-import org.scilab.modules.helptools.external.HTMLMathMLHandler;
-import org.scilab.modules.helptools.external.HTMLScilabHandler;
-import org.scilab.modules.helptools.external.HTMLSVGHandler;
+import org.scilab.modules.helptools.Converter.Backend;
 import org.scilab.modules.helptools.image.ImageConverter;
-import org.scilab.modules.helptools.image.ScilabImageConverter;
+import org.xml.sax.SAXException;
 
 /**
- * Class to convert DocBook to HTML
+ * Class to convert DocBook
  * @author Calixte DENIZET
  */
 public final class SciDocMain {
-
-    private static final String SCI = ScilabConstants.SCI.getPath();
-
+    /**
+     * The output directory
+     */
     private String outputDirectory;
+    /**
+     * The target language as locale string descriptor (en_US, fr_FR, ...)
+     */
     private String language;
-    private String format;
-    private String template;
-    private String version;
-    private String imagedir;
-    private String[] sciprim;
-    private String[] scimacro;
+    /**
+     * Target format
+     */
+    private Backend format;
+    /**
+     * Image directory relative to the outputDirectory
+     */
+    private String imagedir = ".";
+    /**
+     * The configuration of the current generation
+     */
+    private SciDocConfiguration conf = new SciDocConfiguration();
+    /**
+     * True if the documentation should be generated for a toolbox, false for Scilab
+     */
     private boolean isToolbox;
 
+    /*
+     * GIWS Exported methods
+     */
+
     /**
      * Set the directory where files must be exported
      * Note that directory is created
@@ -82,20 +91,29 @@ public final class SciDocMain {
      * @param format the format (among the list CHM, HTML, PDF, JH, PS)
      */
     public void setExportFormat(String format) {
-        this.format = format;
+        final String f = format.toUpperCase().replace('-', '_');
+        try {
+            this.format = Enum.valueOf(Backend.class, f);
+            return;
+        } catch (IllegalArgumentException e) {
+        }
+
+        Backend[] values = Backend.values();
+        final StringBuilder str = new StringBuilder();
+        str.append('[');
+        str.append(values[0]);
+        for (int i = 1; i < values.length; i++) {
+            str.append(',').append(' ');
+            str.append(values[i].toString().toLowerCase());
+        }
+        str.append(']');
+        System.err.printf("%s is not a supported format : one of %s expected.\n", format.toString(), str);
+
     }
 
     /* Stylesheet is useless and just kept to keep the consistency with
      * builddoc V1 */
     public String process(String sourceDoc, String styleSheet)  {
-        SciDocConfiguration conf = new SciDocConfiguration();
-        template = conf.getTemplate(format.toLowerCase());
-        /* TODO: make this file generated at build time of Scilab */
-        sciprim = conf.getBuiltins();
-        scimacro = conf.getMacros();
-        version = conf.getVersion();
-        imagedir = ".";//the path must be relative to outputDirectory
-        String imageOut = outputDirectory;
         String fileToExec = null;
 
         if (!new File(sourceDoc).isFile()) {
@@ -103,76 +121,42 @@ public final class SciDocMain {
             return null;
         }
 
-        if (!new File(template).isFile()) {
-            System.err.println("Could not find template document: " + template);
-            return null;
-        }
-
         try {
-            DocbookTagConverter converter = null;
-            String urlBase = null;
-
-            if (format.equalsIgnoreCase("javahelp")) {
-                converter = new JavaHelpDocbookTagConverter(sourceDoc, outputDirectory, sciprim, scimacro, template, version, imagedir, isToolbox, "scilab://", language);
-                if (!isToolbox) {
-                    imageOut = ((JavaHelpDocbookTagConverter) converter).outImages;
-                }
-            } else {
-                if (isToolbox) {
-                    urlBase = conf.getWebSiteURL() + language + "/";
-                }
-                if (format.equalsIgnoreCase("html")) {
-                    converter = new HTMLDocbookTagConverter(sourceDoc, outputDirectory, sciprim, scimacro, template, version, imagedir, isToolbox, urlBase, language, HTMLDocbookTagConverter.GenerationType.HTML);
-                } else if (format.equalsIgnoreCase("web")) {
-                    converter = new HTMLDocbookTagConverter(sourceDoc, outputDirectory, sciprim, scimacro, template, version, imagedir, isToolbox, urlBase, language, HTMLDocbookTagConverter.GenerationType.WEB);
-                    ImageConverter.loadMD5s(ScilabConstants.SCI.getPath() + "/modules/helptools/etc");
-                } else if (format.equalsIgnoreCase("chm")) {
-                    converter = new CHMDocbookTagConverter(sourceDoc, outputDirectory, sciprim, scimacro, template, version, imagedir, conf.getWebSiteURL(), isToolbox, urlBase, language);
-                }
+            Converter converter = null;
+            ImageConverter imgConvert = new ImageConverter();
+
+            switch (format) {
+                case JAVAHELP:
+                    imgConvert.loadMD5s(ScilabConstants.SCI.getPath() + "/modules/helptools/etc");
+                    converter = new JavaHelpDocbookTagConverter(sourceDoc, this, imgConvert);
+                    break;
+                case HTML:
+                    converter = new HTMLDocbookTagConverter(sourceDoc, this, imgConvert);
+                    break;
+                case WEB:
+                    imgConvert.loadMD5s(ScilabConstants.SCI.getPath() + "/modules/helptools/etc");
+                    converter = new HTMLDocbookTagConverter(sourceDoc, this, imgConvert);
+                    break;
+                case CHM:
+                    imgConvert.loadMD5s(ScilabConstants.SCI.getPath() + "/modules/helptools/etc");
+                    converter = new CHMDocbookTagConverter(sourceDoc, this, imgConvert);
+                    break;
+                case JAR_ONLY:
+                    converter = new JarOnlyConverter(this);
+                    break;
+                default:
+                    System.err.printf("%s is not a supported format.\n", format);
+                    return null;
             }
 
-            converter.registerExternalXMLHandler(HTMLMathMLHandler.getInstance(imageOut, imagedir));
-            converter.registerExternalXMLHandler(HTMLSVGHandler.getInstance(imageOut, imagedir));
-            converter.registerExternalXMLHandler(HTMLScilabHandler.getInstance(imageOut, imagedir));
+            converter.registerAllExternalXMLHandlers();
+
             converter.convert();
 
-            HTMLMathMLHandler.clean();
-            HTMLSVGHandler.clean();
-            HTMLScilabHandler.clean();
-
-            fileToExec = ScilabImageConverter.getFileWithScilabCode();
-
-            ScilabCommonsUtils.copyFile(new File(SCI + "/modules/helptools/data/css/scilab_code.css"), new File(outputDirectory + "/scilab_code.css"));
-            ScilabCommonsUtils.copyFile(new File(SCI + "/modules/helptools/data/css/xml_code.css"), new File(outputDirectory + "/xml_code.css"));
-            ScilabCommonsUtils.copyFile(new File(SCI + "/modules/helptools/data/css/c_code.css"), new File(outputDirectory + "/c_code.css"));
-            ScilabCommonsUtils.copyFile(new File(SCI + "/modules/helptools/data/css/style.css"), new File(outputDirectory + "/style.css"));
-            ScilabCommonsUtils.copyFile(new File(ScilabSwingUtilities.findIcon("media-playback-start")), new File(imageOut + "/ScilabExecute.png"));
-            ScilabCommonsUtils.copyFile(new File(ScilabSwingUtilities.findIcon("accessories-text-editor")), new File(imageOut + "/ScilabEdit.png"));
-            ScilabCommonsUtils.copyFile(new File(ScilabSwingUtilities.findIcon("dialog-information")), new File(imageOut + "/ScilabNote.png"));
-            ScilabCommonsUtils.copyFile(new File(ScilabSwingUtilities.findIcon("dialog-warning")), new File(imageOut + "/ScilabWarning.png"));
-            ScilabCommonsUtils.copyFile(new File(ScilabSwingUtilities.findIcon("dialog-warning")), new File(imageOut + "/ScilabCaution.png"));
-            ScilabCommonsUtils.copyFile(new File(ScilabSwingUtilities.findIcon("dialog-information")), new File(imageOut + "/ScilabTip.png"));
-            ScilabCommonsUtils.copyFile(new File(ScilabSwingUtilities.findIcon("emblem-important")), new File(imageOut + "/ScilabImportant.png"));
-            if (format.equalsIgnoreCase("javahelp")) {
-                if (!isToolbox) {
-                    ScilabCommonsUtils.copyFile(new File(SCI + "/modules/helptools/data/pages/error.html"), new File(outputDirectory + "/ScilabErrorPage.html"));
-                    File homepage = new File(SCI + "/modules/helptools/data/pages/homepage-" + language + ".html");
-                    if (!homepage.isFile()) {
-                        /* could not find the localized homepage. Switch to english */
-                        homepage = new File(SCI + "/modules/helptools/data/pages/homepage-en_US.html");
-                    }
-                    ScilabCommonsUtils.copyFile(homepage, new File(outputDirectory + "/ScilabHomePage.html"));
-
-                    File homepageImage = new File(SCI + "/modules/helptools/data/pages/ban-" + language + ".png");
-                    if (!homepageImage.isFile()) {
-                        homepageImage = new File(SCI + "/modules/helptools/data/pages/ban-en_US.png");
-                    }
-                    ScilabCommonsUtils.copyFile(homepageImage, new File(imageOut + "/ban_en_US.png"));
-                }
-
-                if (fileToExec == null) {
-                    generateJavahelp(outputDirectory, language, isToolbox);
-                }
+            converter.install();
+
+            if (imgConvert.getScilabImageConverter() != null) {
+                fileToExec = imgConvert.getScilabImageConverter().getFileWithScilabCode();
             }
 
         } catch (SAXException e) {
@@ -186,10 +170,31 @@ public final class SciDocMain {
         return fileToExec;
     }
 
-    public static void generateJavahelp(String outputDirectory, String language, boolean isToolbox) {
-        BuildJavaHelp.buildJavaHelp(outputDirectory, language);
-        if (!isToolbox) {
-            BuildJavaHelp.buildJarImages(SCI + "/modules/helptools/images", SCI + "/modules/helptools/jar");
-        }
+    /*
+     * Getters
+     */
+
+    public String getOutputDirectory() {
+        return outputDirectory;
+    }
+
+    public String getLanguage() {
+        return language;
+    }
+
+    public Backend getFormat() {
+        return format;
+    }
+
+    public String getImagedir() {
+        return imagedir;
+    }
+
+    public SciDocConfiguration getConf() {
+        return conf;
+    }
+
+    public boolean isToolbox() {
+        return isToolbox;
     }
 }
index 873edec..db9b762 100644 (file)
@@ -96,6 +96,7 @@ public class TemplateHandler {
                 stringBuilder.append(line);
                 stringBuilder.append("\n");
             }
+            reader.close();
 
             array = stringBuilder.toString().split("(<!--<)|(>-->)");
         } catch (IOException e) {
index 2ee45c8..8a9b9c6 100644 (file)
 
 package org.scilab.modules.helptools.external;
 
+import java.io.File;
+
 import org.xml.sax.Attributes;
 import org.xml.sax.Locator;
-
 import org.scilab.modules.helptools.DocbookTagConverter;
 
 public abstract class ExternalXMLHandler {
 
     private DocbookTagConverter converter;
+    protected int compt = 1;
 
     public abstract StringBuilder startExternalXML(String localName, Attributes attributes, Locator locator);
 
@@ -27,14 +29,18 @@ public abstract class ExternalXMLHandler {
 
     public abstract String getURI();
 
-    public DocbookTagConverter getConverter() {
+    public final DocbookTagConverter getConverter() {
         return converter;
     }
 
-    public void setConverter(DocbookTagConverter converter) {
+    public final void setConverter(DocbookTagConverter converter) {
         this.converter = converter;
     }
 
+    public final void resetCompt() {
+        compt = 1;
+    }
+
     public String getScilabURI() {
         return "http://www.scilab.org";
     }
index 2557013..9406dbb 100644 (file)
@@ -20,7 +20,6 @@ import org.xml.sax.Attributes;
 import org.xml.sax.Locator;
 
 import org.scilab.modules.helptools.HTMLDocbookTagConverter;
-import org.scilab.modules.helptools.image.ImageConverter;
 
 /**
  * Handle the included SVG code
@@ -31,9 +30,6 @@ public class HTMLMathMLHandler extends ExternalXMLHandler {
     private static final String MATH = "math";
     private static final String BASENAME = "_MathML_";
 
-    private static HTMLMathMLHandler instance;
-
-    private int compt = 1;
     private StringBuilder buffer = new StringBuilder(8192);
     private String baseDir;
     private String outputDir;
@@ -44,31 +40,11 @@ public class HTMLMathMLHandler extends ExternalXMLHandler {
      * Constructor
      * @param baseDir the base directory where to put the generated images
      */
-    private HTMLMathMLHandler(String outputDir, String baseDir) {
+    public HTMLMathMLHandler(String outputDir, String baseDir) {
         this.outputDir = outputDir + File.separator + baseDir;
         this.baseDir = baseDir + "/";
     }
 
-    public static HTMLMathMLHandler getInstance(String outputDir, String baseDir) {
-        if (instance == null) {
-            instance = new HTMLMathMLHandler(outputDir, baseDir);
-        }
-
-        return instance;
-    }
-
-    public static HTMLMathMLHandler getInstance() {
-        return instance;
-    }
-
-    public static void clean() {
-        instance = null;
-    }
-
-    public void resetCompt() {
-        compt = 1;
-    }
-
     /**
      * {@inheritDoc}
      */
@@ -120,7 +96,7 @@ public class HTMLMathMLHandler extends ExternalXMLHandler {
                 baseImagePath = ((HTMLDocbookTagConverter) getConverter()).getBaseImagePath();
             }
 
-            String ret = ImageConverter.getImageByCode(getConverter().getCurrentFileName(), buffer.toString(), attributes, "image/mathml", f, baseDir + f.getName(), baseImagePath, line, language, isLocalized);
+            String ret = getConverter().getImageConverter().getImageByCode(getConverter().getCurrentFileName(), buffer.toString(), attributes, "image/mathml", f, baseDir + f.getName(), baseImagePath, line, language, isLocalized);
             buffer.setLength(0);
 
             return ret;
index 373534d..1c27e2b 100644 (file)
@@ -31,9 +31,6 @@ public class HTMLSVGHandler extends ExternalXMLHandler {
     private static final String SVG = "svg";
     private static final String BASENAME = "_SVG_";
 
-    private static HTMLSVGHandler instance;
-
-    private int compt = 1;
     private StringBuilder buffer = new StringBuilder(8192);
     private String baseDir;
     private String outputDir;
@@ -44,30 +41,11 @@ public class HTMLSVGHandler extends ExternalXMLHandler {
      * Constructor
      * @param baseDir the base directory where to put the generated images
      */
-    private HTMLSVGHandler(String outputDir, String baseDir) {
+    public HTMLSVGHandler(String outputDir, String baseDir) {
         this.outputDir = outputDir + File.separator + baseDir;
         this.baseDir = baseDir + "/";
     }
 
-    public static HTMLSVGHandler getInstance(String outputDir, String baseDir) {
-        if (instance == null) {
-            instance = new HTMLSVGHandler(outputDir, baseDir);
-        }
-
-        return instance;
-    }
-    public static HTMLSVGHandler getInstance() {
-        return instance;
-    }
-
-    public static void clean() {
-        instance = null;
-    }
-
-    public void resetCompt() {
-        compt = 1;
-    }
-
     /**
      * {@inheritDoc}
      */
@@ -118,7 +96,7 @@ public class HTMLSVGHandler extends ExternalXMLHandler {
                 baseImagePath = ((HTMLDocbookTagConverter) getConverter()).getBaseImagePath();
             }
 
-            String ret = ImageConverter.getImageByCode(getConverter().getCurrentFileName(), buffer.toString(), attributes, "image/svg", f, baseDir + f.getName(), baseImagePath, line, language, isLocalized);
+            String ret = getConverter().getImageConverter().getImageByCode(getConverter().getCurrentFileName(), buffer.toString(), attributes, "image/svg", f, baseDir + f.getName(), baseImagePath, line, language, isLocalized);
             buffer.setLength(0);
 
             return ret;
index dbcf038..590b02e 100644 (file)
@@ -22,8 +22,6 @@ import org.xml.sax.Attributes;
 import org.xml.sax.Locator;
 
 import org.scilab.modules.helptools.HTMLDocbookTagConverter;
-import org.scilab.modules.helptools.image.ImageConverter;
-import org.scilab.modules.helptools.image.ScilabImageConverter;
 
 /**
  * Handle the included SCILAB code
@@ -34,9 +32,6 @@ public class HTMLScilabHandler extends ExternalXMLHandler {
     private static final String IMAGE = "image";
     private static final String BASENAME = "_";
 
-    private static HTMLScilabHandler instance;
-
-    private int compt = 1;
     private StringBuilder buffer = new StringBuilder(8192);
     private String baseDir;
     private String outputDir;
@@ -47,31 +42,11 @@ public class HTMLScilabHandler extends ExternalXMLHandler {
      * Constructor
      * @param baseDir the base directory where to put the generated images
      */
-    private HTMLScilabHandler(String outputDir, String baseDir) {
+    public HTMLScilabHandler(String outputDir, String baseDir) {
         this.outputDir = outputDir + File.separator + baseDir;
         this.baseDir = baseDir + "/";
     }
 
-    public static HTMLScilabHandler getInstance(String outputDir, String baseDir) {
-        if (instance == null) {
-            instance = new HTMLScilabHandler(outputDir, baseDir);
-        }
-
-        return instance;
-    }
-
-    public static HTMLScilabHandler getInstance() {
-        return instance;
-    }
-
-    public void resetCompt() {
-        compt = 1;
-    }
-
-    public static void clean() {
-        instance = null;
-    }
-
     /**
      * {@inheritDoc}
      */
@@ -127,19 +102,18 @@ public class HTMLScilabHandler extends ExternalXMLHandler {
                 baseImagePath = ((HTMLDocbookTagConverter) getConverter()).getBaseImagePath();
             }
             if (isLocalized || (existing = getExistingFile(outputDir, fileName)) == null) {
-                ret = ImageConverter.getImageByCode(currentFileName, buffer.toString(), attributes, "image/scilab", f, baseDir + f.getName(), baseImagePath, line, language, isLocalized);
+                ret = getConverter().getImageConverter().getImageByCode(currentFileName, buffer.toString(), attributes, "image/scilab", f, baseDir + f.getName(), baseImagePath, line, language, isLocalized);
             } else {
-                ret = ImageConverter.getImageByFile(attributes, null, existing.getAbsolutePath(), outputDir, ".", baseImagePath);
-                ret = ScilabImageConverter.getInstance().getHTMLCodeToReturn(buffer.toString(), ret);
+                ret = getConverter().getImageConverter().getImageByFile(attributes, null, existing.getAbsolutePath(), outputDir, ".", baseImagePath);
             }
 
             buffer.setLength(0);
-
             return ret;
         }
 
         recreateTag(buffer, localName, null);
 
+        buffer.setLength(0);
         return null;
     }
 
index 776878e..cf72d95 100644 (file)
@@ -13,7 +13,6 @@
 package org.scilab.modules.helptools.image;
 
 import java.awt.Graphics2D;
-import java.awt.Color;
 import java.awt.image.BufferedImage;
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
@@ -23,10 +22,6 @@ import java.io.FileOutputStream;
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
-import java.io.OutputStream;
-import java.io.StringReader;
-import java.net.URI;
-import java.net.URISyntaxException;
 import java.nio.channels.FileChannel;
 import java.util.HashMap;
 import java.util.Map;
@@ -35,10 +30,10 @@ import java.util.TreeMap;
 import javax.activation.MimetypesFileTypeMap;
 import javax.imageio.ImageIO;
 import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.JLabel;
 
 import org.scilab.modules.commons.ScilabCommonsUtils;
+import org.scilab.modules.helptools.Converter;
+import org.scilab.modules.helptools.DocbookTagConverter;
 
 /**
  * Class to handle the image conversion
@@ -48,11 +43,12 @@ public final class ImageConverter {
 
     private static final String MD5_FILE = "images_md5.txt";
 
-    private static Map<String, ExternalImageConverter> externalConverters = new HashMap<String, ExternalImageConverter>();
-    private static MimetypesFileTypeMap mimeMap = new MimetypesFileTypeMap();
-    private static Map<String, String> md5s;
+    private DocbookTagConverter conv;
+    private Map<String, ExternalImageConverter> externalConverters = new HashMap<String, ExternalImageConverter>();
+    private MimetypesFileTypeMap mimeMap = new MimetypesFileTypeMap();
+    private Map<String, String> md5s = null;
 
-    static {
+    public ImageConverter() {
         mimeMap.addMimeTypes("type=image/latex exts=tex,latex");
         mimeMap.addMimeTypes("type=image/mathml exts=mml,mathml");
         mimeMap.addMimeTypes("type=image/svg exts=svg");
@@ -60,21 +56,33 @@ public final class ImageConverter {
         mimeMap.addMimeTypes("type=image/scilab-xcos exts=xcos,zcos");
     }
 
+    public void setDocbookTagConverter(DocbookTagConverter conv) {
+        this.conv = conv;
+    }
+
     /**
      * Register a new ExternalImageConverter
      * @param c the converter to register
      */
-    public static void registerExternalImageConverter(ExternalImageConverter c) {
+    public void registerExternalImageConverter(ExternalImageConverter c) {
         if (c != null) {
             externalConverters.put(c.getMimeType(), c);
         }
     }
 
     /**
+     * Get the current Scilab image converter
+     * @return a Scilab image converter
+     */
+    public ScilabImageConverter getScilabImageConverter() {
+        return (ScilabImageConverter) externalConverters.get("image/scilab");
+    }
+
+    /**
      * Load file containing md5s
      * @param dir the directory where to find the file
      */
-    public static void loadMD5s(String dir) {
+    public void loadMD5s(String dir) {
         md5s = getMD5s(dir);
     }
 
@@ -82,9 +90,8 @@ public final class ImageConverter {
      * Save file containing md5s
      * @param dir the directory where to find the file
      */
-    public static void saveMD5s(String dir) {
+    public void saveMD5s(String dir) {
         writeMD5s(dir, md5s);
-        md5s = null;
     }
 
     /**
@@ -92,7 +99,7 @@ public final class ImageConverter {
      * @param code the code to compare
      * @param file the file name of the future image
      */
-    public static boolean compareMD5(String code, String file) {
+    public boolean compareMD5(String code, String file) {
         if (md5s != null && code != null && file != null && !file.isEmpty()) {
             code = code.trim().replaceAll("[ \t]*[\n]+[ \t]*", "");
             String md5 = ScilabCommonsUtils.getMD5(code);
@@ -186,9 +193,9 @@ public final class ImageConverter {
      * @param path the current XML file which is parsed
      * @param image the filename
      * @param destDir the destination directory
-     * @return the HTML code to insert the image
+     * @return true if the code has been rendered into {@code imageFile}
      */
-    public static String getImageByFile(Map<String, String> attrs, String path, String image, String outputDir, String destDir, String baseImagePath) {
+    public String getImageByFile(Map<String, String> attrs, String path, String image, String outputDir, String destDir, String baseImagePath) {
         File f = new File(image);
         if (!f.isAbsolute()) {
             f = new File(path + File.separator + image);
@@ -196,21 +203,21 @@ public final class ImageConverter {
 
         String destFile = outputDir + File.separator + destDir + File.separator + f.getName();
 
-        ExternalImageConverter conv = externalConverters.get(mimeMap.getContentType(f));
-        if (conv != null) {
+        ExternalImageConverter imgConv = externalConverters.get(mimeMap.getContentType(f));
+        if (imgConv != null) {
             destFile += ".png";
         }
         File imageFile = new File(destFile);
         String imageName = destDir + "/" + imageFile.getName();
 
         if (f.lastModified() > imageFile.lastModified()) {
-            if (conv != null) {
-                return conv.convertToImage(f, attrs, imageFile, imageName);
+            if (imgConv != null) {
+                return imgConv.convertToImage(f, attrs, imageFile, imageName);
             }
             copyImageFile(f, outputDir + File.separator + destDir);
         }
 
-        return "<img src=\'" + baseImagePath + imageName + "\'/>";
+        return conv.generateImageCode(conv.getBaseImagePath() + imageName, attrs);
     }
 
     /**
@@ -218,11 +225,11 @@ public final class ImageConverter {
      * @param attrs the attribute of the image
      * @param mime type
      * @param imageFile the filename
-     * @return the HTML code to insert the image
+     * @return true if the code has been rendered into {@code imageFile}
      */
-    public static String getImageByCode(String currentFile, String code, Map<String, String> attrs, String mime, File imageFile, String imageName, String baseImagePath, int lineNumber, String language, boolean isLocalized) {
-        ExternalImageConverter conv = externalConverters.get(mime);
-        if (conv == null) {
+    public String getImageByCode(String currentFile, String code, Map<String, String> attrs, String mime, File imageFile, String imageName, String baseImagePath, int lineNumber, String language, boolean isLocalized) {
+        ExternalImageConverter imgConv = externalConverters.get(mime);
+        if (imgConv == null) {
             System.err.println("In file " + currentFile + " at line " + lineNumber + ": invalid code:\n" + code);
             return null;
         }
@@ -231,48 +238,18 @@ public final class ImageConverter {
             md5s.remove(imageFile.getName());
         }
 
+        File current = new File(currentFile);
         if (!compareMD5(code, imageFile.getName())) {
-            File current = new File(currentFile);
             if (isLocalized || language.equals("en_US")) {
                 System.err.println("Info: Create image " + imageFile.getName() + " from line " + lineNumber + " in " + current.getName());
             } else if (!language.equals("en_US") && imageFile.exists()) {
                 System.err.println("Warning: Overwrite image " + imageFile.getName() + " from line " + lineNumber + " in " + current.getName() + ". Check the code or use scilab:localized=\"true\" attribute.");
             }
 
-            return conv.convertToImage(currentFile, code, attrs, imageFile, imageName);
-        }
-
-        return "<img src=\'" + baseImagePath + imageName + "\'/>";
-    }
-
-    /**
-     * @param code the code to translate
-     * @param img image information
-     * @param fileName the filename
-     * @param attrs the attribute of the image
-     * @return the HTML code to insert the image
-     */
-    public static String generateCode(Image img, String fileName, Map<String, String> attrs) {
-        String style = attrs.get("style");
-        String top = "";
-        boolean display = style != null && style.equals("display");
-
-        if (!display) {
-            top = "top:" + img.descent + "px;";
-        }
-
-        String alignAttr = attrs.get("align");
-        String align = "";
-        String div = "div";
-        if (alignAttr != null) {
-            align = " style=\'text-align:" + alignAttr + "\'";
-        } else if (display) {
-            align = " style=\'text-align:center\'";
-        } else {
-            div = "span";
+            return imgConv.convertToImage(currentFile, code, attrs, imageFile, imageName);
         }
 
-        return "<" + div + align + "><img src=\'" + fileName + "\' style=\'position:relative;" + top  + "width:" + img.width + "px;height:" + img.height + "px\'/></" + div + ">";
+        return conv.generateImageCode(conv.getBaseImagePath() + imageName, attrs);
     }
 
     /**
index dd76293..b0b5cef 100644 (file)
@@ -15,18 +15,14 @@ package org.scilab.modules.helptools.image;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
-import java.io.StringReader;
 import java.io.IOException;
 import java.util.Map;
 
-import javax.swing.JLabel;
-
 import org.scilab.forge.jlatexmath.TeXConstants;
 import org.scilab.forge.jlatexmath.TeXFormula;
 import org.scilab.forge.jlatexmath.TeXIcon;
 import org.scilab.forge.jlatexmath.ParseException;
-
-import org.scilab.modules.helptools.HTMLDocbookTagConverter;
+import org.scilab.modules.helptools.DocbookTagConverter;
 
 /**
  * A LaTeX to PNG converter
@@ -34,10 +30,9 @@ import org.scilab.modules.helptools.HTMLDocbookTagConverter;
  */
 public class LaTeXImageConverter implements ExternalImageConverter {
 
-    private static LaTeXImageConverter instance;
-    private final HTMLDocbookTagConverter conv;
+    private final DocbookTagConverter conv;
 
-    private LaTeXImageConverter(HTMLDocbookTagConverter conv) {
+    public LaTeXImageConverter(DocbookTagConverter conv) {
         this.conv = conv;
     }
 
@@ -56,17 +51,6 @@ public class LaTeXImageConverter implements ExternalImageConverter {
     }
 
     /**
-     * Since it is a singleton class...
-     * @return this
-     */
-    public static ExternalImageConverter getInstance(HTMLDocbookTagConverter conv) {
-        if (instance == null) {
-            instance = new LaTeXImageConverter(conv);
-        }
-        return instance;
-    }
-
-    /**
      * {@inheritDoc}
      */
     public String convertToImage(String currentFile, String latex, Map<String, String> attributes, File imageFile, String imageName) {
@@ -90,15 +74,12 @@ public class LaTeXImageConverter implements ExternalImageConverter {
 
             Image img = new Image(icon, icon.getIconWidth(), icon.getIconHeight(), icon.getIconHeight() - icon.getIconDepth(), icon.getIconDepth());
             if (img != null && ImageConverter.convertIconToPNG(img.icon, imageFile)) {
-                return ImageConverter.generateCode(img, conv.getBaseImagePath() + imageName, attributes);
+                return conv.generateImageCode(img, conv.getBaseImagePath() + imageName, attributes);
             }
 
-            return null;
-
         } catch (ParseException e) {
             System.err.println("LaTeX code in\n" + currentFile + "\nhas generated an error: " + e.getMessage());
         }
-
         return null;
     }
 
index 3c7bef5..51f8e3c 100644 (file)
 
 package org.scilab.modules.helptools.image;
 
-import java.awt.Graphics2D;
 import java.awt.Color;
+import java.awt.Graphics2D;
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.IOException;
 import java.util.Map;
 
 import javax.swing.ImageIcon;
-
 import javax.xml.parsers.ParserConfigurationException;
 
-import org.w3c.dom.Node;
-import org.w3c.dom.Document;
-import org.xml.sax.SAXException;
-
 import net.sourceforge.jeuclid.MathMLParserSupport;
-import net.sourceforge.jeuclid.MutableLayoutContext;
-import net.sourceforge.jeuclid.layout.JEuclidView;
 import net.sourceforge.jeuclid.context.LayoutContextImpl;
 import net.sourceforge.jeuclid.context.Parameter;
+import net.sourceforge.jeuclid.layout.JEuclidView;
 
-import org.scilab.modules.helptools.HTMLDocbookTagConverter;
+import org.scilab.modules.helptools.DocbookTagConverter;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
 
 /**
  * A MathML to PNG converter
@@ -42,10 +39,9 @@ import org.scilab.modules.helptools.HTMLDocbookTagConverter;
 public class MathMLImageConverter implements ExternalImageConverter {
 
     private static final Graphics2D TEMPGRAPHIC = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB).createGraphics();
-    private static MathMLImageConverter instance;
-    private final HTMLDocbookTagConverter conv;
+    private final DocbookTagConverter conv;
 
-    private MathMLImageConverter(HTMLDocbookTagConverter conv) {
+    public MathMLImageConverter(DocbookTagConverter conv) {
         this.conv = conv;
     }
 
@@ -64,17 +60,6 @@ public class MathMLImageConverter implements ExternalImageConverter {
     }
 
     /**
-     * Since it is a singleton class...
-     * @return this
-     */
-    public static ExternalImageConverter getInstance(HTMLDocbookTagConverter conv) {
-        if (instance == null) {
-            instance = new MathMLImageConverter(conv);
-        }
-        return instance;
-    }
-
-    /**
      * {@inheritDoc}
      */
     public String convertToImage(String currentFile, String mathml, Map<String, String> attributes, File imageFile, String imageName) {
@@ -97,7 +82,7 @@ public class MathMLImageConverter implements ExternalImageConverter {
 
         Image img = convertMathML(doc, fs);
         if (img != null && ImageConverter.convertIconToPNG(img.icon, imageFile)) {
-            return ImageConverter.generateCode(img, conv.getBaseImagePath() + imageName, attributes);
+            return conv.generateImageCode(img, conv.getBaseImagePath() + imageName, attributes);
         }
 
         return null;
@@ -124,7 +109,7 @@ public class MathMLImageConverter implements ExternalImageConverter {
 
         Image img = convertMathML(doc, fs);
         if (img != null && ImageConverter.convertIconToPNG(img.icon, imageFile)) {
-            return ImageConverter.generateCode(img, conv.getBaseImagePath() + imageName, attributes);
+            return conv.generateImageCode(img, conv.getBaseImagePath() + imageName, attributes);
         }
 
         return null;
index 699cb4c..5088feb 100644 (file)
@@ -16,29 +16,24 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
-import java.io.IOException;
 import java.io.OutputStream;
 import java.io.StringReader;
 import java.util.Map;
 
-import org.apache.batik.transcoder.TranscoderException;
 import org.apache.batik.transcoder.TranscoderInput;
 import org.apache.batik.transcoder.TranscoderOutput;
 import org.apache.batik.transcoder.Transcoder;
 import org.apache.batik.transcoder.image.ImageTranscoder;
 import org.apache.batik.transcoder.image.PNGTranscoder;
-
-import org.scilab.modules.helptools.HTMLDocbookTagConverter;
+import org.scilab.modules.helptools.DocbookTagConverter;
 
 /**
  * SVG to PNG converter
  */
 public class SVGImageConverter implements ExternalImageConverter {
+    private final DocbookTagConverter conv;
 
-    private static SVGImageConverter instance;
-    private final HTMLDocbookTagConverter conv;
-
-    private SVGImageConverter(HTMLDocbookTagConverter conv) {
+    public SVGImageConverter(DocbookTagConverter conv) {
         this.conv = conv;
     }
 
@@ -57,22 +52,10 @@ public class SVGImageConverter implements ExternalImageConverter {
     }
 
     /**
-     * Since this a singleton class...
-     * @return this
-     */
-    public static ExternalImageConverter getInstance(HTMLDocbookTagConverter conv) {
-        if (instance == null) {
-            instance = new SVGImageConverter(conv);
-        }
-
-        return instance;
-    }
-
-    /**
      * {@inheritDoc}
      */
     public String convertToImage(String currentFile, String svg, Map<String, String> attributes, File imageFile, String imageName) {
-        return convertToPNG(new TranscoderInput(new StringReader(svg)), imageFile, imageName);
+        return convertToPNG(new TranscoderInput(new StringReader(svg)), attributes, imageFile, imageName);
     }
 
     /**
@@ -80,7 +63,7 @@ public class SVGImageConverter implements ExternalImageConverter {
      */
     public String convertToImage(File svg, Map<String, String> attributes, File imageFile, String imageName) {
         try {
-            return convertToPNG(new TranscoderInput(new FileInputStream(svg)), imageFile, conv.getBaseImagePath() + imageName);
+            return convertToPNG(new TranscoderInput(new FileInputStream(svg)), attributes, imageFile, conv.getBaseImagePath() + imageName);
         } catch (FileNotFoundException e) {
             System.err.println("Problem when exporting SVG to " + imageFile + "!\n" + e.toString());
         }
@@ -91,7 +74,7 @@ public class SVGImageConverter implements ExternalImageConverter {
     /**
      * Make really the conversion from svg to png
      */
-    private static String convertToPNG(TranscoderInput input, File imageFile, String imageName) {
+    private String convertToPNG(TranscoderInput input, Map<String, String> attributes, File imageFile, String imageName) {
         Transcoder trans = new PNGTranscoder();
         trans.addTranscodingHint(ImageTranscoder.KEY_FORCE_TRANSPARENT_WHITE, Boolean.TRUE);
 
@@ -101,7 +84,7 @@ public class SVGImageConverter implements ExternalImageConverter {
             trans.transcode(input, output);
             os.flush();
             os.close();
-            return "<img src=\'" + imageName + "\'/>";
+            return conv.generateImageCode(conv.getBaseImagePath() + imageName, attributes);
         } catch (Exception e) {
             System.err.println("Problem when exporting SVG to " + imageFile + "!\n" + e.toString());
         }
index 78319d9..a3ba5a4 100644 (file)
@@ -15,18 +15,14 @@ package org.scilab.modules.helptools.image;
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.FileReader;
-import java.io.IOException;
-import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.Writer;
 import java.util.Map;
 
 import org.scilab.modules.commons.ScilabCommons;
-import org.scilab.modules.helptools.HTMLDocbookTagConverter;
+import org.scilab.modules.helptools.DocbookTagConverter;
 
 /**
  * Scilab code to PNG converter
@@ -34,11 +30,10 @@ import org.scilab.modules.helptools.HTMLDocbookTagConverter;
 public class ScilabImageConverter implements ExternalImageConverter {
 
     private static final byte[] BOM = { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
-    private static ScilabImageConverter instance;
     private final StringBuilder buffer;
-    private final HTMLDocbookTagConverter conv;
+    private final DocbookTagConverter conv;
 
-    private ScilabImageConverter(HTMLDocbookTagConverter conv) {
+    public ScilabImageConverter(DocbookTagConverter conv) {
         buffer = new StringBuilder(8192);
         this.conv = conv;
     }
@@ -54,14 +49,14 @@ public class ScilabImageConverter implements ExternalImageConverter {
         return false;
     }
 
-    public static String getFileWithScilabCode() {
-        if (instance.buffer.length() != 0) {
+    public String getFileWithScilabCode() {
+        if (buffer.length() != 0) {
             try {
                 File f = File.createTempFile("help-", ".sce", new File(ScilabCommons.getTMPDIR()));
                 FileOutputStream fos = new FileOutputStream(f);
                 Writer out = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8"));
                 fos.write(BOM);
-                out.write(instance.buffer.toString());
+                out.write(buffer.toString());
                 out.flush();
 
                 out.close();
@@ -70,37 +65,17 @@ public class ScilabImageConverter implements ExternalImageConverter {
                 return f.getAbsolutePath();
             } catch (Exception e) {
                 System.err.println("Cannot generate the file with Scilab code to execute:\n" + e);
-            } finally {
-                instance = null;
             }
         }
 
-        instance = null;
-
         return null;
     }
 
     /**
-     * Since this a singleton class...
-     * @return this
-     */
-    public static ScilabImageConverter getInstance(HTMLDocbookTagConverter conv) {
-        if (instance == null) {
-            instance = new ScilabImageConverter(conv);
-        }
-
-        return instance;
-    }
-
-    public static ScilabImageConverter getInstance() {
-        return instance;
-    }
-
-    /**
      * {@inheritDoc}
      */
     public String convertToImage(String currentFile, String code, Map<String, String> attributes, File imageFile, String imageName) {
-        return convertToPNG(currentFile, code, imageFile, imageName);
+        return convertToPNG(currentFile, code, attributes, imageFile, imageName);
     }
 
     /**
@@ -118,7 +93,7 @@ public class ScilabImageConverter implements ExternalImageConverter {
 
             in.close();
 
-            return convertToPNG(code.getName(), buffer.toString(), imageFile, imageName);
+            return convertToPNG(code.getName(), buffer.toString(), attributes, imageFile, imageName);
         } catch (Exception e) {
             System.err.println("Problem when exporting Scilab code to " + imageFile + "!\n" + e.toString());
         }
@@ -126,7 +101,7 @@ public class ScilabImageConverter implements ExternalImageConverter {
         return null;
     }
 
-    private final String convertToPNG(String currentFile, String code, File imageFile, String imageName) {
+    private final String convertToPNG(String currentFile, String code, Map<String, String> attributes, File imageFile, String imageName) {
         buffer.append("function _generate_image_from_doc\n");
         buffer.append("__olddrv__=driver();\n");
         buffer.append("disp(\"Generate image " + imageName + " from Scilab code from file " + new File(currentFile).getName() + "\");");
@@ -141,76 +116,6 @@ public class ScilabImageConverter implements ExternalImageConverter {
         buffer.append("_generate_image_from_doc();\n");
         buffer.append("clear _generate_image_from_doc;\n");
 
-        return getHTMLCodeToReturn(code, "<img src=\'" + conv.getBaseImagePath() + imageName + "\'/>");
-    }
-
-    public String getHTMLCodeToReturn(String code, String imageTag) {
-        if (conv.getGenerationType() == HTMLDocbookTagConverter.GenerationType.WEB) {
-            /* Prepare the code for the html inclusion */
-            code = convertCode(code);
-            /* Provide a tooltip */
-            return "<div rel='tooltip' title='" + code + "'>" + imageTag + "</div>";
-        } else {
-            /* No tooltip in the javahelp browser ...
-             * too limited html capabilities */
-            return imageTag;
-        }
-    }
-
-    private static final String convertCode(String code) {
-        if (code == null || code.length() == 0) {
-            return "";
-        }
-
-        StringBuffer buffer = new StringBuffer(2 * code.length());
-        int start = 0;
-        int end = code.length() - 1;
-        char c = code.charAt(0);
-
-        // first we trim
-        while (c == ' ' || c == '\t' || c == '\n' || c == '\r') {
-            if (start < end) {
-                c = code.charAt(++start);
-            } else {
-                break;
-            }
-        }
-        c = code.charAt(end);
-        while (c == ' ' || c == '\t' || c == '\n' || c == '\r') {
-            if (end > 0) {
-                c = code.charAt(--end);
-            } else {
-                break;
-            }
-        }
-
-        // replace chars by their html entities equivalent
-        for (int j = start; j <= end; j++) {
-            c = code.charAt(j);
-            switch (c) {
-                case '&':
-                    buffer.append("&amp;");
-                    break;
-                case '<':
-                    buffer.append("&lt;");
-                    break;
-                case '>':
-                    buffer.append("&gt;");
-                    break;
-                case '\n':
-                    buffer.append("<br />");
-                    break;
-                case '\'':
-                    buffer.append("&#039;");
-                    break;
-                case '\"':
-                    buffer.append("&quot;");
-                    break;
-                default:
-                    buffer.append(c);
-            }
-        }
-
-        return buffer.toString();
+        return conv.generateImageCode(code, conv.getBaseImagePath() + imageName, attributes);
     }
 }
index 2323ce0..fe87e71 100644 (file)
@@ -16,17 +16,15 @@ import java.io.File;
 import java.lang.reflect.Method;
 import java.util.Map;
 
-import org.scilab.modules.helptools.HTMLDocbookTagConverter;
+import org.scilab.modules.helptools.DocbookTagConverter;
 
 /**
  * Xcos schema to PNG converter
  */
 public class XcosImageConverter implements ExternalImageConverter {
+    private final DocbookTagConverter conv;
 
-    private static XcosImageConverter instance;
-    private final HTMLDocbookTagConverter conv;
-
-    private XcosImageConverter(HTMLDocbookTagConverter conv) {
+    public XcosImageConverter(DocbookTagConverter conv) {
         this.conv = conv;
     }
 
@@ -44,30 +42,13 @@ public class XcosImageConverter implements ExternalImageConverter {
     }
 
     /**
-     * Since this a singleton class...
-     *
-     * @return this
-     */
-    public static XcosImageConverter getInstance(HTMLDocbookTagConverter conv) {
-        if (instance == null) {
-            instance = new XcosImageConverter(conv);
-        }
-
-        return instance;
-    }
-
-    public static XcosImageConverter getInstance() {
-        return instance;
-    }
-
-    /**
      * {@inheritDoc}
      *
      * Redirect to the scilab code implementation.
      */
     @Override
     public String convertToImage(String currentFile, String code, Map<String, String> attributes, File imageFile, String imageName) {
-        return ScilabImageConverter.getInstance().convertToImage(currentFile, code, attributes, imageFile, imageName);
+        return conv.getImageConverter().getScilabImageConverter().convertToImage(currentFile, code, attributes, imageFile, imageName);
     }
 
     /**
@@ -77,7 +58,7 @@ public class XcosImageConverter implements ExternalImageConverter {
     public String convertToImage(File schema, Map<String, String> attributes, File imageFile, String imageName) {
         try {
             final String name = schema.getName();
-            return convertToPNG(name, schema.getAbsolutePath(), imageFile, imageName);
+            return convertToPNG(name, schema.getAbsolutePath(), attributes, imageFile, imageName);
         } catch (Exception e) {
             e.printStackTrace();
             System.err.printf("Problem when exporting Xcos schema %s !\n%s\n", schema, e.toString());
@@ -86,7 +67,7 @@ public class XcosImageConverter implements ExternalImageConverter {
         return null;
     }
 
-    private final String convertToPNG(final String helpID, final String xcosFile, final File imageFile, final String imageName) throws Exception {
+    private final String convertToPNG(final String helpID, final String xcosFile, Map<String, String> attributes, final File imageFile, final String imageName) throws Exception {
         /*
          * use a delegate method to avoid a static dependency
          */
@@ -94,19 +75,6 @@ public class XcosImageConverter implements ExternalImageConverter {
         final Method convertToPNG = export.getDeclaredMethod("convertToPNG", String.class, String.class, File.class, String.class);
         convertToPNG.invoke(null, helpID, xcosFile, imageFile, imageName);
 
-        return getHTMLCodeToReturn(helpID, "<img src=\'" + conv.getBaseImagePath() + imageName + "\'/>");
-    }
-
-    public String getHTMLCodeToReturn(String filename, String imageTag) {
-        if (conv.getGenerationType() == HTMLDocbookTagConverter.GenerationType.WEB) {
-            /* Provide a tooltip */
-            return "<div rel='tooltip' title='" + filename + "'>" + imageTag + "</div>";
-        } else {
-            /*
-             * No tooltip in the javahelp browser ... too limited html
-             * capabilities
-             */
-            return imageTag;
-        }
+        return conv.generateImageCode(xcosFile, conv.getBaseImagePath() + imageName, attributes);
     }
 }