diff options
Diffstat (limited to 'src/htmldocvisitor.h')
-rw-r--r-- | src/htmldocvisitor.h | 244 |
1 files changed, 151 insertions, 93 deletions
diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h index 9f0f699..39956da 100644 --- a/src/htmldocvisitor.h +++ b/src/htmldocvisitor.h @@ -25,8 +25,9 @@ #include "doxygen.h" #include "outputgen.h" #include "code.h" +#include "dot.h" -/*! Concrete visitor implementation for pretty printing */ +/*! @brief Concrete visitor implementation for HTML output. */ class HtmlDocVisitor : public DocVisitor { public: @@ -34,6 +35,8 @@ class HtmlDocVisitor : public DocVisitor : m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE) {} //-------------------------------------- + // visitor functions for leaf nodes + //-------------------------------------- void visit(DocWord *w) { @@ -91,7 +94,7 @@ class HtmlDocVisitor : public DocVisitor void visit(DocURL *u) { if (m_hide) return; - m_t << "<a href=\"" << u->url() << "\">" << u->url() << "</a> "; + m_t << "<a href=\"" << u->url() << "\">" << u->url() << "</a>"; } void visit(DocLineBreak *) { @@ -159,39 +162,50 @@ class HtmlDocVisitor : public DocVisitor if (m_hide) return; m_t << "<a name=\"%s\"/></a>"; } - void visit(DocCopy *c) - { - if (m_hide) return; - // TODO - printf("<copy link=\"%s\"/>",c->link().data()); - } void visit(DocInclude *inc) { if (m_hide) return; - // TODO - printf("<include file=\"%s\" type=\"",inc->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; + case DocInclude::Include: + m_t << "<div class=\"fragment\"><pre>"; + parseCode(m_ci,inc->context(),inc->text(),FALSE,0); + m_t << "</pre></div>"; + break; + case DocInclude::DontInclude: + break; + case DocInclude::HtmlInclude: + m_t << inc->text(); + break; + case DocInclude::VerbInclude: + m_t << "<div class=\"fragment\"><pre>"; + filter(inc->text()); + m_t << "</pre></div>"; + break; } - printf("\"/>"); } void visit(DocIncOperator *op) { - if (m_hide) return; - // TODO - printf("<incoperator pattern=\"%s\" type=\"",op->pattern().data()); - switch(op->type()) + //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n", + // op->type(),op->isFirst(),op->isLast(),op->text().data()); + if (op->isFirst()) + { + m_t << "<div class=\"fragment\"><pre>"; + m_hide = TRUE; + } + if (op->type()!=DocIncOperator::Skip) + { + parseCode(m_ci,op->context(),op->text(),FALSE,0); + } + if (op->isLast()) + { + m_hide = FALSE; + m_t << "</pre></div>"; + } + else { - case DocIncOperator::Line: printf("line"); break; - case DocIncOperator::Skip: printf("skip"); break; - case DocIncOperator::SkipLine: printf("skipline"); break; - case DocIncOperator::Until: printf("until"); break; + m_t << endl; } - printf("\"/>"); } void visit(DocFormula *f) { @@ -205,9 +219,15 @@ class HtmlDocVisitor : public DocVisitor m_t << "\"middle\""; // assume Windows users use IE or HtmlHelp which on // displays formulas nicely with align == "middle" #endif - m_t << " src=\"" << f->name() << ".png\">" << endl; - if (f->text().at(0)=='\\') m_t << "</center><p>" << endl; + m_t << " src=\"" << f->name() << ".png\">"; + if (f->text().at(0)=='\\') + m_t << endl << "</center><p>" << endl; + else + m_t << " "; } + + //-------------------------------------- + // visitor functions for compound nodes //-------------------------------------- void visitPre(DocAutoList *l) @@ -249,15 +269,15 @@ class HtmlDocVisitor : public DocVisitor !(p->parent() && // and for parameter sections p->parent()->kind()==DocNode::Kind_ParamSect ) - ) m_t << "<p>\n"; + ) m_t << "\n<p>\n"; } void visitPre(DocRoot *) { - m_t << "<hr><h4><font color=\"red\">New parser:</font></h4>\n"; + //m_t << "<hr><h4><font color=\"red\">New parser:</font></h4>\n"; } void visitPost(DocRoot *) { - m_t << "<hr><h4><font color=\"red\">Old parser:</font></h4>\n"; + //m_t << "<hr><h4><font color=\"red\">Old parser:</font></h4>\n"; } void visitPre(DocSimpleSect *s) { @@ -295,12 +315,11 @@ class HtmlDocVisitor : public DocVisitor case DocSimpleSect::User: break; case DocSimpleSect::Unknown: break; } - m_t << ":"; // special case 1: user defined title if (s->type()!=DocSimpleSect::User) { - m_t << "</b></dt><dd>"; + m_t << ":</b></dt><dd>"; } } void visitPost(DocSimpleSect *) @@ -332,11 +351,14 @@ class HtmlDocVisitor : public DocVisitor } void visitPre(DocSection *s) { - m_t << "<h%d>",s->level(); + m_t << "<h" << s->level()+1 << ">"; + m_t << "<a name=\"" << s->anchor(); + filter(s->title()); + m_t << "\"</a>" << endl; + m_t << "</h" << s->level()+1 << ">\n"; } - void visitPost(DocSection *s) + void visitPost(DocSection *) { - m_t << "</h%d>\n",s->level(); } void visitPre(DocHtmlList *s) { @@ -449,7 +471,7 @@ class HtmlDocVisitor : public DocVisitor } void visitPost(DocHRef *) { - m_t << "</a>\n"; + m_t << "</a>"; } void visitPre(DocHtmlHeader *header) { @@ -461,18 +483,68 @@ class HtmlDocVisitor : public DocVisitor } void visitPre(DocImage *img) { - m_t << "<img src=\"" << img->name() << "\">\n"; + if (img->type()==DocImage::Html) + { + QCString baseName=img->name(); + int i; + if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1) + { + baseName=baseName.right(baseName.length()-i-1); + } + m_t << "<div align=\"center\">" << endl; + m_t << "<img src=\"" << img->name() << "\" alt=\"" + << baseName << "\">" << endl; + if (img->hasCaption()) + { + m_t << "<p><strong>"; + } + } + else // other format -> skip + { + m_hide=TRUE; + } } - void visitPost(DocImage *) + void visitPost(DocImage *img) { + if (img->type()==DocImage::Html) + { + if (img->hasCaption()) + { + m_t << "</strong></p>"; + } + m_t << "</div>" << endl; + } + else // other format + { + m_hide=FALSE; + } } - void visitPre(DocDotFile *) + void visitPre(DocDotFile *df) { - // TODO + QCString baseName=df->file(); + int i; + if ((i=baseName.findRev('/'))!=-1) + { + baseName=baseName.right(baseName.length()-i-1); + } + QCString outDir = Config_getString("HTML_OUTPUT"); + writeDotGraphFromFile(df->file(),outDir,baseName,BITMAP); + m_t << "<div align=\"center\">" << endl; + m_t << "<img src=\"" << baseName << "." + << Config_getEnum("DOT_IMAGE_FORMAT") << "\" alt=\"" + << baseName << "\">" << endl; + if (df->hasCaption()) + { + m_t << "<p><strong>"; + } } - void visitPost(DocDotFile *) + void visitPost(DocDotFile *df) { - // TODO + if (df->hasCaption()) + { + m_t << "</strong></p>" << endl; + } + m_t << "</div>" << endl; } void visitPre(DocLink *lnk) { @@ -490,30 +562,37 @@ class HtmlDocVisitor : public DocVisitor void visitPost(DocRef *) { endLink(); + m_t << " "; } - void visitPre(DocSecRefItem *) + void visitPre(DocSecRefItem *ref) { - // TODO + QCString refName=ref->file(); + if (refName.right(Doxygen::htmlFileExtension.length())!=Doxygen::htmlFileExtension) + { + refName+=Doxygen::htmlFileExtension; + } + m_t << "<li><a href=\"" << refName << "#" << ref->anchor() << "\">"; + } void visitPost(DocSecRefItem *) { - // TODO + m_t << "</a> "; } void visitPre(DocSecRefList *) { - // TODO + m_t << "<multicol cols=3>" << endl; + m_t << "<ul>" << endl; } void visitPost(DocSecRefList *) { - // TODO + m_t << "</ul>" << endl; + m_t << "</multicol>" << endl; } void visitPre(DocLanguage *) { - // TODO } void visitPost(DocLanguage *) { - // TODO } void visitPre(DocParamSect *s) { @@ -526,6 +605,8 @@ class HtmlDocVisitor : public DocVisitor m_t << theTranslator->trReturnValues(); break; case DocParamSect::Exception: m_t << theTranslator->trExceptions(); break; + default: + ASSERT(0); } m_t << ":"; m_t << "</b></dt><dd>" << endl; @@ -556,8 +637,9 @@ class HtmlDocVisitor : public DocVisitor void visitPre(DocXRefItem *x) { m_t << "<dl compact><dt><b><a class=\"el\" href=\"" - << x->file() << Doxygen::htmlFileExtension << "#" << x->anchor() << "\">" - << x->title() << ":</a></b></dt><dd>"; + << x->file() << Doxygen::htmlFileExtension << "#" << x->anchor() << "\">"; + filter(x->title()); + m_t << ":</a></b></dt><dd>"; } void visitPost(DocXRefItem *) { @@ -570,54 +652,30 @@ class HtmlDocVisitor : public DocVisitor void visitPost(DocInternalRef *) { endLink(); + m_t << " "; } - - private: - void filter(const char *str) - { - if (str==0) return; - const char *p=str; - char c; - while (*p) - { - c=*p++; - switch(c) - { - case '<': m_t << "<"; break; - case '>': m_t << ">"; break; - case '&': m_t << "&"; break; - default: m_t << c; - } - } - } - - void startLink(const QCString &ref,const QCString &file,const QCString &anchor) + void visitPre(DocCopy *) { - QCString *dest; - if (!ref.isEmpty()) // link to entity imported via tag file - { - m_t << "<a class=\"elRef\" "; - m_t << "doxygen=\"" << ref << ":"; - if ((dest=Doxygen::tagDestinationDict[ref])) m_t << *dest << "/"; - m_t << "\" "; - } - else // local link - { - m_t << "<a class=\"el\" "; - } - m_t << "href=\""; - if (!ref.isEmpty()) - { - if ((dest=Doxygen::tagDestinationDict[ref])) m_t << *dest << "/"; - } - if (!file.isEmpty()) m_t << file << Doxygen::htmlFileExtension; - if (!anchor.isEmpty()) m_t << "#" << anchor; - m_t << "\">"; } - void endLink() + void visitPost(DocCopy *) { - m_t << "</a> "; } + + private: + + //-------------------------------------- + // helper functions + //-------------------------------------- + + void filter(const char *str); + void startLink(const QCString &ref,const QCString &file, + const QCString &anchor); + void endLink(); + + //-------------------------------------- + // state variables + //-------------------------------------- + QTextStream &m_t; BaseCodeDocInterface &m_ci; bool m_insidePre; |