a70efbbd324aeb86dd8469b757f85f248abdef88
[scilab.git] / scilab / modules / helptools / src / java / org / scilab / modules / helptools / HTMLDocbookTagConverter.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 package org.scilab.modules.helptools;
14
15 import java.io.File;
16 import java.io.IOException;
17 import java.net.URI;
18 import java.net.URISyntaxException;
19 import java.util.Date;
20 import java.util.Map;
21 import java.util.Stack;
22 import java.util.regex.Pattern;
23
24 import org.xml.sax.SAXException;
25
26 import org.scilab.modules.helptools.image.ImageConverter;
27 import org.scilab.modules.helptools.image.LaTeXImageConverter;
28 import org.scilab.modules.helptools.image.MathMLImageConverter;
29 import org.scilab.modules.helptools.image.ScilabImageConverter;
30 import org.scilab.modules.helptools.image.SVGImageConverter;
31 import org.scilab.modules.helptools.scilab.ScilabLexer;
32 import org.scilab.modules.helptools.scilab.HTMLScilabCodeHandler;
33 import org.scilab.modules.helptools.scilab.AbstractScilabCodeHandler;
34 import org.scilab.modules.helptools.XML.XMLLexer;
35 import org.scilab.modules.helptools.XML.HTMLXMLCodeHandler;
36 import org.scilab.modules.helptools.c.CLexer;
37 import org.scilab.modules.helptools.c.HTMLCCodeHandler;
38 import org.scilab.modules.helptools.java.JavaLexer;
39 import org.scilab.modules.localization.Messages;
40
41 /**
42  * Class to convert DocBook to HTML
43  * @author Calixte DENIZET
44  */
45 public class HTMLDocbookTagConverter extends DocbookTagConverter implements TemplateFiller {
46
47     private static final String SCILAB_URI = "http://www.scilab.org";
48     private static final String LATEXBASENAME = "Equation_LaTeX_";
49     private static final String VERSION = Messages.gettext("Version");
50     private static final String DESCRIPTION = Messages.gettext("Description");
51
52     private StringBuilder buffer = new StringBuilder(8192);
53     private int latexCompt;
54     private String imageDir;
55     private String outName;
56     private String urlBase;
57     private boolean linkToTheWeb;
58     private boolean hasExamples;
59     private int warnings;
60     private int nbFiles;
61
62     protected Map<String, String> mapId;
63     protected Map<String, String> tocitem;
64     protected HTMLDocbookLinkResolver.TreeId tree;
65     protected Map<String, HTMLDocbookLinkResolver.TreeId> mapTreeId;
66     protected Map<String, String> mapIdPurpose;
67
68     protected TemplateHandler templateHandler;
69
70     protected ScilabLexer scilabLexer;
71     protected XMLLexer xmlLexer;
72     protected CLexer cLexer;
73     protected JavaLexer javaLexer;
74
75     protected String bookTitle = "";
76     protected String partTitle = "";
77     protected String chapterTitle = "";
78     protected String sectionTitle = "";
79     protected String fileSubtitle = "";
80
81     protected String refpurpose = "";
82     protected String refname = "";
83     protected String version;
84     protected String appendToProgramListing;
85     protected String appendForExecToProgramListing;
86     protected String prependToProgramListing;
87     protected String currentId;
88     protected String indexFilename = "index" /*UUID.randomUUID().toString()*/ + ".html";
89
90     protected boolean isToolbox;
91
92     /**
93      * Constructor
94      * @param inName the name of the input stream
95      * @param outName the output directory
96      * @param primConf the file containing the primitives of Scilab
97      * @param macroConf the file containing the macros of Scilab
98      * @param template the template to use
99      * @param version the version
100      * @param imageDir the image directory (relative to outName)
101      * @param isToolbox is true when compile a toolbox' help
102      * @param urlBase the base url for external link
103      */
104     public HTMLDocbookTagConverter(String inName, String outName, String[] primConf, String[] macroConf, String template, String version, String imageDir, boolean isToolbox, String urlBase) throws IOException, SAXException {
105         super(inName);
106
107         this.version = version;
108         this.imageDir = imageDir;
109         this.outName = outName + File.separator;
110         HTMLDocbookLinkResolver resolver = new HTMLDocbookLinkResolver(inName);
111         mapId = resolver.getMapId();
112         tocitem = resolver.getToc();
113         tree = resolver.getTree();
114         mapTreeId = resolver.getMapTreeId();
115         mapIdPurpose = resolver.getMapIdPurpose();
116         scilabLexer = new ScilabLexer(primConf, macroConf);
117         this.urlBase = urlBase;
118         this.linkToTheWeb = urlBase != null && !urlBase.equals("scilab://");
119         this.isToolbox = isToolbox;
120         if (isToolbox) {// we generate a toolbox's help
121             HTMLScilabCodeHandler.setLinkWriter(new AbstractScilabCodeHandler.LinkWriter() {
122                 public String getLink(String id) {
123                     if (id.length() > 0 && id.charAt(0) == '%') {
124                         id = id.replace("%", "percent");
125                     }
126                     String link = mapId.get(id);
127                     if (link == null) {
128                         return HTMLDocbookTagConverter.this.urlBase + id;
129                     } else {
130                         return link;
131                     }
132                 }
133             });
134         } else {// we generate Scilab's help
135             HTMLScilabCodeHandler.setLinkWriter(new AbstractScilabCodeHandler.LinkWriter() {
136                 public String getLink(String id) {
137                     if (id.length() > 0 && id.charAt(0) == '%') {
138                         id = id.replace("%", "percent");
139                     }
140                     return mapId.get(id);
141                 }
142             });
143         }
144
145         xmlLexer = new XMLLexer();
146         cLexer = new CLexer();
147         javaLexer = new JavaLexer();
148         File tpl = new File(template);
149         templateHandler = new TemplateHandler(this, tpl);
150         ImageConverter.registerExternalImageConverter(LaTeXImageConverter.getInstance());
151         ImageConverter.registerExternalImageConverter(MathMLImageConverter.getInstance());
152         ImageConverter.registerExternalImageConverter(SVGImageConverter.getInstance());
153         ImageConverter.registerExternalImageConverter(ScilabImageConverter.getInstance());
154     }
155
156     /**
157      * @return the buffer used
158      */
159     public StringBuilder getBuffer() {
160         return buffer;
161     }
162
163     /**
164      * @param tag the tag name
165      * @param contents the contents to enclose between opening and closing tags
166      */
167     public String encloseContents(final String tag, final String contents) {
168         buffer.setLength(0);
169         buffer.append("<");
170         buffer.append(tag);
171         buffer.append(">");
172         if (contents != null) {
173             buffer.append(contents);
174         }
175         buffer.append("</");
176         buffer.append(tag);
177         buffer.append(">");
178
179         return buffer.toString();
180     }
181
182     /**
183      * @param tag the tag name
184      * @param attrs the attributes {attr1, value1, attr2, value2, ...}
185      * @param contents the contents to enclose between opening and closing tags
186      */
187     public String encloseContents(final String tag, final String[] attrs, final String contents) {
188         buffer.setLength(0);
189         buffer.append("<");
190         buffer.append(tag);
191         if (attrs != null) {
192             for (int i = 0; i < attrs.length; i += 2) {
193                 buffer.append(" ");
194                 buffer.append(attrs[i]);
195                 buffer.append("=\"");
196                 buffer.append(attrs[i + 1]);
197                 buffer.append("\"");
198             }
199         }
200
201         buffer.append(">");
202         if (contents != null) {
203             buffer.append(contents);
204         }
205         buffer.append("</");
206         buffer.append(tag);
207         buffer.append(">");
208
209         return buffer.toString();
210     }
211
212     /**
213      * @param tag the tag name
214      * @param clazz the css class name
215      * @param contents the contents to enclose between opening and closing tags
216      */
217     public String encloseContents(final String tag, final String clazz, final String contents) {
218         buffer.setLength(0);
219         buffer.append("<");
220         buffer.append(tag);
221         buffer.append(" class=\"");
222         buffer.append(clazz);
223         buffer.append("\">");
224         if (contents != null) {
225             buffer.append(contents);
226         }
227         buffer.append("</");
228         buffer.append(tag);
229         buffer.append(">");
230
231         return buffer.toString();
232     }
233
234     /**
235      * {@inheritDoc}
236      */
237     public boolean isEscapable(final String tagName, final String uri) {
238         return !"latex".equals(tagName) && !"screen".equals(tagName) && !"programlisting".equals(tagName) && !"code".equals(tagName) && !"synopsis".equals(tagName) && !(uri.equals(SCILAB_URI) && tagName.equals("image"));
239     }
240
241     /**
242      * {@inheritDoc}
243      */
244     public boolean isTrimable(final String tagName) {
245         return !"screen".equals(tagName) && !"programlisting".equals(tagName) && !"code".equals(tagName) && !"synopsis".equals(tagName);
246     }
247
248     /**
249      * @param fileName the file to create
250      * @param subtitle the subtitle of the file
251      * @param contents the contents of the file
252      */
253     public void createHTMLFile(final String id, final String fileName, final String subtitle, final String contents) {
254         if (!hasError) {
255             fileSubtitle = subtitle;
256             nbFiles++;
257             templateHandler.generateFileFromTemplate(outName + fileName, id, contents);
258         }
259     }
260
261     /**
262      * {@inheritDoc}
263      */
264     public String makeTitle(final String id) {
265         if (refname.length() > 0) {
266             return tocitem.get(id);
267         }
268
269         return "";
270     }
271
272     /**
273      * {@inheritDoc}
274      */
275     public String makeSubtitle(final String id) {
276         return fileSubtitle;
277     }
278
279     /**
280      * {@inheritDoc}
281      */
282     public String makePrevious(final String id) {
283         buffer.setLength(0);
284         buffer.append("<span class=\"previous\">");
285         HTMLDocbookLinkResolver.TreeId leaf = mapTreeId.get(id);
286         if (leaf == null) {
287             return "";
288         }
289         HTMLDocbookLinkResolver.TreeId prev = leaf.getPrevious();
290         if (prev.parent != null) {
291             buffer.append("<a href=\"");
292             buffer.append(mapId.get(prev.id));
293             buffer.append("\">&lt;&lt; ");
294             buffer.append(tocitem.get(prev.id));
295             buffer.append("</a></span>\n");
296
297             return buffer.toString();
298         }
299
300         return "";
301     }
302
303     /**
304      * {@inheritDoc}
305      */
306     public String makePath(final String id) {
307         buffer.setLength(0);
308         buffer.append("<span class=\"path\">");
309         HTMLDocbookLinkResolver.TreeId leaf = mapTreeId.get(id);
310         if (leaf == null) {
311             return "";
312         }
313         String str = tocitem.get(id);
314         leaf = leaf.parent;
315         while (leaf != null && !leaf.isRoot()) {
316             str = "<a href=\"" + mapId.get(leaf.id) + "\">" + tocitem.get(leaf.id) + "</a> &gt; " + str;
317             leaf = leaf.parent;
318         }
319
320         str = "<a href=\"" + indexFilename  + "\">" + bookTitle + "</a> &gt;&gt; " + str;
321         buffer.append(str);
322         buffer.append("</span>\n");
323
324         return buffer.toString();
325     }
326
327     /**
328      * {@inheritDoc}
329      */
330     public String makeTop(final String id) {
331         buffer.setLength(0);
332         buffer.append("<span class=\"top\">");
333         HTMLDocbookLinkResolver.TreeId leaf = mapTreeId.get(id);
334         if (leaf == null) {
335             return "";
336         }
337
338         leaf = leaf.parent;
339         if (leaf != null) {
340             buffer.append("<a href=\"");
341             if (!leaf.isRoot()) {
342                 buffer.append(mapId.get(leaf.id));
343                 buffer.append("\">");
344                 buffer.append(tocitem.get(leaf.id));
345             } else {
346                 buffer.append(indexFilename);
347                 buffer.append("\">");
348                 buffer.append(bookTitle);
349             }
350             buffer.append("</a></span>\n");
351         } else {
352             return "";
353         }
354
355         return buffer.toString();
356     }
357
358     /**
359      * {@inheritDoc}
360      */
361     public String makeNext(final String id) {
362         buffer.setLength(0);
363         buffer.append("<span class=\"next\">");
364         HTMLDocbookLinkResolver.TreeId leaf = mapTreeId.get(id);
365         if (leaf == null) {
366             return "";
367         }
368         HTMLDocbookLinkResolver.TreeId next = leaf.getNext();
369         if (next != null) {
370             buffer.append("<a href=\"");
371             buffer.append(mapId.get(next.id));
372             buffer.append("\">");
373             buffer.append(tocitem.get(next.id));
374             buffer.append(" &gt;&gt;</a></span>\n");
375
376             return buffer.toString();
377         }
378
379         return "";
380     }
381
382     /**
383      * {@inheritDoc}
384      */
385     public String makeStart(final String id) {
386         buffer.setLength(0);
387         buffer.append("<span class=\"start\">");
388         buffer.append("<a href=\"");
389         buffer.append(indexFilename);
390         buffer.append("\">");
391         buffer.append(bookTitle);
392         buffer.append("</a></span>\n");
393
394         return buffer.toString();
395     }
396
397     /**
398      * {@inheritDoc}
399      */
400     public String makeTocList(final String id) {
401         buffer.setLength(0);
402         HTMLDocbookLinkResolver.TreeId leaf = mapTreeId.get(id);
403         if (leaf == null) {
404             return "";
405         }
406
407         HTMLDocbookLinkResolver.TreeId parent = leaf.parent;
408         buffer.append("<ul class=\"toc\">\n");
409         String str = "";
410         while (parent != null && !parent.isRoot()) {
411             str = "<li class=\"parent\"><a href=\"" + mapId.get(parent.id) + "\">" + tocitem.get(parent.id) + "</a></li>\n" + str;
412             parent = parent.parent;
413         }
414         buffer.append("<li class=\"root\"><a href=\"");
415         buffer.append(indexFilename);
416         buffer.append("\">");
417         buffer.append(bookTitle);
418         buffer.append("</a></li>\n");
419         buffer.append(str);
420
421         parent = leaf.parent;
422
423         for (HTMLDocbookLinkResolver.TreeId c : parent.children) {
424             if (c == leaf) {
425                 buffer.append("<li class=\"list-active\"><a href=\"");
426             } else {
427                 buffer.append("<li><a href=\"");
428             }
429             buffer.append(mapId.get(c.id));
430             buffer.append("\">");
431             buffer.append(tocitem.get(c.id));
432             buffer.append("</a></li>\n");
433         }
434         buffer.append("</ul>\n");
435
436         return buffer.toString();
437     }
438
439     /**
440      * {@inheritDoc}
441      */
442     public String makeLastModified(final String id) {
443         buffer.setLength(0);
444         try {
445             buffer.append("<span class=\"lastmodified\">");
446             buffer.append(new Date(new File(new URI(currentFileName)).lastModified()).toString());
447             buffer.append("</span>\n");
448         } catch (URISyntaxException e) {
449             e.printStackTrace();
450         }
451         return buffer.toString();
452     }
453
454     /**
455      * {@inheritDoc}
456      */
457     public String makeGenerationDate(final String id) {
458         buffer.setLength(0);
459         buffer.append("<span class=\"generationdate\">");
460         buffer.append(new Date(System.currentTimeMillis()).toString());
461         buffer.append("</span>\n");
462
463         return buffer.toString();
464     }
465
466     /**
467      * {@inheritDoc}
468      */
469     public String makeVersion(final String id) {
470         buffer.setLength(0);
471         buffer.append("<span class=\"version\">");
472         buffer.append(version);
473         buffer.append("</span>\n");
474
475         return buffer.toString();
476     }
477
478     /**
479      * Handle a refentry
480      * @param attributes the tag attributes
481      * @param contents the tag contents
482      * @return the HTML code
483      * @throws SAXEception if an error is encountered
484      */
485     public String handleRefentry(final Map<String, String> attributes, final String contents) throws SAXException {
486         String id = attributes.get("id");
487         if (id != null) {
488             currentId = id;
489         }
490         String fileName = mapId.get(currentId);
491         createHTMLFile(currentId, fileName, refpurpose, contents);
492         if (!hasExamples) {
493             warnings++;
494             //System.err.println("Warning (should be fixed): no example in " + currentFileName);
495         } else {
496             hasExamples = false;
497         }
498         String rp = encloseContents("span", "refentry-description", refpurpose);
499         String str = encloseContents("li", encloseContents("a", new String[] {"href", fileName, "class", "refentry"}, currentId) + " &#8212; " + rp);
500         refpurpose = "";
501         refname = "";
502         currentId = null;
503
504         return str;
505     }
506
507     /**
508      * Handle a section
509      * @param attributes the tag attributes
510      * @param contents the tag contents
511      * @return the HTML code
512      * @throws SAXEception if an error is encountered
513      */
514     public String handleSection(final Map<String, String> attributes, final String contents) throws SAXException {
515         String fileName = attributes.get("id") + ".html";
516         String str = encloseContents("ul", "list-refentry", contents);
517         String title = encloseContents("h3", "title-section", sectionTitle);
518         createHTMLFile(attributes.get("id"), fileName, sectionTitle, title + "\n" + str);
519
520         str = encloseContents("li", encloseContents("a", new String[] {"href", fileName, "class", "section"}, sectionTitle) + "\n" + str);
521         sectionTitle = "";
522
523         return str;
524     }
525
526     /**
527      * Handle a book
528      * @param attributes the tag attributes
529      * @param contents the tag contents
530      * @return the HTML code
531      * @throws SAXEception if an error is encountered
532      */
533     public String handleBook(final Map<String, String> attributes, final String contents) throws SAXException {
534         String str = encloseContents("ul", "list-part", contents);
535         String btitle;
536         if (bookTitle.trim().equalsIgnoreCase("Scilab")) {
537             btitle = version;
538         } else {
539             btitle = bookTitle;
540         }
541         String title = encloseContents("h3", "book-title", btitle);
542         createHTMLFile("index", indexFilename, btitle, title + "\n" + str);
543
544         if (warnings != 0) {
545             System.err.println("Total files without example: " + warnings);
546             System.err.println("Total generated html files: " + nbFiles);
547         }
548
549         return encloseContents("li", encloseContents("a", new String[] {"href", indexFilename, "class", "part"}, bookTitle) + "\n" + str);
550     }
551
552     /**
553      * Handle a part
554      * @param attributes the tag attributes
555      * @param contents the tag contents
556      * @return the HTML code
557      * @throws SAXEception if an error is encountered
558      */
559     public String handlePart(final Map<String, String> attributes, final String contents) throws SAXException {
560         String fileName = attributes.get("id") + ".html";
561         String str = encloseContents("ul", "list-chapter", contents);
562         String title = encloseContents("h3", "title-part", partTitle);
563         createHTMLFile(attributes.get("id"), fileName, partTitle, title + "\n" + str);
564
565         str = encloseContents("li", encloseContents("a", new String[] {"href", fileName, "class", "part"}, partTitle) + "\n" + str);
566         partTitle = "";
567
568         return str;
569     }
570
571     /**
572      * Handle a chapter
573      * @param attributes the tag attributes
574      * @param contents the tag contents
575      * @return the HTML code
576      * @throws SAXEception if an error is encountered
577      */
578     public String handleChapter(final Map<String, String> attributes, final String contents) throws SAXException {
579         String fileName = attributes.get("id") + ".html";
580         String str = encloseContents("ul", "list-refentry", contents);
581         String title = encloseContents("h3", "title-chapter", chapterTitle);
582         createHTMLFile(attributes.get("id"), fileName, chapterTitle, title + "\n" + str);
583
584         str = encloseContents("li", encloseContents("a", new String[] {"href", fileName, "class", "chapter"}, chapterTitle) + "\n" + str);
585         chapterTitle = "";
586
587         return str;
588     }
589
590     // partiellement merdique car le style de title depend du noeud pere.
591     /**
592      * Handle a title
593      * @param attributes the tag attributes
594      * @param contents the tag contents
595      * @return the HTML code
596      * @throws SAXEception if an error is encountered
597      */
598     public String handleTitle(final Map<String, String> attributes, final String contents) throws SAXException {
599         String clazz = "title";
600         String parent = getParentTagName();
601         if (parent.equals("chapter")) {
602             chapterTitle = contents;
603         } else if (parent.equals("part")) {
604             partTitle = contents;
605         } else if (parent.equals("info")) {
606             bookTitle = contents;
607         } else if (parent.equals("section")) {
608             sectionTitle = contents;
609         } else if (parent.equals("refsection") && Pattern.matches("^[ \\t]*ex[ea]mpl[eo].*", contents.toLowerCase())) {
610             hasExamples = true;
611             return encloseContents("h3", clazz, contents);
612         } else {
613             return encloseContents("h3", clazz, contents);
614         }
615
616         return null;
617     }
618
619     /**
620      * Handle a para
621      * @param attributes the tag attributes
622      * @param contents the tag contents
623      * @return the HTML code
624      * @throws SAXEception if an error is encountered
625      */
626     public String handlePara(final Map<String, String> attributes, final String contents) throws SAXException {
627         return encloseContents("p", "para", contents);
628     }
629
630     /**
631      * Handle a literal
632      * @param attributes the tag attributes
633      * @param contents the tag contents
634      * @return the HTML code
635      * @throws SAXEception if an error is encountered
636      */
637     public String handleLiteral(final Map<String, String> attributes, final String contents) throws SAXException {
638         return encloseContents("code", "literal", contents);
639     }
640
641     /**
642      * Handle a varname
643      * @param attributes the tag attributes
644      * @param contents the tag contents
645      * @return the HTML code
646      * @throws SAXEception if an error is encountered
647      */
648     public String handleVarname(final Map<String, String> attributes, final String contents) throws SAXException {
649         return encloseContents("code", "varname", contents);
650     }
651
652     /**
653      * Handle a command
654      * @param attributes the tag attributes
655      * @param contents the tag contents
656      * @return the HTML code
657      * @throws SAXEception if an error is encountered
658      */
659     public String handleCommand(final Map<String, String> attributes, final String contents) throws SAXException {
660         return encloseContents("code", "command", contents);
661     }
662
663     /**
664      * Handle a code
665      * @param attributes the tag attributes
666      * @param contents the tag contents
667      * @return the HTML code
668      * @throws SAXEception if an error is encountered
669      */
670     public String handleCode(final Map<String, String> attributes, final String contents) throws SAXException {
671         return encloseContents("code", "scilabcode", scilabLexer.convert(HTMLScilabCodeHandler.getInstance(refname, currentFileName), contents));//encloseContents("code", "code", contents);
672     }
673
674     /**
675      * Handle a function
676      * @param attributes the tag attributes
677      * @param contents the tag contents
678      * @return the HTML code
679      * @throws SAXEception if an error is encountered
680      */
681     public String handleFunction(final Map<String, String> attributes, final String contents) throws SAXException {
682         return encloseContents("code", "function", contents);
683     }
684
685     /**
686      * Handle a constant
687      * @param attributes the tag attributes
688      * @param contents the tag contents
689      * @return the HTML code
690      * @throws SAXEception if an error is encountered
691      */
692     public String handleConstant(final Map<String, String> attributes, final String contents) throws SAXException {
693         return encloseContents("code", "constant", contents);
694     }
695
696     /**
697      * Handle an option
698      * @param attributes the tag attributes
699      * @param contents the tag contents
700      * @return the HTML code
701      * @throws SAXEception if an error is encountered
702      */
703     public String handleOption(final Map<String, String> attributes, final String contents) throws SAXException {
704         return encloseContents("code", "option", contents);
705     }
706
707     /**
708      * Handle a refnamediv
709      * @param attributes the tag attributes
710      * @param contents the tag contents
711      * @return the HTML code
712      * @throws SAXEception if an error is encountered
713      */
714     public String handleRefnamediv(final Map<String, String> attributes, final String contents) throws SAXException {
715         String id = attributes.get("id");
716         if (id != null) {
717             currentId = id;
718         }
719
720         return encloseContents("div", "refnamediv", contents);
721     }
722
723     /**
724      * Handle a refname
725      * @param attributes the tag attributes
726      * @param contents the tag contents
727      * @return the HTML code
728      * @throws SAXEception if an error is encountered
729      */
730     public String handleRefname(final Map<String, String> attributes, final String contents) throws SAXException {
731         refname = contents;
732         return encloseContents("h1", "refname", contents);
733     }
734
735     /**
736      * Handle a refpurpose
737      * @param attributes the tag attributes
738      * @param contents the tag contents
739      * @return the HTML code
740      * @throws SAXEception if an error is encountered
741      */
742     public String handleRefpurpose(final Map<String, String> attributes, final String contents) throws SAXException {
743         refpurpose = contents;
744         return encloseContents("p", "refpurpose", contents);
745     }
746
747     /**
748      * Handle a refsynopsisdiv
749      * @param attributes the tag attributes
750      * @param contents the tag contents
751      * @return the HTML code
752      * @throws SAXEception if an error is encountered
753      */
754     public String handleRefsynopsisdiv(final Map<String, String> attributes, final String contents) throws SAXException {
755         String id = attributes.get("id");
756         if (id != null) {
757             return "<a name=\"" + id + "\"></a>" + encloseContents("div", "refsynopsisdiv", contents);
758         } else {
759             return encloseContents("div", "refsynopsisdiv", contents);
760         }
761     }
762
763     /**
764      * Handle a synopsis
765      * @param attributes the tag attributes
766      * @param contents the tag contents
767      * @return the HTML code
768      * @throws SAXEception if an error is encountered
769      */
770     public String handleSynopsis(final Map<String, String> attributes, final String contents) throws SAXException {
771         String id = attributes.get("id");
772         String str = encloseContents("div", "synopsis", encloseContents("pre", SynopsisLexer.convert(refname, contents)));
773         if (id != null) {
774             return "<a name=\"" + id + "\"></a>" + str;
775         } else {
776             return str;
777         }
778     }
779
780     /**
781      * Handle a info
782      * @param attributes the tag attributes
783      * @param contents the tag contents
784      * @return the HTML code
785      * @throws SAXEception if an error is encountered
786      */
787     public String handleInfo(final Map<String, String> attributes, final String contents) throws SAXException {
788         String id = attributes.get("id");
789         if (id != null) {
790             return "<a name=\"" + id + "\"></a>" + encloseContents("div", "info", contents);
791         } else {
792             return encloseContents("div", "info", contents);
793         }
794     }
795
796     /**
797      * Handle a refsection
798      * @param attributes the tag attributes
799      * @param contents the tag contents
800      * @return the HTML code
801      * @throws SAXEception if an error is encountered
802      */
803     public String handleRefsection(final Map<String, String> attributes, final String contents) throws SAXException {
804         String id = attributes.get("id");
805         if (id != null) {
806             return "<a name=\"" + id + "\"></a>" + encloseContents("div", "refsection", contents);
807         } else {
808             return encloseContents("div", "refsection", contents);
809         }
810     }
811
812     /**
813      * Handle a progamlisting
814      * @param attributes the tag attributes
815      * @param contents the tag contents
816      * @return the HTML code
817      * @throws SAXEception if an error is encountered
818      */
819     public String handleProgramlisting(final Map<String, String> attributes, final String contents) throws SAXException {
820         String id = attributes.get("id");
821         String role = attributes.get("role");
822         String str;
823         if (role == null) {
824             String code = encloseContents("pre", "scilabcode", scilabLexer.convert(HTMLScilabCodeHandler.getInstance(refname, currentFileName), contents));
825             if (prependToProgramListing != null) {
826                 code = prependToProgramListing + code;
827             }
828             if (appendToProgramListing != null) {
829                 code += appendToProgramListing;
830             }
831             str = encloseContents("div", "programlisting", code);
832         } else {
833             if (role.equals("xml")) {
834                 str = encloseContents("div", "programlisting", encloseContents("pre", "xmlcode", xmlLexer.convert(HTMLXMLCodeHandler.getInstance(), contents)));
835             } else if (role.equals("c") || role.equals("cpp") || role.equals("code_gateway")) {
836                 str = encloseContents("div", "programlisting", encloseContents("pre", "ccode", cLexer.convert(HTMLCCodeHandler.getInstance(), contents)));
837             } else if (role.equals("java")) {
838                 str = encloseContents("div", "programlisting", encloseContents("pre", "ccode", javaLexer.convert(HTMLCCodeHandler.getInstance(), contents)));
839             } else if (role.equals("exec")) {
840                 String code = encloseContents("pre", "scilabcode", scilabLexer.convert(HTMLScilabCodeHandler.getInstance(refname, currentFileName), contents));
841                 if (prependToProgramListing != null) {
842                     code = prependToProgramListing + code;
843                 }
844                 if (appendForExecToProgramListing != null) {
845                     code += appendForExecToProgramListing;
846                 }
847                 str = encloseContents("div", "programlisting", code);
848             } else if (role.equals("no-scilab-exec")) {
849                 String code = encloseContents("pre", "scilabcode", scilabLexer.convert(HTMLScilabCodeHandler.getInstance(refname, currentFileName), contents));
850                 str = encloseContents("div", "programlisting", code);
851             } else {
852                 String code = encloseContents("pre", "scilabcode", scilabLexer.convert(HTMLScilabCodeHandler.getInstance(refname, currentFileName), contents));
853                 if (prependToProgramListing != null) {
854                     code = prependToProgramListing + code;
855                 }
856                 if (appendToProgramListing != null) {
857                     code += appendToProgramListing;
858                 }
859                 str = encloseContents("div", "programlisting", code);
860             }
861         }
862         if (id != null) {
863             return "<a name=\"" + id + "\"></a>" + str;
864         } else {
865             return str;
866         }
867     }
868
869     /**
870      * Handle a screen
871      * @param attributes the tag attributes
872      * @param contents the tag contents
873      * @return the HTML code
874      * @throws SAXEception if an error is encountered
875      */
876     public String handleScreen(final Map<String, String> attributes, final String contents) throws SAXException {
877         String id = attributes.get("id");
878         String str = encloseContents("div", "screen", encloseContents("pre", contents));
879         if (id != null) {
880             return "<a name=\"" + id + "\"></a>" + str;
881         } else {
882             return str;
883         }
884     }
885
886     /**
887      * Handle a pubdate
888      * @param attributes the tag attributes
889      * @param contents the tag contents
890      * @return the HTML code
891      * @throws SAXEception if an error is encountered
892      */
893     public String handlePubdate(final Map<String, String> attributes, final String contents) throws SAXException {
894         return null;
895     }
896
897     /**
898      * Handle a simplelist
899      * @param attributes the tag attributes
900      * @param contents the tag contents
901      * @return the HTML code
902      * @throws SAXEception if an error is encountered
903      */
904     public String handleSimplelist(final Map<String, String> attributes, final String contents) throws SAXException {
905         String style = "itemizedlist";
906
907         return encloseContents("ul", style, contents);
908     }
909
910     /**
911      * Handle a member
912      * @param attributes the tag attributes
913      * @param contents the tag contents
914      * @return the HTML code
915      * @throws SAXEception if an error is encountered
916      */
917     public String handleMember(final Map<String, String> attributes, final String contents) throws SAXException {
918         return encloseContents("li", "member", contents);
919     }
920
921     /**
922      * Handle a link
923      * @param attributes the tag attributes
924      * @param contents the tag contents
925      * @return the HTML code
926      * @throws SAXEception if an error is encountered
927      */
928     public String handleLink(final Map<String, String> attributes, final String contents) throws SAXException {
929         String link = attributes.get("linkend");
930         if (link == null) {
931             throw new SAXException("No linkend attribute in tag link");
932         }
933
934         String type = attributes.get("type");
935         String id;
936         if (type != null && type.equals("scilab")) {
937             id = resolvScilabLink(link);
938         } else if (type != null && type.equals("remote")) {
939             id = makeRemoteLink(link);
940         } else {
941             id = mapId.get(link);
942         }
943
944         if (id == null) {
945             warnings++;
946             System.err.println("Warning (should be fixed): invalid internal link to " + link + " in " + currentFileName + "\nat line " + locator.getLineNumber());
947             return null;
948         }
949
950         Stack<DocbookElement> stack = getStack();
951         int s = stack.size();
952         if (s >= 3) {
953             DocbookElement elem = stack.get(s - 3);
954             if (elem.getName().equals("refsection")) {
955                 String role = elem.getAttributes().get("role");
956                 if (role != null && role.equals("see also")) {
957                     String purpose = mapIdPurpose.get(link);
958                     if (purpose != null) {
959                         return encloseContents("a", new String[] {"href", id, "class", "link"}, contents) + " &#8212; " + purpose;
960                     } else {
961                         return encloseContents("a", new String[] {"href", id, "class", "link"}, contents);
962                     }
963                 }
964             }
965         }
966
967         return encloseContents("a", new String[] {"href", id, "class", "link"}, contents);
968     }
969
970     /**
971      * Rewrite a link when its type is "scilab"
972      * @param link the link
973      * @return the modified link with protocol scilab:// for example
974      */
975     protected String resolvScilabLink(String link) {
976         int pos = link.indexOf("/");
977         if (pos == -1) {
978             return null;
979         }
980         String first = link.substring(0, pos);
981         String second = link.substring(pos + 1);
982         String[] toks = first.split("\\.");
983         if (toks == null || toks.length != 2) {
984             return null;
985         }
986
987         if (!linkToTheWeb) {
988             return urlBase + link;
989         } else {
990             if (toks[0].equals("scilab") && toks[1].equals("help")) {
991                 return urlBase + second + ".html";
992             } else {
993                 return "#";
994             }
995         }
996     }
997
998     /**
999      * Make a remote link
1000      * @param link the link
1001      * @return the good link
1002      */
1003     protected String makeRemoteLink(String link) {
1004         return link;
1005     }
1006
1007     /**
1008      * Handle an ulink
1009      * @param attributes the tag attributes
1010      * @param contents the tag contents
1011      * @return the HTML code
1012      * @throws SAXEception if an error is encountered
1013      */
1014     public String handleUlink(final Map<String, String> attributes, final String contents) throws SAXException {
1015         String link = attributes.get("url");
1016         if (link == null) {
1017             throw new SAXException("No url attribute in tag ulink");
1018         }
1019
1020         return encloseContents("a", new String[] {"href", link, "class", "ulink"}, contents);
1021     }
1022
1023     /**
1024      * Handle a xref
1025      * @param attributes the tag attributes
1026      * @param contents the tag contents
1027      * @return the HTML code
1028      * @throws SAXEception if an error is encountered
1029      */
1030     public String handleXref(final Map<String, String> attributes, final String contents) throws SAXException {
1031         String link = attributes.get("linkend");
1032         if (link == null) {
1033             throw new SAXException("No linkend attribute in tag link");
1034         }
1035
1036         String id = mapId.get(link);
1037         if (id == null) {
1038             warnings++;
1039             System.err.println("Warning (should be fixed): invalid internal link to " + link + " in " + currentFileName + "\nat line " + locator.getLineNumber());
1040             return null;
1041         }
1042
1043         return encloseContents("a", new String[] {"href", id, "class", "xref"}, contents);
1044     }
1045
1046     /**
1047      * Handle a latex (not really a docbook tag...)
1048      * @param attributes the tag attributes
1049      * @param contents the tag contents
1050      * @return the HTML code
1051      * @throws SAXEception if an error is encountered
1052      */
1053     public String handleLatex(final Map<String, String> attributes, final String contents) throws SAXException {
1054         File f = new File(outName + imageDir, LATEXBASENAME + (latexCompt++) + ".png");
1055         String parent = getParentTagName();
1056         if (parent.equals("para") && !attributes.containsKey("style")) {
1057             attributes.put("style", "text");
1058         }
1059         String fs = attributes.get("fontsize");
1060         if (fs == null) {
1061             attributes.put("fontsize", "16");
1062         }
1063         return ImageConverter.getImageByCode(currentFileName, contents, attributes, "image/latex", f, imageDir + "/" + f.getName());
1064     }
1065
1066     /**
1067      * Handle a term
1068      * @param attributes the tag attributes
1069      * @param contents the tag contents
1070      * @return the HTML code
1071      * @throws SAXEception if an error is encountered
1072      */
1073     public String handleTerm(final Map<String, String> attributes, final String contents) throws SAXException {
1074         String id = attributes.get("id");
1075         if (id != null) {
1076             return "<a name=\"" + id + "\"></a>" + encloseContents("span", "term", contents);
1077         } else {
1078             return encloseContents("span", "term", contents);
1079         }
1080     }
1081
1082     /**
1083      * Handle a listitem
1084      * @param attributes the tag attributes
1085      * @param contents the tag contents
1086      * @return the HTML code
1087      * @throws SAXEception if an error is encountered
1088      */
1089     public String handleListitem(final Map<String, String> attributes, final String contents) throws SAXException {
1090         String parent = getParentTagName();
1091         if (parent.equals("varlistentry")) {
1092             return encloseContents("dd", contents);
1093         }
1094         return encloseContents("li", contents);
1095     }
1096
1097     /**
1098      * Handle a varlistentry
1099      * @param attributes the tag attributes
1100      * @param contents the tag contents
1101      * @return the HTML code
1102      * @throws SAXEception if an error is encountered
1103      */
1104     public String handleVarlistentry(final Map<String, String> attributes, final String contents) throws SAXException {
1105         return encloseContents("dt", contents);
1106     }
1107
1108     /**
1109      * Handle a variablelist
1110      * @param attributes the tag attributes
1111      * @param contents the tag contents
1112      * @return the HTML code
1113      * @throws SAXEception if an error is encountered
1114      */
1115     public String handleVariablelist(final Map<String, String> attributes, final String contents) throws SAXException {
1116         return encloseContents("dl", contents);
1117     }
1118
1119     /**
1120      * Handle an itemizedlist
1121      * @param attributes the tag attributes
1122      * @param contents the tag contents
1123      * @return the HTML code
1124      * @throws SAXEception if an error is encountered
1125      */
1126     public String handleItemizedlist(final Map<String, String> attributes, final String contents) throws SAXException {
1127         String id = attributes.get("id");
1128         if (id != null) {
1129             return "<a name=\"" + id + "\"></a>" + encloseContents("ul", "itemizedlist", contents);
1130         } else {
1131             return encloseContents("ul", "itemizedlist", contents);
1132         }
1133     }
1134
1135     /**
1136      * Handle an emphasis
1137      * @param attributes the tag attributes
1138      * @param contents the tag contents
1139      * @return the HTML code
1140      * @throws SAXEception if an error is encountered
1141      */
1142     public String handleEmphasis(final Map<String, String> attributes, final String contents) throws SAXException {
1143         String role = attributes.get("role");
1144         if (role != null) {
1145             if (role.equals("bold")) {
1146                 return encloseContents("b", contents);
1147             }
1148             if (role.equals("italic")) {
1149                 return encloseContents("i", contents);
1150             }
1151         }
1152
1153         return encloseContents("em", contents);
1154     }
1155
1156     /**
1157      * Handle a tr
1158      * @param attributes the tag attributes
1159      * @param contents the tag contents
1160      * @return the HTML code
1161      * @throws SAXEception if an error is encountered
1162      */
1163     public String handleTr(final Map<String, String> attributes, final String contents) throws SAXException {
1164         return encloseContents("tr", contents);
1165     }
1166
1167     /**
1168      * Handle a td
1169      * @param attributes the tag attributes
1170      * @param contents the tag contents
1171      * @return the HTML code
1172      * @throws SAXEception if an error is encountered
1173      */
1174     public String handleTd(final Map<String, String> attributes, final String contents) throws SAXException {
1175         String align = attributes.get("align");
1176         if (align == null) {
1177             return encloseContents("td", new String[] {"align", align}, contents);
1178         }
1179         return encloseContents("td", contents);
1180     }
1181
1182     /**
1183      * Handle an informaltable
1184      * @param attributes the tag attributes
1185      * @param contents the tag contents
1186      * @return the HTML code
1187      * @throws SAXEception if an error is encountered
1188      */
1189     public String handleInformaltable(final Map<String, String> attributes, final String contents) throws SAXException {
1190         String id = attributes.get("id");
1191         String border = attributes.get("border");
1192         if (border == null) {
1193             border = "";
1194         }
1195         String cellpadding = attributes.get("cellpadding");
1196         if (cellpadding == null) {
1197             cellpadding = "";
1198         }
1199         String width = attributes.get("width");
1200         if (width == null) {
1201             width = "";
1202         }
1203         if (id != null) {
1204             return "<a name=\"" + id + "\"></a>" + encloseContents("table", new String[] {"class", "informaltable", "border", border, "cellpadding", cellpadding, "width", width}, contents);
1205         } else {
1206             return encloseContents("table", new String[] {"class", "informaltable", "border", border, "cellpadding", cellpadding, "width", width}, contents);
1207         }
1208     }
1209
1210     /**
1211      * Handle an imagedata
1212      * @param attributes the tag attributes
1213      * @param contents the tag contents
1214      * @return the HTML code
1215      * @throws SAXEception if an error is encountered
1216      */
1217     public String handleImagedata(final Map<String, String> attributes, final String contents) throws SAXException {
1218         String fileref = attributes.get("fileref");
1219         if (fileref == null) {
1220             if (contents == null || contents.length() == 0) {
1221                 throw new SAXException("No fileref attribute or no data in tag imagedata");
1222             }
1223
1224             return contents;
1225         }
1226
1227         try {
1228             String path = new File(new URI(currentFileName)).getParent();
1229             if (!ImageConverter.imageExists(path, fileref)) {
1230                 throw new SAXException("The given fileref is not on an existing image file:\n" + fileref);
1231             }
1232
1233             return ImageConverter.getImageByFile(attributes, path, fileref, outName, imageDir);
1234         }  catch (URISyntaxException e) {
1235             System.err.println(e);
1236         }
1237
1238         return null;
1239     }
1240
1241     /**
1242      * Handle an imageobject
1243      * @param attributes the tag attributes
1244      * @param contents the tag contents
1245      * @return the HTML code
1246      * @throws SAXEception if an error is encountered
1247      */
1248     public String handleImageobject(final Map<String, String> attributes, final String contents) throws SAXException {
1249         return contents;
1250     }
1251
1252     /**
1253      * Handle an inlinemediaobject
1254      * @param attributes the tag attributes
1255      * @param contents the tag contents
1256      * @return the HTML code
1257      * @throws SAXEception if an error is encountered
1258      */
1259     public String handleInlinemediaobject(final Map<String, String> attributes, final String contents) throws SAXException {
1260         return encloseContents("span", contents);
1261     }
1262
1263     /**
1264      * Handle a screenshot
1265      * @param attributes the tag attributes
1266      * @param contents the tag contents
1267      * @return the HTML code
1268      * @throws SAXEception if an error is encountered
1269      */
1270     public String handleScreenshot(final Map<String, String> attributes, final String contents) throws SAXException {
1271         String id = attributes.get("id");
1272         if (id != null) {
1273             return "<a name=\"" + id + "\"></a>" + encloseContents("div", "screenshot", contents);
1274         } else {
1275             return encloseContents("div", "screenshot", contents);
1276         }
1277     }
1278
1279     /**
1280      * Handle a mediaobject
1281      * @param attributes the tag attributes
1282      * @param contents the tag contents
1283      * @return the HTML code
1284      * @throws SAXEception if an error is encountered
1285      */
1286     public String handleMediaobject(final Map<String, String> attributes, final String contents) throws SAXException {
1287         String id = attributes.get("id");
1288         String c = contents.replaceFirst("top:([0-9]+)px;", "");
1289         if (id != null) {
1290             return "<a name=\"" + id + "\"></a>" + encloseContents("div", "mediaobject", c);
1291         } else {
1292             return encloseContents("div", "mediaobject", c);
1293         }
1294     }
1295
1296     /**
1297      * Handle an informalequation
1298      * @param attributes the tag attributes
1299      * @param contents the tag contents
1300      * @return the HTML code
1301      * @throws SAXEception if an error is encountered
1302      */
1303     public String handleInformalequation(final Map<String, String> attributes, final String contents) throws SAXException {
1304         String id = attributes.get("id");
1305         if (id != null) {
1306             return "<a name=\"" + id + "\"></a>" + encloseContents("div", "informalequation", contents);
1307         } else {
1308             return encloseContents("div", "informalequation", contents);
1309         }
1310     }
1311
1312     /**
1313      * Handle an orderedlist
1314      * @param attributes the tag attributes
1315      * @param contents the tag contents
1316      * @return the HTML code
1317      * @throws SAXEception if an error is encountered
1318      */
1319     public String handleOrderedlist(final Map<String, String> attributes, final String contents) throws SAXException {
1320         String numeration = "1";
1321         String numAttr = attributes.get("numeration");
1322         if (numAttr != null) {
1323             if (numAttr.equals("loweralpha")) {
1324                 numeration = "a";
1325             } else if (numAttr.equals("upperalpha")) {
1326                 numeration = "A";
1327             } else if (numAttr.equals("lowerroman")) {
1328                 numeration = "i";
1329             } else if (numAttr.equals("upperroman")) {
1330                 numeration = "I";
1331             }
1332         }
1333
1334         String id = attributes.get("id");
1335         if (id != null) {
1336             return "<a name=\"" + id + "\"></a>" + encloseContents("ol", new String[] {"type", numeration}, contents);
1337         } else {
1338             return encloseContents("ol", new String[] {"type", numeration}, contents);
1339         }
1340     }
1341
1342     /**
1343      * Handle a subscript
1344      * @param attributes the tag attributes
1345      * @param contents the tag contents
1346      * @return the HTML code
1347      * @throws SAXEception if an error is encountered
1348      */
1349     public String handleSubscript(final Map<String, String> attributes, final String contents) throws SAXException {
1350         return encloseContents("sub", contents);
1351     }
1352
1353     /**
1354      * Handle a superscript
1355      * @param attributes the tag attributes
1356      * @param contents the tag contents
1357      * @return the HTML code
1358      * @throws SAXEception if an error is encountered
1359      */
1360     public String handleSuperscript(final Map<String, String> attributes, final String contents) throws SAXException {
1361         return encloseContents("sup", contents);
1362     }
1363
1364     /**
1365      * Handle a replaceable
1366      * @param attributes the tag attributes
1367      * @param contents the tag contents
1368      * @return the HTML code
1369      * @throws SAXEception if an error is encountered
1370      */
1371     public String handleReplaceable(final Map<String, String> attributes, final String contents) throws SAXException {
1372         return encloseContents("span", "replaceable", contents);
1373     }
1374
1375     /**
1376      * Handle a question
1377      * @param attributes the tag attributes
1378      * @param contents the tag contents
1379      * @return the HTML code
1380      * @throws SAXEception if an error is encountered
1381      */
1382     public String handleQuestion(final Map<String, String> attributes, final String contents) throws SAXException {
1383         return encloseContents("dt", encloseContents("strong", contents));
1384     }
1385
1386     /**
1387      * Handle an answer
1388      * @param attributes the tag attributes
1389      * @param contents the tag contents
1390      * @return the HTML code
1391      * @throws SAXEception if an error is encountered
1392      */
1393     public String handleAnswer(final Map<String, String> attributes, final String contents) throws SAXException {
1394         return encloseContents("dd", contents);
1395     }
1396
1397     /**
1398      * Handle a qandaentry
1399      * @param attributes the tag attributes
1400      * @param contents the tag contents
1401      * @return the HTML code
1402      * @throws SAXEception if an error is encountered
1403      */
1404     public String handleQandaentry(final Map<String, String> attributes, final String contents) throws SAXException {
1405         return encloseContents("dl", contents);
1406     }
1407
1408     /**
1409      * Handle a qandaset
1410      * @param attributes the tag attributes
1411      * @param contents the tag contents
1412      * @return the HTML code
1413      * @throws SAXEception if an error is encountered
1414      */
1415     public String handleQandaset(final Map<String, String> attributes, final String contents) throws SAXException {
1416         return encloseContents("div", "qandaset", contents);
1417     }
1418
1419     /**
1420      * Handle a caption
1421      * @param attributes the tag attributes
1422      * @param contents the tag contents
1423      * @return the HTML code
1424      * @throws SAXEception if an error is encountered
1425      */
1426     public String handleCaption(final Map<String, String> attributes, final String contents) throws SAXException {
1427         return encloseContents("caption", encloseContents("b", contents));
1428     }
1429
1430     /**
1431      * Handle a tbody
1432      * @param attributes the tag attributes
1433      * @param contents the tag contents
1434      * @return the HTML code
1435      * @throws SAXEception if an error is encountered
1436      */
1437     public String handleTbody(final Map<String, String> attributes, final String contents) throws SAXException {
1438         return encloseContents("tbody", "tbody", contents);
1439     }
1440
1441     /**
1442      * Handle a table
1443      * @param attributes the tag attributes
1444      * @param contents the tag contents
1445      * @return the HTML code
1446      * @throws SAXEception if an error is encountered
1447      */
1448     public String handleTable(final Map<String, String> attributes, final String contents) throws SAXException {
1449         String id = attributes.get("id");
1450         if (id != null) {
1451             return "<a name=\"" + id + "\"></a>" + encloseContents("table", "doctable", contents);
1452         } else {
1453             return encloseContents("table", "doctable", contents);
1454         }
1455     }
1456
1457     /**
1458      * Handle a surname
1459      * @param attributes the tag attributes
1460      * @param contents the tag contents
1461      * @return the HTML code
1462      * @throws SAXEception if an error is encountered
1463      */
1464     public String handleSurname(final Map<String, String> attributes, final String contents) throws SAXException {
1465         return encloseContents("span", "surname", contents);
1466     }
1467
1468     /**
1469      * Handle a firstname
1470      * @param attributes the tag attributes
1471      * @param contents the tag contents
1472      * @return the HTML code
1473      * @throws SAXEception if an error is encountered
1474      */
1475     public String handleFirstname(final Map<String, String> attributes, final String contents) throws SAXException {
1476         return encloseContents("span", "firstname", contents);
1477     }
1478
1479     /**
1480      * Handle a bibliomset
1481      * @param attributes the tag attributes
1482      * @param contents the tag contents
1483      * @return the HTML code
1484      * @throws SAXEception if an error is encountered
1485      */
1486     public String handleBibliomset(final Map<String, String> attributes, final String contents) throws SAXException {
1487         String id = attributes.get("id");
1488         if (id != null) {
1489             return "<a name=\"" + id + "\"></a>" + encloseContents("div", "bibliomset", contents);
1490         } else {
1491             return encloseContents("div", "bibliomset", contents);
1492         }
1493     }
1494
1495     /**
1496      * Handle a bibliomixed
1497      * @param attributes the tag attributes
1498      * @param contents the tag contents
1499      * @return the HTML code
1500      * @throws SAXEception if an error is encountered
1501      */
1502     public String handleBibliomixed(final Map<String, String> attributes, final String contents) throws SAXException {
1503         String id = attributes.get("id");
1504         if (id != null) {
1505             return "<a name=\"" + id + "\"></a>" + encloseContents("div", "bibliomixed", contents);
1506         } else {
1507             return encloseContents("div", "bibliomixed", contents);
1508         }
1509     }
1510
1511     /**
1512      * Handle a th
1513      * @param attributes the tag attributes
1514      * @param contents the tag contents
1515      * @return the HTML code
1516      * @throws SAXEception if an error is encountered
1517      */
1518     public String handleTh(final Map<String, String> attributes, final String contents) throws SAXException {
1519         return encloseContents("th", contents);
1520     }
1521
1522     /**
1523      * Handle a revhistory
1524      * @param attributes the tag attributes
1525      * @param contents the tag contents
1526      * @return the HTML code
1527      * @throws SAXEception if an error is encountered
1528      */
1529     public String handleRevhistory(final Map<String, String> attributes, final String contents) throws SAXException {
1530         String id = attributes.get("id");
1531         String str = "<table class=\"revhistory\"><tr class=\"title\"><td>" + VERSION + "</td><td>" + DESCRIPTION + "</td></tr>" + contents + "</table>";
1532         if (id != null) {
1533             return "<a name=\"" + id + "\"></a>" + str;
1534         } else {
1535             return str;
1536         }
1537     }
1538
1539     /**
1540      * Handle a revision
1541      * @param attributes the tag attributes
1542      * @param contents the tag contents
1543      * @return the HTML code
1544      * @throws SAXEception if an error is encountered
1545      */
1546     public String handleRevision(final Map<String, String> attributes, final String contents) throws SAXException {
1547         return encloseContents("tr", contents);
1548     }
1549
1550     /**
1551      * Handle a revnumber
1552      * @param attributes the tag attributes
1553      * @param contents the tag contents
1554      * @return the HTML code
1555      * @throws SAXEception if an error is encountered
1556      */
1557     public String handleRevnumber(final Map<String, String> attributes, final String contents) throws SAXException {
1558         return encloseContents("td", "revnumber", contents);
1559     }
1560
1561     /**
1562      * Handle a revremark
1563      * @param attributes the tag attributes
1564      * @param contents the tag contents
1565      * @return the HTML code
1566      * @throws SAXEception if an error is encountered
1567      */
1568     public String handleRevremark(final Map<String, String> attributes, final String contents) throws SAXException {
1569         return encloseContents("td", "revremark", contents);
1570     }
1571
1572     /**
1573      * Handle a revdescription
1574      * @param attributes the tag attributes
1575      * @param contents the tag contents
1576      * @return the HTML code
1577      * @throws SAXEception if an error is encountered
1578      */
1579     public String handleRevdescription(final Map<String, String> attributes, final String contents) throws SAXException {
1580         return encloseContents("td", "revdescription", contents);
1581     }
1582
1583     /**
1584      * Handle a note
1585      * @param attributes the tag attributes
1586      * @param contents the tag contents
1587      * @return the HTML code
1588      * @throws SAXEception if an error is encountered
1589      */
1590     public String handleNote(final Map<String, String> attributes, final String contents) throws SAXException {
1591         String id = attributes.get("id");
1592         String code = "<table><tr><td valign=\"top\"><img src=\"ScilabNote.png\"/></td><td valign=\"top\">" + encloseContents("div", "note", contents) + "</tr></table>";
1593         if (id != null) {
1594             return "<a name=\"" + id + "\"></a>" + code;
1595         } else {
1596             return code;
1597         }
1598     }
1599
1600     /**
1601      * Handle a warning
1602      * @param attributes the tag attributes
1603      * @param contents the tag contents
1604      * @return the HTML code
1605      * @throws SAXEception if an error is encountered
1606      */
1607     public String handleWarning(final Map<String, String> attributes, final String contents) throws SAXException {
1608         String id = attributes.get("id");
1609         String code = "<table><tr><td valign=\"top\"><img src=\"ScilabWarning.png\"/></td><td valign=\"top\">" + encloseContents("div", "warning", contents) + "</tr></table>";
1610         if (id != null) {
1611             return "<a name=\"" + id + "\"></a>" + code;
1612         } else {
1613             return code;
1614         }
1615     }
1616
1617     /**
1618      * Handle a caution
1619      * @param attributes the tag attributes
1620      * @param contents the tag contents
1621      * @return the HTML code
1622      * @throws SAXEception if an error is encountered
1623      */
1624     public String handleCaution(final Map<String, String> attributes, final String contents) throws SAXException {
1625         String id = attributes.get("id");
1626         String code = "<table><tr><td valign=\"top\"><img src=\"ScilabCaution.png\"/></td><td valign=\"top\">" + encloseContents("div", "caution", contents) + "</tr></table>";
1627         if (id != null) {
1628             return "<a name=\"" + id + "\"></a>" + code;
1629         } else {
1630             return code;
1631         }
1632     }
1633
1634     /**
1635      * Handle a tip
1636      * @param attributes the tag attributes
1637      * @param contents the tag contents
1638      * @return the HTML code
1639      * @throws SAXEception if an error is encountered
1640      */
1641     public String handleTip(final Map<String, String> attributes, final String contents) throws SAXException {
1642         String id = attributes.get("id");
1643         String code = "<table><tr><td valign=\"top\"><img src=\"ScilabTip.png\"/></td><td valign=\"top\">" + encloseContents("div", "tip", contents) + "</tr></table>";
1644         if (id != null) {
1645             return "<a name=\"" + id + "\"></a>" + code;
1646         } else {
1647             return code;
1648         }
1649     }
1650
1651     /**
1652      * Handle a important
1653      * @param attributes the tag attributes
1654      * @param contents the tag contents
1655      * @return the HTML code
1656      * @throws SAXEception if an error is encountered
1657      */
1658     public String handleImportant(final Map<String, String> attributes, final String contents) throws SAXException {
1659         String id = attributes.get("id");
1660         String code = "<table><tr><td valign=\"top\"><img src=\"ScilabImportant.png\"/></td><td valign=\"top\">" + encloseContents("div", "important", contents) + "</tr></table>";
1661         if (id != null) {
1662             return "<a name=\"" + id + "\"></a>" + code;
1663         } else {
1664             return code;
1665         }
1666     }
1667 }