2666aea1c7178e9f415b64fbd42471de1271e16a
[scilab.git] / scilab / modules / helptools / src / java / org / scilab / modules / helptools / external / HTMLMathMLHandler.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.util.HashMap;
17 import java.util.Map;
18
19 import org.xml.sax.Attributes;
20 import org.xml.sax.Locator;
21
22 import org.scilab.modules.helptools.HTMLDocbookTagConverter;
23
24 /**
25  * Handle the included SVG code
26  * @author Calixte DENIZET
27  */
28 public class HTMLMathMLHandler extends ExternalXMLHandler {
29
30     private static final String MATH = "math";
31     private static final String BASENAME = "_MathML_";
32
33     private StringBuilder buffer = new StringBuilder(8192);
34     private String baseDir;
35     private String outputDir;
36     private boolean isLocalized;
37     private int line;
38
39     /**
40      * Constructor
41      * @param baseDir the base directory where to put the generated images
42      */
43     public HTMLMathMLHandler(String outputDir, String baseDir) {
44         this.outputDir = outputDir + File.separator + baseDir;
45         this.baseDir = baseDir + "/";
46     }
47
48     /**
49      * {@inheritDoc}
50      */
51     public String getURI() {
52         return "http://www.w3.org/1998/Math/MathML";
53     }
54
55     /**
56      * {@inheritDoc}
57      */
58     public StringBuilder startExternalXML(String localName, Attributes attributes, Locator locator) {
59         if (MATH.equals(localName)) {
60             String v = attributes.getValue(getScilabURI(), "localized");
61             isLocalized = "true".equalsIgnoreCase(v);
62             line = locator.getLineNumber();
63         }
64
65         recreateTag(buffer, localName, attributes);
66         if (MATH.equals(localName)) {
67             return buffer;
68         }
69
70         return null;
71     }
72
73     /**
74      * {@inheritDoc}
75      */
76     public String endExternalXML(String localName) {
77         if (MATH.equals(localName)) {
78             recreateTag(buffer, localName, null);
79             File f;
80             String language = ((HTMLDocbookTagConverter) getConverter()).getLanguage();
81             if (isLocalized) {
82                 f = new File(outputDir, BASENAME + getConverter().getCurrentBaseName() + "_" + language + "_" + (compt++) + ".png");
83             } else {
84                 if ("ru_RU".equals(language) && HTMLDocbookTagConverter.containsCyrillic(buffer)) {
85                     System.err.println("Warning: MathML code in " + getConverter().getCurrentFileName() + " at line " + line + " contains cyrillic character. The tag <math> should contain the attribute scilab:localized=\"true\"");
86                 } else if ("ja_JP".equals(language) && HTMLDocbookTagConverter.containsCJK(buffer)) {
87                     System.err.println("Warning: MathML code in " + getConverter().getCurrentFileName() + " at line " + line + " contains CJK character. The tag <math> should contain the attribute scilab:localized=\"true\"");
88                 }
89                 f = new File(outputDir, BASENAME + getConverter().getCurrentBaseName() + "_" + (compt++) + ".png");
90             }
91
92             Map<String, String> attributes = new HashMap<String, String>();
93             attributes.put("fontsize", "16");
94             String baseImagePath = "";
95             if (getConverter() instanceof HTMLDocbookTagConverter) {
96                 baseImagePath = ((HTMLDocbookTagConverter) getConverter()).getBaseImagePath();
97             }
98
99             String ret = getConverter().getImageConverter().getImageByCode(getConverter().getCurrentFileName(), buffer.toString(), attributes, "image/mathml", f, baseDir + f.getName(), baseImagePath, line, language, isLocalized);
100             buffer.setLength(0);
101
102             return ret;
103         }
104
105         recreateTag(buffer, localName, null);
106
107         return null;
108     }
109 }