1 /******************************************************************************
6 * Copyright (C) 1997-2012 by Dimitri van Heesch.
8 * Permission to use, copy, modify, and distribute this software and its
9 * documentation under the terms of the GNU General Public License is hereby
10 * granted. No representations are made about the suitability of this software
11 * for any purpose. It is provided "as is" without express or implied warranty.
12 * See the GNU General Public License for more details.
14 * Documents produced by Doxygen are derivative works derived from the
15 * input used in their production; they are not affected by this license.
19 #ifndef _PRINTDOCVISITOR_H
20 #define _PRINTDOCVISITOR_H
22 #include "docvisitor.h"
24 /*! Concrete visitor implementation for pretty printing */
25 class PrintDocVisitor : public DocVisitor
28 PrintDocVisitor() : DocVisitor(DocVisitor_Other), m_indent(0),
29 m_needsEnter(FALSE), m_insidePre(FALSE) {}
31 //--------------------------------------
33 void visit(DocWord *w)
36 printf("%s",w->word().data());
38 void visit(DocLinkedWord *w)
41 printf("%s",w->word().data());
43 void visit(DocWhiteSpace *w)
48 printf("%s",w->chars().data());
55 void visit(DocSymbol *s)
60 case DocSymbol::BSlash: printf("\\"); break;
61 case DocSymbol::At: printf("@"); break;
62 case DocSymbol::Less: printf("<"); break;
63 case DocSymbol::Greater: printf(">"); break;
64 case DocSymbol::Amp: printf("&"); break;
65 case DocSymbol::Dollar: printf("$"); break;
66 case DocSymbol::Hash: printf("#"); break;
67 case DocSymbol::Percent: printf("%%"); break;
68 case DocSymbol::Pipe: printf("|"); break;
69 case DocSymbol::Copy: printf("©"); break;
70 case DocSymbol::Apos: printf("'"); break;
71 case DocSymbol::Quot: printf("\""); break;
72 case DocSymbol::Lsquo: printf("‘"); break;
73 case DocSymbol::Rsquo: printf("’"); break;
74 case DocSymbol::Ldquo: printf("“"); break;
75 case DocSymbol::Rdquo: printf("”"); break;
76 case DocSymbol::Ndash: printf("–"); break;
77 case DocSymbol::Mdash: printf("—"); break;
78 case DocSymbol::Uml: printf("&%cuml;",s->letter()); break;
79 case DocSymbol::Acute: printf("&%cacute;",s->letter()); break;
80 case DocSymbol::Grave: printf("&%cgrave;",s->letter()); break;
81 case DocSymbol::Circ: printf("&%ccirc;",s->letter()); break;
82 case DocSymbol::Tilde: printf("&%ctilde;",s->letter()); break;
83 case DocSymbol::Szlig: printf("ß"); break;
84 case DocSymbol::Cedil: printf("&%ccedul;",s->letter()); break;
85 case DocSymbol::Ring: printf("&%cring;",s->letter()); break;
86 case DocSymbol::Nbsp: printf(" "); break;
87 case DocSymbol::Aelig: printf("æ"); break;
88 case DocSymbol::AElig: printf("Æ"); break;
89 case DocSymbol::GrkGamma: printf("Γ"); break;
90 case DocSymbol::GrkDelta: printf("Δ"); break;
91 case DocSymbol::GrkTheta: printf("Θ"); break;
92 case DocSymbol::GrkLambda: printf("Λ"); break;
93 case DocSymbol::GrkXi: printf("Ξ"); break;
94 case DocSymbol::GrkPi: printf("Π"); break;
95 case DocSymbol::GrkSigma: printf("Σ"); break;
96 case DocSymbol::GrkUpsilon: printf("Υ"); break;
97 case DocSymbol::GrkPhi: printf("Φ"); break;
98 case DocSymbol::GrkPsi: printf("Ψ"); break;
99 case DocSymbol::GrkOmega: printf("Ω"); break;
100 case DocSymbol::Grkalpha: printf("α"); break;
101 case DocSymbol::Grkbeta: printf("β"); break;
102 case DocSymbol::Grkgamma: printf("γ"); break;
103 case DocSymbol::Grkdelta: printf("δ"); break;
104 case DocSymbol::Grkepsilon: printf("ε"); break;
105 case DocSymbol::Grkzeta: printf("ζ"); break;
106 case DocSymbol::Grketa: printf("η"); break;
107 case DocSymbol::Grktheta: printf("θ"); break;
108 case DocSymbol::Grkiota: printf("ι"); break;
109 case DocSymbol::Grkkappa: printf("κ"); break;
110 case DocSymbol::Grklambda: printf("λ"); break;
111 case DocSymbol::Grkmu: printf("μ"); break;
112 case DocSymbol::Grknu: printf("ν"); break;
113 case DocSymbol::Grkxi: printf("ξ"); break;
114 case DocSymbol::Grkpi: printf("π"); break;
115 case DocSymbol::Grkrho: printf("ρ"); break;
116 case DocSymbol::Grksigma: printf("σ"); break;
117 case DocSymbol::Grktau: printf("τ"); break;
118 case DocSymbol::Grkupsilon: printf("υ"); break;
119 case DocSymbol::Grkphi: printf("φ"); break;
120 case DocSymbol::Grkchi: printf("χ"); break;
121 case DocSymbol::Grkpsi: printf("ψ"); break;
122 case DocSymbol::Grkomega: printf("ω"); break;
123 case DocSymbol::Grkvarsigma: printf("ς"); break;
124 case DocSymbol::Section: printf("§"); break;
125 case DocSymbol::Degree: printf("°"); break;
126 case DocSymbol::Prime: printf("′"); break;
127 case DocSymbol::DoublePrime: printf("″"); break;
128 case DocSymbol::Infinity: printf("∞"); break;
129 case DocSymbol::EmptySet: printf("∅"); break;
130 case DocSymbol::PlusMinus: printf("±"); break;
131 case DocSymbol::Times: printf("×"); break;
132 case DocSymbol::Minus: printf("−"); break;
133 case DocSymbol::CenterDot: printf("⋅"); break;
134 case DocSymbol::Partial: printf("∂"); break;
135 case DocSymbol::Nabla: printf("∇"); break;
136 case DocSymbol::SquareRoot: printf("√"); break;
137 case DocSymbol::Perpendicular: printf("⊥"); break;
138 case DocSymbol::Sum: printf("∑"); break;
139 case DocSymbol::Integral: printf("∫"); break;
140 case DocSymbol::Product: printf("∏"); break;
141 case DocSymbol::Similar: printf("∼"); break;
142 case DocSymbol::Approx: printf("≈"); break;
143 case DocSymbol::NotEqual: printf("≠"); break;
144 case DocSymbol::Equivalent: printf("≡"); break;
145 case DocSymbol::Proportional: printf("∝"); break;
146 case DocSymbol::LessEqual: printf("≤"); break;
147 case DocSymbol::GreaterEqual: printf("≥"); break;
148 case DocSymbol::LeftArrow: printf("←"); break;
149 case DocSymbol::RightArrow: printf("→"); break;
150 case DocSymbol::SetIn: printf("∈"); break;
151 case DocSymbol::SetNotIn: printf("∉"); break;
152 case DocSymbol::LeftCeil: printf("⌈"); break;
153 case DocSymbol::RightCeil: printf("⌉"); break;
154 case DocSymbol::LeftFloor: printf("⌊"); break;
155 case DocSymbol::RightFloor: printf("⌋"); break;
157 printf("Error: unknown symbol found\n");
160 void visit(DocURL *u)
163 printf("%s",u->url().data());
165 void visit(DocLineBreak *)
170 void visit(DocHorRuler *)
175 void visit(DocStyleChange *s)
180 case DocStyleChange::Bold:
181 if (s->enable()) printf("<bold>"); else printf("</bold>");
183 case DocStyleChange::Italic:
184 if (s->enable()) printf("<italic>"); else printf("</italic>");
186 case DocStyleChange::Code:
187 if (s->enable()) printf("<code>"); else printf("</code>");
189 case DocStyleChange::Subscript:
190 if (s->enable()) printf("<sub>"); else printf("</sub>");
192 case DocStyleChange::Superscript:
193 if (s->enable()) printf("<sup>"); else printf("</sup>");
195 case DocStyleChange::Center:
196 if (s->enable()) printf("<center>"); else printf("</center>");
198 case DocStyleChange::Small:
199 if (s->enable()) printf("<small>"); else printf("</small>");
201 case DocStyleChange::Preformatted:
202 if (s->enable()) printf("<pre>"); else printf("</pre>");
204 case DocStyleChange::Div:
205 if (s->enable()) printf("<div>"); else printf("</div>");
207 case DocStyleChange::Span:
208 if (s->enable()) printf("<span>"); else printf("</span>");
212 void visit(DocVerbatim *s)
217 case DocVerbatim::Code: printf("<code>"); break;
218 case DocVerbatim::Verbatim: printf("<verbatim>"); break;
219 case DocVerbatim::HtmlOnly: printf("<htmlonly>"); break;
220 case DocVerbatim::RtfOnly: printf("<rtfonly>"); break;
221 case DocVerbatim::ManOnly: printf("<manonly>"); break;
222 case DocVerbatim::LatexOnly: printf("<latexonly>"); break;
223 case DocVerbatim::XmlOnly: printf("<xmlonly>"); break;
224 case DocVerbatim::Dot: printf("<dot>"); break;
225 case DocVerbatim::Msc: printf("<msc>"); break;
227 printf("%s",s->text().data());
230 case DocVerbatim::Code: printf("</code>"); break;
231 case DocVerbatim::Verbatim: printf("</verbatim>"); break;
232 case DocVerbatim::HtmlOnly: printf("</htmlonly>"); break;
233 case DocVerbatim::RtfOnly: printf("</rtfonly>"); break;
234 case DocVerbatim::ManOnly: printf("</manonly>"); break;
235 case DocVerbatim::LatexOnly: printf("</latexonly>"); break;
236 case DocVerbatim::XmlOnly: printf("</xmlonly>"); break;
237 case DocVerbatim::Dot: printf("</dot>"); break;
238 case DocVerbatim::Msc: printf("</msc>"); break;
241 void visit(DocAnchor *a)
244 printf("<anchor name=\"%s\"/>",a->anchor().data());
246 void visit(DocInclude *inc)
249 printf("<include file=\"%s\" type=\"",inc->file().data());
252 case DocInclude::Include: printf("include"); break;
253 case DocInclude::IncWithLines: printf("incwithlines"); break;
254 case DocInclude::DontInclude: printf("dontinclude"); break;
255 case DocInclude::HtmlInclude: printf("htmlinclude"); break;
256 case DocInclude::VerbInclude: printf("verbinclude"); break;
257 case DocInclude::Snippet: printf("snippet"); break;
261 void visit(DocIncOperator *op)
264 printf("<incoperator pattern=\"%s\" type=\"",op->pattern().data());
267 case DocIncOperator::Line: printf("line"); break;
268 case DocIncOperator::Skip: printf("skip"); break;
269 case DocIncOperator::SkipLine: printf("skipline"); break;
270 case DocIncOperator::Until: printf("until"); break;
274 void visit(DocFormula *f)
277 printf("<formula name=%s test=%s/>",f->name().data(),f->text().data());
279 void visit(DocIndexEntry *i)
282 printf("<indexentry>%s</indexentry\n",i->entry().data());
284 void visit(DocSimpleSectSep *)
287 printf("<simplesectsep/>");
289 void visit(DocCite *cite)
292 printf("<cite ref=\"%s\" file=\"%s\" "
293 "anchor=\"%s\" text=\"%s\""
295 cite->ref().data(),cite->file().data(),cite->anchor().data(),
296 cite->text().data());
299 //--------------------------------------
301 void visitPre(DocAutoList *l)
313 void visitPost(DocAutoList *l)
325 void visitPre(DocAutoListItem *)
330 void visitPost(DocAutoListItem *)
335 void visitPre(DocPara *)
340 void visitPost(DocPara *)
345 void visitPre(DocRoot *)
350 void visitPost(DocRoot *)
355 void visitPre(DocSimpleSect *s)
358 printf("<simplesect type=");
361 case DocSimpleSect::See: printf("see"); break;
362 case DocSimpleSect::Return: printf("return"); break;
363 case DocSimpleSect::Author: printf("author"); break;
364 case DocSimpleSect::Authors: printf("authors"); break;
365 case DocSimpleSect::Version: printf("version"); break;
366 case DocSimpleSect::Since: printf("since"); break;
367 case DocSimpleSect::Date: printf("date"); break;
368 case DocSimpleSect::Note: printf("note"); break;
369 case DocSimpleSect::Warning: printf("warning"); break;
370 case DocSimpleSect::Pre: printf("pre"); break;
371 case DocSimpleSect::Post: printf("post"); break;
372 case DocSimpleSect::Copyright: printf("copyright"); break;
373 case DocSimpleSect::Invar: printf("invar"); break;
374 case DocSimpleSect::Remark: printf("remark"); break;
375 case DocSimpleSect::Attention: printf("attention"); break;
376 case DocSimpleSect::User: printf("user"); break;
377 case DocSimpleSect::Rcs: printf("rcs"); break;
378 case DocSimpleSect::Unknown: printf("unknown"); break;
382 void visitPost(DocSimpleSect *)
385 printf("</simplesect>\n");
387 void visitPre(DocTitle *)
392 void visitPost(DocTitle *)
395 printf("</title>\n");
397 void visitPre(DocSimpleList *)
402 void visitPost(DocSimpleList *)
407 void visitPre(DocSimpleListItem *)
412 void visitPost(DocSimpleListItem *)
417 void visitPre(DocSection *s)
420 printf("<sect%d>\n",s->level());
422 void visitPost(DocSection *s)
425 printf("</sect%d>\n",s->level());
427 void visitPre(DocHtmlList *s)
430 if (s->type()==DocHtmlList::Ordered) printf("<ol>\n"); else printf("<ul>\n");
432 void visitPost(DocHtmlList *s)
435 if (s->type()==DocHtmlList::Ordered) printf("</ol>\n"); else printf("</ul>\n");
437 void visitPre(DocHtmlListItem *)
442 void visitPost(DocHtmlListItem *)
447 //void visitPre(DocHtmlPre *)
450 // printf("<pre>\n");
453 //void visitPost(DocHtmlPre *)
455 // m_insidePre=FALSE;
457 // printf("</pre>\n");
459 void visitPre(DocHtmlDescList *)
464 void visitPost(DocHtmlDescList *)
469 void visitPre(DocHtmlDescTitle *)
474 void visitPost(DocHtmlDescTitle *)
479 void visitPre(DocHtmlDescData *)
484 void visitPost(DocHtmlDescData *)
489 void visitPre(DocHtmlTable *t)
492 printf("<table rows=\"%d\" cols=\"%d\">\n",
493 t->numRows(),t->numColumns());
495 void visitPost(DocHtmlTable *)
498 printf("</table>\n");
500 void visitPre(DocHtmlRow *)
505 void visitPost(DocHtmlRow *)
510 void visitPre(DocHtmlCell *c)
513 printf("<t%c>\n",c->isHeading()?'h':'d');
515 void visitPost(DocHtmlCell *c)
518 printf("</t%c>\n",c->isHeading()?'h':'d');
520 void visitPre(DocHtmlCaption *)
523 printf("<caption>\n");
525 void visitPost(DocHtmlCaption *)
528 printf("</caption>\n");
530 void visitPre(DocInternal *)
533 printf("<internal>\n");
535 void visitPost(DocInternal *)
538 printf("</internal>\n");
540 void visitPre(DocHRef *href)
543 printf("<a url=\"%s\">\n",href->url().data());
545 void visitPost(DocHRef *)
550 void visitPre(DocHtmlHeader *header)
553 printf("<h%d>\n",header->level());
555 void visitPost(DocHtmlHeader *header)
558 printf("</h%d>\n",header->level());
560 void visitPre(DocImage *img)
563 printf("<image src=\"%s\" type=\"",img->name().data());
566 case DocImage::Html: printf("html"); break;
567 case DocImage::Latex: printf("latex"); break;
568 case DocImage::Rtf: printf("rtf"); break;
570 printf("\" width=%s height=%s>\n",img->width().data(),img->height().data());
572 void visitPost(DocImage *)
575 printf("</image>\n");
577 void visitPre(DocDotFile *df)
580 printf("<dotfile src=\"%s\">\n",df->name().data());
582 void visitPost(DocDotFile *)
585 printf("</dotfile>\n");
587 void visitPre(DocMscFile *df)
590 printf("<mscfile src=\"%s\">\n",df->name().data());
592 void visitPost(DocMscFile *)
595 printf("</mscfile>\n");
597 void visitPre(DocLink *lnk)
600 printf("<link ref=\"%s\" file=\"%s\" anchor=\"%s\">\n",
601 lnk->ref().data(),lnk->file().data(),lnk->anchor().data());
603 void visitPost(DocLink *)
608 void visitPre(DocRef *ref)
611 printf("<ref ref=\"%s\" file=\"%s\" "
612 "anchor=\"%s\" targetTitle=\"%s\""
613 " hasLinkText=\"%s\" refToAnchor=\"%s\" refToSection=\"%s\">\n",
614 ref->ref().data(),ref->file().data(),ref->anchor().data(),
615 ref->targetTitle().data(),ref->hasLinkText()?"yes":"no",
616 ref->refToAnchor()?"yes":"no", ref->refToSection()?"yes":"no");
618 void visitPost(DocRef *)
623 void visitPre(DocSecRefItem *ref)
626 printf("<secrefitem target=\"%s\">\n",ref->target().data());
628 void visitPost(DocSecRefItem *)
631 printf("</secrefitem>\n");
633 void visitPre(DocSecRefList *)
636 printf("<secreflist>\n");
638 void visitPost(DocSecRefList *)
641 printf("</secreflist>\n");
643 //void visitPre(DocLanguage *l)
646 // printf("<language id=%s>\n",l->id().data());
648 //void visitPost(DocLanguage *)
651 // printf("</language>\n");
653 void visitPre(DocParamList *pl)
656 //QStrListIterator sli(pl->parameters());
657 QListIterator<DocNode> sli(pl->parameters());
660 printf("<parameters>");
661 for (sli.toFirst();(param=sli.current());++sli)
664 if (param->kind()==DocNode::Kind_Word)
666 visit((DocWord*)param);
668 else if (param->kind()==DocNode::Kind_LinkedWord)
670 visit((DocLinkedWord*)param);
676 void visitPost(DocParamList *)
679 printf("</parameters>\n");
681 void visitPre(DocParamSect *ps)
684 printf("<paramsect type=");
687 case DocParamSect::Param: printf("param"); break;
688 case DocParamSect::RetVal: printf("retval"); break;
689 case DocParamSect::Exception: printf("exception"); break;
690 case DocParamSect::TemplateParam: printf("templateparam"); break;
691 case DocParamSect::Unknown: printf("unknown"); break;
695 void visitPost(DocParamSect *)
698 printf("</paramsect>\n");
700 void visitPre(DocXRefItem *x)
703 printf("<xrefitem file=\"%s\" anchor=\"%s\" title=\"%s\"/>\n",
704 x->file().data(),x->anchor().data(),x->title().data());
706 void visitPost(DocXRefItem *)
709 printf("<xrefitem/>\n");
711 void visitPre(DocInternalRef *r)
714 printf("<internalref file=%s anchor=%s>\n",r->file().data(),r->anchor().data());
716 void visitPost(DocInternalRef *)
719 printf("</internalref>\n");
721 void visitPre(DocCopy *c)
724 printf("<copy link=\"%s\">\n",c->link().data());
726 void visitPost(DocCopy *)
731 void visitPre(DocText *)
736 void visitPost(DocText *)
741 void visitPre(DocHtmlBlockQuote *)
744 printf("<blockquote>\n");
746 void visitPost(DocHtmlBlockQuote *)
749 printf("</blockquote>\n");
756 if (m_needsEnter) printf("\n");
757 for (int i=0;i<m_indent;i++) printf(".");
762 if (!m_needsEnter) indent();