Blame src/htmldocvisitor.cpp

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 * 
Packit 1c1d7e
 *
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Permission to use, copy, modify, and distribute this software and its
Packit 1c1d7e
 * documentation under the terms of the GNU General Public License is hereby 
Packit 1c1d7e
 * granted. No representations are made about the suitability of this software 
Packit 1c1d7e
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit 1c1d7e
 * See the GNU General Public License for more details.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Documents produced by Doxygen are derivative works derived from the
Packit 1c1d7e
 * input used in their production; they are not affected by this license.
Packit 1c1d7e
 *
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
#include <qdir.h>
Packit 1c1d7e
#include "htmldocvisitor.h"
Packit 1c1d7e
#include "docparser.h"
Packit 1c1d7e
#include "language.h"
Packit 1c1d7e
#include "doxygen.h"
Packit 1c1d7e
#include "outputgen.h"
Packit 1c1d7e
#include "dot.h"
Packit 1c1d7e
#include "message.h"
Packit 1c1d7e
#include "config.h"
Packit 1c1d7e
#include "htmlgen.h"
Packit 1c1d7e
#include "parserintf.h"
Packit 1c1d7e
#include "msc.h"
Packit 1c1d7e
#include "dia.h"
Packit 1c1d7e
#include "util.h"
Packit 1c1d7e
#include "vhdldocgen.h"
Packit 1c1d7e
#include "filedef.h"
Packit 1c1d7e
#include "memberdef.h"
Packit 1c1d7e
#include "htmlentity.h"
Packit 1c1d7e
#include "plantuml.h"
Packit 1c1d7e
Packit 1c1d7e
static const int NUM_HTML_LIST_TYPES = 4;
Packit 1c1d7e
static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"};
Packit 1c1d7e
Packit 1c1d7e
static QCString convertIndexWordToAnchor(const QString &word)
Packit 1c1d7e
{
Packit 1c1d7e
  static char hex[] = "0123456789abcdef";
Packit 1c1d7e
  QCString result="a";
Packit 1c1d7e
  const char *str = word.data();
Packit 1c1d7e
  unsigned char c;
Packit 1c1d7e
  if (str)
Packit 1c1d7e
  {
Packit 1c1d7e
    while ((c = *str++))
Packit 1c1d7e
    {
Packit 1c1d7e
      if ((c >= 'a' && c <= 'z') || // ALPHA
Packit 1c1d7e
          (c >= 'A' && c <= 'Z') || // ALPHA
Packit 1c1d7e
          (c >= '0' && c <= '9') || // DIGIT
Packit 1c1d7e
          c == '-' ||
Packit 1c1d7e
          c == '.' ||
Packit 1c1d7e
          c == '_'
Packit 1c1d7e
         )
Packit 1c1d7e
      {
Packit 1c1d7e
        result += c;
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        char enc[4];
Packit 1c1d7e
        enc[0] = ':';
Packit 1c1d7e
        enc[1] = hex[(c & 0xf0) >> 4];
Packit 1c1d7e
        enc[2] = hex[c & 0xf];
Packit 1c1d7e
        enc[3] = 0;
Packit 1c1d7e
        result += enc;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  return result;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static bool mustBeOutsideParagraph(DocNode *n)
Packit 1c1d7e
{
Packit 1c1d7e
  switch (n->kind())
Packit 1c1d7e
  {
Packit 1c1d7e
          /* 
    */
Packit 1c1d7e
        case DocNode::Kind_HtmlList:
Packit 1c1d7e
        case DocNode::Kind_SimpleList:
Packit 1c1d7e
        case DocNode::Kind_AutoList:
Packit 1c1d7e
          /* 
*/
Packit 1c1d7e
        case DocNode::Kind_SimpleSect:
Packit 1c1d7e
        case DocNode::Kind_ParamSect:
Packit 1c1d7e
        case DocNode::Kind_HtmlDescList:
Packit 1c1d7e
        case DocNode::Kind_XRefItem:
Packit 1c1d7e
          /*  */
Packit 1c1d7e
        case DocNode::Kind_HtmlTable:
Packit 1c1d7e
          /* <h?> */
Packit 1c1d7e
        case DocNode::Kind_Section:
Packit 1c1d7e
        case DocNode::Kind_HtmlHeader:
Packit 1c1d7e
          /* \internal */
Packit 1c1d7e
        case DocNode::Kind_Internal:
Packit 1c1d7e
          /* 
*/
Packit 1c1d7e
        case DocNode::Kind_Include:
Packit 1c1d7e
        case DocNode::Kind_Image:
Packit 1c1d7e
        case DocNode::Kind_SecRefList:
Packit 1c1d7e
          /* 
*/
Packit 1c1d7e
        case DocNode::Kind_HorRuler:
Packit 1c1d7e
          /* CopyDoc gets paragraph markers from the wrapping DocPara node,
Packit 1c1d7e
           * but needs to insert them for all documentation being copied to
Packit 1c1d7e
           * preserve formatting.
Packit 1c1d7e
           */
Packit 1c1d7e
        case DocNode::Kind_Copy:
Packit 1c1d7e
          /* 
*/
Packit 1c1d7e
        case DocNode::Kind_HtmlBlockQuote:
Packit 1c1d7e
          /* \parblock */
Packit 1c1d7e
        case DocNode::Kind_ParBlock:
Packit 1c1d7e
          return TRUE;
Packit 1c1d7e
        case DocNode::Kind_Verbatim:
Packit 1c1d7e
          {
Packit 1c1d7e
            DocVerbatim *dv = (DocVerbatim*)n;
Packit 1c1d7e
            return dv->type()!=DocVerbatim::HtmlOnly || dv->isBlock();
Packit 1c1d7e
          }
Packit 1c1d7e
        case DocNode::Kind_StyleChange:
Packit 1c1d7e
          return ((DocStyleChange*)n)->style()==DocStyleChange::Preformatted ||
Packit 1c1d7e
                 ((DocStyleChange*)n)->style()==DocStyleChange::Div ||
Packit 1c1d7e
                 ((DocStyleChange*)n)->style()==DocStyleChange::Center;
Packit 1c1d7e
        case DocNode::Kind_Formula:
Packit 1c1d7e
          return !((DocFormula*)n)->isInline();
Packit 1c1d7e
        default:
Packit 1c1d7e
          break;
Packit 1c1d7e
  }
Packit 1c1d7e
  return FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QString htmlAttribsToString(const HtmlAttribList &attribs)
Packit 1c1d7e
{
Packit 1c1d7e
  QString result;
Packit 1c1d7e
  HtmlAttribListIterator li(attribs);
Packit 1c1d7e
  HtmlAttrib *att;
Packit 1c1d7e
  for (li.toFirst();(att=li.current());++li)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (!att->value.isEmpty())  // ignore attribute without values as they
Packit 1c1d7e
                                // are not XHTML compliant
Packit 1c1d7e
    {
Packit 1c1d7e
      result+=" ";
Packit 1c1d7e
      result+=att->name;
Packit 1c1d7e
      result+="=\""+convertToXML(att->value)+"\"";
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  return result;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//-------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
HtmlDocVisitor::HtmlDocVisitor(FTextStream &t,CodeOutputInterface &ci,
Packit 1c1d7e
                               Definition *ctx) 
Packit 1c1d7e
  : DocVisitor(DocVisitor_Html), m_t(t), m_ci(ci), m_insidePre(FALSE), 
Packit 1c1d7e
                                 m_hide(FALSE), m_ctx(ctx)
Packit 1c1d7e
{
Packit 1c1d7e
  if (ctx) m_langExt=ctx->getDefFileExtension();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
  //--------------------------------------
Packit 1c1d7e
  // visitor functions for leaf nodes
Packit 1c1d7e
  //--------------------------------------
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visit(DocWord *w)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("word: %s\n",w->word().data());
Packit 1c1d7e
  if (m_hide) return;
Packit 1c1d7e
  filter(w->word());
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visit(DocLinkedWord *w)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_hide) return;
Packit 1c1d7e
  //printf("linked word: %s\n",w->word().data());
Packit 1c1d7e
  startLink(w->ref(),w->file(),w->relPath(),w->anchor(),w->tooltip());
Packit 1c1d7e
  filter(w->word());
Packit 1c1d7e
  endLink();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visit(DocWhiteSpace *w)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_hide) return;
Packit 1c1d7e
  if (m_insidePre)
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << w->chars();
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << " ";
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visit(DocSymbol *s)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_hide) return;
Packit 1c1d7e
  const char *res = HtmlEntityMapper::instance()->html(s->symbol());
Packit 1c1d7e
  if (res)
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << res;
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    err("HTML: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::writeObfuscatedMailAddress(const QCString &url)
Packit 1c1d7e
{
Packit 1c1d7e
  m_t << "
Packit 1c1d7e
  uint i;
Packit 1c1d7e
  int size=3;
Packit 1c1d7e
  for (i=0;i
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << "+'" << url.mid(i,size) << "'";
Packit 1c1d7e
    i+=size;
Packit 1c1d7e
    if (size==3) size=2; else size=3;
Packit 1c1d7e
  }
Packit 1c1d7e
  m_t << "; return false;\">";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visit(DocURL *u)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_hide) return;
Packit 1c1d7e
  if (u->isEmail()) // mail address
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString url = u->url();
Packit 1c1d7e
    writeObfuscatedMailAddress(url);
Packit 1c1d7e
    uint size=5,i;
Packit 1c1d7e
    for (i=0;i
Packit 1c1d7e
    {
Packit 1c1d7e
      filter(url.mid(i,size));
Packit 1c1d7e
      if (i<url.length()-size) m_t << "<span style=\"display: none;\">.nosp@m.";
Packit 1c1d7e
      i+=size;
Packit 1c1d7e
      if (size==5) size=4; else size=5;
Packit 1c1d7e
    }
Packit 1c1d7e
    m_t << "";
Packit 1c1d7e
  }
Packit 1c1d7e
  else // web address
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << "
Packit 1c1d7e
    m_t << u->url() << "\">";
Packit 1c1d7e
    filter(u->url());
Packit 1c1d7e
    m_t << "";
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visit(DocLineBreak *)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_hide) return;
Packit 1c1d7e
  m_t << "
\n";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visit(DocHorRuler *hr)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_hide) return;
Packit 1c1d7e
  forceEndParagraph(hr);
Packit 1c1d7e
  m_t << "
\n";
Packit 1c1d7e
  forceStartParagraph(hr);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visit(DocStyleChange *s)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_hide) return;
Packit 1c1d7e
  switch (s->style())
Packit 1c1d7e
  {
Packit 1c1d7e
    case DocStyleChange::Bold:
Packit 1c1d7e
      if (s->enable()) m_t << "<b" << htmlAttribsToString(s->attribs()) << ">";      else m_t << "";
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocStyleChange::Italic:
Packit 1c1d7e
      if (s->enable()) m_t << "<em" << htmlAttribsToString(s->attribs()) << ">";     else m_t << "";
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocStyleChange::Code:
Packit 1c1d7e
      if (s->enable()) m_t << "<code" << htmlAttribsToString(s->attribs()) << ">";   else m_t << "";
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocStyleChange::Subscript:
Packit 1c1d7e
      if (s->enable()) m_t << "<sub" << htmlAttribsToString(s->attribs()) << ">";    else m_t << "</sub>";
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocStyleChange::Superscript:
Packit 1c1d7e
      if (s->enable()) m_t << "<sup" << htmlAttribsToString(s->attribs()) << ">";    else m_t << "</sup>";
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocStyleChange::Center:
Packit 1c1d7e
      if (s->enable()) 
Packit 1c1d7e
      {
Packit 1c1d7e
        forceEndParagraph(s);
Packit 1c1d7e
        m_t << "<center" << htmlAttribsToString(s->attribs()) << ">"; 
Packit 1c1d7e
      }
Packit 1c1d7e
      else 
Packit 1c1d7e
      {
Packit 1c1d7e
        m_t << "</center>";
Packit 1c1d7e
        forceStartParagraph(s);
Packit 1c1d7e
      }
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocStyleChange::Small:
Packit 1c1d7e
      if (s->enable()) m_t << "<small" << htmlAttribsToString(s->attribs()) << ">";  else m_t << "</small>";
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocStyleChange::Preformatted:
Packit 1c1d7e
      if (s->enable())
Packit 1c1d7e
      {
Packit 1c1d7e
        forceEndParagraph(s);
Packit 1c1d7e
        m_t << "<pre" << htmlAttribsToString(s->attribs()) << ">";
Packit 1c1d7e
        m_insidePre=TRUE;
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        m_insidePre=FALSE;
Packit 1c1d7e
        m_t << "";
Packit 1c1d7e
        forceStartParagraph(s);
Packit 1c1d7e
      }
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocStyleChange::Div:
Packit 1c1d7e
      if (s->enable()) 
Packit 1c1d7e
      {
Packit 1c1d7e
        forceEndParagraph(s);
Packit 1c1d7e
        m_t << "<div" << htmlAttribsToString(s->attribs()) << ">";  
Packit 1c1d7e
      }
Packit 1c1d7e
      else 
Packit 1c1d7e
      {
Packit 1c1d7e
        m_t << "";
Packit 1c1d7e
        forceStartParagraph(s);
Packit 1c1d7e
      }
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocStyleChange::Span:
Packit 1c1d7e
      if (s->enable()) m_t << "<span" << htmlAttribsToString(s->attribs()) << ">";  else m_t << "";
Packit 1c1d7e
      break;
Packit 1c1d7e
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static void visitPreCaption(FTextStream &t, DocVerbatim *s)
Packit 1c1d7e
{
Packit 1c1d7e
  if (s->hasCaption())
Packit 1c1d7e
  { 
Packit 1c1d7e
    t << "
" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static void visitPostCaption(FTextStream &t, DocVerbatim *s)
Packit 1c1d7e
{
Packit 1c1d7e
  if (s->hasCaption())
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static void visitCaption(HtmlDocVisitor *parent, QList<DocNode> children)
Packit 1c1d7e
{
Packit 1c1d7e
  QListIterator<DocNode> cli(children);
Packit 1c1d7e
  DocNode *n;
Packit 1c1d7e
  for (cli.toFirst();(n=cli.current());++cli) n->accept(parent);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visit(DocVerbatim *s)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_hide) return;
Packit 1c1d7e
  QCString lang = m_langExt;
Packit 1c1d7e
  if (!s->language().isEmpty()) // explicit language setting
Packit 1c1d7e
  {
Packit 1c1d7e
    lang = s->language();
Packit 1c1d7e
  }
Packit 1c1d7e
  SrcLangExt langExt = getLanguageFromFileName(lang);
Packit 1c1d7e
  switch(s->type())
Packit 1c1d7e
  {
Packit 1c1d7e
    case DocVerbatim::Code: 
Packit 1c1d7e
      forceEndParagraph(s);
Packit 1c1d7e
      m_t << PREFRAG_START;
Packit 1c1d7e
      Doxygen::parserManager->getParser(lang)
Packit 1c1d7e
                            ->parseCode(m_ci,
Packit 1c1d7e
                                        s->context(),
Packit 1c1d7e
                                        s->text(),
Packit 1c1d7e
                                        langExt,
Packit 1c1d7e
                                        s->isExample(),
Packit 1c1d7e
                                        s->exampleFile(),
Packit 1c1d7e
                                        0,     // fileDef
Packit 1c1d7e
                                        -1,    // startLine
Packit 1c1d7e
                                        -1,    // endLine
Packit 1c1d7e
                                        FALSE, // inlineFragment
Packit 1c1d7e
                                        0,     // memberDef
Packit 1c1d7e
                                        TRUE,  // show line numbers
Packit 1c1d7e
                                        m_ctx  // search context
Packit 1c1d7e
                                       );
Packit 1c1d7e
      m_t << PREFRAG_END;
Packit 1c1d7e
      forceStartParagraph(s);
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocVerbatim::Verbatim: 
Packit 1c1d7e
      forceEndParagraph(s);
Packit 1c1d7e
      m_t << /*PREFRAG_START <<*/ "
";
Packit 1c1d7e
      filter(s->text());
Packit 1c1d7e
      m_t << "" /*<< PREFRAG_END*/;
Packit 1c1d7e
      forceStartParagraph(s);
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocVerbatim::HtmlOnly: 
Packit 1c1d7e
      if (s->isBlock()) forceEndParagraph(s);
Packit 1c1d7e
      m_t << s->text(); 
Packit 1c1d7e
      if (s->isBlock()) forceStartParagraph(s);
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocVerbatim::ManOnly: 
Packit 1c1d7e
    case DocVerbatim::LatexOnly: 
Packit 1c1d7e
    case DocVerbatim::XmlOnly: 
Packit 1c1d7e
    case DocVerbatim::RtfOnly:
Packit 1c1d7e
    case DocVerbatim::DocbookOnly:
Packit 1c1d7e
      /* nothing */ 
Packit 1c1d7e
      break;
Packit 1c1d7e
Packit 1c1d7e
    case DocVerbatim::Dot:
Packit 1c1d7e
      {
Packit 1c1d7e
        static int dotindex = 1;
Packit 1c1d7e
        QCString fileName(4096);
Packit 1c1d7e
Packit 1c1d7e
        forceEndParagraph(s);
Packit 1c1d7e
        fileName.sprintf("%s%d%s", 
Packit 1c1d7e
            (Config_getString(HTML_OUTPUT)+"/inline_dotgraph_").data(), 
Packit 1c1d7e
            dotindex++,
Packit 1c1d7e
            ".dot"
Packit 1c1d7e
           );
Packit 1c1d7e
        QFile file(fileName);
Packit 1c1d7e
        if (!file.open(IO_WriteOnly))
Packit 1c1d7e
        {
Packit 1c1d7e
          err("Could not open file %s for writing\n",fileName.data());
Packit 1c1d7e
        }
Packit 1c1d7e
        else
Packit 1c1d7e
        {
Packit 1c1d7e
          file.writeBlock( s->text(), s->text().length() );
Packit 1c1d7e
          file.close();
Packit 1c1d7e
Packit 1c1d7e
          m_t << "
" << endl;
Packit 1c1d7e
          writeDotFile(fileName,s->relPath(),s->context());
Packit 1c1d7e
          visitPreCaption(m_t, s);
Packit 1c1d7e
          visitCaption(this, s->children());
Packit 1c1d7e
          visitPostCaption(m_t, s);
Packit 1c1d7e
          m_t << "" << endl;
Packit 1c1d7e
Packit 1c1d7e
          if (Config_getBool(DOT_CLEANUP)) file.remove();
Packit 1c1d7e
        }
Packit 1c1d7e
        forceStartParagraph(s);
Packit 1c1d7e
      }
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocVerbatim::Msc:
Packit 1c1d7e
      {
Packit 1c1d7e
        forceEndParagraph(s);
Packit 1c1d7e
Packit 1c1d7e
        static int mscindex = 1;
Packit 1c1d7e
        QCString baseName(4096);
Packit 1c1d7e
Packit 1c1d7e
        baseName.sprintf("%s%d", 
Packit 1c1d7e
            (Config_getString(HTML_OUTPUT)+"/inline_mscgraph_").data(), 
Packit 1c1d7e
            mscindex++
Packit 1c1d7e
            );
Packit 1c1d7e
        QFile file(baseName+".msc");
Packit 1c1d7e
        if (!file.open(IO_WriteOnly))
Packit 1c1d7e
        {
Packit 1c1d7e
          err("Could not open file %s.msc for writing\n",baseName.data());
Packit 1c1d7e
        }
Packit 1c1d7e
        else
Packit 1c1d7e
        {
Packit 1c1d7e
          QCString text = "msc {";
Packit 1c1d7e
          text+=s->text();
Packit 1c1d7e
          text+="}";
Packit 1c1d7e
Packit 1c1d7e
          file.writeBlock( text, text.length() );
Packit 1c1d7e
          file.close();
Packit 1c1d7e
Packit 1c1d7e
          m_t << "
" << endl;
Packit 1c1d7e
          writeMscFile(baseName+".msc",s->relPath(),s->context());
Packit 1c1d7e
          visitPreCaption(m_t, s);
Packit 1c1d7e
          visitCaption(this, s->children());
Packit 1c1d7e
          visitPostCaption(m_t, s);
Packit 1c1d7e
          m_t << "" << endl;
Packit 1c1d7e
Packit 1c1d7e
          if (Config_getBool(DOT_CLEANUP)) file.remove();
Packit 1c1d7e
        }
Packit 1c1d7e
        forceStartParagraph(s);
Packit 1c1d7e
      }
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocVerbatim::PlantUML:
Packit 1c1d7e
      {
Packit 1c1d7e
        forceEndParagraph(s);
Packit 1c1d7e
Packit 1c1d7e
        static QCString htmlOutput = Config_getString(HTML_OUTPUT);
Packit 1c1d7e
        QCString baseName = writePlantUMLSource(htmlOutput,s->exampleFile(),s->text());
Packit 1c1d7e
        m_t << "
" << endl;
Packit 1c1d7e
        writePlantUMLFile(baseName,s->relPath(),s->context());
Packit 1c1d7e
        visitPreCaption(m_t, s);
Packit 1c1d7e
        visitCaption(this, s->children());
Packit 1c1d7e
        visitPostCaption(m_t, s);
Packit 1c1d7e
        m_t << "" << endl;
Packit 1c1d7e
        forceStartParagraph(s);
Packit 1c1d7e
      }
Packit 1c1d7e
      break;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visit(DocAnchor *anc)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_hide) return;
Packit 1c1d7e
  m_t << "anchor() << "\">";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visit(DocInclude *inc)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_hide) return;
Packit 1c1d7e
  SrcLangExt langExt = getLanguageFromFileName(inc->extension());
Packit 1c1d7e
  switch(inc->type())
Packit 1c1d7e
  {
Packit 1c1d7e
    case DocInclude::Include: 
Packit 1c1d7e
      forceEndParagraph(inc);
Packit 1c1d7e
      m_t << PREFRAG_START;
Packit 1c1d7e
      Doxygen::parserManager->getParser(inc->extension())
Packit 1c1d7e
                            ->parseCode(m_ci,                 
Packit 1c1d7e
                                        inc->context(),
Packit 1c1d7e
                                        inc->text(),
Packit 1c1d7e
                                        langExt,
Packit 1c1d7e
                                        inc->isExample(),
Packit 1c1d7e
                                        inc->exampleFile(),
Packit 1c1d7e
                                        0,     // fileDef
Packit 1c1d7e
                                        -1,    // startLine
Packit 1c1d7e
                                        -1,    // endLine
Packit 1c1d7e
                                        TRUE,  // inlineFragment
Packit 1c1d7e
                                        0,     // memberDef
Packit 1c1d7e
                                        FALSE, // show line numbers
Packit 1c1d7e
                                        m_ctx  // search context 
Packit 1c1d7e
                                       );
Packit 1c1d7e
      m_t << PREFRAG_END;
Packit 1c1d7e
      forceStartParagraph(inc);
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocInclude::IncWithLines:
Packit 1c1d7e
      { 
Packit 1c1d7e
         forceEndParagraph(inc);
Packit 1c1d7e
         m_t << PREFRAG_START;
Packit 1c1d7e
         QFileInfo cfi( inc->file() );
Packit 1c1d7e
         FileDef fd( cfi.dirPath().utf8(), cfi.fileName().utf8() );
Packit 1c1d7e
         Doxygen::parserManager->getParser(inc->extension())
Packit 1c1d7e
                               ->parseCode(m_ci,
Packit 1c1d7e
                                           inc->context(),
Packit 1c1d7e
                                           inc->text(),
Packit 1c1d7e
                                           langExt,
Packit 1c1d7e
                                           inc->isExample(),
Packit 1c1d7e
                                           inc->exampleFile(), 
Packit 1c1d7e
                                           &fd,   // fileDef,
Packit 1c1d7e
                                           -1,    // start line
Packit 1c1d7e
                                           -1,    // end line
Packit 1c1d7e
                                           FALSE, // inline fragment
Packit 1c1d7e
                                           0,     // memberDef
Packit 1c1d7e
                                           TRUE,  // show line numbers
Packit 1c1d7e
                                           m_ctx  // search context
Packit 1c1d7e
                                           );
Packit 1c1d7e
         m_t << PREFRAG_END;
Packit 1c1d7e
         forceStartParagraph(inc);
Packit 1c1d7e
      }
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocInclude::DontInclude: 
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocInclude::HtmlInclude: 
Packit 1c1d7e
      m_t << inc->text(); 
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocInclude::LatexInclude:
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocInclude::VerbInclude: 
Packit 1c1d7e
      forceEndParagraph(inc);
Packit 1c1d7e
      m_t << /*PREFRAG_START <<*/ "
";
Packit 1c1d7e
      filter(inc->text());
Packit 1c1d7e
      m_t << "" /*<< PREFRAG_END*/;
Packit 1c1d7e
      forceStartParagraph(inc);
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocInclude::Snippet:
Packit 1c1d7e
      {
Packit 1c1d7e
         forceEndParagraph(inc);
Packit 1c1d7e
         m_t << PREFRAG_START;
Packit 1c1d7e
         Doxygen::parserManager->getParser(inc->extension())
Packit 1c1d7e
                               ->parseCode(m_ci,
Packit 1c1d7e
                                           inc->context(),
Packit 1c1d7e
                                           extractBlock(inc->text(),inc->blockId()),
Packit 1c1d7e
                                           langExt,
Packit 1c1d7e
                                           inc->isExample(),
Packit 1c1d7e
                                           inc->exampleFile(), 
Packit 1c1d7e
                                           0,
Packit 1c1d7e
                                           -1,    // startLine
Packit 1c1d7e
                                           -1,    // endLine
Packit 1c1d7e
                                           TRUE,  // inlineFragment
Packit 1c1d7e
                                           0,     // memberDef
Packit 1c1d7e
                                           FALSE, // show line number
Packit 1c1d7e
                                           m_ctx  // search context
Packit 1c1d7e
                                          );
Packit 1c1d7e
         m_t << PREFRAG_END;
Packit 1c1d7e
         forceStartParagraph(inc);
Packit 1c1d7e
      }
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocInclude::SnipWithLines:
Packit 1c1d7e
      {
Packit 1c1d7e
         forceEndParagraph(inc);
Packit 1c1d7e
         m_t << PREFRAG_START;
Packit 1c1d7e
         QFileInfo cfi( inc->file() );
Packit 1c1d7e
         FileDef fd( cfi.dirPath().utf8(), cfi.fileName().utf8() );
Packit 1c1d7e
         Doxygen::parserManager->getParser(inc->extension())
Packit 1c1d7e
                               ->parseCode(m_ci,
Packit 1c1d7e
                                           inc->context(),
Packit 1c1d7e
                                           extractBlock(inc->text(),inc->blockId()),
Packit 1c1d7e
                                           langExt,
Packit 1c1d7e
                                           inc->isExample(),
Packit 1c1d7e
                                           inc->exampleFile(), 
Packit 1c1d7e
                                           &fd,
Packit 1c1d7e
                                           lineBlock(inc->text(),inc->blockId()),
Packit 1c1d7e
                                           -1,    // endLine
Packit 1c1d7e
                                           FALSE, // inlineFragment
Packit 1c1d7e
                                           0,     // memberDef
Packit 1c1d7e
                                           TRUE,  // show line number
Packit 1c1d7e
                                           m_ctx  // search context
Packit 1c1d7e
                                          );
Packit 1c1d7e
         m_t << PREFRAG_END;
Packit 1c1d7e
         forceStartParagraph(inc);
Packit 1c1d7e
      }
Packit 1c1d7e
      break;
Packit 1c1d7e
    case DocInclude::SnippetDoc: 
Packit 1c1d7e
    case DocInclude::IncludeDoc: 
Packit 1c1d7e
      err("Internal inconsistency: found switch SnippetDoc / IncludeDoc in file: %s"
Packit 1c1d7e
          "Please create a bug report\n",__FILE__);
Packit 1c1d7e
      break;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visit(DocIncOperator *op)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n",
Packit 1c1d7e
  //    op->type(),op->isFirst(),op->isLast(),op->text().data());
Packit 1c1d7e
  if (op->isFirst()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    if (!m_hide) m_t << PREFRAG_START;
Packit 1c1d7e
    pushEnabled();
Packit 1c1d7e
    m_hide=TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
  SrcLangExt langExt = getLanguageFromFileName(m_langExt);
Packit 1c1d7e
  if (op->type()!=DocIncOperator::Skip) 
Packit 1c1d7e
  {
Packit 1c1d7e
    popEnabled();
Packit 1c1d7e
    if (!m_hide) 
Packit 1c1d7e
    {
Packit 1c1d7e
      Doxygen::parserManager->getParser(m_langExt)
Packit 1c1d7e
                            ->parseCode(
Packit 1c1d7e
                                m_ci,
Packit 1c1d7e
                                op->context(),
Packit 1c1d7e
                                op->text(),
Packit 1c1d7e
                                langExt,
Packit 1c1d7e
                                op->isExample(),
Packit 1c1d7e
                                op->exampleFile(),
Packit 1c1d7e
                                0,     // fileDef
Packit 1c1d7e
                                -1,    // startLine
Packit 1c1d7e
                                -1,    // endLine
Packit 1c1d7e
                                FALSE, // inline fragment
Packit 1c1d7e
                                0,     // memberDef
Packit 1c1d7e
                                TRUE,  // show line numbers
Packit 1c1d7e
                                m_ctx  // search context
Packit 1c1d7e
                               );
Packit 1c1d7e
    }
Packit 1c1d7e
    pushEnabled();
Packit 1c1d7e
    m_hide=TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
  if (op->isLast())  
Packit 1c1d7e
  {
Packit 1c1d7e
    popEnabled();
Packit 1c1d7e
    if (!m_hide) m_t << PREFRAG_END;
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    if (!m_hide) m_t << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visit(DocFormula *f)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_hide) return;
Packit 1c1d7e
  bool bDisplay = !f->isInline();
Packit 1c1d7e
  if (bDisplay) 
Packit 1c1d7e
  {
Packit 1c1d7e
    forceEndParagraph(f);
Packit 1c1d7e
    m_t << "

" << endl;

Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (Config_getBool(USE_MATHJAX))
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString text = f->text();
Packit 1c1d7e
    bool closeInline = FALSE;
Packit 1c1d7e
    if (!bDisplay && !text.isEmpty() && text.at(0)=='$' && 
Packit 1c1d7e
                      text.at(text.length()-1)=='$')
Packit 1c1d7e
    {
Packit 1c1d7e
      closeInline=TRUE;
Packit 1c1d7e
      text = text.mid(1,text.length()-2);
Packit 1c1d7e
      m_t << "\\(";
Packit 1c1d7e
    }
Packit 1c1d7e
    m_t << convertToHtml(text);
Packit 1c1d7e
    if (closeInline)
Packit 1c1d7e
    {
Packit 1c1d7e
      m_t << "\\)";
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << "
Packit 1c1d7e
      << (bDisplay ? "Dsp" : "Inl");
Packit 1c1d7e
    m_t << "\" alt=\"";
Packit 1c1d7e
    filterQuotedCdataAttr(f->text());
Packit 1c1d7e
    m_t << "\"";
Packit 1c1d7e
    // TODO: cache image dimensions on formula generation and give height/width
Packit 1c1d7e
    // for faster preloading and better rendering of the page
Packit 1c1d7e
    m_t << " src=\"" << f->relPath() << f->name() << ".png\"/>";
Packit 1c1d7e
Packit 1c1d7e
  }
Packit 1c1d7e
  if (bDisplay)
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << endl << "

" << endl;
Packit 1c1d7e
    forceStartParagraph(f);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visit(DocIndexEntry *e)
Packit 1c1d7e
{
Packit 1c1d7e
  QCString anchor = convertIndexWordToAnchor(e->entry());
Packit 1c1d7e
  if (e->member()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    anchor.prepend(e->member()->anchor()+"_");
Packit 1c1d7e
  }
Packit 1c1d7e
  m_t << "";
Packit 1c1d7e
  //printf("*** DocIndexEntry: word='%s' scope='%s' member='%s'\n",
Packit 1c1d7e
  //       e->entry().data(),
Packit 1c1d7e
  //       e->scope()  ? e->scope()->name().data()  : "<null>",
Packit 1c1d7e
  //       e->member() ? e->member()->name().data() : "<null>"
Packit 1c1d7e
  //      );
Packit 1c1d7e
  Doxygen::indexList->addIndexItem(e->scope(),e->member(),anchor,e->entry());
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visit(DocSimpleSectSep *)
Packit 1c1d7e
{
Packit 1c1d7e
  m_t << "" << endl;
Packit 1c1d7e
  m_t << "
" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visit(DocCite *cite)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_hide) return;
Packit 1c1d7e
  if (!cite->file().isEmpty()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    startLink(cite->ref(),cite->file(),cite->relPath(),cite->anchor());
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << "[";
Packit 1c1d7e
  }
Packit 1c1d7e
  filter(cite->text());
Packit 1c1d7e
  if (!cite->file().isEmpty()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    endLink();
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << "]";
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
//--------------------------------------
Packit 1c1d7e
// visitor functions for compound nodes
Packit 1c1d7e
//--------------------------------------
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visitPre(DocAutoList *l)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("DocAutoList::visitPre\n");
Packit 1c1d7e
  if (m_hide) return;
Packit 1c1d7e
  forceEndParagraph(l);
Packit 1c1d7e
  if (l->isEnumList())
Packit 1c1d7e
  {
Packit 1c1d7e
    //
Packit 1c1d7e
    // Do list type based on depth:
Packit 1c1d7e
    // 1.
Packit 1c1d7e
    //   a.
Packit 1c1d7e
    //     i.
Packit 1c1d7e
    //       A. 
Packit 1c1d7e
    //         1. (repeat)...
Packit 1c1d7e
    //
Packit 1c1d7e
    m_t << "
    depth() % NUM_HTML_LIST_TYPES] << "\">";
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << "
    ";
Packit 1c1d7e
  }
Packit 1c1d7e
  if (!l->isPreformatted()) m_t << "\n";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visitPost(DocAutoList *l)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("DocAutoList::visitPost\n");
Packit 1c1d7e
  if (m_hide) return;
Packit 1c1d7e
  if (l->isEnumList())
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << "";
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    m_t << "";
Packit 1c1d7e
  }
Packit 1c1d7e
  if (!l->isPreformatted()) m_t << "\n";
Packit 1c1d7e
  forceStartParagraph(l);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void HtmlDocVisitor::visitPre(DocAutoListItem *)
Packit 1c1d7e
{
Packit 1c1d7e
  if (m_hide) return;
Packit 1c1d7e
  m_t << "
  • ";
  • Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocAutoListItem *li) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "";
    Packit 1c1d7e
      if (!li->isPreformatted()) m_t << "\n";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    template<class T> 
    Packit 1c1d7e
    bool isFirstChildNode(T *parent, DocNode *node)
    Packit 1c1d7e
    {
    Packit 1c1d7e
       return parent->children().getFirst()==node;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    template<class T> 
    Packit 1c1d7e
    bool isLastChildNode(T *parent, DocNode *node)
    Packit 1c1d7e
    {
    Packit 1c1d7e
       return parent->children().getLast()==node;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    bool isSeparatedParagraph(DocSimpleSect *parent,DocPara *par)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      QList<DocNode> nodes = parent->children();
    Packit 1c1d7e
      int i = nodes.findRef(par);
    Packit 1c1d7e
      if (i==-1) return FALSE;
    Packit 1c1d7e
      int count = parent->children().count();
    Packit 1c1d7e
      if (count>1 && i==0) // first node
    Packit 1c1d7e
      {
    Packit 1c1d7e
        if (nodes.at(i+1)->kind()==DocNode::Kind_SimpleSectSep)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          return TRUE;
    Packit 1c1d7e
        }
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else if (count>1 && i==count-1) // last node
    Packit 1c1d7e
      {
    Packit 1c1d7e
        if (nodes.at(i-1)->kind()==DocNode::Kind_SimpleSectSep)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          return TRUE;
    Packit 1c1d7e
        }
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else if (count>2 && i>0 && i
    Packit 1c1d7e
      {
    Packit 1c1d7e
        if (nodes.at(i-1)->kind()==DocNode::Kind_SimpleSectSep &&
    Packit 1c1d7e
            nodes.at(i+1)->kind()==DocNode::Kind_SimpleSectSep)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          return TRUE;
    Packit 1c1d7e
        }
    Packit 1c1d7e
      }
    Packit 1c1d7e
      return FALSE;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      int t=0;
    Packit 1c1d7e
      isFirst=FALSE;
    Packit 1c1d7e
      isLast=FALSE;
    Packit 1c1d7e
      if (p && p->parent())
    Packit 1c1d7e
      {
    Packit 1c1d7e
        switch (p->parent()->kind()) 
    Packit 1c1d7e
        {
    Packit 1c1d7e
          case DocNode::Kind_ParBlock:
    Packit 1c1d7e
            { // hierarchy: node N -> para -> parblock -> para
    Packit 1c1d7e
              // adapt return value to kind of N
    Packit 1c1d7e
              DocNode::Kind kind = DocNode::Kind_Para;
    Packit 1c1d7e
              if ( p->parent()->parent() && p->parent()->parent()->parent() )
    Packit 1c1d7e
              {
    Packit 1c1d7e
                kind = p->parent()->parent()->parent()->kind();
    Packit 1c1d7e
              }
    Packit 1c1d7e
              isFirst=isFirstChildNode((DocParBlock*)p->parent(),p);
    Packit 1c1d7e
              isLast =isLastChildNode ((DocParBlock*)p->parent(),p);
    Packit 1c1d7e
              t=0;
    Packit 1c1d7e
              if (isFirst)
    Packit 1c1d7e
              {
    Packit 1c1d7e
                if (kind==DocNode::Kind_HtmlListItem ||
    Packit 1c1d7e
                    kind==DocNode::Kind_SecRefItem)
    Packit 1c1d7e
                {
    Packit 1c1d7e
                  t=1;
    Packit 1c1d7e
                }
    Packit 1c1d7e
                else if (kind==DocNode::Kind_HtmlDescData ||
    Packit 1c1d7e
                         kind==DocNode::Kind_XRefItem ||
    Packit 1c1d7e
                         kind==DocNode::Kind_SimpleSect)
    Packit 1c1d7e
                {
    Packit 1c1d7e
                  t=2;
    Packit 1c1d7e
                }
    Packit 1c1d7e
                else if (kind==DocNode::Kind_HtmlCell ||
    Packit 1c1d7e
                         kind==DocNode::Kind_ParamList)
    Packit 1c1d7e
                {
    Packit 1c1d7e
                  t=5;
    Packit 1c1d7e
                }
    Packit 1c1d7e
              }
    Packit 1c1d7e
              if (isLast)
    Packit 1c1d7e
              {
    Packit 1c1d7e
                if (kind==DocNode::Kind_HtmlListItem ||
    Packit 1c1d7e
                    kind==DocNode::Kind_SecRefItem)
    Packit 1c1d7e
                {
    Packit 1c1d7e
                  t=3;
    Packit 1c1d7e
                }
    Packit 1c1d7e
                else if (kind==DocNode::Kind_HtmlDescData ||
    Packit 1c1d7e
                         kind==DocNode::Kind_XRefItem ||
    Packit 1c1d7e
                         kind==DocNode::Kind_SimpleSect)
    Packit 1c1d7e
                {
    Packit 1c1d7e
                  t=4;
    Packit 1c1d7e
                }
    Packit 1c1d7e
                else if (kind==DocNode::Kind_HtmlCell ||
    Packit 1c1d7e
                         kind==DocNode::Kind_ParamList)
    Packit 1c1d7e
                {
    Packit 1c1d7e
                  t=6;
    Packit 1c1d7e
                }
    Packit 1c1d7e
              }
    Packit 1c1d7e
              break;
    Packit 1c1d7e
            }
    Packit 1c1d7e
          case DocNode::Kind_AutoListItem:
    Packit 1c1d7e
            isFirst=isFirstChildNode((DocAutoListItem*)p->parent(),p);
    Packit 1c1d7e
            isLast =isLastChildNode ((DocAutoListItem*)p->parent(),p);
    Packit 1c1d7e
            t=1; // not used
    Packit 1c1d7e
            break;
    Packit 1c1d7e
          case DocNode::Kind_SimpleListItem:
    Packit 1c1d7e
            isFirst=TRUE;
    Packit 1c1d7e
            isLast =TRUE;
    Packit 1c1d7e
            t=1; // not used
    Packit 1c1d7e
            break;
    Packit 1c1d7e
          case DocNode::Kind_ParamList:
    Packit 1c1d7e
            isFirst=TRUE;
    Packit 1c1d7e
            isLast =TRUE;
    Packit 1c1d7e
            t=1; // not used
    Packit 1c1d7e
            break;
    Packit 1c1d7e
          case DocNode::Kind_HtmlListItem:
    Packit 1c1d7e
            isFirst=isFirstChildNode((DocHtmlListItem*)p->parent(),p);
    Packit 1c1d7e
            isLast =isLastChildNode ((DocHtmlListItem*)p->parent(),p);
    Packit 1c1d7e
            if (isFirst) t=1;
    Packit 1c1d7e
            if (isLast)  t=3;
    Packit 1c1d7e
            break;
    Packit 1c1d7e
          case DocNode::Kind_SecRefItem:
    Packit 1c1d7e
            isFirst=isFirstChildNode((DocSecRefItem*)p->parent(),p);
    Packit 1c1d7e
            isLast =isLastChildNode ((DocSecRefItem*)p->parent(),p);
    Packit 1c1d7e
            if (isFirst) t=1;
    Packit 1c1d7e
            if (isLast)  t=3;
    Packit 1c1d7e
            break;
    Packit 1c1d7e
          case DocNode::Kind_HtmlDescData:
    Packit 1c1d7e
            isFirst=isFirstChildNode((DocHtmlDescData*)p->parent(),p);
    Packit 1c1d7e
            isLast =isLastChildNode ((DocHtmlDescData*)p->parent(),p);
    Packit 1c1d7e
            if (isFirst) t=2;
    Packit 1c1d7e
            if (isLast)  t=4;
    Packit 1c1d7e
            break;
    Packit 1c1d7e
          case DocNode::Kind_XRefItem:
    Packit 1c1d7e
            isFirst=isFirstChildNode((DocXRefItem*)p->parent(),p);
    Packit 1c1d7e
            isLast =isLastChildNode ((DocXRefItem*)p->parent(),p);
    Packit 1c1d7e
            if (isFirst) t=2;
    Packit 1c1d7e
            if (isLast)  t=4;
    Packit 1c1d7e
            break;
    Packit 1c1d7e
          case DocNode::Kind_SimpleSect:
    Packit 1c1d7e
            isFirst=isFirstChildNode((DocSimpleSect*)p->parent(),p);
    Packit 1c1d7e
            isLast =isLastChildNode ((DocSimpleSect*)p->parent(),p);
    Packit 1c1d7e
            if (isFirst) t=2;
    Packit 1c1d7e
            if (isLast)  t=4;
    Packit 1c1d7e
            if (isSeparatedParagraph((DocSimpleSect*)p->parent(),p))
    Packit 1c1d7e
              // if the paragraph is enclosed with separators it will
    Packit 1c1d7e
              // be included in 
    ..
    so avoid addition paragraph
    Packit 1c1d7e
              // markers
    Packit 1c1d7e
            {
    Packit 1c1d7e
              isFirst=isLast=TRUE;
    Packit 1c1d7e
            }
    Packit 1c1d7e
            break;
    Packit 1c1d7e
          case DocNode::Kind_HtmlCell:
    Packit 1c1d7e
            isFirst=isFirstChildNode((DocHtmlCell*)p->parent(),p);
    Packit 1c1d7e
            isLast =isLastChildNode ((DocHtmlCell*)p->parent(),p);
    Packit 1c1d7e
            if (isFirst) t=5;
    Packit 1c1d7e
            if (isLast)  t=6;
    Packit 1c1d7e
            break;
    Packit 1c1d7e
          default:
    Packit 1c1d7e
            break;
    Packit 1c1d7e
        }
    Packit 1c1d7e
        //printf("para=%p parent()->kind=%d isFirst=%d isLast=%d t=%d\n",
    Packit 1c1d7e
        //    p,p->parent()->kind(),isFirst,isLast,t);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      return t;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocPara *p) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
    Packit 1c1d7e
      //printf("DocPara::visitPre: parent of kind %d ",
    Packit 1c1d7e
      //       p->parent() ? p->parent()->kind() : -1);
    Packit 1c1d7e
    Packit 1c1d7e
      bool needsTag = FALSE;
    Packit 1c1d7e
      if (p && p->parent()) 
    Packit 1c1d7e
      {
    Packit 1c1d7e
        switch (p->parent()->kind()) 
    Packit 1c1d7e
        {
    Packit 1c1d7e
          case DocNode::Kind_Section:
    Packit 1c1d7e
          case DocNode::Kind_Internal:
    Packit 1c1d7e
          case DocNode::Kind_HtmlListItem:
    Packit 1c1d7e
          case DocNode::Kind_HtmlDescData:
    Packit 1c1d7e
          case DocNode::Kind_HtmlCell:
    Packit 1c1d7e
          case DocNode::Kind_SimpleListItem:
    Packit 1c1d7e
          case DocNode::Kind_AutoListItem:
    Packit 1c1d7e
          case DocNode::Kind_SimpleSect:
    Packit 1c1d7e
          case DocNode::Kind_XRefItem:
    Packit 1c1d7e
          case DocNode::Kind_Copy:
    Packit 1c1d7e
          case DocNode::Kind_HtmlBlockQuote:
    Packit 1c1d7e
          case DocNode::Kind_ParBlock:
    Packit 1c1d7e
            needsTag = TRUE;
    Packit 1c1d7e
            break;
    Packit 1c1d7e
          case DocNode::Kind_Root:
    Packit 1c1d7e
            needsTag = !((DocRoot*)p->parent())->singleLine();
    Packit 1c1d7e
            break;
    Packit 1c1d7e
          default:
    Packit 1c1d7e
            needsTag = FALSE;
    Packit 1c1d7e
        }
    Packit 1c1d7e
      }
    Packit 1c1d7e
    Packit 1c1d7e
      // if the first element of a paragraph is something that should be outside of
    Packit 1c1d7e
      // the paragraph (
      ,
      ,,..) then that will already started the
    Packit 1c1d7e
      // paragraph and we don't need to do it here
    Packit 1c1d7e
      uint nodeIndex = 0;
    Packit 1c1d7e
      if (p && nodeIndex<p->children().count())
    Packit 1c1d7e
      {
    Packit 1c1d7e
        while (nodeIndex<p->children().count() && 
    Packit 1c1d7e
               p->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          nodeIndex++;
    Packit 1c1d7e
        }
    Packit 1c1d7e
        if (nodeIndex<p->children().count())
    Packit 1c1d7e
        {
    Packit 1c1d7e
          DocNode *n = p->children().at(nodeIndex);
    Packit 1c1d7e
          if (mustBeOutsideParagraph(n))
    Packit 1c1d7e
          {
    Packit 1c1d7e
            needsTag = FALSE;
    Packit 1c1d7e
          }
    Packit 1c1d7e
        }
    Packit 1c1d7e
      }
    Packit 1c1d7e
    Packit 1c1d7e
      // check if this paragraph is the first or last child of a 
  • or
    .
  • Packit 1c1d7e
      // this allows us to mark the tag with a special class so we can
    Packit 1c1d7e
      // fix the otherwise ugly spacing.
    Packit 1c1d7e
      int t;
    Packit 1c1d7e
      static const char *contexts[7] = 
    Packit 1c1d7e
      { "",                     // 0
    Packit 1c1d7e
        " class=\"startli\"",   // 1
    Packit 1c1d7e
        " class=\"startdd\"",   // 2
    Packit 1c1d7e
        " class=\"endli\"",     // 3
    Packit 1c1d7e
        " class=\"enddd\"",     // 4
    Packit 1c1d7e
        " class=\"starttd\"",   // 5
    Packit 1c1d7e
        " class=\"endtd\""      // 6
    Packit 1c1d7e
      };
    Packit 1c1d7e
      bool isFirst;
    Packit 1c1d7e
      bool isLast;
    Packit 1c1d7e
      t = getParagraphContext(p,isFirst,isLast);
    Packit 1c1d7e
      //printf("startPara first=%d last=%d\n",isFirst,isLast);
    Packit 1c1d7e
      if (isFirst && isLast) needsTag=FALSE;
    Packit 1c1d7e
    Packit 1c1d7e
      //printf("  needsTag=%d\n",needsTag);
    Packit 1c1d7e
      // write the paragraph tag (if needed)
    Packit 1c1d7e
      if (needsTag) m_t << "<p" << contexts[t] << ">";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocPara *p)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      bool needsTag = FALSE;
    Packit 1c1d7e
      if (p->parent()) 
    Packit 1c1d7e
      {
    Packit 1c1d7e
        switch (p->parent()->kind()) 
    Packit 1c1d7e
        {
    Packit 1c1d7e
          case DocNode::Kind_Section:
    Packit 1c1d7e
          case DocNode::Kind_Internal:
    Packit 1c1d7e
          case DocNode::Kind_HtmlListItem:
    Packit 1c1d7e
          case DocNode::Kind_HtmlDescData:
    Packit 1c1d7e
          case DocNode::Kind_HtmlCell:
    Packit 1c1d7e
          case DocNode::Kind_SimpleListItem:
    Packit 1c1d7e
          case DocNode::Kind_AutoListItem:
    Packit 1c1d7e
          case DocNode::Kind_SimpleSect:
    Packit 1c1d7e
          case DocNode::Kind_XRefItem:
    Packit 1c1d7e
          case DocNode::Kind_Copy:
    Packit 1c1d7e
          case DocNode::Kind_HtmlBlockQuote:
    Packit 1c1d7e
          case DocNode::Kind_ParBlock:
    Packit 1c1d7e
            needsTag = TRUE;
    Packit 1c1d7e
            break;
    Packit 1c1d7e
          case DocNode::Kind_Root:
    Packit 1c1d7e
            needsTag = !((DocRoot*)p->parent())->singleLine();
    Packit 1c1d7e
            break;
    Packit 1c1d7e
          default:
    Packit 1c1d7e
            needsTag = FALSE;
    Packit 1c1d7e
        }
    Packit 1c1d7e
      }
    Packit 1c1d7e
    Packit 1c1d7e
      // if the last element of a paragraph is something that should be outside of
    Packit 1c1d7e
      // the paragraph (
      ,
      ,) then that will already have ended the
    Packit 1c1d7e
      // paragraph and we don't need to do it here
    Packit 1c1d7e
      int nodeIndex = p->children().count()-1;
    Packit 1c1d7e
      if (nodeIndex>=0)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        while (nodeIndex>=0 && p->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          nodeIndex--;
    Packit 1c1d7e
        }
    Packit 1c1d7e
        if (nodeIndex>=0)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          DocNode *n = p->children().at(nodeIndex);
    Packit 1c1d7e
          if (mustBeOutsideParagraph(n))
    Packit 1c1d7e
          {
    Packit 1c1d7e
            needsTag = FALSE;
    Packit 1c1d7e
          }
    Packit 1c1d7e
        }
    Packit 1c1d7e
      }
    Packit 1c1d7e
    Packit 1c1d7e
      bool isFirst;
    Packit 1c1d7e
      bool isLast;
    Packit 1c1d7e
      getParagraphContext(p,isFirst,isLast);
    Packit 1c1d7e
      //printf("endPara first=%d last=%d\n",isFirst,isLast);
    Packit 1c1d7e
      if (isFirst && isLast) needsTag=FALSE;
    Packit 1c1d7e
    Packit 1c1d7e
      //printf("DocPara::visitPost needsTag=%d\n",needsTag);
    Packit 1c1d7e
    Packit 1c1d7e
      if (needsTag) m_t << "

    \n";
    Packit 1c1d7e
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocRoot *)
    Packit 1c1d7e
    {
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocRoot *)
    Packit 1c1d7e
    {
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocSimpleSect *s)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      forceEndParagraph(s);
    Packit 1c1d7e
      m_t << "
    typeString() << "\">
    ";
    Packit 1c1d7e
      switch(s->type())
    Packit 1c1d7e
      {
    Packit 1c1d7e
        case DocSimpleSect::See: 
    Packit 1c1d7e
          m_t << theTranslator->trSeeAlso(); break;
    Packit 1c1d7e
        case DocSimpleSect::Return: 
    Packit 1c1d7e
          m_t << theTranslator->trReturns(); break;
    Packit 1c1d7e
        case DocSimpleSect::Author: 
    Packit 1c1d7e
          m_t << theTranslator->trAuthor(TRUE,TRUE); break;
    Packit 1c1d7e
        case DocSimpleSect::Authors: 
    Packit 1c1d7e
          m_t << theTranslator->trAuthor(TRUE,FALSE); break;
    Packit 1c1d7e
        case DocSimpleSect::Version: 
    Packit 1c1d7e
          m_t << theTranslator->trVersion(); break;
    Packit 1c1d7e
        case DocSimpleSect::Since: 
    Packit 1c1d7e
          m_t << theTranslator->trSince(); break;
    Packit 1c1d7e
        case DocSimpleSect::Date: 
    Packit 1c1d7e
          m_t << theTranslator->trDate(); break;
    Packit 1c1d7e
        case DocSimpleSect::Note: 
    Packit 1c1d7e
          m_t << theTranslator->trNote(); break;
    Packit 1c1d7e
        case DocSimpleSect::Warning:
    Packit 1c1d7e
          m_t << theTranslator->trWarning(); break;
    Packit 1c1d7e
        case DocSimpleSect::Pre:
    Packit 1c1d7e
          m_t << theTranslator->trPrecondition(); break;
    Packit 1c1d7e
        case DocSimpleSect::Post:
    Packit 1c1d7e
          m_t << theTranslator->trPostcondition(); break;
    Packit 1c1d7e
        case DocSimpleSect::Copyright:
    Packit 1c1d7e
          m_t << theTranslator->trCopyright(); break;
    Packit 1c1d7e
        case DocSimpleSect::Invar:
    Packit 1c1d7e
          m_t << theTranslator->trInvariant(); break;
    Packit 1c1d7e
        case DocSimpleSect::Remark:
    Packit 1c1d7e
          m_t << theTranslator->trRemarks(); break;
    Packit 1c1d7e
        case DocSimpleSect::Attention:
    Packit 1c1d7e
          m_t << theTranslator->trAttention(); break;
    Packit 1c1d7e
        case DocSimpleSect::User: break;
    Packit 1c1d7e
        case DocSimpleSect::Rcs: break;
    Packit 1c1d7e
        case DocSimpleSect::Unknown:  break;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    Packit 1c1d7e
      // special case 1: user defined title
    Packit 1c1d7e
      if (s->type()!=DocSimpleSect::User && s->type()!=DocSimpleSect::Rcs)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "
    ";
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocSimpleSect *s)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "\n";
    Packit 1c1d7e
      forceStartParagraph(s);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocTitle *)
    Packit 1c1d7e
    {
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocTitle *)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "
    ";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocSimpleList *sl)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      forceEndParagraph(sl);
    Packit 1c1d7e
      m_t << "
      ";
    Packit 1c1d7e
      if (!sl->isPreformatted()) m_t << "\n";
    Packit 1c1d7e
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocSimpleList *sl)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "";
    Packit 1c1d7e
      if (!sl->isPreformatted()) m_t << "\n";
    Packit 1c1d7e
      forceStartParagraph(sl);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocSimpleListItem *)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "
  • ";
  • Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocSimpleListItem *li) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "";
    Packit 1c1d7e
      if (!li->isPreformatted()) m_t << "\n";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocSection *s)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      forceEndParagraph(s);
    Packit 1c1d7e
      m_t << "<h" << s->level() << ">";
    Packit 1c1d7e
      m_t << "anchor();
    Packit 1c1d7e
      m_t << "\">" << endl;
    Packit 1c1d7e
      filter(convertCharEntitiesToUTF8(s->title().data()));
    Packit 1c1d7e
      m_t << "</h" << s->level() << ">\n";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocSection *s) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      forceStartParagraph(s);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocHtmlList *s)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      forceEndParagraph(s);
    Packit 1c1d7e
      if (s->type()==DocHtmlList::Ordered) 
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "<ol" << htmlAttribsToString(s->attribs()) << ">\n"; 
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else 
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "<ul" << htmlAttribsToString(s->attribs()) << ">\n";
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocHtmlList *s) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      if (s->type()==DocHtmlList::Ordered) 
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << ""; 
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      { 
    Packit 1c1d7e
        m_t << "";
    Packit 1c1d7e
      }
    Packit 1c1d7e
      if (!s->isPreformatted()) m_t << "\n";
    Packit 1c1d7e
      forceStartParagraph(s);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocHtmlListItem *i)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "<li" << htmlAttribsToString(i->attribs()) << ">";
    Packit 1c1d7e
      if (!i->isPreformatted()) m_t << "\n";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocHtmlListItem *) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "\n";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocHtmlDescList *dl)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      forceEndParagraph(dl);
    Packit 1c1d7e
      m_t << "<dl" << htmlAttribsToString(dl->attribs()) << ">\n";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocHtmlDescList *dl) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "\n";
    Packit 1c1d7e
      forceStartParagraph(dl);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocHtmlDescTitle *dt)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "<dt" << htmlAttribsToString(dt->attribs()) << ">";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocHtmlDescTitle *) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "\n";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocHtmlDescData *dd)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "<dd" << htmlAttribsToString(dd->attribs()) << ">";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocHtmlDescData *) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "\n";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocHtmlTable *t)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
    Packit 1c1d7e
      forceEndParagraph(t);
    Packit 1c1d7e
    Packit 1c1d7e
      if (t->hasCaption())
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "caption()->anchor() << "\">\n";
    Packit 1c1d7e
      }
    Packit 1c1d7e
    Packit 1c1d7e
      QString attrs = htmlAttribsToString(t->attribs());
    Packit 1c1d7e
      if (attrs.isEmpty())
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "\n";
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "<table" << htmlAttribsToString(t->attribs()) << ">\n";
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocHtmlTable *t) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "\n";
    Packit 1c1d7e
      forceStartParagraph(t);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocHtmlRow *tr)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "<tr" << htmlAttribsToString(tr->attribs()) << ">\n";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocHtmlRow *) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "\n";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocHtmlCell *c)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      if (c->isHeading()) 
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "<th" << htmlAttribsToString(c->attribs()) << ">"; 
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else 
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "<td" << htmlAttribsToString(c->attribs()) << ">";
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocHtmlCell *c) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      if (c->isHeading()) m_t << ""; else m_t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocHtmlCaption *c)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "<caption" << htmlAttribsToString(c->attribs()) << ">";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocHtmlCaption *) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "</caption>\n";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocInternal *)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      //forceEndParagraph(i);
    Packit 1c1d7e
      //m_t << "

    " << theTranslator->trForInternalUseOnly() << "

    " << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocInternal *) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      //forceStartParagraph(i);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocHRef *href)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      if (href->url().left(7)=="mailto:")
    Packit 1c1d7e
      {
    Packit 1c1d7e
        writeObfuscatedMailAddress(href->url().mid(7));
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        QCString url = correctURL(href->url(),href->relPath());
    Packit 1c1d7e
        m_t << "
    Packit 1c1d7e
            << htmlAttribsToString(href->attribs()) << ">";
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocHRef *) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocHtmlHeader *header)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      forceEndParagraph(header);
    Packit 1c1d7e
      m_t << "<h" << header->level() 
    Packit 1c1d7e
          << htmlAttribsToString(header->attribs()) << ">";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocHtmlHeader *header) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "</h" << header->level() << ">\n";
    Packit 1c1d7e
      forceStartParagraph(header);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocImage *img)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (img->type()==DocImage::Html)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        forceEndParagraph(img);
    Packit 1c1d7e
        if (m_hide) return;
    Packit 1c1d7e
        QString baseName=img->name();
    Packit 1c1d7e
        int i;
    Packit 1c1d7e
        if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          baseName=baseName.right(baseName.length()-i-1);
    Packit 1c1d7e
        }
    Packit 1c1d7e
        m_t << "
    " << endl;
    Packit 1c1d7e
        QCString url = img->url();
    Packit 1c1d7e
        QCString sizeAttribs;
    Packit 1c1d7e
        if (!img->width().isEmpty())
    Packit 1c1d7e
        {
    Packit 1c1d7e
          sizeAttribs+=" width=\""+img->width()+"\"";
    Packit 1c1d7e
        }
    Packit 1c1d7e
        if (!img->height().isEmpty())
    Packit 1c1d7e
        {
    Packit 1c1d7e
          sizeAttribs+=" height=\""+img->height()+"\"";
    Packit 1c1d7e
        }
    Packit 1c1d7e
        if (url.isEmpty())
    Packit 1c1d7e
        {
    Packit 1c1d7e
          if (img->name().right(4)==".svg")
    Packit 1c1d7e
          {
    Packit 1c1d7e
            m_t << "<object type=\"image/svg+xml\" data=\"" << img->relPath() << img->name()
    Packit 1c1d7e
                << "\"" << sizeAttribs << htmlAttribsToString(img->attribs()) << ">" << baseName
    Packit 1c1d7e
                << "</object>" << endl;
    Packit 1c1d7e
          }
    Packit 1c1d7e
          else
    Packit 1c1d7e
          {
    Packit 1c1d7e
            m_t << "relPath() << img->name() << "\" alt=\""
    Packit 1c1d7e
                << baseName << "\"" << sizeAttribs << htmlAttribsToString(img->attribs())
    Packit 1c1d7e
                << "/>" << endl;
    Packit 1c1d7e
          }
    Packit 1c1d7e
        }
    Packit 1c1d7e
        else
    Packit 1c1d7e
        {
    Packit 1c1d7e
          if (url.right(4)==".svg")
    Packit 1c1d7e
          {
    Packit 1c1d7e
            m_t << "<object type=\"image/svg+xml\" data=\"" << correctURL(url,img->relPath())
    Packit 1c1d7e
                << "\"" << sizeAttribs << htmlAttribsToString(img->attribs()) << "></object>" << endl;
    Packit 1c1d7e
          }
    Packit 1c1d7e
          else
    Packit 1c1d7e
          {
    Packit 1c1d7e
            m_t << "relPath()) << "\""
    Packit 1c1d7e
                << sizeAttribs << htmlAttribsToString(img->attribs())
    Packit 1c1d7e
                << "/>" << endl;
    Packit 1c1d7e
          }
    Packit 1c1d7e
        }
    Packit 1c1d7e
        if (img->hasCaption())
    Packit 1c1d7e
        {
    Packit 1c1d7e
          m_t << "
    " << endl;
    Packit 1c1d7e
        }
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else // other format -> skip
    Packit 1c1d7e
      {
    Packit 1c1d7e
        pushEnabled();
    Packit 1c1d7e
        m_hide=TRUE;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocImage *img) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (img->type()==DocImage::Html)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        if (m_hide) return;
    Packit 1c1d7e
        if (img->hasCaption())
    Packit 1c1d7e
        {
    Packit 1c1d7e
          m_t << "";
    Packit 1c1d7e
        }
    Packit 1c1d7e
        m_t << "" << endl;
    Packit 1c1d7e
        forceStartParagraph(img);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else // other format
    Packit 1c1d7e
      {
    Packit 1c1d7e
        popEnabled();
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocDotFile *df)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "
    " << endl;
    Packit 1c1d7e
      writeDotFile(df->file(),df->relPath(),df->context());
    Packit 1c1d7e
      if (df->hasCaption())
    Packit 1c1d7e
      { 
    Packit 1c1d7e
        m_t << "
    " << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocDotFile *df) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      if (df->hasCaption())
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "" << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      m_t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocMscFile *df)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "
    " << endl;
    Packit 1c1d7e
      writeMscFile(df->file(),df->relPath(),df->context());
    Packit 1c1d7e
      if (df->hasCaption())
    Packit 1c1d7e
      { 
    Packit 1c1d7e
        m_t << "
    " << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocMscFile *df) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      if (df->hasCaption())
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "" << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      m_t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocDiaFile *df)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "
    " << endl;
    Packit 1c1d7e
      writeDiaFile(df->file(),df->relPath(),df->context());
    Packit 1c1d7e
      if (df->hasCaption())
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "
    " << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocDiaFile *df)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      if (df->hasCaption())
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "" << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      m_t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocLink *lnk)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      startLink(lnk->ref(),lnk->file(),lnk->relPath(),lnk->anchor());
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocLink *) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      endLink();
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocRef *ref)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      if (!ref->file().isEmpty()) 
    Packit 1c1d7e
      {
    Packit 1c1d7e
        // when ref->isSubPage()==TRUE we use ref->file() for HTML and
    Packit 1c1d7e
        // ref->anchor() for LaTeX/RTF
    Packit 1c1d7e
        startLink(ref->ref(),ref->file(),ref->relPath(),ref->isSubPage() ? QCString() : ref->anchor());
    Packit 1c1d7e
      }
    Packit 1c1d7e
      if (!ref->hasLinkText()) filter(ref->targetTitle());
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocRef *ref) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      if (!ref->file().isEmpty()) endLink();
    Packit 1c1d7e
      //m_t << " ";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocSecRefItem *ref)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      QString refName=ref->file();
    Packit 1c1d7e
      if (refName.right(Doxygen::htmlFileExtension.length())!=
    Packit 1c1d7e
          QString(Doxygen::htmlFileExtension))
    Packit 1c1d7e
      {
    Packit 1c1d7e
        refName+=Doxygen::htmlFileExtension;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      m_t << "
  • anchor() << "\">";
  • Packit 1c1d7e
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocSecRefItem *) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "\n";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocSecRefList *s)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      forceEndParagraph(s);
    Packit 1c1d7e
      m_t << "
    " << endl;
    Packit 1c1d7e
      m_t << "
      " << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocSecRefList *s) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "" << endl;
    Packit 1c1d7e
      m_t << "" << endl;
    Packit 1c1d7e
      forceStartParagraph(s);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    //void HtmlDocVisitor::visitPre(DocLanguage *l)
    Packit 1c1d7e
    //{
    Packit 1c1d7e
    //  QString langId = Config_getEnum(OUTPUT_LANGUAGE);
    Packit 1c1d7e
    //  if (l->id().lower()!=langId.lower())
    Packit 1c1d7e
    //  {
    Packit 1c1d7e
    //    pushEnabled();
    Packit 1c1d7e
    //    m_hide = TRUE;
    Packit 1c1d7e
    //  }
    Packit 1c1d7e
    //}
    Packit 1c1d7e
    //
    Packit 1c1d7e
    //void HtmlDocVisitor::visitPost(DocLanguage *l) 
    Packit 1c1d7e
    //{
    Packit 1c1d7e
    //  QString langId = Config_getEnum(OUTPUT_LANGUAGE);
    Packit 1c1d7e
    //  if (l->id().lower()!=langId.lower())
    Packit 1c1d7e
    //  {
    Packit 1c1d7e
    //    popEnabled();
    Packit 1c1d7e
    //  }
    Packit 1c1d7e
    //}
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocParamSect *s)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      forceEndParagraph(s);
    Packit 1c1d7e
      QCString className;
    Packit 1c1d7e
      QCString heading;
    Packit 1c1d7e
      switch(s->type())
    Packit 1c1d7e
      {
    Packit 1c1d7e
        case DocParamSect::Param: 
    Packit 1c1d7e
          heading=theTranslator->trParameters(); 
    Packit 1c1d7e
          className="params";
    Packit 1c1d7e
          break;
    Packit 1c1d7e
        case DocParamSect::RetVal: 
    Packit 1c1d7e
          heading=theTranslator->trReturnValues(); 
    Packit 1c1d7e
          className="retval";
    Packit 1c1d7e
          break;
    Packit 1c1d7e
        case DocParamSect::Exception: 
    Packit 1c1d7e
          heading=theTranslator->trExceptions(); 
    Packit 1c1d7e
          className="exception";
    Packit 1c1d7e
          break;
    Packit 1c1d7e
        case DocParamSect::TemplateParam: 
    Packit 1c1d7e
          heading=theTranslator->trTemplateParameters();
    Packit 1c1d7e
          className="tparams";
    Packit 1c1d7e
          break;
    Packit 1c1d7e
        default:
    Packit 1c1d7e
          ASSERT(0);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      m_t << "
    ";
    Packit 1c1d7e
      m_t << heading;
    Packit 1c1d7e
      m_t << "
    " << endl;
    Packit 1c1d7e
      m_t << "  " << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocParamSect *s)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "  " << endl;
    Packit 1c1d7e
      m_t << "  " << endl;
    Packit 1c1d7e
      m_t << "" << endl;
    Packit 1c1d7e
      forceStartParagraph(s);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocParamList *pl)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      //printf("DocParamList::visitPre\n");
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "    ";
    Packit 1c1d7e
      DocParamSect *sect = 0;
    Packit 1c1d7e
      if (pl->parent()->kind()==DocNode::Kind_ParamSect)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        sect=(DocParamSect*)pl->parent();
    Packit 1c1d7e
      }
    Packit 1c1d7e
      if (sect && sect->hasInOutSpecifier())
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "";
    Packit 1c1d7e
        if (pl->direction()!=DocParamSect::Unspecified)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          m_t << "[";
    Packit 1c1d7e
          if (pl->direction()==DocParamSect::In)
    Packit 1c1d7e
          {
    Packit 1c1d7e
            m_t << "in";
    Packit 1c1d7e
          }
    Packit 1c1d7e
          else if (pl->direction()==DocParamSect::Out)
    Packit 1c1d7e
          {
    Packit 1c1d7e
            m_t << "out";
    Packit 1c1d7e
          }
    Packit 1c1d7e
          else if (pl->direction()==DocParamSect::InOut)
    Packit 1c1d7e
          {
    Packit 1c1d7e
            m_t << "in,out";
    Packit 1c1d7e
          }
    Packit 1c1d7e
          m_t << "]";
    Packit 1c1d7e
        }
    Packit 1c1d7e
        m_t << "";
    Packit 1c1d7e
      }
    Packit 1c1d7e
      if (sect && sect->hasTypeSpecifier())
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "";
    Packit 1c1d7e
        QListIterator<DocNode> li(pl->paramTypes());
    Packit 1c1d7e
        DocNode *type;
    Packit 1c1d7e
        bool first=TRUE;
    Packit 1c1d7e
        for (li.toFirst();(type=li.current());++li)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          if (!first) m_t << " | "; else first=FALSE;
    Packit 1c1d7e
          if (type->kind()==DocNode::Kind_Word)
    Packit 1c1d7e
          {
    Packit 1c1d7e
            visit((DocWord*)type); 
    Packit 1c1d7e
          }
    Packit 1c1d7e
          else if (type->kind()==DocNode::Kind_LinkedWord)
    Packit 1c1d7e
          {
    Packit 1c1d7e
            visit((DocLinkedWord*)type); 
    Packit 1c1d7e
          }
    Packit 1c1d7e
        }
    Packit 1c1d7e
        m_t << "";
    Packit 1c1d7e
      }
    Packit 1c1d7e
      m_t << "";
    Packit 1c1d7e
      //QStrListIterator li(pl->parameters());
    Packit 1c1d7e
      //const char *s;
    Packit 1c1d7e
      QListIterator<DocNode> li(pl->parameters());
    Packit 1c1d7e
      DocNode *param;
    Packit 1c1d7e
      bool first=TRUE;
    Packit 1c1d7e
      for (li.toFirst();(param=li.current());++li)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        if (!first) m_t << ","; else first=FALSE;
    Packit 1c1d7e
        if (param->kind()==DocNode::Kind_Word)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          visit((DocWord*)param); 
    Packit 1c1d7e
        }
    Packit 1c1d7e
        else if (param->kind()==DocNode::Kind_LinkedWord)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          visit((DocLinkedWord*)param); 
    Packit 1c1d7e
        }
    Packit 1c1d7e
      }
    Packit 1c1d7e
      m_t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocParamList *)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      //printf("DocParamList::visitPost\n");
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocXRefItem *x)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      if (x->title().isEmpty()) return;
    Packit 1c1d7e
    Packit 1c1d7e
      forceEndParagraph(x);
    Packit 1c1d7e
      bool anonymousEnum = x->file()=="@";
    Packit 1c1d7e
      if (!anonymousEnum)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "
    key() << "\">
    Packit 1c1d7e
            << x->relPath() << x->file() << Doxygen::htmlFileExtension 
    Packit 1c1d7e
            << "#" << x->anchor() << "\">";
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else 
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "
    key() << "\">
    ";
    Packit 1c1d7e
      }
    Packit 1c1d7e
      filter(x->title());
    Packit 1c1d7e
      m_t << ":";
    Packit 1c1d7e
      if (!anonymousEnum) m_t << "";
    Packit 1c1d7e
      m_t << "
    ";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocXRefItem *x)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      if (x->title().isEmpty()) return;
    Packit 1c1d7e
      m_t << "" << endl;
    Packit 1c1d7e
      forceStartParagraph(x);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocInternalRef *ref)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      startLink(0,ref->file(),ref->relPath(),ref->anchor());
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocInternalRef *) 
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      endLink();
    Packit 1c1d7e
      m_t << " ";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocCopy *)
    Packit 1c1d7e
    {
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocCopy *)
    Packit 1c1d7e
    {
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocText *)
    Packit 1c1d7e
    {
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocText *)
    Packit 1c1d7e
    {
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocHtmlBlockQuote *b)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      forceEndParagraph(b);
    Packit 1c1d7e
      QString attrs = htmlAttribsToString(b->attribs());
    Packit 1c1d7e
      if (attrs.isEmpty())
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "
    \n";
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "<blockquote" << htmlAttribsToString(b->attribs()) << ">\n";
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocHtmlBlockQuote *b)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      m_t << "" << endl;
    Packit 1c1d7e
      forceStartParagraph(b);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocVhdlFlow *vf)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      if (VhdlDocGen::getFlowMember()) // use VHDL flow chart creator
    Packit 1c1d7e
      {
    Packit 1c1d7e
        forceEndParagraph(vf);
    Packit 1c1d7e
        QCString fname=FlowChart::convertNameToFileName();
    Packit 1c1d7e
        m_t << "

    ";

    Packit 1c1d7e
        m_t << "flowchart: " ; // TODO: translate me
    Packit 1c1d7e
        m_t << "
    Packit 1c1d7e
        m_t << fname.data(); 
    Packit 1c1d7e
        m_t << ".svg\">";
    Packit 1c1d7e
        m_t << VhdlDocGen::getFlowMember()->name().data();
    Packit 1c1d7e
        m_t << "";
    Packit 1c1d7e
        if (vf->hasCaption())
    Packit 1c1d7e
        {
    Packit 1c1d7e
          m_t << "
    ";
    Packit 1c1d7e
        }
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocVhdlFlow *vf)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
      if (VhdlDocGen::getFlowMember()) // use VHDL flow chart creator
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "

    ";
    Packit 1c1d7e
        forceStartParagraph(vf);
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPre(DocParBlock *)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::visitPost(DocParBlock *)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (m_hide) return;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::filter(const char *str)
    Packit 1c1d7e
    { 
    Packit 1c1d7e
      if (str==0) return;
    Packit 1c1d7e
      const char *p=str;
    Packit 1c1d7e
      char c;
    Packit 1c1d7e
      while (*p)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        c=*p++;
    Packit 1c1d7e
        switch(c)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          case '<':  m_t << "<"; break;
    Packit 1c1d7e
          case '>':  m_t << ">"; break;
    Packit 1c1d7e
          case '&':  m_t << "&"; break;
    Packit 1c1d7e
          default:   m_t << c;
    Packit 1c1d7e
        }
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    /// Escape basic entities to produce a valid CDATA attribute value,
    Packit 1c1d7e
    /// assume that the outer quoting will be using the double quote "
    Packit 1c1d7e
    void HtmlDocVisitor::filterQuotedCdataAttr(const char* str)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      if (str==0) return;
    Packit 1c1d7e
      const char *p=str;
    Packit 1c1d7e
      char c;
    Packit 1c1d7e
      while (*p)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        c=*p++;
    Packit 1c1d7e
        switch(c)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          case '&':  m_t << "&"; break;
    Packit 1c1d7e
          case '"':  m_t << """; break;
    Packit 1c1d7e
          case '<':  m_t << "<"; break;
    Packit 1c1d7e
          case '>':  m_t << ">"; break;
    Packit 1c1d7e
          default:   m_t << c;
    Packit 1c1d7e
        }
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::startLink(const QCString &ref,const QCString &file,
    Packit 1c1d7e
                                   const QCString &relPath,const QCString &anchor,
    Packit 1c1d7e
                                   const QCString &tooltip)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      //printf("HtmlDocVisitor: file=%s anchor=%s\n",file.data(),anchor.data());
    Packit 1c1d7e
      if (!ref.isEmpty()) // link to entity imported via tag file
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "
    Packit 1c1d7e
        m_t << externalLinkTarget() << externalRef(relPath,ref,FALSE);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else // local link
    Packit 1c1d7e
      {
    Packit 1c1d7e
        m_t << "
    Packit 1c1d7e
      }
    Packit 1c1d7e
      m_t << "href=\"";
    Packit 1c1d7e
      m_t << externalRef(relPath,ref,TRUE);
    Packit 1c1d7e
      if (!file.isEmpty()) m_t << file << Doxygen::htmlFileExtension;
    Packit 1c1d7e
      if (!anchor.isEmpty()) m_t << "#" << anchor;
    Packit 1c1d7e
      m_t << "\"";
    Packit 1c1d7e
      if (!tooltip.isEmpty()) m_t << " title=\"" << convertToHtml(tooltip) << "\"";
    Packit 1c1d7e
      m_t << ">";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::endLink()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      m_t << "";
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::pushEnabled()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      m_enabled.push(new bool(m_hide));
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::popEnabled()
    Packit 1c1d7e
    {
    Packit 1c1d7e
      bool *v=m_enabled.pop();
    Packit 1c1d7e
      ASSERT(v!=0);
    Packit 1c1d7e
      m_hide = *v;
    Packit 1c1d7e
      delete v;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::writeDotFile(const QCString &fn,const QCString &relPath,
    Packit 1c1d7e
                                      const QCString &context)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      QCString baseName=fn;
    Packit 1c1d7e
      int i;
    Packit 1c1d7e
      if ((i=baseName.findRev('/'))!=-1)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        baseName=baseName.right(baseName.length()-i-1);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      if ((i=baseName.find('.'))!=-1) // strip extension
    Packit 1c1d7e
      {
    Packit 1c1d7e
        baseName=baseName.left(i);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      baseName.prepend("dot_");
    Packit 1c1d7e
      QCString outDir = Config_getString(HTML_OUTPUT);
    Packit 1c1d7e
      writeDotGraphFromFile(fn,outDir,baseName,GOF_BITMAP);
    Packit 1c1d7e
      writeDotImageMapFromFile(m_t,fn,outDir,relPath,baseName,context);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::writeMscFile(const QCString &fileName,
    Packit 1c1d7e
                                      const QCString &relPath,
    Packit 1c1d7e
                                      const QCString &context)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      QCString baseName=fileName;
    Packit 1c1d7e
      int i;
    Packit 1c1d7e
      if ((i=baseName.findRev('/'))!=-1) // strip path
    Packit 1c1d7e
      {
    Packit 1c1d7e
        baseName=baseName.right(baseName.length()-i-1);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      if ((i=baseName.find('.'))!=-1) // strip extension
    Packit 1c1d7e
      {
    Packit 1c1d7e
        baseName=baseName.left(i);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      baseName.prepend("msc_");
    Packit 1c1d7e
      QCString outDir = Config_getString(HTML_OUTPUT);
    Packit 1c1d7e
      QCString imgExt = getDotImageExtension();
    Packit 1c1d7e
      MscOutputFormat mscFormat = MSC_BITMAP;
    Packit 1c1d7e
      if ("svg" == imgExt)
    Packit 1c1d7e
        mscFormat = MSC_SVG;
    Packit 1c1d7e
      writeMscGraphFromFile(fileName,outDir,baseName,mscFormat);
    Packit 1c1d7e
      writeMscImageMapFromFile(m_t,fileName,outDir,relPath,baseName,context,mscFormat);
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::writeDiaFile(const QCString &fileName,
    Packit 1c1d7e
                                      const QCString &relPath,
    Packit 1c1d7e
                                      const QCString &)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      QCString baseName=fileName;
    Packit 1c1d7e
      int i;
    Packit 1c1d7e
      if ((i=baseName.findRev('/'))!=-1) // strip path
    Packit 1c1d7e
      {
    Packit 1c1d7e
        baseName=baseName.right(baseName.length()-i-1);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      if ((i=baseName.find('.'))!=-1) // strip extension
    Packit 1c1d7e
      {
    Packit 1c1d7e
        baseName=baseName.left(i);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      baseName.prepend("dia_");
    Packit 1c1d7e
      QCString outDir = Config_getString(HTML_OUTPUT);
    Packit 1c1d7e
      writeDiaGraphFromFile(fileName,outDir,baseName,DIA_BITMAP);
    Packit 1c1d7e
    Packit 1c1d7e
      m_t << "" << endl;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    void HtmlDocVisitor::writePlantUMLFile(const QCString &fileName,
    Packit 1c1d7e
                                           const QCString &relPath,
    Packit 1c1d7e
                                           const QCString &)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      QCString baseName=fileName;
    Packit 1c1d7e
      int i;
    Packit 1c1d7e
      if ((i=baseName.findRev('/'))!=-1) // strip path
    Packit 1c1d7e
      {
    Packit 1c1d7e
        baseName=baseName.right(baseName.length()-i-1);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      if ((i=baseName.findRev('.'))!=-1) // strip extension
    Packit 1c1d7e
      {
    Packit 1c1d7e
        baseName=baseName.left(i);
    Packit 1c1d7e
      }
    Packit 1c1d7e
      static QCString outDir = Config_getString(HTML_OUTPUT);
    Packit 1c1d7e
      QCString imgExt = getDotImageExtension();
    Packit 1c1d7e
      if (imgExt=="svg")
    Packit 1c1d7e
      {
    Packit 1c1d7e
        generatePlantUMLOutput(fileName,outDir,PUML_SVG);
    Packit 1c1d7e
        //m_t << "<iframe scrolling=\"no\" frameborder=\"0\" src=\"" << relPath << baseName << ".svg" << "\" />" << endl;
    Packit 1c1d7e
        //m_t << "

    This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.

    ";
    Packit 1c1d7e
        //m_t << "</iframe>" << endl;
    Packit 1c1d7e
        m_t << "<object type=\"image/svg+xml\" data=\"" << relPath << baseName << ".svg\"></object>" << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      else
    Packit 1c1d7e
      {
    Packit 1c1d7e
        generatePlantUMLOutput(fileName,outDir,PUML_BITMAP);
    Packit 1c1d7e
        m_t << "" << endl;
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    /** Returns TRUE if the child nodes in paragraph \a para until \a nodeIndex
    Packit 1c1d7e
        contain a style change node that is still active and that style change is one that
    Packit 1c1d7e
        must be located outside of a paragraph, i.e. it is a center, div, or pre tag.
    Packit 1c1d7e
        See also bug746162.
    Packit 1c1d7e
     */
    Packit 1c1d7e
    static bool insideStyleChangeThatIsOutsideParagraph(DocPara *para,int nodeIndex)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      //printf("insideStyleChangeThatIsOutputParagraph(index=%d)\n",nodeIndex);
    Packit 1c1d7e
      int styleMask=0;
    Packit 1c1d7e
      bool styleOutsideParagraph=FALSE;
    Packit 1c1d7e
      while (nodeIndex>=0 && !styleOutsideParagraph)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        DocNode *n = para->children().at(nodeIndex);
    Packit 1c1d7e
        if (n->kind()==DocNode::Kind_StyleChange)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          DocStyleChange *sc = (DocStyleChange*)n;
    Packit 1c1d7e
          if (!sc->enable()) // remember styles that has been closed already
    Packit 1c1d7e
          {
    Packit 1c1d7e
            styleMask|=(int)sc->style();
    Packit 1c1d7e
          }
    Packit 1c1d7e
          bool paraStyle = sc->style()==DocStyleChange::Center ||
    Packit 1c1d7e
                           sc->style()==DocStyleChange::Div    ||
    Packit 1c1d7e
                           sc->style()==DocStyleChange::Preformatted;
    Packit 1c1d7e
          //printf("Found style change %s enabled=%d\n",sc->styleString(),sc->enable());
    Packit 1c1d7e
          if (sc->enable() && (styleMask&(int)sc->style())==0 && // style change that is still active
    Packit 1c1d7e
              paraStyle
    Packit 1c1d7e
             )
    Packit 1c1d7e
          {
    Packit 1c1d7e
            styleOutsideParagraph=TRUE;
    Packit 1c1d7e
          }
    Packit 1c1d7e
        }
    Packit 1c1d7e
        nodeIndex--;
    Packit 1c1d7e
      }
    Packit 1c1d7e
      return styleOutsideParagraph;
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    /** Used for items found inside a paragraph, which due to XHTML restrictions
    Packit 1c1d7e
     *  have to be outside of the paragraph. This method will forcefully end
    Packit 1c1d7e
     *  the current paragraph and forceStartParagraph() will restart it.
    Packit 1c1d7e
     */
    Packit 1c1d7e
    void HtmlDocVisitor::forceEndParagraph(DocNode *n)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      //printf("forceEndParagraph(%p) %d\n",n,n->kind());
    Packit 1c1d7e
      if (n->parent() && n->parent()->kind()==DocNode::Kind_Para)
    Packit 1c1d7e
      {
    Packit 1c1d7e
        DocPara *para = (DocPara*)n->parent();
    Packit 1c1d7e
        int nodeIndex = para->children().findRef(n);
    Packit 1c1d7e
        nodeIndex--;
    Packit 1c1d7e
        if (nodeIndex<0) return; // first node
    Packit 1c1d7e
        while (nodeIndex>=0 &&
    Packit 1c1d7e
               para->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace
    Packit 1c1d7e
              )
    Packit 1c1d7e
        {
    Packit 1c1d7e
          nodeIndex--;
    Packit 1c1d7e
        }
    Packit 1c1d7e
        if (nodeIndex>=0)
    Packit 1c1d7e
        {
    Packit 1c1d7e
          DocNode *n = para->children().at(nodeIndex);
    Packit 1c1d7e
          //printf("n=%p kind=%d outside=%d\n",n,n->kind(),mustBeOutsideParagraph(n));
    Packit 1c1d7e
          if (mustBeOutsideParagraph(n)) return;
    Packit 1c1d7e
        }
    Packit 1c1d7e
        nodeIndex--;
    Packit 1c1d7e
        bool styleOutsideParagraph=insideStyleChangeThatIsOutsideParagraph(para,nodeIndex);
    Packit 1c1d7e
        bool isFirst;
    Packit 1c1d7e
        bool isLast;
    Packit 1c1d7e
        getParagraphContext(para,isFirst,isLast);
    Packit 1c1d7e
        //printf("forceEnd first=%d last=%d styleOutsideParagraph=%d\n",isFirst,isLast,styleOutsideParagraph);
    Packit 1c1d7e
        if (isFirst && isLast) return;
    Packit 1c1d7e
        if (styleOutsideParagraph) return;
    Packit 1c1d7e
    Packit 1c1d7e
        m_t << "

    ";
    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e
    Packit 1c1d7e
    /** Used for items found inside a paragraph, which due to XHTML restrictions
    Packit 1c1d7e
     *  have to be outside of the paragraph. This method will forcefully start
    Packit 1c1d7e
     *  the paragraph, that was previously ended by forceEndParagraph().
    Packit 1c1d7e
     */
    Packit 1c1d7e
    void HtmlDocVisitor::forceStartParagraph(DocNode *n)
    Packit 1c1d7e
    {
    Packit 1c1d7e
      //printf("forceStartParagraph(%p) %d\n",n,n->kind());
    Packit 1c1d7e
      if (n->parent() && n->parent()->kind()==DocNode::Kind_Para) // if we are inside a paragraph
    Packit 1c1d7e
      {
    Packit 1c1d7e
        DocPara *para = (DocPara*)n->parent();
    Packit 1c1d7e
        int nodeIndex = para->children().findRef(n);
    Packit 1c1d7e
        int numNodes  = para->children().count();
    Packit 1c1d7e
        bool styleOutsideParagraph=insideStyleChangeThatIsOutsideParagraph(para,nodeIndex);
    Packit 1c1d7e
        if (styleOutsideParagraph) return;
    Packit 1c1d7e
        nodeIndex++;
    Packit 1c1d7e
        if (nodeIndex==numNodes) return; // last node
    Packit 1c1d7e
        while (nodeIndex
    Packit 1c1d7e
               para->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace
    Packit 1c1d7e
              )
    Packit 1c1d7e
        {
    Packit 1c1d7e
          nodeIndex++;
    Packit 1c1d7e
        }
    Packit 1c1d7e
        if (nodeIndex
    Packit 1c1d7e
        {
    Packit 1c1d7e
          DocNode *n = para->children().at(nodeIndex);
    Packit 1c1d7e
          if (mustBeOutsideParagraph(n)) return;
    Packit 1c1d7e
        }
    Packit 1c1d7e
        else
    Packit 1c1d7e
        {
    Packit 1c1d7e
          return; // only whitespace at the end!
    Packit 1c1d7e
        }
    Packit 1c1d7e
    Packit 1c1d7e
        bool isFirst;
    Packit 1c1d7e
        bool isLast;
    Packit 1c1d7e
        getParagraphContext(para,isFirst,isLast);
    Packit 1c1d7e
        //printf("forceStart first=%d last=%d\n",isFirst,isLast);
    Packit 1c1d7e
        if (isFirst && isLast) return;
    Packit 1c1d7e
    Packit 1c1d7e
        m_t << "

    ";

    Packit 1c1d7e
      }
    Packit 1c1d7e
    }
    Packit 1c1d7e