1 /******************************************************************************
5 * Copyright (C) 1997-2014 by Dimitri van Heesch.
7 * Permission to use, copy, modify, and distribute this software and its
8 * documentation under the terms of the GNU General Public License is hereby
9 * granted. No representations are made about the suitability of this software
10 * for any purpose. It is provided "as is" without express or implied warranty.
11 * See the GNU General Public License for more details.
13 * Documents produced by Doxygen are derivative works derived from the
14 * input used in their production; they are not affected by this license.
22 #include <qtextstream.h>
24 #include "docbookgen.h"
28 #include "classlist.h"
31 #include "outputgen.h"
36 #include "docbookvisitor.h"
37 #include "docparser.h"
39 #include "parserintf.h"
40 #include "arguments.h"
41 #include "memberlist.h"
43 #include "memberdef.h"
44 #include "namespacedef.h"
45 #include "membername.h"
46 #include "membergroup.h"
51 #define Docbook_DB(x) do {} while(0)
53 //#define Docbook_DB(x) printf x
54 // debug inside output
55 //#define Docbook_DB(x) QCString __t;__t.sprintf x;m_t << __t
59 class DocbookSectionMapper : public QIntDict<char>
62 DocbookSectionMapper() : QIntDict<char>(47)
64 insert(MemberListType_pubTypes,"public-type");
65 insert(MemberListType_pubMethods,"public-func");
66 insert(MemberListType_pubAttribs,"public-attrib");
67 insert(MemberListType_pubSlots,"public-slot");
68 insert(MemberListType_signals,"signal");
69 insert(MemberListType_dcopMethods,"dcop-func");
70 insert(MemberListType_properties,"property");
71 insert(MemberListType_events,"event");
72 insert(MemberListType_pubStaticMethods,"public-static-func");
73 insert(MemberListType_pubStaticAttribs,"public-static-attrib");
74 insert(MemberListType_proTypes,"protected-type");
75 insert(MemberListType_proMethods,"protected-func");
76 insert(MemberListType_proAttribs,"protected-attrib");
77 insert(MemberListType_proSlots,"protected-slot");
78 insert(MemberListType_proStaticMethods,"protected-static-func");
79 insert(MemberListType_proStaticAttribs,"protected-static-attrib");
80 insert(MemberListType_pacTypes,"package-type");
81 insert(MemberListType_pacMethods,"package-func");
82 insert(MemberListType_pacAttribs,"package-attrib");
83 insert(MemberListType_pacStaticMethods,"package-static-func");
84 insert(MemberListType_pacStaticAttribs,"package-static-attrib");
85 insert(MemberListType_priTypes,"private-type");
86 insert(MemberListType_priMethods,"private-func");
87 insert(MemberListType_priAttribs,"private-attrib");
88 insert(MemberListType_priSlots,"private-slot");
89 insert(MemberListType_priStaticMethods,"private-static-func");
90 insert(MemberListType_priStaticAttribs,"private-static-attrib");
91 insert(MemberListType_friends,"friend");
92 insert(MemberListType_related,"related");
93 insert(MemberListType_decDefineMembers,"define");
94 insert(MemberListType_decProtoMembers,"prototype");
95 insert(MemberListType_decTypedefMembers,"typedef");
96 insert(MemberListType_decEnumMembers,"enum");
97 insert(MemberListType_decFuncMembers,"func");
98 insert(MemberListType_decVarMembers,"var");
102 static DocbookSectionMapper g_docbookSectionMapper;
105 inline void writeDocbookString(FTextStream &t,const char *s)
107 t << convertToXML(s);
110 inline void writeDocbookCodeString(FTextStream &t,const char *s, int &col)
119 static int tabSize = Config_getInt("TAB_SIZE");
120 int spacesToNextTabStop = tabSize - (col%tabSize);
121 col+=spacesToNextTabStop;
122 while (spacesToNextTabStop--) t << " ";
125 case ' ': t << " "; col++; break;
126 case '<': t << "<"; col++; break;
127 case '>': t << ">"; col++; break;
128 case '&': t << "&"; col++; break;
129 case '\'': t << "'"; col++; break;
130 case '"': t << """; col++; break;
131 default: t << c; col++; break;
136 static void writeDocbookHeaderMainpage(FTextStream &t)
138 t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
139 t << "<chapter xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" << endl;
142 static void writeDocbookHeader_ID(FTextStream &t, QCString id)
144 t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
145 t << "<section xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xml:id=\"" << id << "\">" << endl;
148 void writeDocbookLink(FTextStream &t,const char * /*extRef*/,const char *compoundId,
149 const char *anchorId,const char * text,const char * /*tooltip*/)
151 t << "<link linkend=\"" << compoundId;
152 if (anchorId) t << "_1" << anchorId;
155 writeDocbookString(t,text);
159 class TextGeneratorDocbookImpl : public TextGeneratorIntf
162 TextGeneratorDocbookImpl(FTextStream &t): m_t(t) {}
163 void writeString(const char *s,bool /*keepSpaces*/) const
165 writeDocbookString(m_t,s);
167 void writeBreak(int) const {}
168 void writeLink(const char *extRef,const char *file,
169 const char *anchor,const char *text
172 writeDocbookLink(m_t,extRef,file,anchor,text,0);
178 class DocbookCodeGenerator : public CodeOutputInterface
181 DocbookCodeGenerator(FTextStream &t) : m_t(t), m_lineNumber(-1),
182 m_insideCodeLine(FALSE), m_insideSpecialHL(FALSE) {}
183 virtual ~DocbookCodeGenerator() {}
185 void codify(const char *text)
187 Docbook_DB(("(codify \"%s\")\n",text));
188 writeDocbookCodeString(m_t,text,col);
190 void writeCodeLink(const char *ref,const char *file,
191 const char *anchor,const char *name,
194 Docbook_DB(("(writeCodeLink)\n"));
195 writeDocbookLink(m_t,ref,file,anchor,name,tooltip);
198 void writeTooltip(const char *, const DocLinkInfo &, const char *,
199 const char *, const SourceLinkInfo &, const SourceLinkInfo &
202 Docbook_DB(("(writeToolTip)\n"));
204 void startCodeLine(bool)
206 Docbook_DB(("(startCodeLine)\n"));
207 if (m_lineNumber!=-1)
209 if (!m_refId.isEmpty())
211 m_t << "<link linkend=\"" << m_refId << "\">";
214 if (!m_refId.isEmpty())
219 m_insideCodeLine=TRUE;
225 Docbook_DB(("(endCodeLine)\n"));
228 m_external.resize(0);
229 m_insideCodeLine=FALSE;
231 void startFontClass(const char * /*colorClass*/)
233 Docbook_DB(("(startFontClass)\n"));
234 m_t << "<emphasis>"; // non DocBook
235 m_insideSpecialHL=TRUE;
239 Docbook_DB(("(endFontClass)\n"));
240 m_t << "</emphasis>"; // non DocBook
241 m_insideSpecialHL=FALSE;
243 void writeCodeAnchor(const char *)
245 Docbook_DB(("(writeCodeAnchor)\n"));
247 void writeLineNumber(const char *extRef,const char *compId,
248 const char *anchorId,int l)
250 Docbook_DB(("(writeLineNumber)\n"));
251 // we remember the information provided here to use it
252 // at the <codeline> start tag.
257 if (anchorId) m_refId+=(QCString)"_1"+anchorId;
258 m_isMemberRef = anchorId!=0;
259 if (extRef) m_external=extRef;
262 void setCurrentDoc(Definition *,const char *,bool)
265 void addWord(const char *,bool)
270 if (m_insideCodeLine) endCodeLine();
280 bool m_insideCodeLine;
281 bool m_insideSpecialHL;
285 static void writeTemplateArgumentList(ArgumentList *al,
292 indentStr.fill(' ',indent);
295 t << indentStr << "<templateparamlist>" << endl;
296 ArgumentListIterator ali(*al);
298 for (ali.toFirst();(a=ali.current());++ali)
300 t << indentStr << " <param>" << endl;
301 if (!a->type.isEmpty())
303 t << indentStr << " <type>";
304 linkifyText(TextGeneratorDocbookImpl(t),scope,fileScope,0,a->type);
305 t << "</type>" << endl;
307 if (!a->name.isEmpty())
309 t << indentStr << " <declname>" << a->name << "</declname>" << endl;
310 t << indentStr << " <defname>" << a->name << "</defname>" << endl;
312 if (!a->defval.isEmpty())
314 t << indentStr << " <defval>";
315 linkifyText(TextGeneratorDocbookImpl(t),scope,fileScope,0,a->defval);
316 t << "</defval>" << endl;
318 t << indentStr << " </param>" << endl;
320 t << indentStr << "</templateparamlist>" << endl;
324 static void writeTemplateList(ClassDef *cd,FTextStream &t)
326 writeTemplateArgumentList(cd->templateArguments(),t,cd,0,4);
329 static void writeDocbookDocBlock(FTextStream &t,
330 const QCString &fileName,
334 const QCString &text)
336 QCString stext = text.stripWhiteSpace();
337 if (stext.isEmpty()) return;
338 // convert the documentation string into an abstract syntax tree
339 DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text,FALSE,FALSE);
340 // create a code generator
341 DocbookCodeGenerator *docbookCodeGen = new DocbookCodeGenerator(t);
342 // create a parse tree visitor for Docbook
343 DocbookDocVisitor *visitor = new DocbookDocVisitor(t,*docbookCodeGen);
345 root->accept(visitor);
348 delete docbookCodeGen;
352 void writeDocbookCodeBlock(FTextStream &t,FileDef *fd)
354 ParserInterface *pIntf=Doxygen::parserManager->getParser(fd->getDefFileExtension());
355 SrcLangExt langExt = getLanguageFromFileName(fd->getDefFileExtension());
356 pIntf->resetCodeParserState();
357 DocbookCodeGenerator *docbookGen = new DocbookCodeGenerator(t);
358 pIntf->parseCode(*docbookGen, // codeOutIntf
360 fileToString(fd->absFilePath(),Config_getBool("FILTER_SOURCE_FILES")),
362 FALSE, // isExampleBlock
367 FALSE, // inlineFragement
369 TRUE // showLineNumbers
371 docbookGen->finish();
375 static QCString classOutputFileBase(ClassDef *cd)
377 //static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
378 //if (inlineGroupedClasses && cd->partOfGroups()!=0)
379 return cd->getOutputFileBase();
381 // return cd->getOutputFileBase();
384 static QCString memberOutputFileBase(MemberDef *md)
386 //static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES");
387 //if (inlineGroupedClasses && md->getClassDef() && md->getClassDef()->partOfGroups()!=0)
388 // return md->getClassDef()->getDocbookOutputFileBase();
390 // return md->getOutputFileBase();
391 return md->getOutputFileBase();
395 static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *def, bool detailed=0)
398 // + declaration/definition arg lists
402 // + const/volatile specifiers
404 // + source definition
405 // + source references
406 // + source referenced by
408 // + template arguments
409 // (templateArguments(), definitionTemplateParameterLists())
412 // enum values are written as part of the enum
413 if (md->memberType()==MemberType_EnumValue) return;
414 if (md->isHidden()) return;
415 //if (md->name().at(0)=='@') return; // anonymous member
417 // group members are only visible in their group
418 //if (def->definitionType()!=Definition::TypeGroup && md->getGroupDef()) return;
420 switch (md->memberType())
422 case MemberType_Define: memType="define"; break;
423 case MemberType_Function: memType="function"; break;
424 case MemberType_Variable: memType="variable"; break;
425 case MemberType_Typedef: memType="typedef"; break;
426 case MemberType_Enumeration: memType="enum"; break;
427 case MemberType_EnumValue: ASSERT(0); break;
428 case MemberType_Signal: memType="signal"; break;
429 case MemberType_Slot: memType="slot"; break;
430 case MemberType_Friend: memType="friend"; break;
431 case MemberType_DCOP: memType="dcop"; break;
432 case MemberType_Property: memType="property"; break;
433 case MemberType_Event: memType="event"; break;
434 case MemberType_Interface: memType="interface"; break;
435 case MemberType_Service: memType="service"; break;
438 if (md->getClassDef())
440 scopeName=md->getClassDef()->name();
442 else if (md->getNamespaceDef())
444 scopeName=md->getNamespaceDef()->name();
448 t << " <para>" << endl;
449 t << " <itemizedlist>" << endl;
450 t << " <listitem>" << endl;
453 if (md->memberType()==MemberType_Enumeration)
455 MemberList *enumFields = md->enumFieldList();
456 t << " <para>" << memType << " <link linkend=\"";
457 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
459 t << md->getGroupDef()->getOutputFileBase();
463 t << memberOutputFileBase(md);
465 t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
468 MemberListIterator emli(*enumFields);
472 for (emli.toFirst();(emd=emli.current());++emli)
478 t << "<link linkend=\"" << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">";
479 writeDocbookString(t,emd->name());
481 if (!emd->initializer().isEmpty())
484 writeDocbookString(t,emd->initializer());
491 else if (md->memberType()==MemberType_Define)
493 t << " <para>" << "#" << memType << " <link linkend=\"";
494 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
496 t << md->getGroupDef()->getOutputFileBase();
500 t << memberOutputFileBase(md);
502 t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
503 if (!md->initializer().isEmpty() && md->initializer().length()<2000)
506 linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->initializer());
508 if (md->briefDescription())
510 t << "<para><emphasis>";
511 writeDocbookString(t,md->briefDescription());
512 t << "</emphasis></para>" << endl;
515 else if (md->memberType()==MemberType_Variable)
517 if (md->getClassDef())
519 t << " <para>" << convertToXML(md->declaration());
520 if (md->briefDescription())
522 t << "<para><emphasis>";
523 writeDocbookString(t,md->briefDescription());
524 t << "</emphasis></para>";
530 linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
531 t << " <link linkend=\"";
532 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
534 t << md->getGroupDef()->getOutputFileBase();
538 t << memberOutputFileBase(md);
540 t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
543 else if (md->memberType()==MemberType_Typedef)
545 t << " <para>" << memType;
547 linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
549 t << " <link linkend=\"";
550 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
552 t << md->getGroupDef()->getOutputFileBase();
556 t << memberOutputFileBase(md);
558 t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
560 else if (md->memberType()==MemberType_Function)
563 linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
564 t << " <link linkend=\"";
565 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
567 t << md->getGroupDef()->getOutputFileBase();
571 t << memberOutputFileBase(md);
573 t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
575 ArgumentList *declAl = md->declArgumentList();
576 ArgumentList *defAl = md->argumentList();
577 if (declAl && declAl->count()>0)
579 ArgumentListIterator declAli(*declAl);
580 ArgumentListIterator defAli(*defAl);
583 for (declAli.toFirst();(a=declAli.current());++declAli)
589 if (!a->type.isEmpty())
591 linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,a->type);
594 if (!a->name.isEmpty())
596 writeDocbookString(t,a->name);
607 if (closePara) t << "</para>" << endl;
608 t << " </listitem>" << endl;
609 t << " </itemizedlist>" << endl;
610 t << " </para>" << endl;
614 if (md->memberType()==MemberType_Enumeration)
616 MemberList *enumFields = md->enumFieldList();
617 t << " <section xml:id=\"";
618 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
620 t << md->getGroupDef()->getOutputFileBase();
624 t << memberOutputFileBase(md);
626 t << "_1" << md->anchor() << "\">" << endl;
627 t << " <title>" << memType << " " << convertToXML(md->name()) << " " << "</title>" << endl;
629 writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
633 MemberListIterator emli(*enumFields);
635 t << " <formalpara>" << endl;
636 t << " <title>Enumerator:</title>" << endl;
637 t << " <variablelist>" << endl;
638 for (emli.toFirst();(emd=emli.current());++emli)
640 t << " <varlistentry xml:id=\"";
641 t << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">" << endl;
643 writeDocbookString(t,emd->name());
644 t << "</term>" << endl;
645 t << " <listitem>" << endl;
647 writeDocbookString(t,emd->briefDescription());
648 t << "</para>" << endl;
649 t << " </listitem>" << endl;
650 t << " </varlistentry>" << endl;
652 t << " </variablelist>" << endl;
653 t << " </formalpara>" << endl;
655 t << "Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << endl;
656 t << " <programlisting>" << endl;
658 for (emli.toFirst();(emd=emli.current());++emli)
660 writeDocbookString(t,emd->name());
661 if (!emd->initializer().isEmpty())
664 writeDocbookString(t,emd->initializer());
668 t << "}" << convertToXML(md->name()) << ";" << endl;
669 t << " </programlisting>" << endl;
670 t << " </para>" << endl;
671 t << " </section>" << endl;
674 else if (md->memberType()==MemberType_Typedef)
676 t << " <section xml:id=\"";
677 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
679 t << md->getGroupDef()->getOutputFileBase();
683 t << memberOutputFileBase(md);
685 t << "_1" << md->anchor() << "\">" << endl;
686 t << " <title>" << convertToXML(md->definition()) << "</title>";
688 writeDocbookString(t,md->briefDescription());
689 t << "</emphasis>" << endl;
691 writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
693 t << " </section>" << endl;
695 else if (md->memberType()==MemberType_Function)
697 t << " <section xml:id=\"";
698 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
700 t << md->getGroupDef()->getOutputFileBase();
704 t << memberOutputFileBase(md);
706 t << "_1" << md->anchor() << "\">" << endl;
707 t << " <title>" << convertToXML(md->definition()) << " " << convertToXML(md->argsString()) << "</title>";
709 writeDocbookString(t,md->briefDescription());
710 t << "</emphasis>" << endl;
712 writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
714 t << " </section>" << endl;
716 else if (md->memberType()==MemberType_Define)
718 if (md->documentation())
720 t << " <section xml:id=\"";
721 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
723 t << md->getGroupDef()->getOutputFileBase();
727 t << memberOutputFileBase(md);
729 t << "_1" << md->anchor() << "\">" << endl;
730 t << " <title>" << convertToXML(md->definition()) << "</title>";
732 writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
734 t << " <para>Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << "</para>" << endl;
735 t << " <para>The Documentation for this define was generated from the following file: </para>" << endl;
736 t << " <para><itemizedlist><listitem><para>" << stripPath(md->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
737 t << " </section>" << endl;
740 else if (md->memberType()==MemberType_Variable)
742 if (md->getClassDef())
744 if (md->documentation())
746 t << " <simplesect>" << endl;
747 t << " <title>" << convertToXML(md->definition()) << "</title>";
749 writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
751 t << " <para>Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << "</para>" << endl;
752 t << " <para>The Documentation for this struct was generated from the following file: </para>" << endl;
753 t << " <para><itemizedlist><listitem><para>" << stripPath(md->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
754 t << " </simplesect>" << endl;
759 t << " <section xml:id=\"";
760 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
762 t << md->getGroupDef()->getOutputFileBase();
766 t << memberOutputFileBase(md);
768 t << "_1" << md->anchor() << "\">" << endl;
769 t << " <title>" << convertToXML(md->definition()) << "</title>";
771 writeDocbookString(t,md->briefDescription());
772 t << "</emphasis>" << endl;
774 writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
776 t << " </section>" << endl;
782 static void generateDocbookSection(Definition *d,FTextStream &t,MemberList *ml,const char *kind,
783 bool detailed=0, const char *header=0,const char *documentation=0)
786 MemberListIterator mli(*ml);
790 QCString compkind = kind;
791 QCString title, desctitle;
793 for (mli.toFirst();(md=mli.current());++mli)
795 // namespace members are also inserted in the file scope, but
796 // to prevent this duplication in the Docbook output, we filter those here.
797 if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
803 switch (ml->listType())
805 case MemberListType_decDefineMembers: title="Defines"; desctitle="Define Documentation"; break;
806 case MemberListType_decTypedefMembers: title="Typedefs"; desctitle="Typedef Documentation"; break;
807 case MemberListType_decEnumMembers: title="Enumerations"; desctitle="Enumeration Type documentation"; break;
808 case MemberListType_decFuncMembers: title="Functions"; desctitle="Function Documentation"; break;
809 case MemberListType_decVarMembers: title="Variables"; desctitle="Variable Documentation"; break;
810 case MemberListType_pubAttribs: title="Public Attributes"; desctitle="Member Documentation"; break;
811 case MemberListType_priAttribs: title="Private Attributes"; desctitle="Member Documentation"; break;
812 case MemberListType_proAttribs: title="Protected Attributes";desctitle="Member Documentation"; break;
813 default: title=""; desctitle=""; break;
816 if (count==0) return; // empty list
818 for (mli.toFirst();(md=mli.current());++mli)
820 if (md->documentation())
830 if (desctitle=="Member Documentation")
834 t << " <simplesect>" << endl;
835 t << " <title>" << desctitle << "</title>" << endl;
838 else if (desctitle=="Define Documentation")
842 t << " <section>" << endl;
843 t << " <title>" << desctitle << "</title>" << endl;
848 t << " <section>" << endl;
849 t << " <title>" << desctitle << "</title>" << endl;
854 t << " <simplesect>" << endl;
857 t << " <title>" << convertToXML(header) << "</title>" << endl;
861 t << " <title>" << title << "</title>" << endl;
867 t << " <description>";
868 writeDocbookDocBlock(t,d->docFile(),d->docLine(),d,0,documentation);
869 t << "</description>" << endl;
871 for (mli.toFirst();(md=mli.current());++mli)
873 // namespace members are also inserted in the file scope, but
874 // to prevent this duplication in the Docbook output, we filter those here.
875 if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
877 generateDocbookForMember(md,t,d,detailed);
884 if (desctitle=="Member Documentation")
888 t << " </simplesect>" << endl;
891 else if (desctitle=="Define Documentation")
895 t << " </section>" << endl;
900 t << " </section>" << endl;
906 t << " </simplesect>" << endl;
910 static void writeInnerClasses(const ClassSDict *cl,FTextStream &t)
914 ClassSDict::Iterator cli(*cl);
916 QCString title = "Classes";
920 t << " <simplesect>" << endl;
921 t << " <title> " << title << " </title>" << endl;
923 for (cli.toFirst();(cd=cli.current());++cli)
925 if (!cd->isHidden() && cd->name().find('@')==-1)
927 t << " <para>" << endl;
928 t << " <itemizedlist>" << endl;
929 t << " <listitem>" << endl;
930 t << " <para>" << "struct <link linkend=\"" << classOutputFileBase(cd) << "\">" << convertToXML(cd->name()) << "</link>";
931 t << "</para>" << endl;
932 t << " </listitem>" << endl;
933 t << " </itemizedlist>" << endl;
934 t << " </para>" << endl;
939 t << " </simplesect>" << endl;
944 static void writeInnerNamespaces(const NamespaceSDict *nl,FTextStream &t)
948 NamespaceSDict::Iterator nli(*nl);
950 QCString title = "Namespaces";
954 t << " <simplesect>" << endl;
955 t << " <title> " << title << " </title>" << endl;
957 for (nli.toFirst();(nd=nli.current());++nli)
959 if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
961 t << " <para>" << endl;
962 t << " <itemizedlist>" << endl;
963 t << " <listitem>" << endl;
964 t << " <para>" << "struct <link linkend=\"" << nd->getOutputFileBase() << "\">" << convertToXML(nd->name()) << "</link>";
965 t << "</para>" << endl;
966 t << " </listitem>" << endl;
967 t << " </itemizedlist>" << endl;
968 t << " </para>" << endl;
973 t << " </simplesect>" << endl;
978 static void writeInnerFiles(const FileList *fl,FTextStream &t)
982 QListIterator<FileDef> fli(*fl);
984 QCString title = "Files";
988 t << " <simplesect>" << endl;
989 t << " <title> " << title << " </title>" << endl;
991 for (fli.toFirst();(fd=fli.current());++fli)
993 t << " <para>" << endl;
994 t << " <itemizedlist>" << endl;
995 t << " <listitem>" << endl;
996 t << " <para>" << "file <link linkend=\"" << fd->getOutputFileBase() << "\">" << convertToXML(fd->name()) << "</link>";
997 t << "</para>" << endl;
998 t << " </listitem>" << endl;
999 t << " </itemizedlist>" << endl;
1000 t << " </para>" << endl;
1004 t << " </simplesect>" << endl;
1009 static void writeInnerPages(const PageSDict *pl,FTextStream &t)
1013 PageSDict::Iterator pli(*pl);
1016 for (pli.toFirst();(pd=pli.current());++pli)
1018 t << "<xi:include href=\"" << pd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
1023 static void writeInnerGroups(const GroupList *gl,FTextStream &t)
1027 GroupListIterator gli(*gl);
1030 //Docbook header tags for inner groups
1033 t << " <simplesect>" << endl;
1034 t << " <title>Modules</title>" << endl;
1035 t << " </simplesect>" << endl;
1036 t << " <para>" << endl;
1037 t << " <itemizedlist>" << endl;
1040 for (gli.toFirst();(sgd=gli.current());++gli)
1042 t << " <listitem><para><link linkend=\"" << sgd->getOutputFileBase() << "\">" << convertToXML(sgd->groupTitle()) << "</link></para></listitem>" << endl;
1045 //Docbook footer tags for inner groups
1048 t << " </itemizedlist>" << endl;
1049 t << " </para>" << endl;
1055 static void writeInnerDirs(const DirList *dl,FTextStream &t)
1059 QListIterator<DirDef> subdirs(*dl);
1061 QCString title = "Directories";
1062 if (subdirs.toFirst())
1064 t << " <simplesect>" << endl;
1065 t << " <title> " << title << " </title>" << endl;
1067 for (subdirs.toFirst();(subdir=subdirs.current());++subdirs)
1069 t << " <para>" << endl;
1070 t << " <itemizedlist>" << endl;
1071 t << " <listitem>" << endl;
1072 t << " <para>" << "dir <link linkend=\"" << subdir->getOutputFileBase() << "\">" << convertToXML(subdir->displayName()) << "</link>";
1073 t << "</para>" << endl;
1074 t << " </listitem>" << endl;
1075 t << " </itemizedlist>" << endl;
1076 t << " </para>" << endl;
1078 if (subdirs.toFirst())
1080 t << " </simplesect>" << endl;
1085 static void writeInnerGroupFiles(const GroupList *gl,FTextStream &t)
1089 GroupListIterator gli(*gl);
1092 for (gli.toFirst();(sgd=gli.current());++gli)
1094 t << "<xi:include href=\"" << sgd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
1099 static void generateDocbookForClass(ClassDef *cd,FTextStream &ti)
1101 // + brief description
1102 // + detailed description
1103 // + template argument list(s)
1106 // + inheritance diagram
1107 // + list of direct super classes
1108 // + list of direct sub classes
1109 // + list of inner classes
1110 // + collaboration diagram
1111 // + list of all members
1112 // + user defined member sections
1113 // + standard member sections
1114 // + detailed member documentation
1115 // - examples using the class
1117 if (cd->isReference()) return; // skip external references.
1118 if (cd->isHidden()) return; // skip hidden classes.
1119 if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
1120 if (cd->templateMaster()!=0) return; // skip generated template instances.
1122 msg("Generating Docbook output for class %s\n",cd->name().data());
1124 QCString fileDocbook=cd->getOutputFileBase()+".xml";
1125 //Add the file Documentation info to index file
1126 ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
1128 QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
1129 QCString fileName=outputDirectory+"/"+ classOutputFileBase(cd)+".xml";
1131 if (!f.open(IO_WriteOnly))
1133 err("Cannot open file %s for writing!\n",fileName.data());
1137 //t.setEncoding(FTextStream::UnicodeUTF8);
1139 writeDocbookHeader_ID(t, classOutputFileBase(cd));
1141 writeDocbookString(t,cd->name());
1142 t << " " << cd->compoundTypeString() << " Reference";
1143 t << "</title>" << endl;
1145 IncludeInfo *ii=cd->includeInfo();
1148 QCString nm = ii->includeName;
1149 if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
1152 t << "<para>" << endl;
1153 t << " <programlisting>#include ";
1154 if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references
1156 t << "<link linkend=\"" << ii->fileDef->getOutputFileBase() << "\">";
1166 t << convertToXML(nm);
1175 if (ii->fileDef && !ii->fileDef->isReference())
1179 t << "</programlisting>" << endl;
1180 t << "</para>" << endl;
1184 writeInnerClasses(cd->getClassSDict(),t);
1186 writeTemplateList(cd,t);
1187 if (cd->getMemberGroupSDict())
1189 MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
1191 for (;(mg=mgli.current());++mgli)
1193 generateDocbookSection(cd,t,mg->members(),"user-defined",0,mg->header(),
1194 mg->documentation());
1199 QListIterator<MemberList> mli(cd->getMemberLists());
1201 for (mli.toFirst();(ml=mli.current());++mli)
1203 if ((ml->listType()&MemberListType_detailedLists)==0)
1205 generateDocbookSection(cd,t,ml,g_docbookSectionMapper.find(ml->listType()));
1208 if (cd->briefDescription())
1210 t << " <simplesect>" << endl;
1211 t << " <title>Brief Description</title>" << endl;
1212 writeDocbookDocBlock(t,cd->briefFile(),cd->briefLine(),cd,0,cd->briefDescription());
1213 t << " </simplesect>" << endl;
1216 if (cd->documentation())
1218 t << " <simplesect>" << endl;
1219 t << " <title>Detailed Description</title>" << endl;
1220 writeDocbookDocBlock(t,cd->docFile(),cd->docLine(),cd,0,cd->documentation());
1221 t << " <para>Definition at line " << cd->getDefLine() << " of file " << stripPath(cd->getDefFileName()) << "</para>" << endl;
1222 t << " <para>The Documentation for this struct was generated from the following file: </para>" << endl;
1223 t << " <para><itemizedlist><listitem><para>" << stripPath(cd->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
1224 t << " </simplesect>" << endl;
1226 for (mli.toFirst();(ml=mli.current());++mli)
1228 if ((ml->listType()&MemberListType_detailedLists)==0)
1230 generateDocbookSection(cd,t,ml,g_docbookSectionMapper.find(ml->listType()),1);
1234 /*// TODO: Handling of Inheritance and Colloboration graph for Docbook to be implemented
1235 DotClassGraph inheritanceGraph(cd,DotNode::Inheritance);
1236 if (!inheritanceGraph.isTrivial())
1238 t << " <inheritancegraph>" << endl;
1239 inheritanceGraph.writeDocbook(t);
1240 t << " </inheritancegraph>" << endl;
1242 DotClassGraph collaborationGraph(cd,DotNode::Collaboration);
1243 if (!collaborationGraph.isTrivial())
1245 t << " <collaborationgraph>" << endl;
1246 collaborationGraph.writeDocbook(t);
1247 t << " </collaborationgraph>" << endl;
1249 t << " <location file=\""
1250 << cd->getDefFileName() << "\" line=\""
1251 << cd->getDefLine() << "\"";
1252 if (cd->getStartBodyLine()!=-1)
1254 FileDef *bodyDef = cd->getBodyDef();
1257 t << " bodyfile=\"" << bodyDef->absFilePath() << "\"";
1259 t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
1260 << cd->getEndBodyLine() << "\"";
1263 writeListOfAllMembers(cd,t);
1266 t << "</section>" << endl;
1270 static void generateDocbookForNamespace(NamespaceDef *nd,FTextStream &ti)
1272 // + contained class definitions
1273 // + contained namespace definitions
1279 // - files containing (parts of) the namespace definition
1281 if (nd->isReference() || nd->isHidden()) return; // skip external references
1283 QCString fileDocbook=nd->getOutputFileBase()+".xml";
1284 //Add the file Documentation info to index file
1285 ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
1287 QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
1288 QCString fileName=outputDirectory+"/"+nd->getOutputFileBase()+".xml";
1290 if (!f.open(IO_WriteOnly))
1292 err("Cannot open file %s for writing!\n",fileName.data());
1296 //t.setEncoding(FTextStream::UnicodeUTF8);
1298 writeDocbookHeader_ID(t, nd->getOutputFileBase());
1300 writeDocbookString(t,nd->name());
1301 t << "</title>" << endl;
1303 writeInnerClasses(nd->getClassSDict(),t);
1304 writeInnerNamespaces(nd->getNamespaceSDict(),t);
1306 if (nd->getMemberGroupSDict())
1308 MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
1310 for (;(mg=mgli.current());++mgli)
1312 generateDocbookSection(nd,t,mg->members(),"user-defined",0,mg->header(),
1313 mg->documentation());
1317 QListIterator<MemberList> mli(nd->getMemberLists());
1319 for (mli.toFirst();(ml=mli.current());++mli)
1321 if ((ml->listType()&MemberListType_declarationLists)!=0)
1323 generateDocbookSection(nd,t,ml,g_docbookSectionMapper.find(ml->listType()));
1327 if (nd->briefDescription())
1329 t << " <simplesect>" << endl;
1330 t << " <title>Brief Description</title>" << endl;
1331 writeDocbookDocBlock(t,nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription());
1332 t << " </simplesect>" << endl;
1335 if (nd->documentation())
1337 t << " <simplesect>" << endl;
1338 t << " <title>Detailed Description</title>" << endl;
1339 writeDocbookDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation());
1340 t << " <para>Definition at line " << nd->getDefLine() << " of file " << stripPath(nd->getDefFileName()) << "</para>" << endl;
1341 t << " <para>The Documentation for this struct was generated from the following file: </para>" << endl;
1342 t << " <para><itemizedlist><listitem><para>" << stripPath(nd->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
1343 t << " </simplesect>" << endl;
1345 t << "</section>" << endl;
1348 static void generateDocbookForFile(FileDef *fd,FTextStream &ti)
1351 // + includedby files
1353 // + included by graph
1354 // + contained class definitions
1355 // + contained namespace definitions
1362 // - number of lines
1364 if (fd->isReference()) return; // skip external references
1366 QCString fileDocbook=fd->getOutputFileBase()+".xml";
1367 //Add the file Documentation info to index file
1368 ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
1370 QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
1371 QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml";
1374 if (!f.open(IO_WriteOnly))
1376 err("Cannot open file %s for writing!\n",fileName.data());
1380 //t.setEncoding(FTextStream::UnicodeUTF8);
1381 writeDocbookHeader_ID(t, fd->getOutputFileBase());
1384 writeDocbookString(t,fd->name());
1385 t << " File Reference";
1386 t << "</title>" << endl;
1390 if (fd->includeFileList())
1392 QListIterator<IncludeInfo> ili1(*fd->includeFileList());
1393 for (ili1.toFirst();(inc=ili1.current());++ili1)
1395 t << " <programlisting>#include ";
1404 t << convertToXML(inc->includeName);
1413 t << "</programlisting>" << endl;
1417 if (fd->getClassSDict())
1419 writeInnerClasses(fd->getClassSDict(),t);
1421 if (fd->getNamespaceSDict())
1423 writeInnerNamespaces(fd->getNamespaceSDict(),t);
1426 if (fd->getMemberGroupSDict())
1428 MemberGroupSDict::Iterator mgli(*fd->getMemberGroupSDict());
1430 for (;(mg=mgli.current());++mgli)
1432 generateDocbookSection(fd,t,mg->members(),"user-defined",0,mg->header(),
1433 mg->documentation());
1437 QListIterator<MemberList> mli(fd->getMemberLists());
1439 for (mli.toFirst();(ml=mli.current());++mli)
1441 if ((ml->listType()&MemberListType_declarationLists)!=0)
1443 generateDocbookSection(fd,t,ml,g_docbookSectionMapper.find(ml->listType()));
1447 t << " <simplesect>" << endl;
1448 t << " <title>Detailed Description</title>" << endl;
1449 writeDocbookDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription());
1450 writeDocbookDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation());
1451 t << " <para>Definition in file " << fd->getDefFileName() << "</para>" << endl;
1452 t << " </simplesect>" << endl;
1454 /*// TODO: Handling of Program listing for Docbook to be implemented
1455 if (Config_getBool("DOCBOOK_PROGRAMLISTING"))
1457 t << " <programlisting>" << endl;
1458 writeDocbookCodeBlock(t,fd);
1459 t << " </programlisting>" << endl;
1463 t << "</section>" << endl;
1467 static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti)
1478 // + brief description
1479 // + detailed description
1481 if (gd->isReference()) return; // skip external references
1483 if (!gd->isASubGroup())
1485 QCString fileDocbook=gd->getOutputFileBase()+".xml";
1486 //Add the file Documentation info to index file
1487 ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
1490 QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
1491 QCString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml";
1494 if (!f.open(IO_WriteOnly))
1496 err("Cannot open file %s for writing!\n",fileName.data());
1501 //t.setEncoding(FTextStream::UnicodeUTF8);
1502 writeDocbookHeader_ID(t, gd->getOutputFileBase());
1504 t << " <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl;
1506 if (gd->briefDescription())
1508 t << " <simplesect>" << endl;
1509 t << " <title>Brief Description</title>" << endl;
1510 writeDocbookDocBlock(t,gd->briefFile(),gd->briefLine(),gd,0,gd->briefDescription());
1511 t << " </simplesect>" << endl;
1514 if (gd->documentation())
1516 t << " <simplesect>" << endl;
1517 t << " <title>Detailed Description</title>" << endl;
1518 writeDocbookDocBlock(t,gd->docFile(),gd->docLine(),gd,0,gd->documentation());
1519 t << " </simplesect>" << endl;
1522 writeInnerFiles(gd->getFiles(),t);
1523 writeInnerClasses(gd->getClasses(),t);
1524 writeInnerNamespaces(gd->getNamespaces(),t);
1525 writeInnerPages(gd->getPages(),t);
1526 writeInnerGroups(gd->getSubGroups(),t);
1528 if (gd->getMemberGroupSDict())
1530 MemberGroupSDict::Iterator mgli(*gd->getMemberGroupSDict());
1532 for (;(mg=mgli.current());++mgli)
1534 generateDocbookSection(gd,t,mg->members(),"user-defined",0,mg->header(),
1535 mg->documentation());
1539 QListIterator<MemberList> mli(gd->getMemberLists());
1541 for (mli.toFirst();(ml=mli.current());++mli)
1543 if ((ml->listType()&MemberListType_declarationLists)!=0)
1545 generateDocbookSection(gd,t,ml,g_docbookSectionMapper.find(ml->listType()));
1548 for (mli.toFirst();(ml=mli.current());++mli)
1550 if ((ml->listType()&MemberListType_declarationLists)!=0)
1552 generateDocbookSection(gd,t,ml,g_docbookSectionMapper.find(ml->listType()),1);
1556 writeInnerGroupFiles(gd->getSubGroups(),t);
1558 t << "</section>" << endl;
1562 static void generateDocbookForDir(DirDef *dd,FTextStream &ti)
1564 if (dd->isReference()) return; // skip external references
1566 QCString fileDocbook=dd->getOutputFileBase()+".xml";
1567 //Add the file Documentation info to index file
1568 ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
1570 QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
1571 QCString fileName=outputDirectory+"/"+dd->getOutputFileBase()+".xml";
1573 if (!f.open(IO_WriteOnly))
1575 err("Cannot open file %s for writing!\n",fileName.data());
1580 //t.setEncoding(FTextStream::UnicodeUTF8);
1581 writeDocbookHeader_ID(t, dd->getOutputFileBase());
1584 writeDocbookString(t, dd->displayName());
1585 t << " Directory Reference";
1586 t << "</title>" << endl;
1588 writeInnerDirs(&dd->subDirs(),t);
1589 writeInnerFiles(dd->getFiles(),t);
1591 t << " <simplesect>" << endl;
1592 t << " <title>Detailed Description</title>" << endl;
1593 writeDocbookDocBlock(t,dd->briefFile(),dd->briefLine(),dd,0,dd->briefDescription());
1594 writeDocbookDocBlock(t,dd->docFile(),dd->docLine(),dd,0,dd->documentation());
1595 t << " <para>Directory location is " << dd->name() << "</para>" << endl;
1596 t << " </simplesect>" << endl;
1598 t << "</section>" << endl;
1601 static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample)
1607 if (pd->isReference()) return;
1609 QCString pageName = pd->getOutputFileBase();
1610 if (pd->getGroupDef())
1612 pageName+=(QCString)"_"+pd->name();
1614 if (pageName=="index")
1616 pageName="mainpage"; // to prevent overwriting the generated index page.
1619 QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
1620 QCString fileName=outputDirectory+"/"+pageName+".xml";
1622 if (!f.open(IO_WriteOnly))
1624 err("Cannot open file %s for writing!\n",fileName.data());
1629 //t.setEncoding(FTextStream::UnicodeUTF8);
1631 if (!pd->hasParentPage())
1633 QCString fileDocbook=pageName+".xml";
1634 //Add the file Documentation info to index file
1635 ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
1636 writeDocbookHeaderMainpage(t);
1640 QCString pid = pageName+"_1"+pageName;
1641 writeDocbookHeader_ID(t, pid);
1644 SectionInfo *si = Doxygen::sectionDict->find(pd->name());
1647 t << " <title>" << convertToXML(si->title) << "</title>" << endl;
1651 t << " <title>" << convertToXML(pd->name()) << "</title>" << endl;
1656 writeDocbookDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
1657 pd->documentation()+"\n<include "+pd->name()+">");
1661 writeDocbookDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
1662 pd->documentation());
1664 writeInnerPages(pd->getSubPages(),t);
1666 if (!pd->hasParentPage())
1668 t << endl << "</chapter>" << endl;
1672 t << endl << "</section>" << endl;
1676 void generateDocbook()
1686 QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT");
1687 if (outputDirectory.isEmpty())
1689 outputDirectory=QDir::currentDirPath().utf8();
1693 QDir dir(outputDirectory);
1696 dir.setPath(QDir::currentDirPath());
1697 if (!dir.mkdir(outputDirectory))
1699 err("tag DOCBOOK_OUTPUT: Output directory `%s' does not "
1700 "exist and cannot be created\n",outputDirectory.data());
1705 msg("Notice: Output directory `%s' does not exist. "
1706 "I have created it for you.\n", outputDirectory.data());
1708 dir.cd(outputDirectory);
1710 outputDirectory=dir.absPath().utf8();
1713 QDir dir(outputDirectory);
1716 dir.setPath(QDir::currentDirPath());
1717 if (!dir.mkdir(outputDirectory))
1719 err("Cannot create directory %s\n",outputDirectory.data());
1723 QDir docbookDir(outputDirectory);
1724 createSubDirs(docbookDir);
1726 QCString fileName=outputDirectory+"/index.xml";
1727 QCString dbk_projectName = Config_getString("PROJECT_NAME");
1730 f.setName(fileName);
1731 if (!f.open(IO_WriteOnly))
1733 err("Cannot open file %s for writing!\n",fileName.data());
1737 //t.setEncoding(FTextStream::UnicodeUTF8);
1739 // write index header for Docbook which calls the structure file
1740 t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
1741 t << "<book xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" << endl;
1742 t << " <info>" << endl;
1743 t << " <title>" << dbk_projectName << "</title>" << endl;
1744 t << " </info>" << endl;
1746 // NAMESPACE DOCUMENTATION
1748 NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
1751 //Namespace Documentation index header
1754 t << " <chapter>" << endl;
1755 t << " <title>Namespace Documentation</title>" << endl;
1758 for (nli.toFirst();(nd=nli.current());++nli)
1760 msg("Generating Docbook output for namespace %s\n",nd->name().data());
1761 generateDocbookForNamespace(nd,t);
1764 //Namespace Documentation index footer
1767 t << " </chapter>" << endl;
1770 /** MAINPAGE DOCUMENTATION **/
1772 if (Doxygen::mainPage)
1774 msg("Generating Docbook output for the main page\n");
1775 generateDocbookForPage(Doxygen::mainPage,t,FALSE);
1778 // PAGE DOCUMENTATION
1780 PageSDict::Iterator pdi(*Doxygen::pageSDict);
1783 for (pdi.toFirst();(pd=pdi.current());++pdi)
1785 msg("Generating Docbook output for page %s\n",pd->name().data());
1786 generateDocbookForPage(pd,t,FALSE);
1790 /** MODULE GROUP DOCUMENTATION **/
1792 GroupSDict::Iterator gli(*Doxygen::groupSDict);
1795 //Module group Documentation index header
1798 t << " <chapter>" << endl;
1799 t << " <title>Module Documentation</title>" << endl;
1802 for (;(gd=gli.current());++gli)
1804 msg("Generating Docbook output for group %s\n",gd->name().data());
1805 generateDocbookForGroup(gd,t);
1808 //Module group Documentation index footer
1811 t << " </chapter>" << endl;
1814 //CLASS DOCUMENTATION
1817 ClassSDict::Iterator cli(*Doxygen::classSDict);
1820 //Class Documentation index header
1823 t << " <chapter>" << endl;
1824 t << " <title>Class Documentation</title>" << endl;
1827 for (cli.toFirst();(cd=cli.current());++cli)
1829 generateDocbookForClass(cd,t);
1832 //Class Documentation index footer
1835 t << " </chapter>" << endl;
1839 // FILE DOCUMENTATION
1841 FileNameListIterator fnli(*Doxygen::inputNameList);
1844 //File Documentation index header
1847 t << " <chapter>" << endl;
1848 t << " <title>File Documentation</title>" << endl;
1851 for (;(fn=fnli.current());++fnli)
1853 FileNameIterator fni(*fn);
1855 for (;(fd=fni.current());++fni)
1857 msg("Generating Docbook output for file %s\n",fd->name().data());
1858 generateDocbookForFile(fd,t);
1862 //File Documentation index footer
1865 t << " </chapter>" << endl;
1868 // DIRECTORY DOCUMENTATION
1872 DirSDict::Iterator sdi(*Doxygen::directories);
1874 //Directory Documentation index header
1877 t << " <chapter>" << endl;
1878 t << " <title>Directory Documentation</title>" << endl;
1881 for (sdi.toFirst();(dir=sdi.current());++sdi)
1883 msg("Generate Docbook output for dir %s\n",dir->name().data());
1884 generateDocbookForDir(dir,t);
1887 //Module group Documentation index footer
1890 t << " </chapter>" << endl;
1894 // EXAMPLE PAGE DOCUMENTATION
1897 PageSDict::Iterator pdi(*Doxygen::exampleSDict);
1900 //Example Page Documentation index header
1903 t << " <chapter>" << endl;
1904 t << " <title>Example Documentation</title>" << endl;
1907 for (pdi.toFirst();(pd=pdi.current());++pdi)
1909 msg("Generating Docbook output for example %s\n",pd->name().data());
1910 generateDocbookForPage(pd,t,TRUE);
1913 //Example Page Documentation index footer
1916 t << " </chapter>" << endl;
1920 t << "</book>" << endl;