1 /******************************************************************************
6 * Copyright (C) 1997-2015 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
23 #include "docvisitor.h"
24 #include "htmlentity.h"
27 /*! Concrete visitor implementation for pretty printing */
28 class PrintDocVisitor : public DocVisitor
31 PrintDocVisitor() : DocVisitor(DocVisitor_Other), m_indent(0),
32 m_needsEnter(FALSE), m_insidePre(FALSE) {}
34 //--------------------------------------
36 void visit(DocWord *w)
39 printf("%s",w->word().data());
41 void visit(DocLinkedWord *w)
44 printf("%s",w->word().data());
46 void visit(DocWhiteSpace *w)
51 printf("%s",w->chars().data());
58 void visit(DocSymbol *s)
61 const char *res = HtmlEntityMapper::instance()->utf8(s->symbol(),TRUE);
68 printf("print: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
74 printf("%s",u->url().data());
76 void visit(DocLineBreak *)
81 void visit(DocHorRuler *)
86 void visit(DocStyleChange *s)
91 case DocStyleChange::Bold:
92 if (s->enable()) printf("<bold>"); else printf("</bold>");
94 case DocStyleChange::Italic:
95 if (s->enable()) printf("<italic>"); else printf("</italic>");
97 case DocStyleChange::Code:
98 if (s->enable()) printf("<code>"); else printf("</code>");
100 case DocStyleChange::Subscript:
101 if (s->enable()) printf("<sub>"); else printf("</sub>");
103 case DocStyleChange::Superscript:
104 if (s->enable()) printf("<sup>"); else printf("</sup>");
106 case DocStyleChange::Center:
107 if (s->enable()) printf("<center>"); else printf("</center>");
109 case DocStyleChange::Small:
110 if (s->enable()) printf("<small>"); else printf("</small>");
112 case DocStyleChange::Preformatted:
113 if (s->enable()) printf("<pre>"); else printf("</pre>");
115 case DocStyleChange::Div:
116 if (s->enable()) printf("<div>"); else printf("</div>");
118 case DocStyleChange::Span:
119 if (s->enable()) printf("<span>"); else printf("</span>");
123 void visit(DocVerbatim *s)
128 case DocVerbatim::Code: printf("<code>"); break;
129 case DocVerbatim::Verbatim: printf("<verbatim>"); break;
130 case DocVerbatim::HtmlOnly: printf("<htmlonly>"); break;
131 case DocVerbatim::RtfOnly: printf("<rtfonly>"); break;
132 case DocVerbatim::ManOnly: printf("<manonly>"); break;
133 case DocVerbatim::LatexOnly: printf("<latexonly>"); break;
134 case DocVerbatim::XmlOnly: printf("<xmlonly>"); break;
135 case DocVerbatim::DocbookOnly: printf("<docbookonly>"); break;
136 case DocVerbatim::Dot: printf("<dot>"); break;
137 case DocVerbatim::Msc: printf("<msc>"); break;
138 case DocVerbatim::PlantUML: printf("<plantuml>"); break;
140 printf("%s",s->text().data());
143 case DocVerbatim::Code: printf("</code>"); break;
144 case DocVerbatim::Verbatim: printf("</verbatim>"); break;
145 case DocVerbatim::HtmlOnly: printf("</htmlonly>"); break;
146 case DocVerbatim::RtfOnly: printf("</rtfonly>"); break;
147 case DocVerbatim::ManOnly: printf("</manonly>"); break;
148 case DocVerbatim::LatexOnly: printf("</latexonly>"); break;
149 case DocVerbatim::XmlOnly: printf("</xmlonly>"); break;
150 case DocVerbatim::DocbookOnly: printf("</docbookonly>"); break;
151 case DocVerbatim::Dot: printf("</dot>"); break;
152 case DocVerbatim::Msc: printf("</msc>"); break;
153 case DocVerbatim::PlantUML: printf("</plantuml>"); break;
156 void visit(DocAnchor *a)
159 printf("<anchor name=\"%s\"/>",a->anchor().data());
161 void visit(DocInclude *inc)
164 printf("<include file=\"%s\" type=\"",inc->file().data());
167 case DocInclude::Include: printf("include"); break;
168 case DocInclude::IncWithLines: printf("incwithlines"); break;
169 case DocInclude::DontInclude: printf("dontinclude"); break;
170 case DocInclude::HtmlInclude: printf("htmlinclude"); break;
171 case DocInclude::LatexInclude: printf("latexinclude"); break;
172 case DocInclude::VerbInclude: printf("verbinclude"); break;
173 case DocInclude::Snippet: printf("snippet"); break;
174 case DocInclude::SnipWithLines: printf("snipwithlines"); break;
175 case DocInclude::SnippetDoc:
176 case DocInclude::IncludeDoc:
177 err("Internal inconsistency: found switch SnippetDoc / IncludeDoc in file: %s"
178 "Please create a bug report\n",__FILE__);
183 void visit(DocIncOperator *op)
186 printf("<incoperator pattern=\"%s\" type=\"",op->pattern().data());
189 case DocIncOperator::Line: printf("line"); break;
190 case DocIncOperator::Skip: printf("skip"); break;
191 case DocIncOperator::SkipLine: printf("skipline"); break;
192 case DocIncOperator::Until: printf("until"); break;
196 void visit(DocFormula *f)
199 printf("<formula name=%s text=%s/>",f->name().data(),f->text().data());
201 void visit(DocIndexEntry *i)
204 printf("<indexentry>%s</indexentry\n",i->entry().data());
206 void visit(DocSimpleSectSep *)
209 printf("<simplesectsep/>");
211 void visit(DocCite *cite)
214 printf("<cite ref=\"%s\" file=\"%s\" "
215 "anchor=\"%s\" text=\"%s\""
217 cite->ref().data(),cite->file().data(),cite->anchor().data(),
218 cite->text().data());
221 //--------------------------------------
223 void visitPre(DocAutoList *l)
235 void visitPost(DocAutoList *l)
247 void visitPre(DocAutoListItem *)
252 void visitPost(DocAutoListItem *)
257 void visitPre(DocPara *)
262 void visitPost(DocPara *)
267 void visitPre(DocRoot *)
272 void visitPost(DocRoot *)
277 void visitPre(DocSimpleSect *s)
280 printf("<simplesect type=");
283 case DocSimpleSect::See: printf("see"); break;
284 case DocSimpleSect::Return: printf("return"); break;
285 case DocSimpleSect::Author: printf("author"); break;
286 case DocSimpleSect::Authors: printf("authors"); break;
287 case DocSimpleSect::Version: printf("version"); break;
288 case DocSimpleSect::Since: printf("since"); break;
289 case DocSimpleSect::Date: printf("date"); break;
290 case DocSimpleSect::Note: printf("note"); break;
291 case DocSimpleSect::Warning: printf("warning"); break;
292 case DocSimpleSect::Pre: printf("pre"); break;
293 case DocSimpleSect::Post: printf("post"); break;
294 case DocSimpleSect::Copyright: printf("copyright"); break;
295 case DocSimpleSect::Invar: printf("invar"); break;
296 case DocSimpleSect::Remark: printf("remark"); break;
297 case DocSimpleSect::Attention: printf("attention"); break;
298 case DocSimpleSect::User: printf("user"); break;
299 case DocSimpleSect::Rcs: printf("rcs"); break;
300 case DocSimpleSect::Unknown: printf("unknown"); break;
304 void visitPost(DocSimpleSect *)
307 printf("</simplesect>\n");
309 void visitPre(DocTitle *)
314 void visitPost(DocTitle *)
317 printf("</title>\n");
319 void visitPre(DocSimpleList *)
324 void visitPost(DocSimpleList *)
329 void visitPre(DocSimpleListItem *)
334 void visitPost(DocSimpleListItem *)
339 void visitPre(DocSection *s)
342 printf("<sect%d>\n",s->level());
344 void visitPost(DocSection *s)
347 printf("</sect%d>\n",s->level());
349 void visitPre(DocHtmlList *s)
352 if (s->type()==DocHtmlList::Ordered) printf("<ol>\n"); else printf("<ul>\n");
354 void visitPost(DocHtmlList *s)
357 if (s->type()==DocHtmlList::Ordered) printf("</ol>\n"); else printf("</ul>\n");
359 void visitPre(DocHtmlListItem *)
364 void visitPost(DocHtmlListItem *)
369 //void visitPre(DocHtmlPre *)
372 // printf("<pre>\n");
375 //void visitPost(DocHtmlPre *)
377 // m_insidePre=FALSE;
379 // printf("</pre>\n");
381 void visitPre(DocHtmlDescList *)
386 void visitPost(DocHtmlDescList *)
391 void visitPre(DocHtmlDescTitle *)
396 void visitPost(DocHtmlDescTitle *)
401 void visitPre(DocHtmlDescData *)
406 void visitPost(DocHtmlDescData *)
411 void visitPre(DocHtmlTable *t)
414 printf("<table rows=\"%d\" cols=\"%d\">\n",
415 t->numRows(),t->numColumns());
417 void visitPost(DocHtmlTable *)
420 printf("</table>\n");
422 void visitPre(DocHtmlRow *)
427 void visitPost(DocHtmlRow *)
432 void visitPre(DocHtmlCell *c)
435 printf("<t%c>\n",c->isHeading()?'h':'d');
437 void visitPost(DocHtmlCell *c)
440 printf("</t%c>\n",c->isHeading()?'h':'d');
442 void visitPre(DocHtmlCaption *)
445 printf("<caption>\n");
447 void visitPost(DocHtmlCaption *)
450 printf("</caption>\n");
452 void visitPre(DocInternal *)
455 printf("<internal>\n");
457 void visitPost(DocInternal *)
460 printf("</internal>\n");
462 void visitPre(DocHRef *href)
465 printf("<a url=\"%s\">\n",href->url().data());
467 void visitPost(DocHRef *)
472 void visitPre(DocHtmlHeader *header)
475 printf("<h%d>\n",header->level());
477 void visitPost(DocHtmlHeader *header)
480 printf("</h%d>\n",header->level());
482 void visitPre(DocImage *img)
485 printf("<image src=\"%s\" type=\"",img->name().data());
488 case DocImage::Html: printf("html"); break;
489 case DocImage::Latex: printf("latex"); break;
490 case DocImage::Rtf: printf("rtf"); break;
491 case DocImage::DocBook: printf("docbook"); break;
493 printf("\" %s %s>\n",img->width().data(),img->height().data());
495 void visitPost(DocImage *)
498 printf("</image>\n");
500 void visitPre(DocDotFile *df)
503 printf("<dotfile src=\"%s\">\n",df->name().data());
505 void visitPost(DocDotFile *)
508 printf("</dotfile>\n");
510 void visitPre(DocMscFile *df)
513 printf("<mscfile src=\"%s\">\n",df->name().data());
515 void visitPost(DocMscFile *)
518 printf("</mscfile>\n");
520 void visitPre(DocDiaFile *df)
523 printf("<diafile src=\"%s\">\n",df->name().data());
525 void visitPost(DocDiaFile *)
528 printf("</diafile>\n");
530 void visitPre(DocLink *lnk)
533 printf("<link ref=\"%s\" file=\"%s\" anchor=\"%s\">\n",
534 lnk->ref().data(),lnk->file().data(),lnk->anchor().data());
536 void visitPost(DocLink *)
541 void visitPre(DocRef *ref)
544 printf("<ref ref=\"%s\" file=\"%s\" "
545 "anchor=\"%s\" targetTitle=\"%s\""
546 " hasLinkText=\"%s\" refToAnchor=\"%s\" refToSection=\"%s\" refToTable=\"%s\">\n",
547 ref->ref().data(),ref->file().data(),ref->anchor().data(),
548 ref->targetTitle().data(),ref->hasLinkText()?"yes":"no",
549 ref->refToAnchor()?"yes":"no", ref->refToSection()?"yes":"no",
550 ref->refToTable()?"yes":"no");
552 void visitPost(DocRef *)
557 void visitPre(DocSecRefItem *ref)
560 printf("<secrefitem target=\"%s\">\n",ref->target().data());
562 void visitPost(DocSecRefItem *)
565 printf("</secrefitem>\n");
567 void visitPre(DocSecRefList *)
570 printf("<secreflist>\n");
572 void visitPost(DocSecRefList *)
575 printf("</secreflist>\n");
577 //void visitPre(DocLanguage *l)
580 // printf("<language id=%s>\n",l->id().data());
582 //void visitPost(DocLanguage *)
585 // printf("</language>\n");
587 void visitPre(DocParamList *pl)
590 //QStrListIterator sli(pl->parameters());
591 QListIterator<DocNode> sli(pl->parameters());
594 printf("<parameters>");
595 for (sli.toFirst();(param=sli.current());++sli)
598 if (param->kind()==DocNode::Kind_Word)
600 visit((DocWord*)param);
602 else if (param->kind()==DocNode::Kind_LinkedWord)
604 visit((DocLinkedWord*)param);
610 void visitPost(DocParamList *)
613 printf("</parameters>\n");
615 void visitPre(DocParamSect *ps)
618 printf("<paramsect type=");
621 case DocParamSect::Param: printf("param"); break;
622 case DocParamSect::RetVal: printf("retval"); break;
623 case DocParamSect::Exception: printf("exception"); break;
624 case DocParamSect::TemplateParam: printf("templateparam"); break;
625 case DocParamSect::Unknown: printf("unknown"); break;
629 void visitPost(DocParamSect *)
632 printf("</paramsect>\n");
634 void visitPre(DocXRefItem *x)
637 printf("<xrefitem file=\"%s\" anchor=\"%s\" title=\"%s\"/>\n",
638 x->file().data(),x->anchor().data(),x->title().data());
640 void visitPost(DocXRefItem *)
643 printf("<xrefitem/>\n");
645 void visitPre(DocInternalRef *r)
648 printf("<internalref file=%s anchor=%s>\n",r->file().data(),r->anchor().data());
650 void visitPost(DocInternalRef *)
653 printf("</internalref>\n");
655 void visitPre(DocCopy *c)
658 printf("<copy link=\"%s\">\n",c->link().data());
660 void visitPost(DocCopy *)
665 void visitPre(DocText *)
670 void visitPost(DocText *)
675 void visitPre(DocHtmlBlockQuote *)
678 printf("<blockquote>\n");
680 void visitPost(DocHtmlBlockQuote *)
683 printf("</blockquote>\n");
685 void visitPre(DocVhdlFlow *)
688 printf("<vhdlflow>\n");
690 void visitPost(DocVhdlFlow *)
693 printf("</vhdlflow>\n");
695 void visitPre(DocParBlock *)
698 printf("<parblock>\n");
700 void visitPost(DocParBlock *)
703 printf("</parblock>\n");
710 if (m_needsEnter) printf("\n");
711 for (int i=0;i<m_indent;i++) printf(".");
716 if (!m_needsEnter) indent();