/****************************************************************************** * * * * * Copyright (C) 1997-2002 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() : m_indent(0), m_needsEnter(FALSE), m_insidePre(FALSE) {} //-------------------------------------- void visit(DocWord *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::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; } } 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::LatexOnly: 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::LatexOnly: printf(""); break; } } void visit(DocXRefItem *x) { indent_leaf(); printf("",x->id()); } void visit(DocAnchor *a) { indent_leaf(); printf("",a->anchor().data()); } void visit(DocCopy *c) { indent_leaf(); printf("",c->link().data()); } void visit(DocInclude *inc) { indent_leaf(); printf("file().data()); switch(inc->type()) { case DocInclude::Include: printf("include"); 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->id()); } //-------------------------------------- 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("parameters()); const char *s; bool first=TRUE; for (li.toFirst();(s=li.current());++li) { if (!first) printf(","); else first=FALSE; printf("%s",s); } printf("]"); } break; case DocSimpleSect::RetVal: { printf("retval["); QStrListIterator li(s->parameters()); const char *s; bool first=TRUE; for (li.toFirst();(s=li.current());++li) { if (!first) printf(","); else first=FALSE; printf("%s",s); } printf("]"); } break; case DocSimpleSect::Exception: printf("exception"); break; { printf("exception["); QStrListIterator li(s->parameters()); const char *s; bool first=TRUE; for (li.toFirst();(s=li.current());++li) { if (!first) printf(","); else first=FALSE; printf("%s",s); } printf("]"); } break; case DocSimpleSect::Unknown: printf("unknown"); break; } 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(DocIndexEntry *) { indent_pre(); printf("\n"); } void visitPost(DocIndexEntry *) { 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("\n",img->name().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->target().data()); } void visitPost(DocLink *) { indent_post(); printf("\n"); } void visitPre(DocRef *ref) { indent_pre(); printf("\n",ref->target().data()); } 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"); } private: // helper functions void indent() { if (m_needsEnter) printf("\n"); for (int i=0;i