/****************************************************************************** * * * * * Copyright (C) 1997-2006 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("
"); } void visit(DocHorRuler *) { indent_leaf(); printf("
"); } void visit(DocStyleChange *s) { indent_leaf(); switch (s->style()) { case DocStyleChange::Bold: if (s->enable()) printf(""); else printf(""); break; case DocStyleChange::Italic: if (s->enable()) printf(""); else printf(""); break; case DocStyleChange::Code: if (s->enable()) printf(""); else printf(""); break; case DocStyleChange::Subscript: if (s->enable()) printf(""); else printf(""); break; case DocStyleChange::Superscript: if (s->enable()) printf(""); else printf(""); break; case DocStyleChange::Center: if (s->enable()) printf("
"); else printf("
"); break; case DocStyleChange::Small: if (s->enable()) printf(""); else printf(""); break; case DocStyleChange::Preformatted: if (s->enable()) printf("
"); else printf("
"); break; case DocStyleChange::Div: if (s->enable()) printf("
"); else printf("
"); break; case DocStyleChange::Span: if (s->enable()) printf(""); else printf(""); break; } } void visit(DocVerbatim *s) { indent_leaf(); switch(s->type()) { case DocVerbatim::Code: printf(""); break; case DocVerbatim::Verbatim: printf(""); break; case DocVerbatim::HtmlOnly: printf(""); break; case DocVerbatim::ManOnly: printf(""); break; case DocVerbatim::LatexOnly: printf(""); break; case DocVerbatim::XmlOnly: printf(""); break; case DocVerbatim::Dot: printf(""); break; } printf("%s",s->text().data()); switch(s->type()) { case DocVerbatim::Code: printf(""); break; case DocVerbatim::Verbatim: printf(""); break; case DocVerbatim::HtmlOnly: printf(""); break; case DocVerbatim::ManOnly: printf(""); break; case DocVerbatim::LatexOnly: printf(""); break; case DocVerbatim::XmlOnly: printf(""); break; case DocVerbatim::Dot: printf(""); break; } } void visit(DocAnchor *a) { indent_leaf(); printf("",a->anchor().data()); } void visit(DocInclude *inc) { indent_leaf(); printf("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("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("",f->name().data(),f->text().data()); } void visit(DocIndexEntry *i) { indent_leaf(); printf("%sentry().data()); } //-------------------------------------- void visitPre(DocAutoList *l) { indent_pre(); if (l->isEnumList()) { printf("
    \n"); } else { printf("
      \n"); } } void visitPost(DocAutoList *l) { indent_post(); if (l->isEnumList()) { printf("
\n"); } else { printf("\n"); } } void visitPre(DocAutoListItem *) { indent_pre(); printf("
  • \n"); } void visitPost(DocAutoListItem *) { indent_post(); printf("
  • \n"); } void visitPre(DocPara *) { indent_pre(); printf("\n"); } void visitPost(DocPara *) { indent_post(); printf("\n"); } void visitPre(DocRoot *) { indent_pre(); printf("\n"); } void visitPost(DocRoot *) { indent_post(); printf("\n"); } void visitPre(DocSimpleSect *s) { indent_pre(); printf("\n"); } void visitPost(DocSimpleSect *) { indent_post(); printf("\n"); } void visitPre(DocTitle *) { indent_pre(); printf("\n"); } void visitPost(DocTitle *) { indent_post(); printf("\n"); } void visitPre(DocSimpleList *) { indent_pre(); printf("
      \n"); } void visitPost(DocSimpleList *) { indent_post(); printf("
    \n"); } void visitPre(DocSimpleListItem *) { indent_pre(); printf("
  • \n"); } void visitPost(DocSimpleListItem *) { indent_post(); printf("
  • \n"); } void visitPre(DocSection *s) { indent_pre(); printf("\n",s->level()); } void visitPost(DocSection *s) { indent_post(); printf("\n",s->level()); } void visitPre(DocHtmlList *s) { indent_pre(); if (s->type()==DocHtmlList::Ordered) printf("
      \n"); else printf("
        \n"); } void visitPost(DocHtmlList *s) { indent_post(); if (s->type()==DocHtmlList::Ordered) printf("
    \n"); else printf("\n"); } void visitPre(DocHtmlListItem *) { indent_pre(); printf("
  • \n"); } void visitPost(DocHtmlListItem *) { indent_post(); printf("
  • \n"); } //void visitPre(DocHtmlPre *) //{ // indent_pre(); // printf("
    \n");
        //  m_insidePre=TRUE;
        //}
        //void visitPost(DocHtmlPre *) 
        //{
        //  m_insidePre=FALSE;
        //  indent_post();
        //  printf("
    \n"); //} void visitPre(DocHtmlDescList *) { indent_pre(); printf("
    \n"); } void visitPost(DocHtmlDescList *) { indent_post(); printf("
    \n"); } void visitPre(DocHtmlDescTitle *) { indent_pre(); printf("
    \n"); } void visitPost(DocHtmlDescTitle *) { indent_post(); printf("
    \n"); } void visitPre(DocHtmlDescData *) { indent_pre(); printf("
    \n"); } void visitPost(DocHtmlDescData *) { indent_post(); printf("
    \n"); } void visitPre(DocHtmlTable *t) { indent_pre(); printf("\n", t->numRows(),t->numCols()); } void visitPost(DocHtmlTable *) { indent_post(); printf("
    \n"); } void visitPre(DocHtmlRow *) { indent_pre(); printf("\n"); } void visitPost(DocHtmlRow *) { indent_post(); printf("\n"); } void visitPre(DocHtmlCell *c) { indent_pre(); printf("\n",c->isHeading()?'h':'d'); } void visitPost(DocHtmlCell *c) { indent_post(); printf("\n",c->isHeading()?'h':'d'); } void visitPre(DocHtmlCaption *) { indent_pre(); printf("\n"); } void visitPost(DocHtmlCaption *) { indent_post(); printf("\n"); } void visitPre(DocInternal *) { indent_pre(); printf("\n"); } void visitPost(DocInternal *) { indent_post(); printf("\n"); } void visitPre(DocHRef *href) { indent_pre(); printf("\n",href->url().data()); } void visitPost(DocHRef *) { indent_post(); printf("\n"); } void visitPre(DocHtmlHeader *header) { indent_pre(); printf("\n",header->level()); } void visitPost(DocHtmlHeader *header) { indent_post(); printf("\n",header->level()); } void visitPre(DocImage *img) { indent_pre(); printf("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("\n"); } void visitPre(DocDotFile *df) { indent_pre(); printf("\n",df->name().data()); } void visitPost(DocDotFile *) { indent_post(); printf("\n"); } void visitPre(DocLink *lnk) { indent_pre(); printf("\n", lnk->ref().data(),lnk->file().data(),lnk->anchor().data()); } void visitPost(DocLink *) { indent_post(); printf("\n"); } void visitPre(DocRef *ref) { indent_pre(); printf("\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("\n"); } void visitPre(DocSecRefItem *ref) { indent_pre(); printf("\n",ref->target().data()); } void visitPost(DocSecRefItem *) { indent_post(); printf("\n"); } void visitPre(DocSecRefList *) { indent_pre(); printf("\n"); } void visitPost(DocSecRefList *) { indent_post(); printf("\n"); } //void visitPre(DocLanguage *l) //{ // indent_pre(); // printf("\n",l->id().data()); //} //void visitPost(DocLanguage *) //{ // indent_post(); // printf("\n"); //} void visitPre(DocParamList *pl) { indent_pre(); //QStrListIterator sli(pl->parameters()); QListIterator sli(pl->parameters()); //const char *s; DocNode *param; printf(""); for (sli.toFirst();(param=sli.current());++sli) { printf(""); if (param->kind()==DocNode::Kind_Word) { visit((DocWord*)param); } else if (param->kind()==DocNode::Kind_LinkedWord) { visit((DocLinkedWord*)param); } printf(""); } printf("\n"); } void visitPost(DocParamList *) { indent_post(); printf("\n"); } void visitPre(DocParamSect *ps) { indent_pre(); printf("\n"); } void visitPost(DocParamSect *) { indent_post(); printf("\n"); } void visitPre(DocXRefItem *x) { indent_pre(); printf("\n", x->file().data(),x->anchor().data(),x->title().data()); } void visitPost(DocXRefItem *) { indent_post(); printf("\n"); } void visitPre(DocInternalRef *r) { indent_pre(); printf("\n",r->file().data(),r->anchor().data()); } void visitPost(DocInternalRef *) { indent_post(); printf("\n"); } void visitPre(DocCopy *c) { indent_pre(); printf("\n",c->link().data()); } void visitPost(DocCopy *) { indent_post(); printf("\n"); } void visitPre(DocText *) { indent_pre(); printf("\n"); } void visitPost(DocText *) { indent_post(); printf("\n"); } private: // helper functions void indent() { if (m_needsEnter) printf("\n"); for (int i=0;i