Qedeq2Xml.java
001 /* This file is part of the project "Hilbert II" - http://www.qedeq.org
002  *
003  * Copyright 2000-2013,  Michael Meyling <mime@qedeq.org>.
004  *
005  * "Hilbert II" is free software; you can redistribute
006  * it and/or modify it under the terms of the GNU General Public
007  * License as published by the Free Software Foundation; either
008  * version 2 of the License, or (at your option) any later version.
009  *
010  * This program is distributed in the hope that it will be useful,
011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013  * GNU General Public License for more details.
014  */
015 
016 package org.qedeq.kernel.xml.dao;
017 
018 import java.io.IOException;
019 
020 import org.qedeq.base.io.TextOutput;
021 import org.qedeq.base.utility.StringUtility;
022 import org.qedeq.kernel.bo.KernelContext;
023 import org.qedeq.kernel.bo.module.ControlVisitor;
024 import org.qedeq.kernel.bo.module.KernelQedeqBo;
025 import org.qedeq.kernel.se.base.list.ElementList;
026 import org.qedeq.kernel.se.base.module.Add;
027 import org.qedeq.kernel.se.base.module.Author;
028 import org.qedeq.kernel.se.base.module.AuthorList;
029 import org.qedeq.kernel.se.base.module.Axiom;
030 import org.qedeq.kernel.se.base.module.ChangedRule;
031 import org.qedeq.kernel.se.base.module.Chapter;
032 import org.qedeq.kernel.se.base.module.Conclusion;
033 import org.qedeq.kernel.se.base.module.ConditionalProof;
034 import org.qedeq.kernel.se.base.module.Existential;
035 import org.qedeq.kernel.se.base.module.FormalProof;
036 import org.qedeq.kernel.se.base.module.FormalProofLine;
037 import org.qedeq.kernel.se.base.module.FormalProofLineList;
038 import org.qedeq.kernel.se.base.module.Formula;
039 import org.qedeq.kernel.se.base.module.FunctionDefinition;
040 import org.qedeq.kernel.se.base.module.Header;
041 import org.qedeq.kernel.se.base.module.Hypothesis;
042 import org.qedeq.kernel.se.base.module.Import;
043 import org.qedeq.kernel.se.base.module.ImportList;
044 import org.qedeq.kernel.se.base.module.InitialFunctionDefinition;
045 import org.qedeq.kernel.se.base.module.InitialPredicateDefinition;
046 import org.qedeq.kernel.se.base.module.Latex;
047 import org.qedeq.kernel.se.base.module.LatexList;
048 import org.qedeq.kernel.se.base.module.LinkList;
049 import org.qedeq.kernel.se.base.module.LiteratureItem;
050 import org.qedeq.kernel.se.base.module.LiteratureItemList;
051 import org.qedeq.kernel.se.base.module.Location;
052 import org.qedeq.kernel.se.base.module.LocationList;
053 import org.qedeq.kernel.se.base.module.ModusPonens;
054 import org.qedeq.kernel.se.base.module.Node;
055 import org.qedeq.kernel.se.base.module.PredicateDefinition;
056 import org.qedeq.kernel.se.base.module.Proof;
057 import org.qedeq.kernel.se.base.module.Proposition;
058 import org.qedeq.kernel.se.base.module.Qedeq;
059 import org.qedeq.kernel.se.base.module.Rename;
060 import org.qedeq.kernel.se.base.module.Rule;
061 import org.qedeq.kernel.se.base.module.Section;
062 import org.qedeq.kernel.se.base.module.Specification;
063 import org.qedeq.kernel.se.base.module.Subsection;
064 import org.qedeq.kernel.se.base.module.SubsectionList;
065 import org.qedeq.kernel.se.base.module.SubstFree;
066 import org.qedeq.kernel.se.base.module.SubstFunc;
067 import org.qedeq.kernel.se.base.module.SubstPred;
068 import org.qedeq.kernel.se.base.module.Term;
069 import org.qedeq.kernel.se.base.module.Universal;
070 import org.qedeq.kernel.se.base.module.UsedByList;
071 import org.qedeq.kernel.se.common.Plugin;
072 import org.qedeq.kernel.se.common.SourceFileExceptionList;
073 
074 
075 /**
076  * This class prints a QEDEQ module in XML format in an output stream.
077  *
078  @author  Michael Meyling
079  */
080 public final class Qedeq2Xml extends ControlVisitor implements Plugin {
081 
082     /** Output goes here. */
083     private TextOutput printer;
084 
085     /**
086      * Constructor.
087      *
088      @param   plugin  This plugin we work for.
089      @param   bo      QEDEQ BO.
090      @param   printer Print herein.
091      */
092     public Qedeq2Xml(final Plugin plugin, final KernelQedeqBo bo, final TextOutput printer) {
093         super(plugin, bo);
094         this.printer = printer;
095     }
096 
097     /**
098      * Prints a XML representation of given QEDEQ module into a given output stream.
099      *
100      @param   plugin              Plugin we work for.
101      @param   bo                  BO QEDEQ module object.
102      @param   printer             Print herein.
103      @throws  SourceFileExceptionList Major problem occurred.
104      @throws  IOException         Writing failed.
105      */
106     public static void print(final Plugin plugin, final KernelQedeqBo bo, final TextOutput printerthrows
107             SourceFileExceptionList, IOException {
108         final Qedeq2Xml converter = new Qedeq2Xml(plugin, bo, printer);
109         try {
110             converter.traverse();
111         finally {
112             printer.flush();
113         }
114         if (printer.checkError()) {
115             throw printer.getError();
116         }
117     }
118 
119     public final void visitEnter(final Qedeq qedeq) {
120         printer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
121         printer.println("<QEDEQ");
122         printer.println("    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");
123         printer.println("    xsi:noNamespaceSchemaLocation=\"http://www.qedeq.org/"
124             + KernelContext.getInstance().getKernelVersionDirectory() "/xml/qedeq.xsd\">");
125         printer.pushLevel();
126     }
127 
128     public final void visitLeave(final Qedeq qedeq) {
129         printer.popLevel();
130         printer.println("</QEDEQ>");
131     }
132 
133     public void visitEnter(final Header header) {
134         printer.print("<HEADER");
135         if (header.getEmail() != null) {
136             printer.print(" email=\"" + StringUtility.escapeXml(header.getEmail()) "\"");
137         }
138         printer.println(">");
139         printer.pushLevel();
140     }
141 
142     public void visitLeave(final Header header) {
143         printer.popLevel();
144         printer.println("</HEADER>");
145     }
146 
147     public void visitEnter(final Specification specification) {
148         printer.print("<SPECIFICATION");
149         if (specification.getName() != null) {
150             printer.print(" name=\"" + StringUtility.escapeXml(specification.getName()) "\"");
151         }
152         if (specification.getName() != null) {
153             printer.print(" ruleVersion=\"" + StringUtility.escapeXml(specification.getRuleVersion()) "\"");
154         }
155         printer.println(">");
156         printer.pushLevel();
157     }
158 
159     public void visitLeave(final Specification specification) {
160         printer.popLevel();
161         printer.println("</SPECIFICATION>");
162     }
163 
164     public void visitEnter(final LatexList latexList) {
165         final String last = getCurrentContext().getLocationWithinModule();
166         if (last.endsWith(".getTitle()")) {
167             printer.println("<TITLE>");
168         else if (last.endsWith(".getSummary()")) {
169             printer.println("<ABSTRACT>");
170         else if (last.endsWith(".getIntroduction()")) {
171             printer.println("<INTRODUCTION>");
172         else if (last.endsWith(".getName()")) {
173             printer.println("<NAME>");
174         else if (last.endsWith(".getPrecedingText()")) {
175             printer.println("<PRECEDING>");
176         else if (last.endsWith(".getSucceedingText()")) {
177             printer.println("<SUCCEEDING>");
178         else if (last.endsWith(".getLatex()")) {
179             printer.println("<TEXT>");
180         else if (last.endsWith(".getDescription()")) {
181             if (last.indexOf(".getChangedRuleList().get("0) {
182                 printer.println("<DESCRIPTION>");
183             }
184         }
185         printer.pushLevel();
186     }
187 
188     public void visitLeave(final LatexList latexList) {
189         printer.popLevel();
190         final String last = getCurrentContext().getLocationWithinModule();
191         if (last.endsWith(".getTitle()")) {
192             printer.println("</TITLE>");
193         else if (last.endsWith(".getSummary()")) {
194             printer.println("</ABSTRACT>");
195         else if (last.endsWith(".getIntroduction()")) {
196             printer.println("</INTRODUCTION>");
197         else if (last.endsWith(".getName()")) {
198             printer.println("</NAME>");
199         else if (last.endsWith(".getPrecedingText()")) {
200             printer.println("</PRECEDING>");
201         else if (last.endsWith(".getSucceedingText()")) {
202             printer.println("</SUCCEEDING>");
203         else if (last.endsWith(".getLatex()")) {
204             printer.println("</TEXT>");
205         else if (last.endsWith(".getDescription()")) {
206             if (last.indexOf(".getChangedRuleList().get("0) {
207                 printer.println("</DESCRIPTION>");
208             }
209         }
210     }
211 
212     public void visitEnter(final Latex latex) {
213         printer.print("<LATEX");
214         if (latex.getLanguage() != null) {
215             printer.print(" language=\"" + latex.getLanguage() "\"");
216         }
217         printer.println(">");
218         if (latex.getLatex() != null) {
219             printer.pushLevel();
220             printer.println("<![CDATA[");
221             printer.addToken("  ")// we must fool the printer, this is token not whitespace!
222             final String tabs = printer.getLevel();
223             printer.clearLevel();
224             // escape ]]>
225             final String data = StringUtility.replace(latex.getLatex(),
226                 "]]>""]]]]><![CDATA[>");
227             printer.println(StringUtility.useSystemLineSeparator(data).trim());
228             printer.pushLevel(tabs);
229         }
230     }
231 
232     public void visitLeave(final Latex latex) {
233         if (latex.getLatex() != null) {
234             printer.println("]]>");
235             printer.popLevel();
236         }
237         printer.println("</LATEX>");
238     }
239 
240     public void visitEnter(final LocationList locationList) {
241         printer.println("<LOCATIONS>");
242         printer.pushLevel();
243     }
244 
245     public void visitLeave(final LocationList locationList) {
246         printer.popLevel();
247         printer.println("</LOCATIONS>");
248     }
249 
250     public void visitEnter(final Location location) {
251         printer.print("<LOCATION");
252         if (location.getLocation() != null) {
253             printer.print(" value=\"" + location.getLocation() "\"");
254         }
255         printer.println(" />");
256     }
257 
258     public void visitEnter(final AuthorList authorList) {
259         printer.println("<AUTHORS>");
260         printer.pushLevel();
261     }
262 
263     public void visitLeave(final AuthorList authorList) {
264         printer.popLevel();
265         printer.println("</AUTHORS>");
266     }
267 
268     public void visitEnter(final Author author) {
269         printer.print("<AUTHOR");
270         if (author.getEmail() != null) {
271             printer.print(" email=\"" + StringUtility.escapeXml(author.getEmail()) "\"");
272         }
273         printer.println(">");
274         printer.pushLevel();
275         if (author.getName() != null) {
276             printer.println("<NAME>");
277         }
278         printer.pushLevel();
279     }
280 
281     public void visitLeave(final Author author) {
282         printer.popLevel();
283         if (author.getName() != null) {
284             printer.println("</NAME>");
285         }
286         printer.popLevel();
287         printer.println("</AUTHOR>");
288     }
289 
290     public void visitEnter(final ImportList importList) {
291         printer.println("<IMPORTS>");
292         printer.pushLevel();
293     }
294 
295     public void visitLeave(final ImportList importList) {
296         printer.popLevel();
297         printer.println("</IMPORTS>");
298     }
299 
300     public void visitEnter(final Import imp) {
301         printer.print("<IMPORT");
302         if (imp.getLabel() != null) {
303             printer.print(" label=\"" + StringUtility.escapeXml(imp.getLabel()) "\"");
304         }
305         printer.println(">");
306         printer.pushLevel();
307     }
308 
309     public void visitLeave(final Import imp) {
310         printer.popLevel();
311         printer.println("</IMPORT>");
312     }
313 
314     public void visitEnter(final UsedByList usedByList) {
315         printer.println("<USEDBY>");
316         printer.pushLevel();
317     }
318 
319     public void visitLeave(final UsedByList usedByList) {
320         printer.popLevel();
321         printer.println("</USEDBY>");
322     }
323 
324     public void visitEnter(final Chapter chapter) {
325         printer.print("<CHAPTER");
326         if (chapter.getNoNumber() != null) {
327             printer.print(" noNumber=\"" + chapter.getNoNumber().booleanValue() "\"");
328         }
329         printer.println(">");
330         printer.pushLevel();
331     }
332 
333     public void visitLeave(final Chapter chapter) {
334         printer.popLevel();
335         printer.println("</CHAPTER>");
336     }
337 
338     public void visitEnter(final Section section) {
339         printer.print("<SECTION");
340         if (section.getNoNumber() != null) {
341             printer.print(" noNumber=\"" + section.getNoNumber().booleanValue() "\"");
342         }
343         printer.println(">");
344         printer.pushLevel();
345     }
346 
347     public void visitLeave(final Section section) {
348         printer.popLevel();
349         printer.println("</SECTION>");
350     }
351 
352     public void visitEnter(final SubsectionList subsectionList) {
353         printer.println("<SUBSECTIONS>");
354         printer.pushLevel();
355     }
356 
357     public void visitLeave(final SubsectionList subsectionList) {
358         printer.popLevel();
359         printer.println("</SUBSECTIONS>");
360     }
361 
362     public void visitEnter(final Subsection subsection) {
363         printer.print("<SUBSECTION");
364         if (subsection.getId() != null) {
365             printer.print(" id=\"" + StringUtility.escapeXml(subsection.getId()) "\"");
366         }
367         if (subsection.getLevel() != null) {
368             printer.print(" level=\"" + StringUtility.escapeXml(subsection.getLevel()) "\"");
369         }
370         printer.println(">");
371         printer.pushLevel();
372     }
373 
374     public void visitLeave(final Subsection subsection) {
375         printer.popLevel();
376         printer.println("</SUBSECTION>");
377     }
378 
379     public void visitEnter(final Node node) {
380         printer.print("<NODE");
381         if (node.getId() != null) {
382             printer.print(" id=\"" + StringUtility.escapeXml(node.getId()) "\"");
383         }
384         if (node.getLevel() != null) {
385             printer.print(" level=\"" + StringUtility.escapeXml(node.getLevel()) "\"");
386         }
387         printer.println(">");
388         printer.pushLevel();
389     }
390 
391     public void visitLeave(final Node node) {
392         printer.popLevel();
393         printer.println("</NODE>");
394     }
395 
396     public void visitEnter(final Axiom axiom) {
397         printer.print("<AXIOM");
398         if (axiom.getDefinedOperator() != null) {
399             printer.print(" definedOperator=\"" + StringUtility.escapeXml(axiom.getDefinedOperator()) "\"");
400         }
401         printer.println(">");
402         printer.pushLevel();
403     }
404 
405     public void visitLeave(final Axiom axiom) {
406         printer.popLevel();
407         printer.println("</AXIOM>");
408     }
409 
410     public void visitEnter(final Proposition proposition) {
411         printer.println("<THEOREM>");
412         printer.pushLevel();
413     }
414 
415     public void visitLeave(final Proposition proposition) {
416         printer.popLevel();
417         printer.println("</THEOREM>");
418     }
419 
420     public void visitEnter(final Proof proof) {
421         printer.print("<PROOF");
422         if (proof.getKind() != null) {
423             printer.print(" kind=\"" + StringUtility.escapeXml(proof.getKind()) "\"");
424         }
425         if (proof.getLevel() != null) {
426             printer.print(" level=\"" + StringUtility.escapeXml(proof.getLevel()) "\"");
427         }
428         printer.println(">");
429     }
430 
431     public void visitLeave(final Proof proof) {
432         printer.println("</PROOF>");
433     }
434 
435     public void visitEnter(final FormalProof proof) {
436         printer.println("<FORMAL_PROOF>");
437         printer.pushLevel();
438     }
439 
440     public void visitLeave(final FormalProof proof) {
441         printer.popLevel();
442         printer.println("</FORMAL_PROOF>");
443     }
444 
445     public void visitEnter(final FormalProofLineList proof) {
446         printer.println("<LINES>");
447         printer.pushLevel();
448     }
449 
450     public void visitLeave(final FormalProofLineList proof) {
451         printer.popLevel();
452         printer.println("</LINES>");
453     }
454 
455     public void visitEnter(final FormalProofLine line) {
456         printer.print("<L");
457         if (line.getLabel() != null) {
458             printer.print(" label=\"" + StringUtility.escapeXml(line.getLabel()) "\"");
459         }
460         printer.println(">");
461         printer.pushLevel();
462     }
463 
464     public void visitLeave(final FormalProofLine line) {
465         printer.popLevel();
466         printer.println("</L>");
467     }
468 
469     public void visitEnter(final ModusPonens reason) {
470         printer.print("<MP");
471         if (reason.getReference1() != null) {
472             printer.print(" ref1=\"" + StringUtility.escapeXml(reason.getReference1()) "\"");
473         }
474         if (reason.getReference2() != null) {
475             printer.print(" ref2=\"" + StringUtility.escapeXml(reason.getReference2()) "\"");
476         }
477     }
478 
479     public void visitLeave(final ModusPonens reason) {
480         printer.println("/>");
481     }
482 
483     public void visitEnter(final Add reason) {
484         printer.print("<ADD");
485         if (reason.getReference() != null) {
486             printer.print(" ref=\"" + StringUtility.escapeXml(reason.getReference()) "\"");
487         }
488     }
489 
490     public void visitLeave(final Add reason) {
491         printer.println("/>");
492     }
493 
494     public void visitEnter(final Rename reason) {
495         printer.print("<RENAME");
496         if (reason.getReference() != null) {
497             printer.print(" ref=\"" + StringUtility.escapeXml(reason.getReference()) "\"");
498         }
499         if (reason.getOccurrence() != 0) {
500             printer.print(" occurrence=\"" + StringUtility.escapeXml("" + reason.getOccurrence()) "\"");
501         }
502         printer.println(">");
503         printer.pushLevel();
504     }
505 
506     public void visitLeave(final Rename reason) {
507         printer.popLevel();
508         printer.println("</RENAME>");
509     }
510 
511     public void visitEnter(final SubstFree reason) {
512         printer.print("<SUBST_FREE");
513         if (reason.getReference() != null) {
514             printer.print(" ref=\"" + StringUtility.escapeXml(reason.getReference()) "\"");
515         }
516         printer.println(">");
517         printer.pushLevel();
518     }
519 
520     public void visitLeave(final SubstFree reason) {
521         printer.popLevel();
522         printer.println("</SUBST_FREE>");
523     }
524 
525     public void visitEnter(final SubstFunc reason) {
526         printer.print("<SUBST_FUNVAR");
527         if (reason.getReference() != null) {
528             printer.print(" ref=\"" + StringUtility.escapeXml(reason.getReference()) "\"");
529         }
530         printer.println(">");
531         printer.pushLevel();
532     }
533 
534     public void visitLeave(final SubstFunc reason) {
535         printer.popLevel();
536         printer.println("</SUBST_FUNVAR>");
537     }
538 
539     public void visitEnter(final SubstPred reason) {
540         printer.print("<SUBST_PREDVAR");
541         if (reason.getReference() != null) {
542             printer.print(" ref=\"" + StringUtility.escapeXml(reason.getReference()) "\"");
543         }
544         printer.println(">");
545         printer.pushLevel();
546     }
547 
548     public void visitLeave(final SubstPred reason) {
549         printer.popLevel();
550         printer.println("</SUBST_PREDVAR>");
551     }
552 
553     public void visitEnter(final Existential reason) {
554         printer.print("<EXISTENTIAL");
555         if (reason.getReference() != null) {
556             printer.print(" ref=\"" + StringUtility.escapeXml(reason.getReference()) "\"");
557         }
558         printer.println(">");
559         printer.pushLevel();
560     }
561 
562     public void visitLeave(final Existential reason) {
563         printer.popLevel();
564         printer.println("</EXISTENTIAL>");
565     }
566 
567     public void visitEnter(final Universal reason) {
568         printer.print("<UNIVERSAL");
569         if (reason.getReference() != null) {
570             printer.print(" ref=\"" + StringUtility.escapeXml(reason.getReference()) "\"");
571         }
572         printer.println(">");
573         printer.pushLevel();
574     }
575 
576     public void visitLeave(final Universal reason) {
577         printer.popLevel();
578         printer.println("</UNIVERSAL>");
579     }
580 
581     public void visitEnter(final ConditionalProof reason) {
582         printer.println("<CP>");
583         printer.pushLevel();
584     }
585 
586     public void visitLeave(final ConditionalProof reason) {
587         printer.popLevel();
588         printer.println("</CP>");
589     }
590 
591     public void visitEnter(final Hypothesis hypothesis) {
592         printer.print("<HYPOTHESIS");
593         if (hypothesis.getLabel() != null) {
594             printer.print(" label=\"" + StringUtility.escapeXml(hypothesis.getLabel()) "\"");
595         }
596         printer.println(">");
597         printer.pushLevel();
598     }
599 
600     public void visitLeave(final Hypothesis hypothesis) {
601         printer.popLevel();
602         printer.println("</HYPOTHESIS>");
603     }
604 
605     public void visitEnter(final Conclusion conclusion) {
606         printer.print("<CONCLUSION");
607         if (conclusion.getLabel() != null) {
608             printer.print(" label=\"" + StringUtility.escapeXml(conclusion.getLabel()) "\"");
609         }
610         printer.println(">");
611         printer.pushLevel();
612     }
613 
614     public void visitLeave(final Conclusion conclusion) {
615         printer.popLevel();
616         printer.println("</CONCLUSION>");
617     }
618 
619     public void visitEnter(final InitialPredicateDefinition definition) {
620         printer.print("<DEFINITION_PREDICATE_INITIAL");
621         if (definition.getArgumentNumber() != null) {
622             printer.print(" arguments=\"" + StringUtility.escapeXml(definition.getArgumentNumber()) "\"");
623         }
624         if (definition.getName() != null) {
625             printer.print(" name=\"" + StringUtility.escapeXml(definition.getName()) "\"");
626         }
627         printer.println(">");
628         printer.pushLevel();
629         if (definition.getLatexPattern() != null) {
630             printer.println("<LATEXPATTERN>" + StringUtility.escapeXml(definition.getLatexPattern())
631                 "</LATEXPATTERN>");
632         }
633     }
634 
635     public void visitLeave(final InitialPredicateDefinition definition) {
636         printer.popLevel();
637         printer.println("</DEFINITION_PREDICATE_INITIAL>");
638     }
639 
640     public void visitEnter(final PredicateDefinition definition) {
641         printer.print("<DEFINITION_PREDICATE");
642         if (definition.getArgumentNumber() != null) {
643             printer.print(" arguments=\"" + StringUtility.escapeXml(definition.getArgumentNumber()) "\"");
644         }
645         if (definition.getName() != null) {
646             printer.print(" name=\"" + StringUtility.escapeXml(definition.getName()) "\"");
647         }
648         printer.println(">");
649         printer.pushLevel();
650         if (definition.getLatexPattern() != null) {
651             printer.println("<LATEXPATTERN>" + StringUtility.escapeXml(definition.getLatexPattern())
652                 "</LATEXPATTERN>");
653         }
654     }
655 
656     public void visitLeave(final PredicateDefinition definition) {
657         printer.popLevel();
658         printer.println("</DEFINITION_PREDICATE>");
659     }
660 
661     public void visitEnter(final InitialFunctionDefinition definition) {
662         printer.print("<DEFINITION_FUNCTION_INITIAL");
663         if (definition.getArgumentNumber() != null) {
664             printer.print(" arguments=\"" + StringUtility.escapeXml(definition.getArgumentNumber()) "\"");
665         }
666         if (definition.getName() != null) {
667             printer.print(" name=\"" + StringUtility.escapeXml(definition.getName()) "\"");
668         }
669         printer.println(">");
670         printer.pushLevel();
671         if (definition.getLatexPattern() != null) {
672             printer.println("<LATEXPATTERN>" + definition.getLatexPattern()
673                 "</LATEXPATTERN>");
674         }
675     }
676 
677     public void visitLeave(final InitialFunctionDefinition definition) {
678         printer.popLevel();
679         printer.println("</DEFINITION_FUNCTION_INITIAL>");
680     }
681 
682     public void visitEnter(final FunctionDefinition definition) {
683         printer.print("<DEFINITION_FUNCTION");
684         if (definition.getArgumentNumber() != null) {
685             printer.print(" arguments=\"" + StringUtility.escapeXml(definition.getArgumentNumber()) "\"");
686         }
687         if (definition.getName() != null) {
688             printer.print(" name=\"" + StringUtility.escapeXml(definition.getName()) "\"");
689         }
690         printer.println(">");
691         printer.pushLevel();
692         if (definition.getLatexPattern() != null) {
693             printer.println("<LATEXPATTERN>" + definition.getLatexPattern()
694                 "</LATEXPATTERN>");
695         }
696     }
697 
698     public void visitLeave(final FunctionDefinition definition) {
699         printer.popLevel();
700         printer.println("</DEFINITION_FUNCTION>");
701     }
702 
703     public void visitEnter(final Rule rule) {
704         printer.print("<RULE");
705         if (rule.getName() != null) {
706             printer.print(" name=\"" + StringUtility.escapeXml(rule.getName()) "\"");
707         }
708         if (rule.getVersion() != null) {
709             printer.print(" version=\"" + StringUtility.escapeXml(rule.getVersion()) "\"");
710         }
711         printer.println(">");
712         printer.pushLevel();
713     }
714 
715     public void visitLeave(final Rule rule) {
716         printer.popLevel();
717         printer.println("</RULE>");
718     }
719 
720     public void visitEnter(final LinkList linkList) {
721         for (int i = 0; i < linkList.size(); i++) {
722             printer.print("<LINK");
723             if (linkList.get(i!= null) {
724                 printer.print(" id=\"" + StringUtility.escapeXml(linkList.get(i)) "\"");
725             }
726             printer.println("/>");
727         };
728     }
729 
730     public void visitEnter(final ChangedRule rule) {
731         printer.print("<CHANGED_RULE");
732         if (rule.getName() != null) {
733             printer.print(" name=\"" + StringUtility.escapeXml(rule.getName()) "\"");
734         }
735         if (rule.getVersion() != null) {
736             printer.print(" version=\"" + StringUtility.escapeXml(rule.getVersion()) "\"");
737         }
738         printer.println(">");
739     }
740 
741     public void visitLeave(final ChangedRule rule) {
742         printer.println("</CHANGED_RULE>");
743     }
744 
745     public void visitEnter(final Formula formula) {
746         printer.println("<FORMULA>");
747         printer.pushLevel();
748     }
749 
750     public void visitLeave(final Formula formula) {
751         printer.popLevel();
752         printer.println("</FORMULA>");
753     }
754 
755     public void visitEnter(final Term term) {
756         printer.println("<TERM>");
757         printer.pushLevel();
758     }
759 
760     public void visitLeave(final Term term) {
761         printer.popLevel();
762         printer.println("</TERM>");
763     }
764 
765     // TODO mime 20070217: what do we do if an atom is not first element of a list?
766     // we wouldn't get it here!!! But can we think of an output syntax anyway????
767     public void visitEnter(final ElementList list) {
768         final String operator = list.getOperator();
769         printer.print("<" + operator);
770         final boolean firstIsAtom = list.size() && list.getElement(0).isAtom();
771         if (firstIsAtom) {
772             final String atom = list.getElement(0).getAtom().getString();
773             if (atom != null) {
774                 if ("VAR".equals(operator|| "PREDVAR".equals(operator)
775                         || "FUNVAR".equals(operator)) {
776                     printer.print(" id=\"" + StringUtility.escapeXml(atom"\"");
777                 else if ("PREDCON".equals(operator|| "FUNCON".equals(operator)) {
778                     printer.print(" ref=\"" + StringUtility.escapeXml(atom"\"");
779                 else {
780                     printer.print(" unknown=\"" + StringUtility.escapeXml(atom"\"");
781                 }
782             }
783         }
784         if (list.size() == || list.size() == && list.getElement(0).isAtom()) {
785             printer.print("/");
786         }
787         printer.println(">");
788         printer.pushLevel();
789     }
790 
791     public void visitLeave(final ElementList list) {
792         printer.popLevel();
793         if (list.size() == || list.size() == && list.getElement(0).isAtom()) {
794             return;
795         }
796         printer.println("</" + list.getOperator() ">");
797     }
798 
799     public void visitEnter(final LiteratureItemList list) {
800         printer.println("<BIBLIOGRAPHY>");
801         printer.pushLevel();
802     }
803 
804     public void visitLeave(final LiteratureItemList list) {
805         printer.popLevel();
806         printer.println("</BIBLIOGRAPHY>");
807     }
808 
809     public void visitEnter(final LiteratureItem item) {
810         printer.print("<ITEM");
811         if (item.getLabel() != null) {
812             printer.print(" label=\"" + StringUtility.escapeXml(item.getLabel()) "\"");
813         }
814         printer.println(">");
815         printer.pushLevel();
816     }
817 
818     public void visitLeave(final LiteratureItem item) {
819         printer.popLevel();
820         printer.println("</ITEM>");
821     }
822 
823     public String getPluginId() {
824         return this.getClass().getName();
825     }
826 
827     public String getPluginActionName() {
828         return "generate XML";
829     }
830 
831     public String getPluginDescription() {
832         return "Transformes QEDEQ module into XML data";
833     }
834 
835 }