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