/****************************************************************************** * * * * * Copyright (C) 1997-2008 by Dimitri van Heesch. * * Permission to use, copy, modify, and distribute this software and its * documentation under the terms of the GNU General Public License is hereby * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * * Documents produced by Doxygen are derivative works derived from the * input used in their production; they are not affected by this license. * */ #ifndef _PRINTDOCVISITOR_H #define _PRINTDOCVISITOR_H #include "docvisitor.h" /*! Concrete visitor implementation for pretty printing */ class PrintDocVisitor : public DocVisitor { public: PrintDocVisitor() : DocVisitor(DocVisitor_Other), m_indent(0), m_needsEnter(FALSE), m_insidePre(FALSE) {} //-------------------------------------- void visit(DocWord *w) { indent_leaf(); printf("%s",w->word().data()); } void visit(DocLinkedWord *w) { indent_leaf(); printf("%s",w->word().data()); } void visit(DocWhiteSpace *w) { indent_leaf(); if (m_insidePre) { printf("%s",w->chars().data()); } else { printf(" "); } } void visit(DocSymbol *s) { indent_leaf(); switch(s->symbol()) { case DocSymbol::BSlash: printf("\\"); break; case DocSymbol::At: printf("@"); break; case DocSymbol::Less: printf("<"); break; case DocSymbol::Greater: printf(">"); break; case DocSymbol::Amp: printf("&"); break; case DocSymbol::Dollar: printf("$"); break; case DocSymbol::Hash: printf("#"); break; case DocSymbol::Percent: printf("%%"); break; case DocSymbol::Copy: printf("©"); break; case DocSymbol::Apos: printf("'"); break; case DocSymbol::Quot: printf("\""); break; case DocSymbol::Lsquo: printf("‘"); break; case DocSymbol::Rsquo: printf("’"); break; case DocSymbol::Ldquo: printf("“"); break; case DocSymbol::Rdquo: printf("”"); break; case DocSymbol::Ndash: printf("–"); break; case DocSymbol::Mdash: printf("—"); break; case DocSymbol::Uml: printf("&%cuml;",s->letter()); break; case DocSymbol::Acute: printf("&%cacute;",s->letter()); break; case DocSymbol::Grave: printf("&%cgrave;",s->letter()); break; case DocSymbol::Circ: printf("&%ccirc;",s->letter()); break; case DocSymbol::Tilde: printf("&%ctilde;",s->letter()); break; case DocSymbol::Szlig: printf("ß"); break; case DocSymbol::Cedil: printf("&%ccedul;",s->letter()); break; case DocSymbol::Ring: printf("&%cring;",s->letter()); break; case DocSymbol::Nbsp: printf(" "); break; default: printf("Error: unknown symbol found\n"); } } void visit(DocURL *u) { indent_leaf(); printf("%s",u->url().data()); } void visit(DocLineBreak *) { indent_leaf(); printf("<br/>"); } void visit(DocHorRuler *) { indent_leaf(); printf("<hr>"); } void visit(DocStyleChange *s) { indent_leaf(); switch (s->style()) { case DocStyleChange::Bold: if (s->enable()) printf("<bold>"); else printf("</bold>"); break; case DocStyleChange::Italic: if (s->enable()) printf("<italic>"); else printf("</italic>"); break; case DocStyleChange::Code: if (s->enable()) printf("<code>"); else printf("</code>"); break; case DocStyleChange::Subscript: if (s->enable()) printf("<sub>"); else printf("</sub>"); break; case DocStyleChange::Superscript: if (s->enable()) printf("<sup>"); else printf("</sup>"); break; case DocStyleChange::Center: if (s->enable()) printf("<center>"); else printf("</center>"); break; case DocStyleChange::Small: if (s->enable()) printf("<small>"); else printf("</small>"); break; case DocStyleChange::Preformatted: if (s->enable()) printf("<pre>"); else printf("</pre>"); break; case DocStyleChange::Div: if (s->enable()) printf("<div>"); else printf("</div>"); break; case DocStyleChange::Span: if (s->enable()) printf("<span>"); else printf("</span>"); break; } } void visit(DocVerbatim *s) { indent_leaf(); switch(s->type()) { case DocVerbatim::Code: printf("<code>"); break; case DocVerbatim::Verbatim: printf("<verbatim>"); break; case DocVerbatim::HtmlOnly: printf("<htmlonly>"); break; case DocVerbatim::ManOnly: printf("<manonly>"); break; case DocVerbatim::LatexOnly: printf("<latexonly>"); break; case DocVerbatim::XmlOnly: printf("<xmlonly>"); break; case DocVerbatim::Dot: printf("<dot>"); break; case DocVerbatim::Msc: printf("<msc>"); break; } printf("%s",s->text().data()); switch(s->type()) { case DocVerbatim::Code: printf("</code>"); break; case DocVerbatim::Verbatim: printf("</verbatim>"); break; case DocVerbatim::HtmlOnly: printf("</htmlonly>"); break; case DocVerbatim::ManOnly: printf("</manonly>"); break; case DocVerbatim::LatexOnly: printf("</latexonly>"); break; case DocVerbatim::XmlOnly: printf("</xmlonly>"); break; case DocVerbatim::Dot: printf("</dot>"); break; case DocVerbatim::Msc: printf("</msc>"); break; } } void visit(DocAnchor *a) { indent_leaf(); printf("<anchor name=\"%s\"/>",a->anchor().data()); } void visit(DocInclude *inc) { indent_leaf(); printf("<include file=\"%s\" type=\"",inc->file().data()); switch(inc->type()) { case DocInclude::Include: printf("include"); break; case DocInclude::IncWithLines: printf("incwithlines"); break; case DocInclude::DontInclude: printf("dontinclude"); break; case DocInclude::HtmlInclude: printf("htmlinclude"); break; case DocInclude::VerbInclude: printf("verbinclude"); break; } printf("\"/>"); } void visit(DocIncOperator *op) { indent_leaf(); printf("<incoperator pattern=\"%s\" type=\"",op->pattern().data()); switch(op->type()) { case DocIncOperator::Line: printf("line"); break; case DocIncOperator::Skip: printf("skip"); break; case DocIncOperator::SkipLine: printf("skipline"); break; case DocIncOperator::Until: printf("until"); break; } printf("\"/>"); } void visit(DocFormula *f) { indent_leaf(); printf("<formula name=%s test=%s/>",f->name().data(),f->text().data()); } void visit(DocIndexEntry *i) { indent_leaf(); printf("<indexentry>%s</indexentry\n",i->entry().data()); } //-------------------------------------- void visitPre(DocAutoList *l) { indent_pre(); if (l->isEnumList()) { printf("<ol>\n"); } else { printf("<ul>\n"); } } void visitPost(DocAutoList *l) { indent_post(); if (l->isEnumList()) { printf("</ol>\n"); } else { printf("</ul>\n"); } } void visitPre(DocAutoListItem *) { indent_pre(); printf("<li>\n"); } void visitPost(DocAutoListItem *) { indent_post(); printf("</li>\n"); } void visitPre(DocPara *) { indent_pre(); printf("<para>\n"); } void visitPost(DocPara *) { indent_post(); printf("</para>\n"); } void visitPre(DocRoot *) { indent_pre(); printf("<root>\n"); } void visitPost(DocRoot *) { indent_post(); printf("</root>\n"); } void visitPre(DocSimpleSect *s) { indent_pre(); printf("<simplesect type="); switch(s->type()) { case DocSimpleSect::See: printf("see"); break; case DocSimpleSect::Return: printf("return"); break; case DocSimpleSect::Author: printf("author"); break; case DocSimpleSect::Authors: printf("authors"); break; case DocSimpleSect::Version: printf("version"); break; case DocSimpleSect::Since: printf("since"); break; case DocSimpleSect::Date: printf("date"); break; case DocSimpleSect::Note: printf("note"); break; case DocSimpleSect::Warning: printf("warning"); break; case DocSimpleSect::Pre: printf("pre"); break; case DocSimpleSect::Post: printf("post"); break; case DocSimpleSect::Invar: printf("invar"); break; case DocSimpleSect::Remark: printf("remark"); break; case DocSimpleSect::Attention: printf("attention"); break; case DocSimpleSect::User: printf("user"); break; case DocSimpleSect::Rcs: printf("rcs"); break; case DocSimpleSect::Unknown: printf("unknown"); break; } printf(">\n"); } void visitPost(DocSimpleSect *) { indent_post(); printf("</simplesect>\n"); } void visitPre(DocTitle *) { indent_pre(); printf("<title>\n"); } void visitPost(DocTitle *) { indent_post(); printf("</title>\n"); } void visitPre(DocSimpleList *) { indent_pre(); printf("<ul>\n"); } void visitPost(DocSimpleList *) { indent_post(); printf("</ul>\n"); } void visitPre(DocSimpleListItem *) { indent_pre(); printf("<li>\n"); } void visitPost(DocSimpleListItem *) { indent_post(); printf("</li>\n"); } void visitPre(DocSection *s) { indent_pre(); printf("<sect%d>\n",s->level()); } void visitPost(DocSection *s) { indent_post(); printf("</sect%d>\n",s->level()); } void visitPre(DocHtmlList *s) { indent_pre(); if (s->type()==DocHtmlList::Ordered) printf("<ol>\n"); else printf("<ul>\n"); } void visitPost(DocHtmlList *s) { indent_post(); if (s->type()==DocHtmlList::Ordered) printf("</ol>\n"); else printf("</ul>\n"); } void visitPre(DocHtmlListItem *) { indent_pre(); printf("<li>\n"); } void visitPost(DocHtmlListItem *) { indent_post(); printf("</li>\n"); } //void visitPre(DocHtmlPre *) //{ // indent_pre(); // printf("<pre>\n"); // m_insidePre=TRUE; //} //void visitPost(DocHtmlPre *) //{ // m_insidePre=FALSE; // indent_post(); // printf("</pre>\n"); //} void visitPre(DocHtmlDescList *) { indent_pre(); printf("<dl>\n"); } void visitPost(DocHtmlDescList *) { indent_post(); printf("</dl>\n"); } void visitPre(DocHtmlDescTitle *) { indent_pre(); printf("<dt>\n"); } void visitPost(DocHtmlDescTitle *) { indent_post(); printf("</dt>\n"); } void visitPre(DocHtmlDescData *) { indent_pre(); printf("<dd>\n"); } void visitPost(DocHtmlDescData *) { indent_post(); printf("</dd>\n"); } void visitPre(DocHtmlTable *t) { indent_pre(); printf("<table rows=\"%d\" cols=\"%d\">\n", t->numRows(),t->numCols()); } void visitPost(DocHtmlTable *) { indent_post(); printf("</table>\n"); } void visitPre(DocHtmlRow *) { indent_pre(); printf("<tr>\n"); } void visitPost(DocHtmlRow *) { indent_post(); printf("</tr>\n"); } void visitPre(DocHtmlCell *c) { indent_pre(); printf("<t%c>\n",c->isHeading()?'h':'d'); } void visitPost(DocHtmlCell *c) { indent_post(); printf("</t%c>\n",c->isHeading()?'h':'d'); } void visitPre(DocHtmlCaption *) { indent_pre(); printf("<caption>\n"); } void visitPost(DocHtmlCaption *) { indent_post(); printf("</caption>\n"); } void visitPre(DocInternal *) { indent_pre(); printf("<internal>\n"); } void visitPost(DocInternal *) { indent_post(); printf("</internal>\n"); } void visitPre(DocHRef *href) { indent_pre(); printf("<a url=\"%s\">\n",href->url().data()); } void visitPost(DocHRef *) { indent_post(); printf("</a>\n"); } void visitPre(DocHtmlHeader *header) { indent_pre(); printf("<h%d>\n",header->level()); } void visitPost(DocHtmlHeader *header) { indent_post(); printf("</h%d>\n",header->level()); } void visitPre(DocImage *img) { indent_pre(); printf("<image src=\"%s\" type=\"",img->name().data()); switch(img->type()) { case DocImage::Html: printf("html"); break; case DocImage::Latex: printf("latex"); break; case DocImage::Rtf: printf("rtf"); break; } printf("\" width=%s height=%s>\n",img->width().data(),img->height().data()); } void visitPost(DocImage *) { indent_post(); printf("</image>\n"); } void visitPre(DocDotFile *df) { indent_pre(); printf("<dotfile src=\"%s\">\n",df->name().data()); } void visitPost(DocDotFile *) { indent_post(); printf("</dotfile>\n"); } void visitPre(DocLink *lnk) { indent_pre(); printf("<link ref=\"%s\" file=\"%s\" anchor=\"%s\">\n", lnk->ref().data(),lnk->file().data(),lnk->anchor().data()); } void visitPost(DocLink *) { indent_post(); printf("</link>\n"); } void visitPre(DocRef *ref) { indent_pre(); printf("<ref ref=\"%s\" file=\"%s\" " "anchor=\"%s\" targetTitle=\"%s\"" " hasLinkText=\"%s\" refToAnchor=\"%s\" refToSection=\"%s\">\n", ref->ref().data(),ref->file().data(),ref->anchor().data(), ref->targetTitle().data(),ref->hasLinkText()?"yes":"no", ref->refToAnchor()?"yes":"no", ref->refToSection()?"yes":"no"); } void visitPost(DocRef *) { indent_post(); printf("</ref>\n"); } void visitPre(DocSecRefItem *ref) { indent_pre(); printf("<secrefitem target=\"%s\">\n",ref->target().data()); } void visitPost(DocSecRefItem *) { indent_post(); printf("</secrefitem>\n"); } void visitPre(DocSecRefList *) { indent_pre(); printf("<secreflist>\n"); } void visitPost(DocSecRefList *) { indent_post(); printf("</secreflist>\n"); } //void visitPre(DocLanguage *l) //{ // indent_pre(); // printf("<language id=%s>\n",l->id().data()); //} //void visitPost(DocLanguage *) //{ // indent_post(); // printf("</language>\n"); //} void visitPre(DocParamList *pl) { indent_pre(); //QStrListIterator sli(pl->parameters()); QListIterator<DocNode> sli(pl->parameters()); //const char *s; DocNode *param; printf("<parameters>"); for (sli.toFirst();(param=sli.current());++sli) { printf("<param>"); if (param->kind()==DocNode::Kind_Word) { visit((DocWord*)param); } else if (param->kind()==DocNode::Kind_LinkedWord) { visit((DocLinkedWord*)param); } printf("</param>"); } printf("\n"); } void visitPost(DocParamList *) { indent_post(); printf("</parameters>\n"); } void visitPre(DocParamSect *ps) { indent_pre(); printf("<paramsect type="); switch (ps->type()) { case DocParamSect::Param: printf("param"); break; case DocParamSect::RetVal: printf("retval"); break; case DocParamSect::Exception: printf("exception"); break; case DocParamSect::TemplateParam: printf("templateparam"); break; case DocParamSect::Unknown: printf("unknown"); break; } printf(">\n"); } void visitPost(DocParamSect *) { indent_post(); printf("</paramsect>\n"); } void visitPre(DocXRefItem *x) { indent_pre(); printf("<xrefitem file=\"%s\" anchor=\"%s\" title=\"%s\"/>\n", x->file().data(),x->anchor().data(),x->title().data()); } void visitPost(DocXRefItem *) { indent_post(); printf("<xrefitem/>\n"); } void visitPre(DocInternalRef *r) { indent_pre(); printf("<internalref file=%s anchor=%s>\n",r->file().data(),r->anchor().data()); } void visitPost(DocInternalRef *) { indent_post(); printf("</internalref>\n"); } void visitPre(DocCopy *c) { indent_pre(); printf("<copy link=\"%s\">\n",c->link().data()); } void visitPost(DocCopy *) { indent_post(); printf("</copy>\n"); } void visitPre(DocText *) { indent_pre(); printf("<text>\n"); } void visitPost(DocText *) { indent_post(); printf("</text>\n"); } private: // helper functions void indent() { if (m_needsEnter) printf("\n"); for (int i=0;i<m_indent;i++) printf("."); m_needsEnter=FALSE; } void indent_leaf() { if (!m_needsEnter) indent(); m_needsEnter=TRUE; } void indent_pre() { indent(); m_indent++; } void indent_post() { m_indent--; indent(); } // member variables int m_indent; bool m_needsEnter; bool m_insidePre; }; #endif