Doc Scilab image gen: when localized='false' in locale other than en_US and when...
[scilab.git] / scilab / modules / helptools / src / java / org / scilab / modules / helptools / external / HTMLScilabHandler.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  *
11  */
12
13 package org.scilab.modules.helptools.external;
14
15 import java.io.File;
16 import java.io.FileFilter;
17 import java.io.IOException;
18 import java.util.HashMap;
19 import java.util.Map;
20
21 import org.xml.sax.Attributes;
22 import org.xml.sax.Locator;
23
24 import org.scilab.modules.helptools.HTMLDocbookTagConverter;
25
26 /**
27  * Handle the included SCILAB code
28  * @author Calixte DENIZET
29  */
30 public class HTMLScilabHandler extends ExternalXMLHandler {
31
32     private static final String IMAGE = "image";
33     private static final String BASENAME = "_";
34
35     private StringBuilder buffer = new StringBuilder(8192);
36     private String baseDir;
37     private String outputDir;
38     private Boolean isLocalized;
39     private int line;
40
41     /**
42      * Constructor
43      * @param baseDir the base directory where to put the generated images
44      */
45     public HTMLScilabHandler(String outputDir, String baseDir) {
46         this.outputDir = outputDir + File.separator + baseDir;
47         this.baseDir = baseDir + "/";
48     }
49
50     /**
51      * {@inheritDoc}
52      */
53     public String getURI() {
54         return "http://www.scilab.org";
55     }
56
57     /**
58      * {@inheritDoc}
59      */
60     public StringBuilder startExternalXML(String localName, Attributes attributes, Locator locator) {
61         if (localName.equals("image")) {
62             isLocalized = getLocalized(null, attributes);
63             line = locator.getLineNumber();
64         }
65
66         if (IMAGE.equals(localName)) {
67             return buffer;
68         } else {
69             recreateTag(buffer, localName, attributes);
70         }
71
72         return null;
73     }
74
75     /**
76      * {@inheritDoc}
77      */
78     public String endExternalXML(String localName) {
79         if (IMAGE.equals(localName)) {
80             String currentFileName = getConverter().getCurrentFileName();
81             String baseName = new File(currentFileName).getName();
82             int dotpos = baseName.lastIndexOf('.');
83             if (dotpos != -1) {
84                 baseName = baseName.substring(0, dotpos);
85             }
86             String language = ((HTMLDocbookTagConverter) getConverter()).getLanguage();
87             String fileName;
88             if (isLocalized != null && isLocalized.booleanValue()) {
89                 fileName = baseName + BASENAME + language + BASENAME + (compt++) + ".png";
90             } else {
91                 fileName = baseName + BASENAME + (compt++) + ".png";
92             }
93
94             File f = new File(outputDir, fileName);
95             Map<String, String> attributes = new HashMap<String, String>();
96
97             String ret;
98             File existing;
99             String baseImagePath = "";
100             if (getConverter() instanceof HTMLDocbookTagConverter) {
101                 baseImagePath = ((HTMLDocbookTagConverter) getConverter()).getBaseImagePath();
102             }
103             if ((isLocalized != null && isLocalized.booleanValue()) || (existing = getExistingFile(outputDir, fileName)) == null) {
104                 ret = getConverter().getImageConverter().getImageByCode(currentFileName, buffer.toString(), attributes, "image/scilab", f, baseDir + f.getName(), baseImagePath, line, language, isLocalized);
105             } else {
106                 ret = getConverter().getImageConverter().getImageByFile(attributes, null, existing.getAbsolutePath(), outputDir, ".", baseImagePath);
107             }
108
109             buffer.setLength(0);
110             return ret;
111         }
112
113         recreateTag(buffer, localName, null);
114
115         buffer.setLength(0);
116         return null;
117     }
118
119     private static File getExistingFile(String outputDir, String filename) {
120         try {
121             final File outDir = new File(outputDir).getCanonicalFile();
122             FileFilter filter = new FileFilter() {
123                 public boolean accept(File f) {
124                     return f.isDirectory() && !f.equals(outDir);
125                 }
126             };
127             File[] dirs = outDir.getParentFile().listFiles(filter);
128             File im = new File(filename);
129             for (File dir : dirs) {
130                 File f = new File(dir, im.getName());
131                 if (f.exists() && f.canRead()) {
132                     return f;
133                 }
134             }
135         } catch (IOException e) { }
136
137         return null;
138     }
139 }