Helptools: fix xmltopdf and xmltops 61/12061/3
Clément DAVID [Thu, 18 Jul 2013 10:54:27 +0000 (12:54 +0200)]
 * Implement a basic FODocbookTagConverter using the provided xsl stylesheets
 * Convert BuildPDF to be compatible with ContainerConverter for PDF and PS

It does not implement a Docbook (Scilab subset) to FO file but rely on the stylesheet to perform the conversion. This lead to huge conversion time.

Change-Id: Ia943060441881e50c155c290bcbd10579a433061

scilab/modules/helptools/macros/xmltoformat.sci
scilab/modules/helptools/src/java/org/scilab/modules/helptools/BuildDocObject.java [deleted file]
scilab/modules/helptools/src/java/org/scilab/modules/helptools/Converter.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/CopyConvert.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/DocbookTagConverter.java
scilab/modules/helptools/src/java/org/scilab/modules/helptools/FODocbookTagConverter.java [new file with mode: 0644]
scilab/modules/helptools/src/java/org/scilab/modules/helptools/FopConverter.java [moved from scilab/modules/helptools/src/java/org/scilab/modules/helptools/BuildPDF.java with 70% similarity]
scilab/modules/helptools/src/java/org/scilab/modules/helptools/SciDocMain.java

index 509ff0b..9d94bb8 100644 (file)
@@ -434,20 +434,25 @@ function generated_files = xmltoformat(output_format,dirs,titles,directory_langu
     //  * handle the second pass build (container management or second transform)
     select output_format
     case "javaHelp" then
+        formatDescriptor = output_format;
         output_format_ext = "jar";
         second_pass_format = "jar-only";
     case "web"
+        formatDescriptor = output_format;
         output_format_ext = "html";
         second_pass_format = [];
     case "ps"
+        formatDescriptor = output_format;
         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"
+        formatDescriptor = output_format;
         output_format_ext = output_format;
         output_format = "fo"; // pdf file is generated on a second pass from fo files
         second_pass_format = "pdf";
     else
+        formatDescriptor = output_format;
         output_format_ext = output_format;
         second_pass_format = [];
     end
@@ -457,7 +462,7 @@ function generated_files = xmltoformat(output_format,dirs,titles,directory_langu
 
     if all_scilab_help then
 
-        mprintf(_("Building the scilab manual file ["+output_format+"]\n"));
+        mprintf(_("Building the scilab manual file [%s]\n"), formatDescriptor);
 
         // Define and create the final output directory if does not exist
         if output_format == "web" then
@@ -539,7 +544,7 @@ function generated_files = xmltoformat(output_format,dirs,titles,directory_langu
 
             this_tree  = contrib_tree(dirs_c(k));
 
-            mprintf(_("\nBuilding the manual file [%s] in %s.\n"),output_format,strsubst(dirs_c(k),SCI_long,"SCI"));
+            mprintf(_("\nBuilding the manual file [%s] in %s.\n"),formatDescriptor,strsubst(dirs_c(k),SCI_long,"SCI"));
 
             // Define and create the final output directory if does not exist
             final_output_dir = pathconvert(dirs_c(k)+"/../../"+output_format_ext,%f,%f);
@@ -630,12 +635,12 @@ function generated_files = xmltoformat(output_format,dirs,titles,directory_langu
 
             if nb_dir > 1 then
                 if displaydone == 0 then
-                    mprintf(_("\nBuilding the manual file [%s].\n"),output_format);
+                    mprintf(_("\nBuilding the manual file [%s].\n"),formatDescriptor);
                     displaydone = 1;
                 end
                 mprintf(_("\t%s\n"),strsubst(dirs(k),SCI_long,"SCI"));
             else
-                mprintf(_("\nBuilding the manual file [%s] in %s.\n"),output_format,strsubst(dirs(k),SCI_long,"SCI"));
+                mprintf(_("\nBuilding the manual file [%s] in %s.\n"),formatDescriptor,strsubst(dirs(k),SCI_long,"SCI"));
             end
 
             // Define and create the final output directory if does not exist
diff --git a/scilab/modules/helptools/src/java/org/scilab/modules/helptools/BuildDocObject.java b/scilab/modules/helptools/src/java/org/scilab/modules/helptools/BuildDocObject.java
deleted file mode 100644 (file)
index 950100c..0000000
+++ /dev/null
@@ -1,372 +0,0 @@
-/*
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2008 - INRIA - Sylvestre LEDRU
- *
- * 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.1-en.txt
- *
- */
-
-package org.scilab.modules.helptools;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.TransformerFactoryConfigurationError;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-
-import org.xml.sax.SAXParseException;
-import org.xml.sax.SAXException;
-
-/**
- * This classes intends to wrap Saxon features in a easy-to-use class.
- */
-public class BuildDocObject {
-
-    /**
-     * Windows version ?
-     */
-    public static final boolean IS_WINDOWS = (File.pathSeparatorChar == ';');
-
-    private static final String SCI = System.getenv("SCI");
-    private static final String ERROR_WHILE_COPYING = "Error while copying ";
-    private static final String CANNOT_COPY_CONVERT = "Cannot copy/convert '";
-    private static final String COULD_NOT_FIND_STYLE_DOC = "Could not find the style document: ";
-    private static final String TO_WITH_QUOTES = "' to '";
-    private static final String TO = " to ";
-    private static final String COLON_WITH_QUOTES = "': ";
-    private static final String COLON = " : ";
-    private static final String PDF_FORMAT = "PDF";
-    private static final String POSTSCRIPT_FORMAT = "PS";
-    private static final String JH_FORMAT = "JH";
-    private static final String JAVAHELP_FORMAT = "JAVAHELP";
-    private static final String USE_EXTENSIONS_1 = "use.extensions=1";
-    private static final String GRAPHICSIZE_EXTENSION_0 = "graphicsize.extension=0";
-    private static final String TOC_SECTION_DEPTH_3 = "toc.section.depth=3";
-    private static final String SECTION_AUTOLABEL_1 = "section.autolabel=1";
-    private static final String USE_ID_AS_FILENAME = "use.id.as.filename=1";
-    private static final String GENERATE_TOC = "\"generate.toc= \"";
-
-    private String outputDirectory;
-    private String format;
-    private String language;
-    private String docbookPath;
-    private String styleDoc;
-    private ArrayList<String> specificArgs = new ArrayList<String>();
-    private boolean isLatexConverted = true;
-
-    /**
-     * Creator ... creates the BuildDocObject object
-     *
-     * @throws FileNotFoundException if Docbook is not found
-     */
-    public BuildDocObject() throws FileNotFoundException {
-        super();
-        this.docbookPath = System.getenv("DOCBOOK_ROOT");
-
-        if (IS_WINDOWS) {
-            if (this.docbookPath == null) {
-                this.docbookPath = SCI + "/thirdparty/docbook";
-            }
-        } else {
-            if (this.docbookPath == null) {
-                throw new FileNotFoundException("Could not find variable DOCBOOK_ROOT defining Docbook root directory");
-            }
-        }
-    }
-
-    /**
-     * Set the path to the DocBook XSL application
-     * See: http://wiki.docbook.org/topic/DocBookXslStylesheets
-     * @param docbookPath The absolute path to the base directory
-     */
-    public void setDocbookPath(String docbookPath) {
-        this.docbookPath = docbookPath;
-    }
-
-    /**
-     * Set the directory where files must be exported
-     * Note that directory is created
-     *
-     * @param outputDirectory The path to the directory
-     * @return If the directory exists
-     */
-    public boolean setOutputDirectory(String outputDirectory) {
-        File directory = new File(outputDirectory);
-        if (!directory.isDirectory()) {
-            if (!directory.mkdirs()) {
-                return false;
-            }
-        }
-        this.outputDirectory = outputDirectory;
-        return true;
-    }
-
-    /**
-     * Defines the language
-     *
-     * @param language the language (xx_XX ex: en_US, fr_FR)
-     */
-    public void setWorkingLanguage(String language) {
-        this.language = language;
-    }
-
-
-    /**
-     * Defines the export format
-     * @param format the format (among the list CHM, HTML, PDF, JH, PS)
-     */
-    public void setExportFormat(String format) {
-
-        // Need to work with a String instead of a enum since it needs
-        // to be called from C/C++ and GIWS doesn't manage this type.
-        // Can be CHM, HTML, PDF, JavaHelp, Postscript
-        if (format.equalsIgnoreCase(PDF_FORMAT) || format.equalsIgnoreCase(POSTSCRIPT_FORMAT)) {
-            specificArgs.add(USE_EXTENSIONS_1);
-            specificArgs.add(GRAPHICSIZE_EXTENSION_0);
-            specificArgs.add("paper.type=A4");
-            specificArgs.add("\"generate.toc=book toc,title,figure,table,example,equation part toc,title reference toc,title\"");
-            specificArgs.add(TOC_SECTION_DEPTH_3);
-            specificArgs.add(SECTION_AUTOLABEL_1);
-            specificArgs.add("variablelist.as.blocks=1");
-            specificArgs.add("shade.verbatim=1");
-            specificArgs.add("img.src.path=" + outputDirectory);
-            this.styleDoc = docbookPath + "/fo/docbook.xsl";
-            this.isLatexConverted = false;
-        }
-
-        /* HTML Format */
-        if (format.equalsIgnoreCase("HTML")) {
-            specificArgs.add(USE_ID_AS_FILENAME);
-            specificArgs.add("html.stylesheet=html.css");
-            specificArgs.add(USE_EXTENSIONS_1);
-            specificArgs.add(GRAPHICSIZE_EXTENSION_0);
-            specificArgs.add(TOC_SECTION_DEPTH_3);
-            specificArgs.add(SECTION_AUTOLABEL_1);
-            this.styleDoc = docbookPath + "/html/chunk.xsl";
-
-            /* Copy the css file for thr HTML pages */
-            String cssFile = new String(SCI + "/modules/helptools/css/html.css");
-            try {
-                Helpers.copyFile(new File(cssFile), new File(outputDirectory + "/html.css"));
-            } catch (java.io.FileNotFoundException e) {
-                System.err.println(ERROR_WHILE_COPYING + cssFile + TO
-                                   + outputDirectory + COLON + e.getMessage());
-            } catch (java.io.IOException e) {
-                System.err.println(ERROR_WHILE_COPYING + cssFile + TO
-                                   + outputDirectory + COLON + e.getMessage());
-            }
-        }
-
-        /* CHM Format */
-        if (format.equalsIgnoreCase("CHM")) {
-            specificArgs.add(USE_ID_AS_FILENAME);
-            specificArgs.add("html.stylesheet=htmlhelp.css");
-            specificArgs.add(USE_EXTENSIONS_1);
-            specificArgs.add(GRAPHICSIZE_EXTENSION_0);
-            specificArgs.add(GENERATE_TOC);
-            this.styleDoc = docbookPath + "/htmlhelp/htmlhelp.xsl";
-
-            /* Copy the css file for thr HTML pages */
-            String cssFile = new String(SCI + "/modules/helptools/css/htmlhelp.css");
-            try {
-                Helpers.copyFile(new File(cssFile), new File(outputDirectory + "/htmlhelp.css"));
-            } catch (java.io.FileNotFoundException e) {
-                System.err.println(ERROR_WHILE_COPYING + cssFile + TO
-                                   + outputDirectory + COLON + e.getMessage());
-            } catch (java.io.IOException e) {
-                System.err.println(ERROR_WHILE_COPYING + cssFile + TO
-                                   + outputDirectory + COLON + e.getMessage());
-            }
-        }
-
-
-        /* Java Help */
-        if (format.equalsIgnoreCase(JH_FORMAT) || format.equalsIgnoreCase(JAVAHELP_FORMAT)) {
-            // JavaHelp
-            specificArgs.add(USE_EXTENSIONS_1);
-            specificArgs.add(GRAPHICSIZE_EXTENSION_0);
-            specificArgs.add(GENERATE_TOC);
-            specificArgs.add(USE_ID_AS_FILENAME);
-            this.styleDoc = docbookPath + "/javahelp/javahelp.xsl";
-        }
-        this.format = format;
-    }
-
-
-    /**
-     * Replace links by the contents of the XML files in the master
-     * @param masterXML name of the master file
-     * @param styleSheet CSS to be used
-     * @return the absolute path of the new master file
-     */
-    private String preProcessMaster(String masterXML) {
-
-        String filename = new File(masterXML).getName();
-        /* Create the output file which will be created by copyconvert.run into the working directory  */
-        File masterXMLTransformed = new File(this.outputDirectory
-                                             + File.separator + filename.substring(0, filename.lastIndexOf(".")) + "-processed.xml");
-
-        CopyConvert copyConvert = new CopyConvert();
-        copyConvert.setVerbose(true);
-        copyConvert.setPrintFormat(this.format);
-        copyConvert.setLatexConverted(isLatexConverted);
-
-        try {
-            copyConvert.run(new File(masterXML), masterXMLTransformed);
-        } catch (SAXParseException e) {
-            System.err.println(CANNOT_COPY_CONVERT + masterXML + TO_WITH_QUOTES
-                               + masterXMLTransformed + COLON_WITH_QUOTES + Helpers.reason(e));
-            System.err.println("Line: " + e.getLineNumber());
-            System.err.println("Column: " + e.getColumnNumber());
-            System.err.println("Public ID: " + e.getPublicId());
-            System.err.println("System Id: " + e.getSystemId());
-            return null;
-        } catch (SAXException e) {
-            System.err.println(CANNOT_COPY_CONVERT + masterXML + TO_WITH_QUOTES
-                               + masterXMLTransformed + COLON_WITH_QUOTES + Helpers.reason(e));
-            return null;
-
-        } catch (IOException e) {
-            System.err.println(CANNOT_COPY_CONVERT + masterXML + TO_WITH_QUOTES
-                               + masterXMLTransformed + COLON_WITH_QUOTES + Helpers.reason(e));
-            return null;
-        }
-
-        return masterXMLTransformed.getAbsolutePath();
-
-    }
-
-    /**
-     * Private method which manages the post processing
-     * @return The path to the file/directory created.
-     */
-    private String postProcess() {
-        if (this.format.equalsIgnoreCase(JH_FORMAT) || format.equalsIgnoreCase(JAVAHELP_FORMAT)) {
-            JarOnlyConverter.buildJar(this.outputDirectory, this.language);
-        }
-        if (format.equalsIgnoreCase(PDF_FORMAT) || format.equalsIgnoreCase(POSTSCRIPT_FORMAT)) {
-            return BuildPDF.buildPDF(this.outputDirectory, this.language, format);
-        }
-
-        return this.outputDirectory;
-    }
-
-    /**
-     * Preprocess the extendedStyle.xsl file
-     * Basically, we load the xsl and replace STYLE_DOC by the actual path
-     * to the xsl file since docbook cannot replace env variables
-     * @return the path to the preprocessed file
-     */
-
-    private File generateExtendedStyle() {
-        String mainStyleDoc = SCI + "/modules/helptools/schema/extendedStyle.xsl";
-        try {
-            String contentMainStyleDoc = Helpers.loadString(new File(mainStyleDoc), "UTF-8");
-
-            /* STYLE_DOC is a predefined variable */
-            File tmpFileForURI = new File(this.styleDoc);
-            contentMainStyleDoc = contentMainStyleDoc.replaceAll("STYLE_DOC", tmpFileForURI.toURI().toString());
-
-            File temporaryStyleFile = File.createTempFile("style_", ".xsl");
-
-            Helpers.saveString(contentMainStyleDoc, temporaryStyleFile, "UTF-8");
-            return temporaryStyleFile;
-        } catch (java.io.IOException e) {
-            System.err.println("Could not convert " + mainStyleDoc);
-            return null;
-        }
-    }
-
-    /**
-     * Launch the whole Saxon process
-     *
-     * @param sourceDoc Path to the XML master document
-     * @param styleSheet Path to the CSS stylesheet
-     * @return The path to the file/directory created.
-     * @throws FileNotFoundException Raises an exception if no file/dir found
-     * @throws TransformerException
-     */
-    public String process(String sourceDoc, String styleSheet) throws FileNotFoundException, TransformerException {
-        if (!new File(sourceDoc).isFile()) {
-            throw new FileNotFoundException("Could not find master document: " + sourceDoc);
-        }
-
-        if (!new File(this.styleDoc).isFile()) {
-            throw new FileNotFoundException(COULD_NOT_FIND_STYLE_DOC + this.styleDoc);
-        }
-
-        String path = styleDoc;
-        File processedStyle = null;
-        if (!isLatexConverted) {
-            processedStyle = generateExtendedStyle();
-            path = processedStyle.getAbsolutePath();
-        }
-
-        if (!new File(this.outputDirectory).isDirectory()) {
-            throw new FileNotFoundException("Could not find directory: " + this.outputDirectory);
-        }
-
-        String sourceDocProcessed = this.preProcessMaster(sourceDoc);
-
-        if (sourceDocProcessed == null) {
-            throw new FileNotFoundException("Unable to parse generated master file.");
-        }
-
-        final StreamResult outputTarget;
-        if (format.equalsIgnoreCase(PDF_FORMAT) || format.equalsIgnoreCase(POSTSCRIPT_FORMAT)) {
-            outputTarget = new StreamResult(new File(Helpers.getTemporaryNameFo(outputDirectory)));
-        } else {
-            throw new RuntimeException("Invalid format");
-        }
-
-        final StreamSource xmlSource = new StreamSource(new File(sourceDocProcessed));
-
-        /*
-         * We rely on the saxon implementation to compile xsl files (the default JVM implementation failed).
-         *
-         * Supported version :
-         *  * Saxon-HE 9.5 (and may be 8.x too) which handle xinclude, XSLT-2 and has better performances
-         *  * Saxon 6.5 if on the classpath
-         *  * JVM Apache-xerces as a fallback but may probably fail to compile docbook.xsl
-         */
-        TransformerFactory tfactory;
-        try {
-            tfactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", null);
-        } catch (TransformerFactoryConfigurationError e) {
-            // switch back to the default implementation which may be saxon 6.5 if found on the classpath or the JVM default implementation otherwise
-            tfactory = TransformerFactory.newInstance();
-        }
-
-        final Transformer transform = tfactory.newTransformer(new StreamSource(new File(path)));
-
-        transform.setParameter("base.dir", this.outputDirectory);
-        for (String arg : specificArgs) {
-            String[] nameValue = arg.split("=");
-            transform.setParameter(nameValue[0], nameValue[1]);
-        }
-
-        transform.transform(xmlSource, outputTarget);
-
-        if (new File(sourceDocProcessed).isDirectory()) {
-            /* Delete the master temp file to avoid to be shipped with the rest */
-            new File(sourceDocProcessed).delete();
-        }
-
-        if (processedStyle != null) {
-            processedStyle.delete();
-        }
-
-        return this.postProcess();
-
-    }
-}
index d9a4516..c98b0fa 100644 (file)
@@ -10,11 +10,16 @@ public interface Converter {
      * List all supported Converters backends for doc generation
      */
     public static enum Backend {
+        /* Docbook converters */
         JAVAHELP,
         HTML,
         WEB,
         CHM,
-        JAR_ONLY
+        FO,
+        /* Containers */
+        JAR_ONLY,
+        PDF,
+        PS
     }
 
     /**
index 5b6fc46..a6ab1a9 100644 (file)
@@ -139,8 +139,9 @@ public class CopyConvert extends DefaultHandler implements ErrorHandler {
             SAXParserFactory factory = SAXParserFactory.newInstance();
             factory.setNamespaceAware(true);
             // We need qNames and xmlns*.
-            factory.setFeature(
-                "http://xml.org/sax/features/namespace-prefixes", true);
+// FIXME: xmlns:db prefix is not handled by the thirdparty's stylesheet (not the right version)
+//            factory.setFeature(
+//                "http://xml.org/sax/features/namespace-prefixes", true);
             factory.setValidating(false);
             //factory.setXIncludeAware(false);
 
index a060032..e9d7d69 100644 (file)
@@ -579,4 +579,80 @@ public abstract class DocbookTagConverter extends DefaultHandler implements Conv
 
         return buf;
     }
+
+    /*
+     * All Handled tag method definition, these methods are the implementation of "Docbook 5.0 - subset Scilab"
+     */
+
+    public abstract String handleAnswer(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleBibliomixed(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleBibliomset(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleBook(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleCaption(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleCaution(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleChapter(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleCode(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleCommand(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleConstant(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleEmphasis(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleFirstname(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleFunction(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleImagedata(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleImageobject(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleImportant(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleInfo(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleInformalequation(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleInformaltable(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleInlinemediaobject(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleItemizedlist(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleLatex(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleLink(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleListitem(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleLiteral(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleMediaobject(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleMember(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleNote(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleOption(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleOrderedlist(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handlePara(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handlePart(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleProgramlisting(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handlePubdate(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleQandaentry(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleQandaset(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleQuestion(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleRefentry(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleRefnamediv(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleRefname(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleRefpurpose(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleRefsection(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleRefsynopsisdiv(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleReplaceable(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleRevdescription(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleRevhistory(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleRevision(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleRevnumber(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleRevremark(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleScreen(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleScreenshot(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleSection(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleSimplelist(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleSubscript(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleSuperscript(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleSurname(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleSynopsis(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleTable(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleTbody(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleTd(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleTerm(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleTh(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleTip(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleTitle(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleTr(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleUlink(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleVariablelist(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleVarlistentry(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleVarname(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleWarning(final Map<String, String> attributes, final String contents) throws SAXException;
+    public abstract String handleXref(final Map<String, String> attributes, final String contents) throws SAXException;
 }
diff --git a/scilab/modules/helptools/src/java/org/scilab/modules/helptools/FODocbookTagConverter.java b/scilab/modules/helptools/src/java/org/scilab/modules/helptools/FODocbookTagConverter.java
new file mode 100644 (file)
index 0000000..c77ec16
--- /dev/null
@@ -0,0 +1,202 @@
+/*
+ * 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;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.TransformerFactoryConfigurationError;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.scilab.modules.helptools.image.ImageConverter;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+/**
+ * Implement a docbook to fo converter.
+ *
+ * FIXME: Currently it use an externel xsl stylesheet to convert the tag. It should implement the Scilab subset by extending {@link DocbookTagConverter}.
+ */
+public class FODocbookTagConverter implements Converter {
+
+    private static final String SCI = System.getenv("SCI");
+    public static final boolean IS_WINDOWS = (File.pathSeparatorChar == ';');
+    private static final String CANNOT_COPY_CONVERT = "Cannot copy/convert '";
+    private static final String TO_WITH_QUOTES = "' to '";
+    private static final String COLON_WITH_QUOTES = "': ";
+
+    private final String inName;
+    private final SciDocMain sciDocMain;
+
+    private final File docbookPath;
+    private final File styleDoc;
+
+    public FODocbookTagConverter(String inName, SciDocMain sciDocMain, final ImageConverter imgConvert) throws IOException {
+
+        this.inName = inName;
+        this.sciDocMain = sciDocMain;
+
+        String localDocbookPath = System.getenv("DOCBOOK_ROOT");
+        if (localDocbookPath == null) {
+            localDocbookPath = SCI + "/thirdparty/docbook";
+        }
+        docbookPath = new File(localDocbookPath);
+        if (!docbookPath.isDirectory()) {
+            throw new FileNotFoundException("Could not find variable DOCBOOK_ROOT defining Docbook root directory");
+        }
+
+        styleDoc = new File(new File(docbookPath, "fo"), "docbook.xsl");
+        if (!styleDoc.isFile()) {
+            throw new FileNotFoundException("Could not find " + styleDoc);
+        }
+    }
+
+    @Override
+    public void registerAllExternalXMLHandlers() {
+    }
+
+    @Override
+    public void convert() throws SAXException, IOException {
+        final File processedStyle = generateExtendedStyle();
+
+        final File sourceDocProcessed = preProcessMaster(inName);
+        if (!sourceDocProcessed.isFile()) {
+            throw new FileNotFoundException("Unable to parse generated master file : " + inName + " .");
+        }
+
+        final StreamResult outputTarget = new StreamResult(new File(Helpers.getTemporaryNameFo(sciDocMain.getOutputDirectory())));
+        final StreamSource xmlSource = new StreamSource(sourceDocProcessed);
+
+        /*
+         * We rely on the saxon implementation to compile xsl files (the default JVM implementation failed).
+         *
+         * Supported version :
+         *  * Saxon-HE 9.5 (and may be 8.x too) which handle xinclude, XSLT-2 and has better performances
+         *  * Saxon 6.5 if on the classpath
+         *  * JVM Apache-xerces as a fallback but may probably fail to compile docbook.xsl
+         */
+        TransformerFactory tfactory;
+        try {
+            tfactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", null);
+        } catch (TransformerFactoryConfigurationError e) {
+            // switch back to the default implementation which may be saxon 6.5 if found on the classpath or the JVM default implementation otherwise
+            tfactory = TransformerFactory.newInstance();
+        }
+
+        try {
+            final Transformer transform = tfactory.newTransformer(new StreamSource(processedStyle));
+
+            transform.setParameter("base.dir", sciDocMain.getOutputDirectory());
+
+            // FO specific parameters
+            transform.setParameter("use.extensions", "1");
+            transform.setParameter("graphicsize.extension", "0");
+            transform.setParameter("paper.type", "A4");
+            transform.setParameter("generate.toc", "book toc,title,figure,table,example,equation part toc,title reference toc,title");
+            transform.setParameter("toc.section.depth", "3");
+            transform.setParameter("section.autolabel", "1");
+            transform.setParameter("variablelist.as.blocks", "1");
+            transform.setParameter("shade.verbatim", "1");
+            transform.setParameter("img.src.path", sciDocMain.getOutputDirectory());
+
+            transform.transform(xmlSource, outputTarget);
+
+            /* Delete the master temp file to avoid to be shipped with the rest */
+            sourceDocProcessed.delete();
+            processedStyle.delete();
+
+        } catch (TransformerException e) {
+            e.printStackTrace();
+        }
+
+
+    }
+
+    @Override
+    public void install() throws IOException {
+
+    }
+
+    /**
+     * Preprocess the extendedStyle.xsl file
+     * Basically, we load the xsl and replace STYLE_DOC by the actual path
+     * to the xsl file since docbook cannot replace env variables
+     * @return the path to the preprocessed file
+     */
+    private File generateExtendedStyle() {
+        File mainStyleDoc = new File(SCI + "/modules/helptools/schema/extendedStyle.xsl");
+        try {
+            String contentMainStyleDoc = Helpers.loadString(mainStyleDoc, "UTF-8");
+
+            /* STYLE_DOC is a predefined variable */
+            contentMainStyleDoc = contentMainStyleDoc.replaceAll("STYLE_DOC", this.styleDoc.toURI().toString());
+
+            File temporaryStyleFile = File.createTempFile("style_", ".xsl");
+
+            Helpers.saveString(contentMainStyleDoc, temporaryStyleFile, "UTF-8");
+            return temporaryStyleFile;
+        } catch (java.io.IOException e) {
+            System.err.println("Could not convert " + mainStyleDoc);
+            return null;
+        }
+    }
+
+    /**
+     * Replace links by the contents of the XML files in the master
+     * @param masterXML name of the master file
+     * @param styleSheet CSS to be used
+     * @return the new master file
+     */
+    private File preProcessMaster(String masterXML) {
+
+        String filename = new File(masterXML).getName();
+        /* Create the output file which will be created by copyconvert.run into the working directory  */
+        File masterXMLTransformed = new File(sciDocMain.getOutputDirectory()
+                                             + File.separator + filename.substring(0, filename.lastIndexOf(".")) + "-processed.xml");
+
+        CopyConvert copyConvert = new CopyConvert();
+        copyConvert.setVerbose(true);
+        copyConvert.setPrintFormat(sciDocMain.getFormat().name());
+        copyConvert.setLatexConverted(false);
+
+        try {
+            copyConvert.run(new File(masterXML), masterXMLTransformed);
+        } catch (SAXParseException e) {
+            System.err.println(CANNOT_COPY_CONVERT + masterXML + TO_WITH_QUOTES
+                               + masterXMLTransformed + COLON_WITH_QUOTES + Helpers.reason(e));
+            System.err.println("Line: " + e.getLineNumber());
+            System.err.println("Column: " + e.getColumnNumber());
+            System.err.println("Public ID: " + e.getPublicId());
+            System.err.println("System Id: " + e.getSystemId());
+            return null;
+        } catch (SAXException e) {
+            System.err.println(CANNOT_COPY_CONVERT + masterXML + TO_WITH_QUOTES
+                               + masterXMLTransformed + COLON_WITH_QUOTES + Helpers.reason(e));
+            return null;
+
+        } catch (IOException e) {
+            System.err.println(CANNOT_COPY_CONVERT + masterXML + TO_WITH_QUOTES
+                               + masterXMLTransformed + COLON_WITH_QUOTES + Helpers.reason(e));
+            return null;
+        }
+
+        return masterXMLTransformed;
+
+    }
+}
@@ -1,77 +1,46 @@
-/*
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2008 - INRIA - Sylvestre LEDRU
- *
- *  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.1-en.txt
- *
- */
-
 package org.scilab.modules.helptools;
 
+import java.io.BufferedOutputStream;
 import java.io.File;
-
 import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
-import java.io.BufferedOutputStream;
-import java.io.FileOutputStream;
 
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
 import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerConfigurationException;
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.Result;
 import javax.xml.transform.sax.SAXResult;
+import javax.xml.transform.stream.StreamSource;
 
 import org.apache.fop.apps.FOPException;
-import org.apache.fop.apps.FopFactory;
 import org.apache.fop.apps.Fop;
-import org.apache.fop.apps.MimeConstants;
+import org.apache.fop.apps.FopFactory;
 import org.apache.fop.apps.FormattingResults;
-import org.xml.sax.SAXException;
-
+import org.apache.fop.apps.MimeConstants;
 import org.scilab.forge.jlatexmath.fop.JLaTeXMathElementMapping;
 import org.scilab.forge.jlatexmath.fop.JLaTeXMathXMLHandler;
-
 import org.scilab.modules.commons.xml.ScilabTransformerFactory;
+import org.xml.sax.SAXException;
 
-/**
- * This class manages the build of the PDF file
- */
-public final class BuildPDF {
-
-    /**
-     * Default constructor (must not be used)
-     */
-    private BuildPDF() {
-        throw new UnsupportedOperationException();
-    }
+public class FopConverter extends ContainerConverter {
 
+    final Backend format;
 
-    /**
-     * After the saxon process, create the PDF thanks to fop
-     *
-     * @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 buildPDF(String outputDirectory, String language, String format) {
+    public FopConverter(SciDocMain sciDocMain) {
+        super(sciDocMain.getOutputDirectory(), sciDocMain.getLanguage());
+        this.format = sciDocMain.getFormat();
+    }
 
+    @Override
+    public void convert() throws SAXException, IOException {
         String baseName = Helpers.getBaseName(language);
         /* the following '..' is used because we are in the current working
            directory with all the tmp stuff in it */
-        String fileName = outputDirectory + "/" + baseName;
-        if (format.equalsIgnoreCase("PS")) {
-            fileName += ".ps";
-        } else {
-            fileName += ".pdf";
-        }
+        String fileName = outputDirectory + "/" + baseName + "." + format.name().toLowerCase();
 
         try {
             FopFactory fopFactory = FopFactory.newInstance();
@@ -81,11 +50,18 @@ public final class BuildPDF {
 
             // Step 3: Construct fop with desired output format
             OutputStream out = new BufferedOutputStream(new FileOutputStream(fileName));
-            Fop fop;
-            if (format.equalsIgnoreCase("PS")) {
-                fop = fopFactory.newFop(MimeConstants.MIME_POSTSCRIPT, out);
-            } else {
-                fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);
+            final Fop fop;
+            switch (format) {
+                case PS:
+                    fop = fopFactory.newFop(MimeConstants.MIME_POSTSCRIPT, out);
+                    break;
+                case PDF:
+                    fop = fopFactory.newFop(MimeConstants.MIME_POSTSCRIPT, out);
+                    break;
+
+                default:
+                    out.close();
+                    throw new IOException(String.format("%s is not a supported format.\n", format));
             }
 
             // Step 4: Setup JAXP using identity transformer
@@ -121,7 +97,9 @@ public final class BuildPDF {
         } catch (SAXException e) {
             System.out.println(e.getLocalizedMessage());
         }
+    }
 
-        return fileName;
+    @Override
+    public void install() throws IOException {
     }
 }
index 0a17d86..2e8323f 100644 (file)
@@ -141,9 +141,16 @@ public final class SciDocMain {
                     imgConvert.loadMD5s(ScilabConstants.SCI.getPath() + "/modules/helptools/etc");
                     converter = new CHMDocbookTagConverter(sourceDoc, this, imgConvert);
                     break;
+                case FO:
+                    converter = new FODocbookTagConverter(sourceDoc, this, imgConvert);
+                    break;
                 case JAR_ONLY:
                     converter = new JarOnlyConverter(this);
                     break;
+                case PDF:
+                case PS:
+                    converter = new FopConverter(this);
+                    break;
                 default:
                     System.err.printf("%s is not a supported format.\n", format);
                     return null;