Blame src/docbookgen.cpp

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 <stdlib.h>
Packit 1c1d7e
Packit 1c1d7e
#include <qdir.h>
Packit 1c1d7e
#include <qfile.h>
Packit 1c1d7e
#include <qtextstream.h>
Packit 1c1d7e
#include <qintdict.h>
Packit 1c1d7e
#include "docbookgen.h"
Packit 1c1d7e
#include "doxygen.h"
Packit 1c1d7e
#include "message.h"
Packit 1c1d7e
#include "config.h"
Packit 1c1d7e
#include "classlist.h"
Packit 1c1d7e
#include "util.h"
Packit 1c1d7e
#include "defargs.h"
Packit 1c1d7e
#include "outputgen.h"
Packit 1c1d7e
#include "dot.h"
Packit 1c1d7e
#include "pagedef.h"
Packit 1c1d7e
#include "filename.h"
Packit 1c1d7e
#include "version.h"
Packit 1c1d7e
#include "docbookvisitor.h"
Packit 1c1d7e
#include "docparser.h"
Packit 1c1d7e
#include "language.h"
Packit 1c1d7e
#include "parserintf.h"
Packit 1c1d7e
#include "arguments.h"
Packit 1c1d7e
#include "memberlist.h"
Packit 1c1d7e
#include "groupdef.h"
Packit 1c1d7e
#include "memberdef.h"
Packit 1c1d7e
#include "namespacedef.h"
Packit 1c1d7e
#include "membername.h"
Packit 1c1d7e
#include "membergroup.h"
Packit 1c1d7e
#include "dirdef.h"
Packit 1c1d7e
#include "section.h"
Packit 1c1d7e
Packit 1c1d7e
// no debug info
Packit 1c1d7e
#define Docbook_DB(x) do {} while(0)
Packit 1c1d7e
// debug to stdout
Packit 1c1d7e
//#define Docbook_DB(x) printf x
Packit 1c1d7e
// debug inside output
Packit 1c1d7e
//#define Docbook_DB(x) QCString __t;__t.sprintf x;m_t << __t
Packit 1c1d7e
Packit 1c1d7e
//------------------
Packit 1c1d7e
Packit 1c1d7e
class DocbookSectionMapper : public QIntDict<char>
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    DocbookSectionMapper() : QIntDict<char>(47)
Packit 1c1d7e
  {
Packit 1c1d7e
    insert(MemberListType_pubTypes,"public-type");
Packit 1c1d7e
    insert(MemberListType_pubMethods,"public-func");
Packit 1c1d7e
    insert(MemberListType_pubAttribs,"public-attrib");
Packit 1c1d7e
    insert(MemberListType_pubSlots,"public-slot");
Packit 1c1d7e
    insert(MemberListType_signals,"signal");
Packit 1c1d7e
    insert(MemberListType_dcopMethods,"dcop-func");
Packit 1c1d7e
    insert(MemberListType_properties,"property");
Packit 1c1d7e
    insert(MemberListType_events,"event");
Packit 1c1d7e
    insert(MemberListType_pubStaticMethods,"public-static-func");
Packit 1c1d7e
    insert(MemberListType_pubStaticAttribs,"public-static-attrib");
Packit 1c1d7e
    insert(MemberListType_proTypes,"protected-type");
Packit 1c1d7e
    insert(MemberListType_proMethods,"protected-func");
Packit 1c1d7e
    insert(MemberListType_proAttribs,"protected-attrib");
Packit 1c1d7e
    insert(MemberListType_proSlots,"protected-slot");
Packit 1c1d7e
    insert(MemberListType_proStaticMethods,"protected-static-func");
Packit 1c1d7e
    insert(MemberListType_proStaticAttribs,"protected-static-attrib");
Packit 1c1d7e
    insert(MemberListType_pacTypes,"package-type");
Packit 1c1d7e
    insert(MemberListType_pacMethods,"package-func");
Packit 1c1d7e
    insert(MemberListType_pacAttribs,"package-attrib");
Packit 1c1d7e
    insert(MemberListType_pacStaticMethods,"package-static-func");
Packit 1c1d7e
    insert(MemberListType_pacStaticAttribs,"package-static-attrib");
Packit 1c1d7e
    insert(MemberListType_priTypes,"private-type");
Packit 1c1d7e
    insert(MemberListType_priMethods,"private-func");
Packit 1c1d7e
    insert(MemberListType_priAttribs,"private-attrib");
Packit 1c1d7e
    insert(MemberListType_priSlots,"private-slot");
Packit 1c1d7e
    insert(MemberListType_priStaticMethods,"private-static-func");
Packit 1c1d7e
    insert(MemberListType_priStaticAttribs,"private-static-attrib");
Packit 1c1d7e
    insert(MemberListType_friends,"friend");
Packit 1c1d7e
    insert(MemberListType_related,"related");
Packit 1c1d7e
    insert(MemberListType_decDefineMembers,"define");
Packit 1c1d7e
    insert(MemberListType_decProtoMembers,"prototype");
Packit 1c1d7e
    insert(MemberListType_decTypedefMembers,"typedef");
Packit 1c1d7e
    insert(MemberListType_decEnumMembers,"enum");
Packit 1c1d7e
    insert(MemberListType_decFuncMembers,"func");
Packit 1c1d7e
    insert(MemberListType_decVarMembers,"var");
Packit 1c1d7e
  }
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
static DocbookSectionMapper g_docbookSectionMapper;
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
inline void writeDocbookString(FTextStream &t,const char *s)
Packit 1c1d7e
{
Packit 1c1d7e
  t << convertToXML(s);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
inline void writeDocbookCodeString(FTextStream &t,const char *s, int &col)
Packit 1c1d7e
{
Packit 1c1d7e
  char c;
Packit 1c1d7e
  while ((c=*s++))
Packit 1c1d7e
  {
Packit 1c1d7e
    switch(c)
Packit 1c1d7e
    {
Packit 1c1d7e
      case '\t':
Packit 1c1d7e
        {
Packit 1c1d7e
          static int tabSize = Config_getInt(TAB_SIZE);
Packit 1c1d7e
          int spacesToNextTabStop = tabSize - (col%tabSize);
Packit 1c1d7e
          col+=spacesToNextTabStop;
Packit 1c1d7e
          while (spacesToNextTabStop--) t << " ";
Packit 1c1d7e
          break;
Packit 1c1d7e
        }
Packit 1c1d7e
      case ' ':  t << " "; col++;  break;
Packit 1c1d7e
      case '<':  t << "<"; col++;   break;
Packit 1c1d7e
      case '>':  t << ">"; col++;   break;
Packit 1c1d7e
      case '&':  t << "&"; col++;  break;
Packit 1c1d7e
      case '\'': t << "'"; col++; break;
Packit 1c1d7e
      case '"':  t << """; col++; break;
Packit 1c1d7e
      default:   t << c; col++;        break;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeDocbookHeaderMainpage(FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  t << "" << endl;;
Packit 1c1d7e
  t << "<chapter xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeDocbookHeader_ID(FTextStream &t, QCString id)
Packit 1c1d7e
{
Packit 1c1d7e
  t << "" << endl;;
Packit 1c1d7e
  t << "<section xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:id=\"" << id << "\">" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void writeDocbookLink(FTextStream &t,const char * /*extRef*/,const char *compoundId,
Packit 1c1d7e
    const char *anchorId,const char * text,const char * /*tooltip*/)
Packit 1c1d7e
{
Packit 1c1d7e
  t << "
Packit 1c1d7e
  if (anchorId) t << "_1" << anchorId;
Packit 1c1d7e
  t << "\"";
Packit 1c1d7e
  t << ">";
Packit 1c1d7e
  writeDocbookString(t,text);
Packit 1c1d7e
  t << "</link>";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
class TextGeneratorDocbookImpl : public TextGeneratorIntf
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    TextGeneratorDocbookImpl(FTextStream &t): m_t(t) {}
Packit 1c1d7e
    void writeString(const char *s,bool /*keepSpaces*/) const
Packit 1c1d7e
    {
Packit 1c1d7e
      writeDocbookString(m_t,s);
Packit 1c1d7e
    }
Packit 1c1d7e
    void writeBreak(int) const {}
Packit 1c1d7e
    void writeLink(const char *extRef,const char *file,
Packit 1c1d7e
        const char *anchor,const char *text
Packit 1c1d7e
        ) const
Packit 1c1d7e
    {
Packit 1c1d7e
      writeDocbookLink(m_t,extRef,file,anchor,text,0);
Packit 1c1d7e
    }
Packit 1c1d7e
  private:
Packit 1c1d7e
    FTextStream &m_;;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
class DocbookCodeGenerator : public CodeOutputInterface
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    DocbookCodeGenerator(FTextStream &t) : m_t(t), m_lineNumber(-1), m_col(0),
Packit 1c1d7e
    m_insideCodeLine(FALSE), m_insideSpecialHL(FALSE) {}
Packit 1c1d7e
    virtual ~DocbookCodeGenerator() {}
Packit 1c1d7e
Packit 1c1d7e
    void codify(const char *text)
Packit 1c1d7e
    {
Packit 1c1d7e
      Docbook_DB(("(codify \"%s\")\n",text));
Packit 1c1d7e
      writeDocbookCodeString(m_t,text,m_col);
Packit 1c1d7e
    }
Packit 1c1d7e
    void writeCodeLink(const char *ref,const char *file,
Packit 1c1d7e
        const char *anchor,const char *name,
Packit 1c1d7e
        const char *tooltip)
Packit 1c1d7e
    {
Packit 1c1d7e
      Docbook_DB(("(writeCodeLink)\n"));
Packit 1c1d7e
      writeDocbookLink(m_t,ref,file,anchor,name,tooltip);
Packit 1c1d7e
      m_col+=strlen(name);
Packit 1c1d7e
    }
Packit 1c1d7e
    void writeTooltip(const char *, const DocLinkInfo &, const char *,
Packit 1c1d7e
                      const char *, const SourceLinkInfo &, const SourceLinkInfo &
Packit 1c1d7e
                     )
Packit 1c1d7e
    {
Packit 1c1d7e
      Docbook_DB(("(writeToolTip)\n"));
Packit 1c1d7e
    }
Packit 1c1d7e
    void startCodeLine(bool)
Packit 1c1d7e
    {
Packit 1c1d7e
      Docbook_DB(("(startCodeLine)\n"));
Packit 1c1d7e
      if (m_lineNumber!=-1)
Packit 1c1d7e
      {
Packit 1c1d7e
        if (!m_refId.isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          m_t << "<link linkend=\"" << m_refId << "\">";
Packit 1c1d7e
        }
Packit 1c1d7e
        m_t << m_lineNumber << " ";
Packit 1c1d7e
        if (!m_refId.isEmpty())
Packit 1c1d7e
        {
Packit 1c1d7e
          m_t << "</link>";
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
      m_insideCodeLine=TRUE;
Packit 1c1d7e
      m_col=0;
Packit 1c1d7e
    }
Packit 1c1d7e
    void endCodeLine()
Packit 1c1d7e
    {
Packit 1c1d7e
      m_t << endl;
Packit 1c1d7e
      Docbook_DB(("(endCodeLine)\n"));
Packit 1c1d7e
      m_lineNumber = -1;
Packit 1c1d7e
      m_refId.resize(0);
Packit 1c1d7e
      m_external.resize(0);
Packit 1c1d7e
      m_insideCodeLine=FALSE;
Packit 1c1d7e
    }
Packit 1c1d7e
    void startFontClass(const char *colorClass)
Packit 1c1d7e
    {
Packit 1c1d7e
      Docbook_DB(("(startFontClass)\n"));
Packit 1c1d7e
      m_t << "<emphasis class=\"" << colorClass << "\">";
Packit 1c1d7e
      m_insideSpecialHL=TRUE;
Packit 1c1d7e
    }
Packit 1c1d7e
    void endFontClass()
Packit 1c1d7e
    {
Packit 1c1d7e
      Docbook_DB(("(endFontClass)\n"));
Packit 1c1d7e
      m_t << "</emphasis>"; // non DocBook
Packit 1c1d7e
      m_insideSpecialHL=FALSE;
Packit 1c1d7e
    }
Packit 1c1d7e
    void writeCodeAnchor(const char *)
Packit 1c1d7e
    {
Packit 1c1d7e
      Docbook_DB(("(writeCodeAnchor)\n"));
Packit 1c1d7e
    }
Packit 1c1d7e
    void writeLineNumber(const char *extRef,const char *compId,
Packit 1c1d7e
        const char *anchorId,int l)
Packit 1c1d7e
    {
Packit 1c1d7e
      Docbook_DB(("(writeLineNumber)\n"));
Packit 1c1d7e
      // we remember the information provided here to use it
Packit 1c1d7e
      // at the <codeline> start tag.
Packit 1c1d7e
      m_lineNumber = l;
Packit 1c1d7e
      if (compId)
Packit 1c1d7e
      {
Packit 1c1d7e
        m_refId=compId;
Packit 1c1d7e
        if (anchorId) m_refId+=(QCString)"_1"+anchorId;
Packit 1c1d7e
        if (extRef) m_external=extRef;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    void setCurrentDoc(Definition *,const char *,bool)
Packit 1c1d7e
    {
Packit 1c1d7e
    }
Packit 1c1d7e
    void addWord(const char *,bool)
Packit 1c1d7e
    {
Packit 1c1d7e
    }
Packit 1c1d7e
    void finish()
Packit 1c1d7e
    {
Packit 1c1d7e
      if (m_insideCodeLine) endCodeLine();
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
  private:
Packit 1c1d7e
    FTextStream &m_;;
Packit 1c1d7e
    QCString m_refId;
Packit 1c1d7e
    QCString m_external;
Packit 1c1d7e
    int m_lineNumber;
Packit 1c1d7e
    int m_col;
Packit 1c1d7e
    bool m_insideCodeLine;
Packit 1c1d7e
    bool m_insideSpecialHL;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static void writeTemplateArgumentList(ArgumentList *al,
Packit 1c1d7e
    FTextStream &t,
Packit 1c1d7e
    Definition *scope,
Packit 1c1d7e
    FileDef *fileScope,
Packit 1c1d7e
    int indent)
Packit 1c1d7e
{
Packit 1c1d7e
  QCString indentStr;
Packit 1c1d7e
  indentStr.fill(' ',indent);
Packit 1c1d7e
  if (al)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << indentStr << "<templateparamlist>" << endl;
Packit 1c1d7e
    ArgumentListIterator ali(*al);
Packit 1c1d7e
    Argument *a;
Packit 1c1d7e
    for (ali.toFirst();(a=ali.current());++ali)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << indentStr << "  <param>" << endl;
Packit 1c1d7e
      if (!a->type.isEmpty())
Packit 1c1d7e
      {
Packit 1c1d7e
        t << indentStr <<  "    <type>";
Packit 1c1d7e
        linkifyText(TextGeneratorDocbookImpl(t),scope,fileScope,0,a->type);
Packit 1c1d7e
        t << "</type>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
      if (!a->name.isEmpty())
Packit 1c1d7e
      {
Packit 1c1d7e
        t << indentStr <<  "    <declname>" << a->name << "</declname>" << endl;
Packit 1c1d7e
        t << indentStr <<  "    <defname>" << a->name << "</defname>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
      if (!a->defval.isEmpty())
Packit 1c1d7e
      {
Packit 1c1d7e
        t << indentStr << "    <defval>";
Packit 1c1d7e
        linkifyText(TextGeneratorDocbookImpl(t),scope,fileScope,0,a->defval);
Packit 1c1d7e
        t << "</defval>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
      t << indentStr << "  </param>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
    t << indentStr << "</templateparamlist>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeTemplateList(ClassDef *cd,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  writeTemplateArgumentList(cd->templateArguments(),t,cd,0,4);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeDocbookDocBlock(FTextStream &t,
Packit 1c1d7e
    const QCString &fileName,
Packit 1c1d7e
    int lineNr,
Packit 1c1d7e
    Definition *scope,
Packit 1c1d7e
    MemberDef * md,
Packit 1c1d7e
    const QCString &text)
Packit 1c1d7e
{
Packit 1c1d7e
  QCString stext = text.stripWhiteSpace();
Packit 1c1d7e
  if (stext.isEmpty()) return;
Packit 1c1d7e
  // convert the documentation string into an abstract syntax tree
Packit 1c1d7e
  DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text,FALSE,FALSE);
Packit 1c1d7e
  // create a code generator
Packit 1c1d7e
  DocbookCodeGenerator *docbookCodeGen = new DocbookCodeGenerator(t);
Packit 1c1d7e
  // create a parse tree visitor for Docbook
Packit 1c1d7e
  DocbookDocVisitor *visitor = new DocbookDocVisitor(t,*docbookCodeGen);
Packit 1c1d7e
  // visit all nodes
Packit 1c1d7e
  root->accept(visitor);
Packit 1c1d7e
  // clean up
Packit 1c1d7e
  delete visitor;
Packit 1c1d7e
  delete docbookCodeGen;
Packit 1c1d7e
  delete root;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void writeDocbookCodeBlock(FTextStream &t,FileDef *fd)
Packit 1c1d7e
{
Packit 1c1d7e
  ParserInterface *pIntf=Doxygen::parserManager->getParser(fd->getDefFileExtension());
Packit 1c1d7e
  SrcLangExt langExt = getLanguageFromFileName(fd->getDefFileExtension());
Packit 1c1d7e
  pIntf->resetCodeParserState();
Packit 1c1d7e
  DocbookCodeGenerator *docbookGen = new DocbookCodeGenerator(t);
Packit 1c1d7e
  pIntf->parseCode(*docbookGen,  // codeOutIntf
Packit 1c1d7e
      0,           // scopeName
Packit 1c1d7e
      fileToString(fd->absFilePath(),Config_getBool(FILTER_SOURCE_FILES)),
Packit 1c1d7e
      langExt,     // lang
Packit 1c1d7e
      FALSE,       // isExampleBlock
Packit 1c1d7e
      0,           // exampleName
Packit 1c1d7e
      fd,          // fileDef
Packit 1c1d7e
      -1,          // startLine
Packit 1c1d7e
      -1,          // endLine
Packit 1c1d7e
      FALSE,       // inlineFragement
Packit 1c1d7e
      0,           // memberDef
Packit 1c1d7e
      TRUE         // showLineNumbers
Packit 1c1d7e
      );
Packit 1c1d7e
  docbookGen->finish();
Packit 1c1d7e
  delete docbookGen;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QCString classOutputFileBase(ClassDef *cd)
Packit 1c1d7e
{
Packit 1c1d7e
  //static bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
Packit 1c1d7e
  //if (inlineGroupedClasses && cd->partOfGroups()!=0)
Packit 1c1d7e
  return cd->getOutputFileBase();
Packit 1c1d7e
  //else
Packit 1c1d7e
  //  return cd->getOutputFileBase();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QCString memberOutputFileBase(MemberDef *md)
Packit 1c1d7e
{
Packit 1c1d7e
  //static bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
Packit 1c1d7e
  //if (inlineGroupedClasses && md->getClassDef() && md->getClassDef()->partOfGroups()!=0)
Packit 1c1d7e
  //  return md->getClassDef()->getDocbookOutputFileBase();
Packit 1c1d7e
  //else
Packit 1c1d7e
  //  return md->getOutputFileBase();
Packit 1c1d7e
  return md->getOutputFileBase();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *def, bool detailed=0)
Packit 1c1d7e
{
Packit 1c1d7e
Packit 1c1d7e
  // + declaration/definition arg lists
Packit 1c1d7e
  // + reimplements
Packit 1c1d7e
  // + reimplementedBy
Packit 1c1d7e
  // + exceptions
Packit 1c1d7e
  // + const/volatile specifiers
Packit 1c1d7e
  // - examples
Packit 1c1d7e
  // + source definition
Packit 1c1d7e
  // + source references
Packit 1c1d7e
  // + source referenced by
Packit 1c1d7e
  // - body code
Packit 1c1d7e
  // + template arguments
Packit 1c1d7e
  //     (templateArguments(), definitionTemplateParameterLists())
Packit 1c1d7e
  // - call graph
Packit 1c1d7e
Packit 1c1d7e
  // enum values are written as part of the enum
Packit 1c1d7e
  if (md->memberType()==MemberType_EnumValue) return;
Packit 1c1d7e
  if (md->isHidden()) return;
Packit 1c1d7e
  //if (md->name().at(0)=='@') return; // anonymous member
Packit 1c1d7e
Packit 1c1d7e
  // group members are only visible in their group
Packit 1c1d7e
  //if (def->definitionType()!=Definition::TypeGroup && md->getGroupDef()) return;
Packit 1c1d7e
  QCString memType;
Packit 1c1d7e
  switch (md->memberType())
Packit 1c1d7e
  {
Packit 1c1d7e
    case MemberType_Define:      memType="define";    break;
Packit 1c1d7e
    case MemberType_Function:    memType="function";  break;
Packit 1c1d7e
    case MemberType_Variable:    memType="variable";  break;
Packit 1c1d7e
    case MemberType_Typedef:     memType="typedef";   break;
Packit 1c1d7e
    case MemberType_Enumeration: memType="enum";      break;
Packit 1c1d7e
    case MemberType_EnumValue:   ASSERT(0);           break;
Packit 1c1d7e
    case MemberType_Signal:      memType="signal";    break;
Packit 1c1d7e
    case MemberType_Slot:        memType="slot";      break;
Packit 1c1d7e
    case MemberType_Friend:      memType="friend";    break;
Packit 1c1d7e
    case MemberType_DCOP:        memType="dcop";      break;
Packit 1c1d7e
    case MemberType_Property:    memType="property";  break;
Packit 1c1d7e
    case MemberType_Event:       memType="event";     break;
Packit 1c1d7e
    case MemberType_Interface:   memType="interface"; break;
Packit 1c1d7e
    case MemberType_Service:     memType="service";   break;
Packit 1c1d7e
  }
Packit 1c1d7e
  QCString scopeName;
Packit 1c1d7e
  if (md->getClassDef())
Packit 1c1d7e
  {
Packit 1c1d7e
    scopeName=md->getClassDef()->name();
Packit 1c1d7e
  }
Packit 1c1d7e
  else if (md->getNamespaceDef())
Packit 1c1d7e
  {
Packit 1c1d7e
    scopeName=md->getNamespaceDef()->name();
Packit 1c1d7e
  }
Packit 1c1d7e
  if (detailed==0) 
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "            <para>" << endl;
Packit 1c1d7e
    t << "                <itemizedlist>" << endl;
Packit 1c1d7e
    t << "                    <listitem>" << endl;
Packit 1c1d7e
    //enum
Packit 1c1d7e
    bool closePara=TRUE;
Packit 1c1d7e
    if (md->memberType()==MemberType_Enumeration) 
Packit 1c1d7e
    {
Packit 1c1d7e
      MemberList *enumFields = md->enumFieldList();
Packit 1c1d7e
      t << "                            <para><literallayout>" << memType << " 
Packit 1c1d7e
      if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
Packit 1c1d7e
      {
Packit 1c1d7e
        t << md->getGroupDef()->getOutputFileBase();
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        t << memberOutputFileBase(md);
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
Packit 1c1d7e
      if (enumFields!=0) 
Packit 1c1d7e
      {
Packit 1c1d7e
        MemberListIterator emli(*enumFields);
Packit 1c1d7e
        MemberDef *emd;
Packit 1c1d7e
        t << " {" << endl;
Packit 1c1d7e
        int cnt=0;
Packit 1c1d7e
        for (emli.toFirst();(emd=emli.current());++emli) 
Packit 1c1d7e
        {
Packit 1c1d7e
          if (cnt!=0) 
Packit 1c1d7e
          {
Packit 1c1d7e
            t << "," << endl;
Packit 1c1d7e
          }
Packit 1c1d7e
          t << "<link linkend=\"" << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">";
Packit 1c1d7e
          writeDocbookString(t,emd->name());
Packit 1c1d7e
          t << "</link>";
Packit 1c1d7e
          if (!emd->initializer().isEmpty()) 
Packit 1c1d7e
          {
Packit 1c1d7e
            writeDocbookString(t,emd->initializer());
Packit 1c1d7e
          }
Packit 1c1d7e
          cnt++;
Packit 1c1d7e
        }
Packit 1c1d7e
        t << endl << "}";
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "</literallayout>" << endl;
Packit 1c1d7e
      if (md->briefDescription())
Packit 1c1d7e
      {
Packit 1c1d7e
          t << "<para><emphasis>";
Packit 1c1d7e
          writeDocbookString(t,md->briefDescription());
Packit 1c1d7e
          t << "</emphasis></para>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else if (md->memberType()==MemberType_Define) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "                            <para>" << "#" << memType << " 
Packit 1c1d7e
      if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
Packit 1c1d7e
      {
Packit 1c1d7e
        t << md->getGroupDef()->getOutputFileBase();
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        t << memberOutputFileBase(md);
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
Packit 1c1d7e
      if (!md->initializer().isEmpty() && md->initializer().length()<2000) 
Packit 1c1d7e
      {
Packit 1c1d7e
        t << " ";
Packit 1c1d7e
        linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->initializer());
Packit 1c1d7e
      }
Packit 1c1d7e
      if (md->briefDescription()) 
Packit 1c1d7e
      {
Packit 1c1d7e
        t << "<para><emphasis>";
Packit 1c1d7e
        writeDocbookString(t,md->briefDescription());
Packit 1c1d7e
        t << "</emphasis></para>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else if (md->memberType()==MemberType_Variable) 
Packit 1c1d7e
    {
Packit 1c1d7e
      if (md->getClassDef()) 
Packit 1c1d7e
      {
Packit 1c1d7e
        t << "                        <para>" << convertToXML(md->declaration());
Packit 1c1d7e
        if (md->briefDescription()) 
Packit 1c1d7e
        {
Packit 1c1d7e
          t << "<para><emphasis>";
Packit 1c1d7e
          writeDocbookString(t,md->briefDescription());
Packit 1c1d7e
          t << "</emphasis></para>";
Packit 1c1d7e
        }
Packit 1c1d7e
      } 
Packit 1c1d7e
      else 
Packit 1c1d7e
      {
Packit 1c1d7e
        t << "                        <para>";
Packit 1c1d7e
        linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
Packit 1c1d7e
        t << " 
Packit 1c1d7e
        if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
Packit 1c1d7e
        {
Packit 1c1d7e
          t << md->getGroupDef()->getOutputFileBase();
Packit 1c1d7e
        }
Packit 1c1d7e
        else
Packit 1c1d7e
        {
Packit 1c1d7e
          t << memberOutputFileBase(md);
Packit 1c1d7e
        }
Packit 1c1d7e
        t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
Packit 1c1d7e
        if (md->briefDescription())
Packit 1c1d7e
        {
Packit 1c1d7e
            t << "<para><emphasis>";
Packit 1c1d7e
            writeDocbookString(t,md->briefDescription());
Packit 1c1d7e
            t << "</emphasis></para>" << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else if (md->memberType()==MemberType_Typedef) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "                            <para>" << memType;
Packit 1c1d7e
      t << " ";
Packit 1c1d7e
      linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
Packit 1c1d7e
      t << " ";
Packit 1c1d7e
      t << " 
Packit 1c1d7e
      if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
Packit 1c1d7e
      {
Packit 1c1d7e
        t << md->getGroupDef()->getOutputFileBase();
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        t << memberOutputFileBase(md);
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
Packit 1c1d7e
      if (md->briefDescription())
Packit 1c1d7e
      {
Packit 1c1d7e
          t << "<para><emphasis>";
Packit 1c1d7e
          writeDocbookString(t,md->briefDescription());
Packit 1c1d7e
          t << "</emphasis></para>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else if (md->memberType()==MemberType_Function) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "                        <para>";
Packit 1c1d7e
      linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
Packit 1c1d7e
      t << " 
Packit 1c1d7e
      if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
Packit 1c1d7e
      {
Packit 1c1d7e
        t << md->getGroupDef()->getOutputFileBase();
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        t << memberOutputFileBase(md);
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
Packit 1c1d7e
      t << " (" << endl;
Packit 1c1d7e
      ArgumentList *declAl = md->declArgumentList();
Packit 1c1d7e
      if (declAl && declAl->count()>0)
Packit 1c1d7e
      {
Packit 1c1d7e
        ArgumentListIterator declAli(*declAl);
Packit 1c1d7e
        Argument *a;
Packit 1c1d7e
        int cnt=0;
Packit 1c1d7e
        for (declAli.toFirst();(a=declAli.current());++declAli)
Packit 1c1d7e
        {
Packit 1c1d7e
          if (cnt!=0) 
Packit 1c1d7e
          {
Packit 1c1d7e
            t << ", ";
Packit 1c1d7e
          }
Packit 1c1d7e
          if (!a->type.isEmpty())
Packit 1c1d7e
          {
Packit 1c1d7e
            linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,a->type);
Packit 1c1d7e
          }
Packit 1c1d7e
          t << " ";
Packit 1c1d7e
          if (!a->name.isEmpty())
Packit 1c1d7e
          {
Packit 1c1d7e
            writeDocbookString(t,a->name);
Packit 1c1d7e
          }
Packit 1c1d7e
          cnt++;
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
      t << ")";
Packit 1c1d7e
      if (md->briefDescription())
Packit 1c1d7e
      {
Packit 1c1d7e
          t << "<para><emphasis>";
Packit 1c1d7e
          writeDocbookString(t,md->briefDescription());
Packit 1c1d7e
          t << "</emphasis></para>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      closePara = FALSE;
Packit 1c1d7e
    }
Packit 1c1d7e
    if (closePara) t << "</para>" << endl;
Packit 1c1d7e
    t << "                    </listitem>" << endl;
Packit 1c1d7e
    t << "                </itemizedlist>" << endl;
Packit 1c1d7e
    t << "            </para>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    if (md->memberType()==MemberType_Enumeration)
Packit 1c1d7e
    {
Packit 1c1d7e
      MemberList *enumFields = md->enumFieldList();
Packit 1c1d7e
      t << "            
Packit 1c1d7e
      if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
Packit 1c1d7e
      {
Packit 1c1d7e
        t << md->getGroupDef()->getOutputFileBase();
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        t << memberOutputFileBase(md);
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "_1" << md->anchor() << "\">" << endl;
Packit 1c1d7e
      t << "               <title>" << memType << " " << convertToXML(md->name()) << " " << "</title>" << endl;
Packit 1c1d7e
      t << "               ";
Packit 1c1d7e
      writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
Packit 1c1d7e
      t << endl;
Packit 1c1d7e
      if (enumFields!=0) 
Packit 1c1d7e
      {
Packit 1c1d7e
        MemberListIterator emli(*enumFields);
Packit 1c1d7e
        MemberDef *emd;
Packit 1c1d7e
        t << "               <formalpara>" << endl;
Packit 1c1d7e
        t << "                    <title>" << theTranslator->trEnumerationValues() << ":</title>" << endl;
Packit 1c1d7e
        t << "                    <variablelist>" << endl;
Packit 1c1d7e
        for (emli.toFirst();(emd=emli.current());++emli) 
Packit 1c1d7e
        {
Packit 1c1d7e
          t << "                        
Packit 1c1d7e
          t << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">" << endl;
Packit 1c1d7e
          t << "                            <term>";
Packit 1c1d7e
          writeDocbookString(t,emd->name());
Packit 1c1d7e
          t << "</term>" << endl;
Packit 1c1d7e
          t << "                            <listitem>" << endl;
Packit 1c1d7e
          if(Config_getBool(REPEAT_BRIEF))
Packit 1c1d7e
          {
Packit 1c1d7e
              t << "                                <para>";
Packit 1c1d7e
              writeDocbookString(t,emd->briefDescription());
Packit 1c1d7e
              t << "</para>" << endl;
Packit 1c1d7e
          }
Packit 1c1d7e
          t << "                            </listitem>" << endl;
Packit 1c1d7e
          t << "                        </varlistentry>" << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        t << "                     </variablelist>" << endl;
Packit 1c1d7e
        t << "                </formalpara>" << endl;
Packit 1c1d7e
        t << "                <para>";
Packit 1c1d7e
        t << "Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << endl;
Packit 1c1d7e
        t << "                    <computeroutput><literallayout>" << endl;
Packit 1c1d7e
        t << "{" << endl;
Packit 1c1d7e
        for (emli.toFirst();(emd=emli.current());++emli) 
Packit 1c1d7e
        {
Packit 1c1d7e
          writeDocbookString(t,emd->name());
Packit 1c1d7e
          if (!emd->initializer().isEmpty()) 
Packit 1c1d7e
          {
Packit 1c1d7e
            writeDocbookString(t,emd->initializer());
Packit 1c1d7e
          }
Packit 1c1d7e
          t << ", " << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        t << "}" << convertToXML(md->name()) << ";" << endl;
Packit 1c1d7e
        t << "                    </literallayout></computeroutput>" << endl;
Packit 1c1d7e
        t << "                </para>" << endl;
Packit 1c1d7e
        t << "            </section>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else if (md->memberType()==MemberType_Typedef) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "            
Packit 1c1d7e
      if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
Packit 1c1d7e
      {
Packit 1c1d7e
        t << md->getGroupDef()->getOutputFileBase();
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        t << memberOutputFileBase(md);
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "_1" << md->anchor() << "\">" << endl;
Packit 1c1d7e
      t << "                <title>" << convertToXML(md->definition()) << "</title>";
Packit 1c1d7e
      if(Config_getBool(REPEAT_BRIEF))
Packit 1c1d7e
      {
Packit 1c1d7e
          t << " <emphasis>";
Packit 1c1d7e
          writeDocbookString(t,md->briefDescription());
Packit 1c1d7e
          t << "</emphasis>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "                ";
Packit 1c1d7e
      writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
Packit 1c1d7e
      t << endl;
Packit 1c1d7e
      t << "            </section>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
    else if (md->memberType()==MemberType_Function) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "            
Packit 1c1d7e
      if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
Packit 1c1d7e
      {
Packit 1c1d7e
        t << md->getGroupDef()->getOutputFileBase();
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        t << memberOutputFileBase(md);
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "_1" << md->anchor() << "\">" << endl;
Packit 1c1d7e
      t << "                <title>" << convertToXML(md->definition()) << " " << convertToXML(md->argsString()) << "</title>";
Packit 1c1d7e
      if(Config_getBool(REPEAT_BRIEF))
Packit 1c1d7e
      {
Packit 1c1d7e
          t << " <emphasis>";
Packit 1c1d7e
          writeDocbookString(t,md->briefDescription());
Packit 1c1d7e
          t << "</emphasis>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "                ";
Packit 1c1d7e
      writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
Packit 1c1d7e
      t << endl;
Packit 1c1d7e
      t << "            </section>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
    else if (md->memberType()==MemberType_Define) 
Packit 1c1d7e
    {
Packit 1c1d7e
      if (md->documentation()) 
Packit 1c1d7e
      {
Packit 1c1d7e
        t << "            
Packit 1c1d7e
        if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
Packit 1c1d7e
        {
Packit 1c1d7e
          t << md->getGroupDef()->getOutputFileBase();
Packit 1c1d7e
        }
Packit 1c1d7e
        else
Packit 1c1d7e
        {
Packit 1c1d7e
          t << memberOutputFileBase(md);
Packit 1c1d7e
        }
Packit 1c1d7e
        t << "_1" << md->anchor() << "\">" << endl;
Packit 1c1d7e
        t << "                <title>" << convertToXML(md->definition()) << "</title>";
Packit 1c1d7e
        t << "                ";
Packit 1c1d7e
        writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
Packit 1c1d7e
        t << endl;
Packit 1c1d7e
        t << "                <para>Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << "</para>" << endl;
Packit 1c1d7e
        t << "                <para>The Documentation for this define was generated from the following file: </para>" << endl;
Packit 1c1d7e
        t << "                <para><itemizedlist><listitem><para>" << stripPath(md->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
Packit 1c1d7e
        t << "            </section>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else if (md->memberType()==MemberType_Variable) 
Packit 1c1d7e
    {
Packit 1c1d7e
      if (md->getClassDef()) 
Packit 1c1d7e
      {
Packit 1c1d7e
        if (md->documentation()) 
Packit 1c1d7e
        {
Packit 1c1d7e
          t << "            <simplesect>" << endl;
Packit 1c1d7e
          t << "                <title>" << convertToXML(md->definition()) << "</title>";
Packit 1c1d7e
          t << "                ";
Packit 1c1d7e
          writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
Packit 1c1d7e
          t << endl;
Packit 1c1d7e
          t << "                <para>Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << "</para>" << endl;
Packit 1c1d7e
          t << "                <para>The Documentation for this struct was generated from the following file: </para>" << endl;
Packit 1c1d7e
          t << "                <para><itemizedlist><listitem><para>" << stripPath(md->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
Packit 1c1d7e
          t << "            </simplesect>" << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
      else 
Packit 1c1d7e
      {
Packit 1c1d7e
        t << "            
Packit 1c1d7e
        if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
Packit 1c1d7e
        {
Packit 1c1d7e
          t << md->getGroupDef()->getOutputFileBase();
Packit 1c1d7e
        }
Packit 1c1d7e
        else
Packit 1c1d7e
        {
Packit 1c1d7e
          t << memberOutputFileBase(md);
Packit 1c1d7e
        }
Packit 1c1d7e
        t << "_1" << md->anchor() << "\">" << endl;
Packit 1c1d7e
        t << "                <title>" << convertToXML(md->definition()) << "</title>";
Packit 1c1d7e
        if(Config_getBool(REPEAT_BRIEF))
Packit 1c1d7e
        {
Packit 1c1d7e
            t << " <emphasis>";
Packit 1c1d7e
            writeDocbookString(t,md->briefDescription());
Packit 1c1d7e
            t << "</emphasis>" << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        t << "                ";
Packit 1c1d7e
        writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
Packit 1c1d7e
        t << endl;
Packit 1c1d7e
        t << "            </section>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void generateDocbookSection(Definition *d,FTextStream &t,MemberList *ml,const char *,
Packit 1c1d7e
    bool detailed=0, const char *header=0,const char *documentation=0)
Packit 1c1d7e
{
Packit 1c1d7e
  if (ml==0) return;
Packit 1c1d7e
  MemberListIterator mli(*ml);
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
  int count=0;
Packit 1c1d7e
  int doc_count=0;
Packit 1c1d7e
  QCString title, desctitle;
Packit 1c1d7e
Packit 1c1d7e
  for (mli.toFirst();(md=mli.current());++mli) 
Packit 1c1d7e
  {
Packit 1c1d7e
    // namespace members are also inserted in the file scope, but
Packit 1c1d7e
    // to prevent this duplication in the Docbook output, we filter those here.
Packit 1c1d7e
    if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0) 
Packit 1c1d7e
    {
Packit 1c1d7e
      count++;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  
Packit 1c1d7e
  if (count==0) return; // empty list
Packit 1c1d7e
Packit 1c1d7e
  switch (ml->listType())
Packit 1c1d7e
  {
Packit 1c1d7e
    case MemberListType_decDefineMembers:  title=theTranslator->trDefines();             desctitle=theTranslator->trDefineDocumentation();            break;
Packit 1c1d7e
    case MemberListType_decTypedefMembers: title=theTranslator->trTypedefs();            desctitle=theTranslator->trTypedefDocumentation();           break;
Packit 1c1d7e
    case MemberListType_decEnumMembers:    title=theTranslator->trEnumerations();        desctitle=theTranslator->trEnumerationTypeDocumentation();   break;
Packit 1c1d7e
    case MemberListType_decFuncMembers:    title=theTranslator->trFunctions();           desctitle=theTranslator->trFunctionDocumentation();          break;
Packit 1c1d7e
    case MemberListType_decVarMembers:     title=theTranslator->trVariables();           desctitle=theTranslator->trVariableDocumentation();          break;
Packit 1c1d7e
    case MemberListType_pubAttribs:        title=theTranslator->trPublicAttribs();       desctitle=theTranslator->trMemberDataDocumentation();        break;
Packit 1c1d7e
    case MemberListType_priAttribs:        title=theTranslator->trPrivateAttribs();      desctitle=theTranslator->trMemberDataDocumentation();        break;
Packit 1c1d7e
    case MemberListType_proAttribs:        title=theTranslator->trProtectedAttribs();    desctitle=theTranslator->trMemberDataDocumentation();        break;
Packit 1c1d7e
    default:                               title="";                    desctitle="";                                  break;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (detailed) 
Packit 1c1d7e
  {
Packit 1c1d7e
    for (mli.toFirst();(md=mli.current());++mli)
Packit 1c1d7e
    {
Packit 1c1d7e
        if (md->documentation().isEmpty() && !Config_getBool(REPEAT_BRIEF))
Packit 1c1d7e
        {
Packit 1c1d7e
            continue;
Packit 1c1d7e
        }
Packit 1c1d7e
        doc_count = 1;
Packit 1c1d7e
        break;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    if(doc_count == 0)
Packit 1c1d7e
    {
Packit 1c1d7e
        return;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    if (desctitle)
Packit 1c1d7e
    {
Packit 1c1d7e
        t << "        <section>" << endl;
Packit 1c1d7e
        t << "            <title>" << desctitle << "</title>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  } else 
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "        <section>" << endl;
Packit 1c1d7e
    if (header) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "            <title>" << convertToXML(header) << "</title>" << endl;
Packit 1c1d7e
    } 
Packit 1c1d7e
    else 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "            <title>" << title << "</title>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (documentation) 
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "      <description>";
Packit 1c1d7e
    writeDocbookDocBlock(t,d->docFile(),d->docLine(),d,0,documentation);
Packit 1c1d7e
    t << "</description>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  for (mli.toFirst();(md=mli.current());++mli) 
Packit 1c1d7e
  {
Packit 1c1d7e
    // namespace members are also inserted in the file scope, but
Packit 1c1d7e
    // to prevent this duplication in the Docbook output, we filter those here.
Packit 1c1d7e
    if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0) 
Packit 1c1d7e
    {
Packit 1c1d7e
        if (detailed && md->documentation().isEmpty() && !Config_getBool(REPEAT_BRIEF))
Packit 1c1d7e
        {
Packit 1c1d7e
            continue;
Packit 1c1d7e
        }
Packit 1c1d7e
Packit 1c1d7e
        generateDocbookForMember(md,t,d,detailed);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (detailed) 
Packit 1c1d7e
  {
Packit 1c1d7e
    if (desctitle) 
Packit 1c1d7e
    {
Packit 1c1d7e
        t << "        </section>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  } 
Packit 1c1d7e
  else 
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "        </section>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeInnerClasses(const ClassSDict *cl,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  if (cl)
Packit 1c1d7e
  {
Packit 1c1d7e
    ClassSDict::Iterator cli(*cl);
Packit 1c1d7e
    ClassDef *cd;
Packit 1c1d7e
    QCString title = theTranslator->trClasses();
Packit 1c1d7e
Packit 1c1d7e
    if (cli.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "        <section>" << endl;
Packit 1c1d7e
      t << "            <title> " << title << " </title>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
    for (cli.toFirst();(cd=cli.current());++cli)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (!cd->isHidden() && cd->name().find('@')==-1) 
Packit 1c1d7e
      {
Packit 1c1d7e
        t << "            <para>" << endl;
Packit 1c1d7e
        t << "                <itemizedlist>" << endl;
Packit 1c1d7e
        t << "                    <listitem>" << endl;
Packit 1c1d7e
        t << "                        <para>" << "struct <link linkend=\"" << classOutputFileBase(cd) << "\">" << convertToXML(cd->name()) << "</link>";
Packit 1c1d7e
        t << "</para>" << endl;
Packit 1c1d7e
        if (cd->briefDescription())
Packit 1c1d7e
        {
Packit 1c1d7e
            t << "<para><emphasis>";
Packit 1c1d7e
            writeDocbookString(t,cd->briefDescription());
Packit 1c1d7e
            t << "</emphasis></para>" << endl;
Packit 1c1d7e
        }
Packit 1c1d7e
        t << "                    </listitem>" << endl;
Packit 1c1d7e
        t << "                </itemizedlist>" << endl;
Packit 1c1d7e
        t << "            </para>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    if (cli.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "        </section>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeInnerNamespaces(const NamespaceSDict *nl,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  if (nl)
Packit 1c1d7e
  {
Packit 1c1d7e
    NamespaceSDict::Iterator nli(*nl);
Packit 1c1d7e
    NamespaceDef *nd;
Packit 1c1d7e
    QCString title = theTranslator->trNamespaces();
Packit 1c1d7e
Packit 1c1d7e
    if (nli.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "        <simplesect>" << endl;
Packit 1c1d7e
      t << "            <title> " << title << " </title>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
    for (nli.toFirst();(nd=nli.current());++nli)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
Packit 1c1d7e
      {
Packit 1c1d7e
        t << "            <para>" << endl;
Packit 1c1d7e
        t << "                <itemizedlist>" << endl;
Packit 1c1d7e
        t << "                    <listitem>" << endl;
Packit 1c1d7e
        t << "                        <para>" << "struct <link linkend=\"" << nd->getOutputFileBase() << "\">" << convertToXML(nd->name()) << "</link>";
Packit 1c1d7e
        t << "</para>" << endl;
Packit 1c1d7e
        t << "                    </listitem>" << endl;
Packit 1c1d7e
        t << "                </itemizedlist>" << endl;
Packit 1c1d7e
        t << "            </para>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    if (nli.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "        </simplesect>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeInnerFiles(const FileList *fl,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  if (fl)
Packit 1c1d7e
  {
Packit 1c1d7e
    QListIterator<FileDef> fli(*fl);
Packit 1c1d7e
    FileDef *fd;
Packit 1c1d7e
    QCString title =  theTranslator->trFile(TRUE,TRUE);
Packit 1c1d7e
Packit 1c1d7e
    if (fli.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "        <simplesect>" << endl;
Packit 1c1d7e
      t << "            <title> " << title << " </title>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
    for (fli.toFirst();(fd=fli.current());++fli) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "            <para>" << endl;
Packit 1c1d7e
      t << "                <itemizedlist>" << endl;
Packit 1c1d7e
      t << "                    <listitem>" << endl;
Packit 1c1d7e
      t << "                        <para>" << "file <link linkend=\"" << fd->getOutputFileBase() << "\">" << convertToXML(fd->name()) << "</link>";
Packit 1c1d7e
      t << "</para>" << endl;
Packit 1c1d7e
      t << "                    </listitem>" << endl;
Packit 1c1d7e
      t << "                </itemizedlist>" << endl;
Packit 1c1d7e
      t << "            </para>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
    if (fli.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "        </simplesect>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeInnerPages(const PageSDict *pl,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  if (pl)
Packit 1c1d7e
  {
Packit 1c1d7e
    PageSDict::Iterator pli(*pl);
Packit 1c1d7e
    PageDef *pd;
Packit 1c1d7e
Packit 1c1d7e
    for (pli.toFirst();(pd=pli.current());++pli)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "<xi:include href=\"" << pd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>"  << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeInnerGroups(const GroupList *gl,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  if (gl)
Packit 1c1d7e
  {
Packit 1c1d7e
    GroupListIterator gli(*gl);
Packit 1c1d7e
    GroupDef *sgd;
Packit 1c1d7e
Packit 1c1d7e
    //Docbook header tags for inner groups
Packit 1c1d7e
    if (gli.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    <simplesect>" << endl;
Packit 1c1d7e
      t << "        <title>" << theTranslator->trModules() << "</title>" << endl;
Packit 1c1d7e
      t << "    </simplesect>" << endl;
Packit 1c1d7e
      t << "    <para>" << endl;
Packit 1c1d7e
      t << "        <itemizedlist>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    for (gli.toFirst();(sgd=gli.current());++gli)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "            <listitem><para><link linkend=\"" << sgd->getOutputFileBase() << "\">" << convertToXML(sgd->groupTitle()) << "</link></para></listitem>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    //Docbook footer tags for inner groups
Packit 1c1d7e
    if (gli.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "        </itemizedlist>" << endl;
Packit 1c1d7e
      t << "    </para>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeInnerDirs(const DirList *dl,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  if (dl)
Packit 1c1d7e
  {
Packit 1c1d7e
    QListIterator<DirDef> subdirs(*dl);
Packit 1c1d7e
    DirDef *subdir;
Packit 1c1d7e
    QCString title = theTranslator->trDirectories();
Packit 1c1d7e
    if (subdirs.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "        <simplesect>" << endl;
Packit 1c1d7e
      t << "            <title> " << title << " </title>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
    for (subdirs.toFirst();(subdir=subdirs.current());++subdirs)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "            <para>" << endl;
Packit 1c1d7e
      t << "                <itemizedlist>" << endl;
Packit 1c1d7e
      t << "                    <listitem>" << endl;
Packit 1c1d7e
      t << "                        <para>" << "dir <link linkend=\"" << subdir->getOutputFileBase() << "\">" << convertToXML(subdir->displayName()) << "</link>";
Packit 1c1d7e
      t << "</para>" << endl;
Packit 1c1d7e
      t << "                    </listitem>" << endl;
Packit 1c1d7e
      t << "                </itemizedlist>" << endl;
Packit 1c1d7e
      t << "            </para>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
    if (subdirs.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "        </simplesect>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeInnerGroupFiles(const GroupList *gl,FTextStream &t)
Packit 1c1d7e
{
Packit 1c1d7e
  if (gl)
Packit 1c1d7e
  {
Packit 1c1d7e
    GroupListIterator gli(*gl);
Packit 1c1d7e
    GroupDef *sgd;
Packit 1c1d7e
Packit 1c1d7e
    for (gli.toFirst();(sgd=gli.current());++gli)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "<xi:include href=\"" << sgd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>"  << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void generateDocbookForClass(ClassDef *cd,FTextStream &ti)
Packit 1c1d7e
{
Packit 1c1d7e
  // + brief description
Packit 1c1d7e
  // + detailed description
Packit 1c1d7e
  // + template argument list(s)
Packit 1c1d7e
  // - include file
Packit 1c1d7e
  // + member groups
Packit 1c1d7e
  // + inheritance diagram
Packit 1c1d7e
  // + list of direct super classes
Packit 1c1d7e
  // + list of direct sub classes
Packit 1c1d7e
  // + list of inner classes
Packit 1c1d7e
  // + collaboration diagram
Packit 1c1d7e
  // + list of all members
Packit 1c1d7e
  // + user defined member sections
Packit 1c1d7e
  // + standard member sections
Packit 1c1d7e
  // + detailed member documentation
Packit 1c1d7e
  // - examples using the class
Packit 1c1d7e
Packit 1c1d7e
  if (cd->isReference())        return; // skip external references.
Packit 1c1d7e
  if (cd->isHidden())           return; // skip hidden classes.
Packit 1c1d7e
  if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
Packit 1c1d7e
  if (cd->templateMaster()!=0)  return; // skip generated template instances.
Packit 1c1d7e
Packit 1c1d7e
  msg("Generating Docbook output for class %s\n",cd->name().data());
Packit 1c1d7e
Packit 1c1d7e
  QCString fileDocbook=cd->getOutputFileBase()+".xml";
Packit 1c1d7e
  //Add the file Documentation info to index file
Packit 1c1d7e
  ti << "        <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
Packit 1c1d7e
  QCString fileName=outputDirectory+"/"+ classOutputFileBase(cd)+".xml";
Packit 1c1d7e
  QCString relPath = relativePathToRoot(fileName);
Packit 1c1d7e
  QFile f(fileName);
Packit 1c1d7e
  if (!f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Cannot open file %s for writing!\n",fileName.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
  FTextStream t(&f);
Packit 1c1d7e
  //t.setEncoding(FTextStream::UnicodeUTF8);
Packit 1c1d7e
Packit 1c1d7e
  writeDocbookHeader_ID(t, classOutputFileBase(cd));
Packit 1c1d7e
  t << "<title>";
Packit 1c1d7e
  writeDocbookString(t,cd->name());
Packit 1c1d7e
  t << " " << cd->compoundTypeString() << " Reference";
Packit 1c1d7e
  t << "</title>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  IncludeInfo *ii=cd->includeInfo();
Packit 1c1d7e
  if (ii)
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString nm = ii->includeName;
Packit 1c1d7e
    if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
Packit 1c1d7e
    if (!nm.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "<para>" << endl;
Packit 1c1d7e
      t << "    <programlisting>#include ";
Packit 1c1d7e
      if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references
Packit 1c1d7e
      {
Packit 1c1d7e
        t << "<link linkend=\"" << ii->fileDef->getOutputFileBase() << "\">";
Packit 1c1d7e
      }
Packit 1c1d7e
      if (ii->local)
Packit 1c1d7e
      {
Packit 1c1d7e
        t << """;
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        t << "<";
Packit 1c1d7e
      }
Packit 1c1d7e
      t << convertToXML(nm);
Packit 1c1d7e
      if (ii->local)
Packit 1c1d7e
      {
Packit 1c1d7e
        t << """;
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        t << ">";
Packit 1c1d7e
      }
Packit 1c1d7e
      if (ii->fileDef && !ii->fileDef->isReference())
Packit 1c1d7e
      {
Packit 1c1d7e
        t << "</link>";
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "</programlisting>" << endl;
Packit 1c1d7e
      t << "</para>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (Config_getBool(HAVE_DOT) && (Config_getBool(CLASS_DIAGRAMS) || Config_getBool(CLASS_GRAPH)))
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "<para>Inheritance diagram for " << convertToXML(cd->name()) << "</para>" << endl;
Packit 1c1d7e
    DotClassGraph inheritanceGraph(cd,DotNode::Inheritance);
Packit 1c1d7e
    inheritanceGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,TRUE,FALSE);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (Config_getBool(HAVE_DOT) && Config_getBool(COLLABORATION_GRAPH))
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "<para>Collaboration diagram for " << convertToXML(cd->name()) << "</para>" << endl;
Packit 1c1d7e
    DotClassGraph collaborationGraph(cd,DotNode::Collaboration);
Packit 1c1d7e
    collaborationGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,TRUE,FALSE);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  writeInnerClasses(cd->getClassSDict(),t);
Packit 1c1d7e
Packit 1c1d7e
  writeTemplateList(cd,t);
Packit 1c1d7e
  if (cd->getMemberGroupSDict())
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
Packit 1c1d7e
    MemberGroup *mg;
Packit 1c1d7e
    for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateDocbookSection(cd,t,mg->members(),"user-defined",0,mg->header(),
Packit 1c1d7e
          mg->documentation());
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
  QListIterator<MemberList> mli(cd->getMemberLists());
Packit 1c1d7e
  MemberList *ml;
Packit 1c1d7e
  for (mli.toFirst();(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if ((ml->listType()&MemberListType_detailedLists)==0)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateDocbookSection(cd,t,ml,g_docbookSectionMapper.find(ml->listType()));
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if(Config_getBool(REPEAT_BRIEF))
Packit 1c1d7e
  {
Packit 1c1d7e
      if (cd->briefDescription()) 
Packit 1c1d7e
      {
Packit 1c1d7e
          t << "    <simplesect>" << endl;
Packit 1c1d7e
          // A title as 'Brief Description' may not be necessary.
Packit 1c1d7e
          //t << "        <title>" << theTranslator->trBriefDescription() << "</title>" << endl;
Packit 1c1d7e
          writeDocbookDocBlock(t,cd->briefFile(),cd->briefLine(),cd,0,cd->briefDescription());
Packit 1c1d7e
          t << "    </simplesect>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (cd->documentation()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "        <simplesect>" << endl;
Packit 1c1d7e
    t << "            <title>" << theTranslator->trDetailedDescription() << "</title>" << endl;
Packit 1c1d7e
    writeDocbookDocBlock(t,cd->docFile(),cd->docLine(),cd,0,cd->documentation());
Packit 1c1d7e
    t << "                <para>Definition at line " << cd->getDefLine() << " of file " << stripPath(cd->getDefFileName()) << "</para>" << endl;
Packit 1c1d7e
    t << "                <para>The Documentation for this struct was generated from the following file: </para>" << endl;
Packit 1c1d7e
    t << "                <para><itemizedlist><listitem><para>" << stripPath(cd->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
Packit 1c1d7e
    t << "        </simplesect>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  for (mli.toFirst();(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if ((ml->listType()&MemberListType_detailedLists)==0)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateDocbookSection(cd,t,ml,g_docbookSectionMapper.find(ml->listType()),1);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  /*// TODO: Handling of Inheritance and Colloboration graph for Docbook to be implemented
Packit 1c1d7e
    DotClassGraph inheritanceGraph(cd,DotNode::Inheritance);
Packit 1c1d7e
    if (!inheritanceGraph.isTrivial())
Packit 1c1d7e
    {
Packit 1c1d7e
    t << "    <inheritancegraph>" << endl;
Packit 1c1d7e
    inheritanceGraph.writeDocbook(t);
Packit 1c1d7e
    t << "    </inheritancegraph>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
    DotClassGraph collaborationGraph(cd,DotNode::Collaboration);
Packit 1c1d7e
    if (!collaborationGraph.isTrivial())
Packit 1c1d7e
    {
Packit 1c1d7e
    t << "    <collaborationgraph>" << endl;
Packit 1c1d7e
    collaborationGraph.writeDocbook(t);
Packit 1c1d7e
    t << "    </collaborationgraph>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
    t << "    
Packit 1c1d7e
    << cd->getDefFileName() << "\" line=\""
Packit 1c1d7e
    << cd->getDefLine() << "\"";
Packit 1c1d7e
    if (cd->getStartBodyLine()!=-1)
Packit 1c1d7e
    {
Packit 1c1d7e
    FileDef *bodyDef = cd->getBodyDef();
Packit 1c1d7e
    if (bodyDef)
Packit 1c1d7e
    {
Packit 1c1d7e
    t << " bodyfile=\"" << bodyDef->absFilePath() << "\"";
Packit 1c1d7e
    }
Packit 1c1d7e
    t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
Packit 1c1d7e
    << cd->getEndBodyLine() << "\"";
Packit 1c1d7e
    }
Packit 1c1d7e
    t << "/>" << endl;
Packit 1c1d7e
    writeListOfAllMembers(cd,t);
Packit 1c1d7e
   */
Packit 1c1d7e
Packit 1c1d7e
  t << "</section>" << endl;
Packit 1c1d7e
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void generateDocbookForNamespace(NamespaceDef *nd,FTextStream &ti)
Packit 1c1d7e
{
Packit 1c1d7e
  // + contained class definitions
Packit 1c1d7e
  // + contained namespace definitions
Packit 1c1d7e
  // + member groups
Packit 1c1d7e
  // + normal members
Packit 1c1d7e
  // + brief desc
Packit 1c1d7e
  // + detailed desc
Packit 1c1d7e
  // + location
Packit 1c1d7e
  // - files containing (parts of) the namespace definition
Packit 1c1d7e
Packit 1c1d7e
  if (nd->isReference() || nd->isHidden()) return; // skip external references
Packit 1c1d7e
Packit 1c1d7e
  QCString fileDocbook=nd->getOutputFileBase()+".xml";
Packit 1c1d7e
  //Add the file Documentation info to index file
Packit 1c1d7e
  ti << "        <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
Packit 1c1d7e
  QCString fileName=outputDirectory+"/"+nd->getOutputFileBase()+".xml";
Packit 1c1d7e
  QFile f(fileName);
Packit 1c1d7e
  if (!f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Cannot open file %s for writing!\n",fileName.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
  FTextStream t(&f);
Packit 1c1d7e
  //t.setEncoding(FTextStream::UnicodeUTF8);
Packit 1c1d7e
Packit 1c1d7e
  writeDocbookHeader_ID(t, nd->getOutputFileBase());
Packit 1c1d7e
  t << "<title>";
Packit 1c1d7e
  writeDocbookString(t,nd->name());
Packit 1c1d7e
  t << "</title>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  writeInnerClasses(nd->getClassSDict(),t);
Packit 1c1d7e
  writeInnerNamespaces(nd->getNamespaceSDict(),t);
Packit 1c1d7e
Packit 1c1d7e
  if (nd->getMemberGroupSDict())
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
Packit 1c1d7e
    MemberGroup *mg;
Packit 1c1d7e
    for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateDocbookSection(nd,t,mg->members(),"user-defined",0,mg->header(),
Packit 1c1d7e
          mg->documentation());
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  QListIterator<MemberList> mli(nd->getMemberLists());
Packit 1c1d7e
  MemberList *ml;
Packit 1c1d7e
  for (mli.toFirst();(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if ((ml->listType()&MemberListType_declarationLists)!=0)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateDocbookSection(nd,t,ml,g_docbookSectionMapper.find(ml->listType()));
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if(Config_getBool(REPEAT_BRIEF))
Packit 1c1d7e
  {
Packit 1c1d7e
      if (nd->briefDescription()) 
Packit 1c1d7e
      {
Packit 1c1d7e
          t << "    <simplesect>" << endl;
Packit 1c1d7e
          //t << "        <title>" << theTranslator->trBriefDescription() << "</title>" << endl;
Packit 1c1d7e
          writeDocbookDocBlock(t,nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription());
Packit 1c1d7e
          t << "    </simplesect>" << endl;
Packit 1c1d7e
      }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (nd->documentation()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "        <simplesect>" << endl;
Packit 1c1d7e
    t << "            <title>" << theTranslator->trDetailedDescription() << "</title>" << endl;
Packit 1c1d7e
    writeDocbookDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation());
Packit 1c1d7e
    t << "                <para>Definition at line " << nd->getDefLine() << " of file " << stripPath(nd->getDefFileName()) << "</para>" << endl;
Packit 1c1d7e
    t << "                <para>The Documentation for this struct was generated from the following file: </para>" << endl;
Packit 1c1d7e
    t << "                <para><itemizedlist><listitem><para>" << stripPath(nd->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
Packit 1c1d7e
    t << "        </simplesect>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  t << "</section>" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void generateDocbookForFile(FileDef *fd,FTextStream &ti)
Packit 1c1d7e
{
Packit 1c1d7e
  // + includes files
Packit 1c1d7e
  // + includedby files
Packit 1c1d7e
  // + include graph
Packit 1c1d7e
  // + included by graph
Packit 1c1d7e
  // + contained class definitions
Packit 1c1d7e
  // + contained namespace definitions
Packit 1c1d7e
  // + member groups
Packit 1c1d7e
  // + normal members
Packit 1c1d7e
  // + brief desc
Packit 1c1d7e
  // + detailed desc
Packit 1c1d7e
  // + source code
Packit 1c1d7e
  // + location
Packit 1c1d7e
  // - number of lines
Packit 1c1d7e
Packit 1c1d7e
  if (fd->isReference()) return; // skip external references
Packit 1c1d7e
Packit 1c1d7e
  QCString fileDocbook=fd->getOutputFileBase()+".xml";
Packit 1c1d7e
  //Add the file Documentation info to index file
Packit 1c1d7e
  ti << "        <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
Packit 1c1d7e
  QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml";
Packit 1c1d7e
  QCString relPath = relativePathToRoot(fileName);
Packit 1c1d7e
Packit 1c1d7e
  QFile f(fileName);
Packit 1c1d7e
  if (!f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Cannot open file %s for writing!\n",fileName.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
  FTextStream t(&f);
Packit 1c1d7e
  //t.setEncoding(FTextStream::UnicodeUTF8);
Packit 1c1d7e
  writeDocbookHeader_ID(t, fd->getOutputFileBase());
Packit 1c1d7e
Packit 1c1d7e
  t << "    <title>";
Packit 1c1d7e
  writeDocbookString(t,fd->name());
Packit 1c1d7e
  t << " File Reference";
Packit 1c1d7e
  t << "</title>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  IncludeInfo *inc;
Packit 1c1d7e
Packit 1c1d7e
  if (fd->includeFileList())
Packit 1c1d7e
  {
Packit 1c1d7e
    QListIterator<IncludeInfo> ili1(*fd->includeFileList());
Packit 1c1d7e
    for (ili1.toFirst();(inc=ili1.current());++ili1)
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    <programlisting>#include ";
Packit 1c1d7e
      if (inc->local)
Packit 1c1d7e
      {
Packit 1c1d7e
        t << """;
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        t << "<";
Packit 1c1d7e
      }
Packit 1c1d7e
      t << convertToXML(inc->includeName);
Packit 1c1d7e
      if (inc->local)
Packit 1c1d7e
      {
Packit 1c1d7e
        t << """;
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        t << ">";
Packit 1c1d7e
      }
Packit 1c1d7e
      t << "</programlisting>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (Config_getBool(HAVE_DOT))
Packit 1c1d7e
  {
Packit 1c1d7e
    if (Config_getBool(INCLUDE_GRAPH))
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "<para>Include dependency diagram for " << convertToXML(fd->name()) << "</para>" << endl;
Packit 1c1d7e
      DotInclDepGraph idepGraph(fd, FALSE);
Packit 1c1d7e
      idepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE);
Packit 1c1d7e
    }
Packit 1c1d7e
    if (Config_getBool(INCLUDED_BY_GRAPH))
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "<para>Included by dependency diagram for " << convertToXML(fd->name()) << "</para>" << endl;
Packit 1c1d7e
      DotInclDepGraph ibdepGraph(fd, TRUE);
Packit 1c1d7e
      ibdepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (fd->getClassSDict())
Packit 1c1d7e
  {
Packit 1c1d7e
    writeInnerClasses(fd->getClassSDict(),t);
Packit 1c1d7e
  }
Packit 1c1d7e
  if (fd->getNamespaceSDict())
Packit 1c1d7e
  {
Packit 1c1d7e
    writeInnerNamespaces(fd->getNamespaceSDict(),t);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (fd->getMemberGroupSDict())
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberGroupSDict::Iterator mgli(*fd->getMemberGroupSDict());
Packit 1c1d7e
    MemberGroup *mg;
Packit 1c1d7e
    for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateDocbookSection(fd,t,mg->members(),"user-defined",0,mg->header(),
Packit 1c1d7e
          mg->documentation());
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  QListIterator<MemberList> mli(fd->getMemberLists());
Packit 1c1d7e
  MemberList *ml;
Packit 1c1d7e
  for (mli.toFirst();(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if ((ml->listType()&MemberListType_declarationLists)!=0)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateDocbookSection(fd,t,ml,g_docbookSectionMapper.find(ml->listType()));
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  t << "    <simplesect>" << endl;
Packit 1c1d7e
  t << "        <title>" << theTranslator->trDetailedDescription() << "</title>" << endl;
Packit 1c1d7e
  writeDocbookDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription());
Packit 1c1d7e
  writeDocbookDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation());
Packit 1c1d7e
  if (Config_getBool(FULL_PATH_NAMES)) 
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "    <para>Definition in file " << fd->getDefFileName() << "</para>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "    <para>Definition in file " << stripPath(fd->getDefFileName()) << "</para>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  t << "    </simplesect>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  if (Config_getBool(DOCBOOK_PROGRAMLISTING))
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "    <literallayout><computeroutput>" << endl;
Packit 1c1d7e
    writeDocbookCodeBlock(t,fd);
Packit 1c1d7e
    t << "    </computeroutput></literallayout>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  t << "</section>" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti)
Packit 1c1d7e
{
Packit 1c1d7e
  // + members
Packit 1c1d7e
  // + member groups
Packit 1c1d7e
  // + files
Packit 1c1d7e
  // + classes
Packit 1c1d7e
  // + namespaces
Packit 1c1d7e
  // - packages
Packit 1c1d7e
  // + pages
Packit 1c1d7e
  // + child groups
Packit 1c1d7e
  // - examples
Packit 1c1d7e
  // + brief description
Packit 1c1d7e
  // + detailed description
Packit 1c1d7e
Packit 1c1d7e
  if (gd->isReference()) return; // skip external references
Packit 1c1d7e
Packit 1c1d7e
  if (!gd->isASubGroup()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString fileDocbook=gd->getOutputFileBase()+".xml";
Packit 1c1d7e
    //Add the file Documentation info to index file
Packit 1c1d7e
    ti << "        <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
Packit 1c1d7e
  QCString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml";
Packit 1c1d7e
  QCString relPath = relativePathToRoot(fileName);
Packit 1c1d7e
Packit 1c1d7e
  QFile f(fileName);
Packit 1c1d7e
  if (!f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Cannot open file %s for writing!\n",fileName.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  FTextStream t(&f);
Packit 1c1d7e
  //t.setEncoding(FTextStream::UnicodeUTF8);
Packit 1c1d7e
  writeDocbookHeader_ID(t, gd->getOutputFileBase());
Packit 1c1d7e
Packit 1c1d7e
  t << "    <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  if (Config_getBool(GROUP_GRAPHS) && Config_getBool(HAVE_DOT))
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "<para>Collaboration diagram for " << convertToXML(gd->groupTitle()) << "</para>" << endl;
Packit 1c1d7e
    DotGroupCollaboration collaborationGraph(gd);
Packit 1c1d7e
    collaborationGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (gd->briefDescription()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    //t << "    <section>" << endl;
Packit 1c1d7e
    //t << "        <title>" << theTranslator->trBriefDescription() << "</title>" << endl;
Packit 1c1d7e
    writeDocbookDocBlock(t,gd->briefFile(),gd->briefLine(),gd,0,gd->briefDescription());
Packit 1c1d7e
    //t << "    </section>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (gd->documentation()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "        <section>" << endl;
Packit 1c1d7e
    t << "            <title>" << theTranslator->trDetailedDescription() << "</title>" << endl;
Packit 1c1d7e
    writeDocbookDocBlock(t,gd->docFile(),gd->docLine(),gd,0,gd->documentation());
Packit 1c1d7e
    t << "        </section>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  writeInnerFiles(gd->getFiles(),t);
Packit 1c1d7e
  writeInnerClasses(gd->getClasses(),t);
Packit 1c1d7e
  writeInnerNamespaces(gd->getNamespaces(),t);
Packit 1c1d7e
  writeInnerPages(gd->getPages(),t);
Packit 1c1d7e
  writeInnerGroups(gd->getSubGroups(),t);
Packit 1c1d7e
Packit 1c1d7e
  if (gd->getMemberGroupSDict())
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberGroupSDict::Iterator mgli(*gd->getMemberGroupSDict());
Packit 1c1d7e
    MemberGroup *mg;
Packit 1c1d7e
    for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateDocbookSection(gd,t,mg->members(),"user-defined",0,mg->header(),
Packit 1c1d7e
          mg->documentation());
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  QListIterator<MemberList> mli(gd->getMemberLists());
Packit 1c1d7e
  MemberList *ml;
Packit 1c1d7e
  for (mli.toFirst();(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if ((ml->listType()&MemberListType_declarationLists)!=0)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateDocbookSection(gd,t,ml,g_docbookSectionMapper.find(ml->listType()));
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  for (mli.toFirst();(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if ((ml->listType()&MemberListType_declarationLists)!=0)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateDocbookSection(gd,t,ml,g_docbookSectionMapper.find(ml->listType()),1);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  writeInnerGroupFiles(gd->getSubGroups(),t);
Packit 1c1d7e
Packit 1c1d7e
  t << "</section>" << endl;
Packit 1c1d7e
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void generateDocbookForDir(DirDef *dd,FTextStream &ti)
Packit 1c1d7e
{
Packit 1c1d7e
  if (dd->isReference()) return; // skip external references
Packit 1c1d7e
Packit 1c1d7e
  QCString fileDocbook=dd->getOutputFileBase()+".xml";
Packit 1c1d7e
  //Add the file Documentation info to index file
Packit 1c1d7e
  ti << "        <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
Packit 1c1d7e
  QCString fileName=outputDirectory+"/"+dd->getOutputFileBase()+".xml";
Packit 1c1d7e
  QFile f(fileName);
Packit 1c1d7e
  QCString relPath = relativePathToRoot(fileName);
Packit 1c1d7e
Packit 1c1d7e
  if (!f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Cannot open file %s for writing!\n",fileName.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  FTextStream t(&f);
Packit 1c1d7e
  //t.setEncoding(FTextStream::UnicodeUTF8);
Packit 1c1d7e
  writeDocbookHeader_ID(t, dd->getOutputFileBase());
Packit 1c1d7e
Packit 1c1d7e
  t << "    <title>";
Packit 1c1d7e
  t << theTranslator->trDirReference(dd->displayName());
Packit 1c1d7e
  t << "</title>" << endl;
Packit 1c1d7e
  if (Config_getBool(DIRECTORY_GRAPH) && Config_getBool(HAVE_DOT))
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "<para>Directory dependency diagram for " << convertToXML(dd->displayName()) << "</para>" << endl;
Packit 1c1d7e
    DotDirDeps dirdepGraph(dd);
Packit 1c1d7e
    dirdepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  writeInnerDirs(&dd->subDirs(),t);
Packit 1c1d7e
  writeInnerFiles(dd->getFiles(),t);
Packit 1c1d7e
Packit 1c1d7e
  t << "    <simplesect>" << endl;
Packit 1c1d7e
  t << "        <title>" << theTranslator->trDetailedDescription() << "</title>" << endl;
Packit 1c1d7e
  writeDocbookDocBlock(t,dd->briefFile(),dd->briefLine(),dd,0,dd->briefDescription());
Packit 1c1d7e
  writeDocbookDocBlock(t,dd->docFile(),dd->docLine(),dd,0,dd->documentation());
Packit 1c1d7e
  t << "    <para>Directory location is " << dd->name() << "</para>" << endl;
Packit 1c1d7e
  t << "    </simplesect>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  t << "</section>" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample)
Packit 1c1d7e
{
Packit 1c1d7e
  // + name
Packit 1c1d7e
  // + title
Packit 1c1d7e
  // + documentation
Packit 1c1d7e
Packit 1c1d7e
  if (pd->isReference()) return;
Packit 1c1d7e
Packit 1c1d7e
  QCString pageName = pd->getOutputFileBase();
Packit 1c1d7e
  if (pd->getGroupDef())
Packit 1c1d7e
  {
Packit 1c1d7e
    pageName+=(QCString)"_"+pd->name();
Packit 1c1d7e
  }
Packit 1c1d7e
  if (pageName=="index") 
Packit 1c1d7e
  {
Packit 1c1d7e
    pageName="mainpage"; // to prevent overwriting the generated index page.
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
Packit 1c1d7e
  QCString fileName=outputDirectory+"/"+pageName+".xml";
Packit 1c1d7e
  QFile f(fileName);
Packit 1c1d7e
  if (!f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Cannot open file %s for writing!\n",fileName.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  FTextStream t(&f);
Packit 1c1d7e
  //t.setEncoding(FTextStream::UnicodeUTF8);
Packit 1c1d7e
Packit 1c1d7e
  if(isExample)
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString fileDocbook=pageName+".xml";
Packit 1c1d7e
    ti << "        <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (!pd->hasParentPage() && !isExample)
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString fileDocbook=pageName+".xml";
Packit 1c1d7e
    //Add the file Documentation info to index file
Packit 1c1d7e
    ti << "        <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
Packit 1c1d7e
    writeDocbookHeaderMainpage(t);
Packit 1c1d7e
  } 
Packit 1c1d7e
  else 
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString pid;
Packit 1c1d7e
    if(isExample)
Packit 1c1d7e
    {
Packit 1c1d7e
      pid = pageName;
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      pid = pageName+"_1"+pageName;
Packit 1c1d7e
    }
Packit 1c1d7e
    writeDocbookHeader_ID(t, pid);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  SectionInfo *si = Doxygen::sectionDict->find(pd->name());
Packit 1c1d7e
  if (si)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "    <title>" << convertToXML(si->title) << "</title>" << endl;
Packit 1c1d7e
  } 
Packit 1c1d7e
  else 
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "    <title>" << convertToXML(pd->name()) << "</title>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (isExample)
Packit 1c1d7e
  {
Packit 1c1d7e
    writeDocbookDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
Packit 1c1d7e
        pd->documentation()+"\n\\include "+pd->name());
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    writeDocbookDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
Packit 1c1d7e
        pd->documentation());
Packit 1c1d7e
  }
Packit 1c1d7e
  writeInnerPages(pd->getSubPages(),t);
Packit 1c1d7e
Packit 1c1d7e
  if (!pd->hasParentPage() && !isExample)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << endl << "</chapter>" << endl;
Packit 1c1d7e
  } 
Packit 1c1d7e
  else 
Packit 1c1d7e
  {
Packit 1c1d7e
    t << endl << "</section>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void generateDocbook()
Packit 1c1d7e
{
Packit 1c1d7e
Packit 1c1d7e
  // + classes
Packit 1c1d7e
  // + namespaces
Packit 1c1d7e
  // + files
Packit 1c1d7e
  // + groups
Packit 1c1d7e
  // + related pages
Packit 1c1d7e
  // - examples
Packit 1c1d7e
Packit 1c1d7e
  QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
Packit 1c1d7e
  if (outputDirectory.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    outputDirectory=QDir::currentDirPath().utf8();
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    QDir dir(outputDirectory);
Packit 1c1d7e
    if (!dir.exists())
Packit 1c1d7e
    {
Packit 1c1d7e
      dir.setPath(QDir::currentDirPath());
Packit 1c1d7e
      if (!dir.mkdir(outputDirectory))
Packit 1c1d7e
      {
Packit 1c1d7e
        err("tag DOCBOOK_OUTPUT: Output directory `%s' does not "
Packit 1c1d7e
            "exist and cannot be created\n",outputDirectory.data());
Packit 1c1d7e
        exit(1);
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        msg("Notice: Output directory `%s' does not exist. "
Packit 1c1d7e
            "I have created it for you.\n", outputDirectory.data());
Packit 1c1d7e
      }
Packit 1c1d7e
      dir.cd(outputDirectory);
Packit 1c1d7e
    }
Packit 1c1d7e
    outputDirectory=dir.absPath().utf8();
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  QDir dir(outputDirectory);
Packit 1c1d7e
  if (!dir.exists())
Packit 1c1d7e
  {
Packit 1c1d7e
    dir.setPath(QDir::currentDirPath());
Packit 1c1d7e
    if (!dir.mkdir(outputDirectory))
Packit 1c1d7e
    {
Packit 1c1d7e
      err("Cannot create directory %s\n",outputDirectory.data());
Packit 1c1d7e
      return;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  QDir docbookDir(outputDirectory);
Packit 1c1d7e
  createSubDirs(docbookDir);
Packit 1c1d7e
Packit 1c1d7e
  QCString fileName=outputDirectory+"/index.xml";
Packit 1c1d7e
  QCString dbk_projectName = Config_getString(PROJECT_NAME);
Packit 1c1d7e
  QFile f(fileName);
Packit 1c1d7e
Packit 1c1d7e
  f.setName(fileName);
Packit 1c1d7e
  if (!f.open(IO_WriteOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Cannot open file %s for writing!\n",fileName.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
  FTextStream t(&f);
Packit 1c1d7e
  //t.setEncoding(FTextStream::UnicodeUTF8);
Packit 1c1d7e
Packit 1c1d7e
  // write index header for Docbook which calls the structure file
Packit 1c1d7e
  t << "" << endl;;
Packit 1c1d7e
  t << "<book xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" << endl;
Packit 1c1d7e
  t << "    <info>" << endl;
Packit 1c1d7e
  t << "    <title>" << dbk_projectName << "</title>" << endl;
Packit 1c1d7e
  t << "    </info>" << endl;
Packit 1c1d7e
Packit 1c1d7e
  // NAMESPACE DOCUMENTATION
Packit 1c1d7e
  NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
Packit 1c1d7e
  NamespaceDef *nd;
Packit 1c1d7e
Packit 1c1d7e
  //Namespace Documentation index header
Packit 1c1d7e
  if (nli.toFirst()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "    <chapter>" << endl;
Packit 1c1d7e
    t << "        <title>Namespace Documentation</title>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  for (nli.toFirst();(nd=nli.current());++nli)
Packit 1c1d7e
  {
Packit 1c1d7e
    msg("Generating Docbook output for namespace %s\n",nd->name().data());
Packit 1c1d7e
    generateDocbookForNamespace(nd,t);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  //Namespace Documentation index footer
Packit 1c1d7e
  if (nli.toFirst()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "    </chapter>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  /** MAINPAGE DOCUMENTATION **/
Packit 1c1d7e
Packit 1c1d7e
  if (Doxygen::mainPage)
Packit 1c1d7e
  {
Packit 1c1d7e
    msg("Generating Docbook output for the main page\n");
Packit 1c1d7e
    generateDocbookForPage(Doxygen::mainPage,t,FALSE);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  // PAGE DOCUMENTATION
Packit 1c1d7e
  {
Packit 1c1d7e
    PageSDict::Iterator pdi(*Doxygen::pageSDict);
Packit 1c1d7e
    PageDef *pd=0;
Packit 1c1d7e
Packit 1c1d7e
    for (pdi.toFirst();(pd=pdi.current());++pdi)
Packit 1c1d7e
    {
Packit 1c1d7e
      msg("Generating Docbook output for page %s\n",pd->name().data());
Packit 1c1d7e
      generateDocbookForPage(pd,t,FALSE);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  /** MODULE GROUP DOCUMENTATION **/
Packit 1c1d7e
Packit 1c1d7e
  GroupSDict::Iterator gli(*Doxygen::groupSDict);
Packit 1c1d7e
  GroupDef *gd;
Packit 1c1d7e
Packit 1c1d7e
  //Module group Documentation index header
Packit 1c1d7e
  if (gli.toFirst()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "    <chapter>" << endl;
Packit 1c1d7e
    t << "        <title>" << theTranslator->trModuleDocumentation() << "</title>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  for (;(gd=gli.current());++gli)
Packit 1c1d7e
  {
Packit 1c1d7e
    msg("Generating Docbook output for group %s\n",gd->name().data());
Packit 1c1d7e
    generateDocbookForGroup(gd,t);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  //Module group Documentation index footer
Packit 1c1d7e
  if (gli.toFirst()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "    </chapter>" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  //CLASS DOCUMENTATION
Packit 1c1d7e
Packit 1c1d7e
  {
Packit 1c1d7e
    ClassSDict::Iterator cli(*Doxygen::classSDict);
Packit 1c1d7e
    ClassDef *cd;
Packit 1c1d7e
Packit 1c1d7e
    //Class Documentation index header
Packit 1c1d7e
    if (cli.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    <chapter>" << endl;
Packit 1c1d7e
      t << "        <title>" << theTranslator->trClassDocumentation() << "</title>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    for (cli.toFirst();(cd=cli.current());++cli)
Packit 1c1d7e
    {
Packit 1c1d7e
      generateDocbookForClass(cd,t);
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    //Class Documentation index footer
Packit 1c1d7e
    if (cli.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    </chapter>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  // FILE DOCUMENTATION
Packit 1c1d7e
Packit 1c1d7e
  static bool showFiles = Config_getBool(SHOW_FILES);
Packit 1c1d7e
  if (showFiles)
Packit 1c1d7e
  {
Packit 1c1d7e
    FileNameListIterator fnli(*Doxygen::inputNameList);
Packit 1c1d7e
    FileName *fn;
Packit 1c1d7e
Packit 1c1d7e
    //File Documentation index header
Packit 1c1d7e
    if (fnli.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    <chapter>" << endl;
Packit 1c1d7e
      t << "        <title>" << theTranslator->trFileDocumentation() << "</title>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    for (;(fn=fnli.current());++fnli)
Packit 1c1d7e
    {
Packit 1c1d7e
      FileNameIterator fni(*fn);
Packit 1c1d7e
      FileDef *fd;
Packit 1c1d7e
      for (;(fd=fni.current());++fni)
Packit 1c1d7e
      {
Packit 1c1d7e
        msg("Generating Docbook output for file %s\n",fd->name().data());
Packit 1c1d7e
        generateDocbookForFile(fd,t);
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    //File Documentation index footer
Packit 1c1d7e
    if (fnli.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    </chapter>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  // DIRECTORY DOCUMENTATION
Packit 1c1d7e
  if (Config_getBool(DIRECTORY_GRAPH) && Config_getBool(HAVE_DOT))
Packit 1c1d7e
  {
Packit 1c1d7e
    DirDef *dir;
Packit 1c1d7e
    DirSDict::Iterator sdi(*Doxygen::directories);
Packit 1c1d7e
Packit 1c1d7e
    //Directory Documentation index header
Packit 1c1d7e
    if (sdi.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    <chapter>" << endl;
Packit 1c1d7e
      t << "        <title>" << theTranslator->trDirDocumentation() << "</title>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    for (sdi.toFirst();(dir=sdi.current());++sdi)
Packit 1c1d7e
    {
Packit 1c1d7e
      msg("Generate Docbook output for dir %s\n",dir->name().data());
Packit 1c1d7e
      generateDocbookForDir(dir,t);
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    //Module group Documentation index footer
Packit 1c1d7e
    if (sdi.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    </chapter>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  // EXAMPLE PAGE DOCUMENTATION
Packit 1c1d7e
Packit 1c1d7e
  {
Packit 1c1d7e
    PageSDict::Iterator pdi(*Doxygen::exampleSDict);
Packit 1c1d7e
    PageDef *pd=0;
Packit 1c1d7e
Packit 1c1d7e
    //Example Page Documentation index header
Packit 1c1d7e
    if (pdi.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    <chapter>" << endl;
Packit 1c1d7e
      t << "        <title>" << theTranslator->trExampleDocumentation() << "</title>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    for (pdi.toFirst();(pd=pdi.current());++pdi)
Packit 1c1d7e
    {
Packit 1c1d7e
      msg("Generating Docbook output for example %s\n",pd->name().data());
Packit 1c1d7e
      generateDocbookForPage(pd,t,TRUE);
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    //Example Page Documentation index footer
Packit 1c1d7e
    if (pdi.toFirst()) 
Packit 1c1d7e
    {
Packit 1c1d7e
      t << "    </chapter>" << endl;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  t << "</book>" << endl;
Packit 1c1d7e
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e