1 /******************************************************************************
5 * Copyright (C) 1997-2015 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), m_col(0),
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,m_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 << "\">";
213 m_t << m_lineNumber << " ";
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 class=\"" << colorClass << "\">";
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 if (extRef) m_external=extRef;
261 void setCurrentDoc(Definition *,const char *,bool)
264 void addWord(const char *,bool)
269 if (m_insideCodeLine) endCodeLine();
278 bool m_insideCodeLine;
279 bool m_insideSpecialHL;
283 static void writeTemplateArgumentList(ArgumentList *al,
290 indentStr.fill(' ',indent);
293 t << indentStr << "<templateparamlist>" << endl;
294 ArgumentListIterator ali(*al);
296 for (ali.toFirst();(a=ali.current());++ali)
298 t << indentStr << " <param>" << endl;
299 if (!a->type.isEmpty())
301 t << indentStr << " <type>";
302 linkifyText(TextGeneratorDocbookImpl(t),scope,fileScope,0,a->type);
303 t << "</type>" << endl;
305 if (!a->name.isEmpty())
307 t << indentStr << " <declname>" << a->name << "</declname>" << endl;
308 t << indentStr << " <defname>" << a->name << "</defname>" << endl;
310 if (!a->defval.isEmpty())
312 t << indentStr << " <defval>";
313 linkifyText(TextGeneratorDocbookImpl(t),scope,fileScope,0,a->defval);
314 t << "</defval>" << endl;
316 t << indentStr << " </param>" << endl;
318 t << indentStr << "</templateparamlist>" << endl;
322 static void writeTemplateList(ClassDef *cd,FTextStream &t)
324 writeTemplateArgumentList(cd->templateArguments(),t,cd,0,4);
327 static void writeDocbookDocBlock(FTextStream &t,
328 const QCString &fileName,
332 const QCString &text)
334 QCString stext = text.stripWhiteSpace();
335 if (stext.isEmpty()) return;
336 // convert the documentation string into an abstract syntax tree
337 DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text,FALSE,FALSE);
338 // create a code generator
339 DocbookCodeGenerator *docbookCodeGen = new DocbookCodeGenerator(t);
340 // create a parse tree visitor for Docbook
341 DocbookDocVisitor *visitor = new DocbookDocVisitor(t,*docbookCodeGen);
343 root->accept(visitor);
346 delete docbookCodeGen;
350 void writeDocbookCodeBlock(FTextStream &t,FileDef *fd)
352 ParserInterface *pIntf=Doxygen::parserManager->getParser(fd->getDefFileExtension());
353 SrcLangExt langExt = getLanguageFromFileName(fd->getDefFileExtension());
354 pIntf->resetCodeParserState();
355 DocbookCodeGenerator *docbookGen = new DocbookCodeGenerator(t);
356 pIntf->parseCode(*docbookGen, // codeOutIntf
358 fileToString(fd->absFilePath(),Config_getBool(FILTER_SOURCE_FILES)),
360 FALSE, // isExampleBlock
365 FALSE, // inlineFragement
367 TRUE // showLineNumbers
369 docbookGen->finish();
373 static QCString classOutputFileBase(ClassDef *cd)
375 //static bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
376 //if (inlineGroupedClasses && cd->partOfGroups()!=0)
377 return cd->getOutputFileBase();
379 // return cd->getOutputFileBase();
382 static QCString memberOutputFileBase(MemberDef *md)
384 //static bool inlineGroupedClasses = Config_getBool(INLINE_GROUPED_CLASSES);
385 //if (inlineGroupedClasses && md->getClassDef() && md->getClassDef()->partOfGroups()!=0)
386 // return md->getClassDef()->getDocbookOutputFileBase();
388 // return md->getOutputFileBase();
389 return md->getOutputFileBase();
393 static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *def, bool detailed=0)
396 // + declaration/definition arg lists
400 // + const/volatile specifiers
402 // + source definition
403 // + source references
404 // + source referenced by
406 // + template arguments
407 // (templateArguments(), definitionTemplateParameterLists())
410 // enum values are written as part of the enum
411 if (md->memberType()==MemberType_EnumValue) return;
412 if (md->isHidden()) return;
413 //if (md->name().at(0)=='@') return; // anonymous member
415 // group members are only visible in their group
416 //if (def->definitionType()!=Definition::TypeGroup && md->getGroupDef()) return;
418 switch (md->memberType())
420 case MemberType_Define: memType="define"; break;
421 case MemberType_Function: memType="function"; break;
422 case MemberType_Variable: memType="variable"; break;
423 case MemberType_Typedef: memType="typedef"; break;
424 case MemberType_Enumeration: memType="enum"; break;
425 case MemberType_EnumValue: ASSERT(0); break;
426 case MemberType_Signal: memType="signal"; break;
427 case MemberType_Slot: memType="slot"; break;
428 case MemberType_Friend: memType="friend"; break;
429 case MemberType_DCOP: memType="dcop"; break;
430 case MemberType_Property: memType="property"; break;
431 case MemberType_Event: memType="event"; break;
432 case MemberType_Interface: memType="interface"; break;
433 case MemberType_Service: memType="service"; break;
436 if (md->getClassDef())
438 scopeName=md->getClassDef()->name();
440 else if (md->getNamespaceDef())
442 scopeName=md->getNamespaceDef()->name();
446 t << " <para>" << endl;
447 t << " <itemizedlist>" << endl;
448 t << " <listitem>" << endl;
451 if (md->memberType()==MemberType_Enumeration)
453 MemberList *enumFields = md->enumFieldList();
454 t << " <para><literallayout>" << memType << " <link linkend=\"";
455 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
457 t << md->getGroupDef()->getOutputFileBase();
461 t << memberOutputFileBase(md);
463 t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
466 MemberListIterator emli(*enumFields);
470 for (emli.toFirst();(emd=emli.current());++emli)
476 t << "<link linkend=\"" << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">";
477 writeDocbookString(t,emd->name());
479 if (!emd->initializer().isEmpty())
481 writeDocbookString(t,emd->initializer());
487 t << "</literallayout>" << endl;
488 if (md->briefDescription())
490 t << "<para><emphasis>";
491 writeDocbookString(t,md->briefDescription());
492 t << "</emphasis></para>" << endl;
495 else if (md->memberType()==MemberType_Define)
497 t << " <para>" << "#" << memType << " <link linkend=\"";
498 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
500 t << md->getGroupDef()->getOutputFileBase();
504 t << memberOutputFileBase(md);
506 t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
507 if (!md->initializer().isEmpty() && md->initializer().length()<2000)
510 linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->initializer());
512 if (md->briefDescription())
514 t << "<para><emphasis>";
515 writeDocbookString(t,md->briefDescription());
516 t << "</emphasis></para>" << endl;
519 else if (md->memberType()==MemberType_Variable)
521 if (md->getClassDef())
523 t << " <para>" << convertToXML(md->declaration());
524 if (md->briefDescription())
526 t << "<para><emphasis>";
527 writeDocbookString(t,md->briefDescription());
528 t << "</emphasis></para>";
534 linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
535 t << " <link linkend=\"";
536 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
538 t << md->getGroupDef()->getOutputFileBase();
542 t << memberOutputFileBase(md);
544 t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
545 if (md->briefDescription())
547 t << "<para><emphasis>";
548 writeDocbookString(t,md->briefDescription());
549 t << "</emphasis></para>" << endl;
553 else if (md->memberType()==MemberType_Typedef)
555 t << " <para>" << memType;
557 linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
559 t << " <link linkend=\"";
560 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
562 t << md->getGroupDef()->getOutputFileBase();
566 t << memberOutputFileBase(md);
568 t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
569 if (md->briefDescription())
571 t << "<para><emphasis>";
572 writeDocbookString(t,md->briefDescription());
573 t << "</emphasis></para>" << endl;
576 else if (md->memberType()==MemberType_Function)
579 linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,md->typeString());
580 t << " <link linkend=\"";
581 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
583 t << md->getGroupDef()->getOutputFileBase();
587 t << memberOutputFileBase(md);
589 t << "_1" << md->anchor() << "\">" << convertToXML(md->name()) << "</link>";
591 ArgumentList *declAl = md->declArgumentList();
592 if (declAl && declAl->count()>0)
594 ArgumentListIterator declAli(*declAl);
597 for (declAli.toFirst();(a=declAli.current());++declAli)
603 if (!a->type.isEmpty())
605 linkifyText(TextGeneratorDocbookImpl(t),def,md->getBodyDef(),md,a->type);
608 if (!a->name.isEmpty())
610 writeDocbookString(t,a->name);
616 if (md->briefDescription())
618 t << "<para><emphasis>";
619 writeDocbookString(t,md->briefDescription());
620 t << "</emphasis></para>" << endl;
627 if (closePara) t << "</para>" << endl;
628 t << " </listitem>" << endl;
629 t << " </itemizedlist>" << endl;
630 t << " </para>" << endl;
634 if (md->memberType()==MemberType_Enumeration)
636 MemberList *enumFields = md->enumFieldList();
637 t << " <section xml:id=\"";
638 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
640 t << md->getGroupDef()->getOutputFileBase();
644 t << memberOutputFileBase(md);
646 t << "_1" << md->anchor() << "\">" << endl;
647 t << " <title>" << memType << " " << convertToXML(md->name()) << " " << "</title>" << endl;
649 writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
653 MemberListIterator emli(*enumFields);
655 t << " <formalpara>" << endl;
656 t << " <title>" << theTranslator->trEnumerationValues() << ":</title>" << endl;
657 t << " <variablelist>" << endl;
658 for (emli.toFirst();(emd=emli.current());++emli)
660 t << " <varlistentry xml:id=\"";
661 t << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">" << endl;
663 writeDocbookString(t,emd->name());
664 t << "</term>" << endl;
665 t << " <listitem>" << endl;
666 if(Config_getBool(REPEAT_BRIEF))
669 writeDocbookString(t,emd->briefDescription());
670 t << "</para>" << endl;
672 t << " </listitem>" << endl;
673 t << " </varlistentry>" << endl;
675 t << " </variablelist>" << endl;
676 t << " </formalpara>" << endl;
678 t << "Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << endl;
679 t << " <computeroutput><literallayout>" << endl;
681 for (emli.toFirst();(emd=emli.current());++emli)
683 writeDocbookString(t,emd->name());
684 if (!emd->initializer().isEmpty())
686 writeDocbookString(t,emd->initializer());
690 t << "}" << convertToXML(md->name()) << ";" << endl;
691 t << " </literallayout></computeroutput>" << endl;
692 t << " </para>" << endl;
693 t << " </section>" << endl;
696 else if (md->memberType()==MemberType_Typedef)
698 t << " <section xml:id=\"";
699 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
701 t << md->getGroupDef()->getOutputFileBase();
705 t << memberOutputFileBase(md);
707 t << "_1" << md->anchor() << "\">" << endl;
708 t << " <title>" << convertToXML(md->definition()) << "</title>";
709 if(Config_getBool(REPEAT_BRIEF))
712 writeDocbookString(t,md->briefDescription());
713 t << "</emphasis>" << endl;
716 writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
718 t << " </section>" << endl;
720 else if (md->memberType()==MemberType_Function)
722 t << " <section xml:id=\"";
723 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
725 t << md->getGroupDef()->getOutputFileBase();
729 t << memberOutputFileBase(md);
731 t << "_1" << md->anchor() << "\">" << endl;
732 t << " <title>" << convertToXML(md->definition()) << " " << convertToXML(md->argsString()) << "</title>";
733 if(Config_getBool(REPEAT_BRIEF))
736 writeDocbookString(t,md->briefDescription());
737 t << "</emphasis>" << endl;
740 writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
742 t << " </section>" << endl;
744 else if (md->memberType()==MemberType_Define)
746 if (md->documentation())
748 t << " <section xml:id=\"";
749 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
751 t << md->getGroupDef()->getOutputFileBase();
755 t << memberOutputFileBase(md);
757 t << "_1" << md->anchor() << "\">" << endl;
758 t << " <title>" << convertToXML(md->definition()) << "</title>";
760 writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
762 t << " <para>Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << "</para>" << endl;
763 t << " <para>The Documentation for this define was generated from the following file: </para>" << endl;
764 t << " <para><itemizedlist><listitem><para>" << stripPath(md->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
765 t << " </section>" << endl;
768 else if (md->memberType()==MemberType_Variable)
770 if (md->getClassDef())
772 if (md->documentation())
774 t << " <simplesect>" << endl;
775 t << " <title>" << convertToXML(md->definition()) << "</title>";
777 writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
779 t << " <para>Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << "</para>" << endl;
780 t << " <para>The Documentation for this struct was generated from the following file: </para>" << endl;
781 t << " <para><itemizedlist><listitem><para>" << stripPath(md->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
782 t << " </simplesect>" << endl;
787 t << " <section xml:id=\"";
788 if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
790 t << md->getGroupDef()->getOutputFileBase();
794 t << memberOutputFileBase(md);
796 t << "_1" << md->anchor() << "\">" << endl;
797 t << " <title>" << convertToXML(md->definition()) << "</title>";
798 if(Config_getBool(REPEAT_BRIEF))
801 writeDocbookString(t,md->briefDescription());
802 t << "</emphasis>" << endl;
805 writeDocbookDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
807 t << " </section>" << endl;
813 static void generateDocbookSection(Definition *d,FTextStream &t,MemberList *ml,const char *,
814 bool detailed=0, const char *header=0,const char *documentation=0)
817 MemberListIterator mli(*ml);
821 QCString title, desctitle;
823 for (mli.toFirst();(md=mli.current());++mli)
825 // namespace members are also inserted in the file scope, but
826 // to prevent this duplication in the Docbook output, we filter those here.
827 if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
833 if (count==0) return; // empty list
835 switch (ml->listType())
837 case MemberListType_decDefineMembers: title=theTranslator->trDefines(); desctitle=theTranslator->trDefineDocumentation(); break;
838 case MemberListType_decTypedefMembers: title=theTranslator->trTypedefs(); desctitle=theTranslator->trTypedefDocumentation(); break;
839 case MemberListType_decEnumMembers: title=theTranslator->trEnumerations(); desctitle=theTranslator->trEnumerationTypeDocumentation(); break;
840 case MemberListType_decFuncMembers: title=theTranslator->trFunctions(); desctitle=theTranslator->trFunctionDocumentation(); break;
841 case MemberListType_decVarMembers: title=theTranslator->trVariables(); desctitle=theTranslator->trVariableDocumentation(); break;
842 case MemberListType_pubAttribs: title=theTranslator->trPublicAttribs(); desctitle=theTranslator->trMemberDataDocumentation(); break;
843 case MemberListType_priAttribs: title=theTranslator->trPrivateAttribs(); desctitle=theTranslator->trMemberDataDocumentation(); break;
844 case MemberListType_proAttribs: title=theTranslator->trProtectedAttribs(); desctitle=theTranslator->trMemberDataDocumentation(); break;
845 default: title=""; desctitle=""; break;
850 for (mli.toFirst();(md=mli.current());++mli)
852 if (md->documentation().isEmpty() && !Config_getBool(REPEAT_BRIEF))
867 t << " <section>" << endl;
868 t << " <title>" << desctitle << "</title>" << endl;
872 t << " <section>" << endl;
875 t << " <title>" << convertToXML(header) << "</title>" << endl;
879 t << " <title>" << title << "</title>" << endl;
885 t << " <description>";
886 writeDocbookDocBlock(t,d->docFile(),d->docLine(),d,0,documentation);
887 t << "</description>" << endl;
889 for (mli.toFirst();(md=mli.current());++mli)
891 // namespace members are also inserted in the file scope, but
892 // to prevent this duplication in the Docbook output, we filter those here.
893 if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
895 if (detailed && md->documentation().isEmpty() && !Config_getBool(REPEAT_BRIEF))
900 generateDocbookForMember(md,t,d,detailed);
907 t << " </section>" << endl;
912 t << " </section>" << endl;
916 static void writeInnerClasses(const ClassSDict *cl,FTextStream &t)
920 ClassSDict::Iterator cli(*cl);
922 QCString title = theTranslator->trClasses();
926 t << " <section>" << endl;
927 t << " <title> " << title << " </title>" << endl;
929 for (cli.toFirst();(cd=cli.current());++cli)
931 if (!cd->isHidden() && cd->name().find('@')==-1)
933 t << " <para>" << endl;
934 t << " <itemizedlist>" << endl;
935 t << " <listitem>" << endl;
936 t << " <para>" << "struct <link linkend=\"" << classOutputFileBase(cd) << "\">" << convertToXML(cd->name()) << "</link>";
937 t << "</para>" << endl;
938 if (cd->briefDescription())
940 t << "<para><emphasis>";
941 writeDocbookString(t,cd->briefDescription());
942 t << "</emphasis></para>" << endl;
944 t << " </listitem>" << endl;
945 t << " </itemizedlist>" << endl;
946 t << " </para>" << endl;
951 t << " </section>" << endl;
956 static void writeInnerNamespaces(const NamespaceSDict *nl,FTextStream &t)
960 NamespaceSDict::Iterator nli(*nl);
962 QCString title = theTranslator->trNamespaces();
966 t << " <simplesect>" << endl;
967 t << " <title> " << title << " </title>" << endl;
969 for (nli.toFirst();(nd=nli.current());++nli)
971 if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
973 t << " <para>" << endl;
974 t << " <itemizedlist>" << endl;
975 t << " <listitem>" << endl;
976 t << " <para>" << "struct <link linkend=\"" << nd->getOutputFileBase() << "\">" << convertToXML(nd->name()) << "</link>";
977 t << "</para>" << endl;
978 t << " </listitem>" << endl;
979 t << " </itemizedlist>" << endl;
980 t << " </para>" << endl;
985 t << " </simplesect>" << endl;
990 static void writeInnerFiles(const FileList *fl,FTextStream &t)
994 QListIterator<FileDef> fli(*fl);
996 QCString title = theTranslator->trFile(TRUE,TRUE);
1000 t << " <simplesect>" << endl;
1001 t << " <title> " << title << " </title>" << endl;
1003 for (fli.toFirst();(fd=fli.current());++fli)
1005 t << " <para>" << endl;
1006 t << " <itemizedlist>" << endl;
1007 t << " <listitem>" << endl;
1008 t << " <para>" << "file <link linkend=\"" << fd->getOutputFileBase() << "\">" << convertToXML(fd->name()) << "</link>";
1009 t << "</para>" << endl;
1010 t << " </listitem>" << endl;
1011 t << " </itemizedlist>" << endl;
1012 t << " </para>" << endl;
1016 t << " </simplesect>" << endl;
1021 static void writeInnerPages(const PageSDict *pl,FTextStream &t)
1025 PageSDict::Iterator pli(*pl);
1028 for (pli.toFirst();(pd=pli.current());++pli)
1030 t << "<xi:include href=\"" << pd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
1035 static void writeInnerGroups(const GroupList *gl,FTextStream &t)
1039 GroupListIterator gli(*gl);
1042 //Docbook header tags for inner groups
1045 t << " <simplesect>" << endl;
1046 t << " <title>" << theTranslator->trModules() << "</title>" << endl;
1047 t << " </simplesect>" << endl;
1048 t << " <para>" << endl;
1049 t << " <itemizedlist>" << endl;
1052 for (gli.toFirst();(sgd=gli.current());++gli)
1054 t << " <listitem><para><link linkend=\"" << sgd->getOutputFileBase() << "\">" << convertToXML(sgd->groupTitle()) << "</link></para></listitem>" << endl;
1057 //Docbook footer tags for inner groups
1060 t << " </itemizedlist>" << endl;
1061 t << " </para>" << endl;
1067 static void writeInnerDirs(const DirList *dl,FTextStream &t)
1071 QListIterator<DirDef> subdirs(*dl);
1073 QCString title = theTranslator->trDirectories();
1074 if (subdirs.toFirst())
1076 t << " <simplesect>" << endl;
1077 t << " <title> " << title << " </title>" << endl;
1079 for (subdirs.toFirst();(subdir=subdirs.current());++subdirs)
1081 t << " <para>" << endl;
1082 t << " <itemizedlist>" << endl;
1083 t << " <listitem>" << endl;
1084 t << " <para>" << "dir <link linkend=\"" << subdir->getOutputFileBase() << "\">" << convertToXML(subdir->displayName()) << "</link>";
1085 t << "</para>" << endl;
1086 t << " </listitem>" << endl;
1087 t << " </itemizedlist>" << endl;
1088 t << " </para>" << endl;
1090 if (subdirs.toFirst())
1092 t << " </simplesect>" << endl;
1097 static void writeInnerGroupFiles(const GroupList *gl,FTextStream &t)
1101 GroupListIterator gli(*gl);
1104 for (gli.toFirst();(sgd=gli.current());++gli)
1106 t << "<xi:include href=\"" << sgd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
1111 static void generateDocbookForClass(ClassDef *cd,FTextStream &ti)
1113 // + brief description
1114 // + detailed description
1115 // + template argument list(s)
1118 // + inheritance diagram
1119 // + list of direct super classes
1120 // + list of direct sub classes
1121 // + list of inner classes
1122 // + collaboration diagram
1123 // + list of all members
1124 // + user defined member sections
1125 // + standard member sections
1126 // + detailed member documentation
1127 // - examples using the class
1129 if (cd->isReference()) return; // skip external references.
1130 if (cd->isHidden()) return; // skip hidden classes.
1131 if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
1132 if (cd->templateMaster()!=0) return; // skip generated template instances.
1134 msg("Generating Docbook output for class %s\n",cd->name().data());
1136 QCString fileDocbook=cd->getOutputFileBase()+".xml";
1137 //Add the file Documentation info to index file
1138 ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
1140 QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
1141 QCString fileName=outputDirectory+"/"+ classOutputFileBase(cd)+".xml";
1142 QCString relPath = relativePathToRoot(fileName);
1144 if (!f.open(IO_WriteOnly))
1146 err("Cannot open file %s for writing!\n",fileName.data());
1150 //t.setEncoding(FTextStream::UnicodeUTF8);
1152 writeDocbookHeader_ID(t, classOutputFileBase(cd));
1154 writeDocbookString(t,cd->name());
1155 t << " " << cd->compoundTypeString() << " Reference";
1156 t << "</title>" << endl;
1158 IncludeInfo *ii=cd->includeInfo();
1161 QCString nm = ii->includeName;
1162 if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
1165 t << "<para>" << endl;
1166 t << " <programlisting>#include ";
1167 if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references
1169 t << "<link linkend=\"" << ii->fileDef->getOutputFileBase() << "\">";
1179 t << convertToXML(nm);
1188 if (ii->fileDef && !ii->fileDef->isReference())
1192 t << "</programlisting>" << endl;
1193 t << "</para>" << endl;
1197 if (Config_getBool(HAVE_DOT) && (Config_getBool(CLASS_DIAGRAMS) || Config_getBool(CLASS_GRAPH)))
1199 t << "<para>Inheritance diagram for " << convertToXML(cd->name()) << "</para>" << endl;
1200 DotClassGraph inheritanceGraph(cd,DotNode::Inheritance);
1201 inheritanceGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,TRUE,FALSE);
1204 if (Config_getBool(HAVE_DOT) && Config_getBool(COLLABORATION_GRAPH))
1206 t << "<para>Collaboration diagram for " << convertToXML(cd->name()) << "</para>" << endl;
1207 DotClassGraph collaborationGraph(cd,DotNode::Collaboration);
1208 collaborationGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,TRUE,FALSE);
1211 writeInnerClasses(cd->getClassSDict(),t);
1213 writeTemplateList(cd,t);
1214 if (cd->getMemberGroupSDict())
1216 MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
1218 for (;(mg=mgli.current());++mgli)
1220 generateDocbookSection(cd,t,mg->members(),"user-defined",0,mg->header(),
1221 mg->documentation());
1226 QListIterator<MemberList> mli(cd->getMemberLists());
1228 for (mli.toFirst();(ml=mli.current());++mli)
1230 if ((ml->listType()&MemberListType_detailedLists)==0)
1232 generateDocbookSection(cd,t,ml,g_docbookSectionMapper.find(ml->listType()));
1236 if(Config_getBool(REPEAT_BRIEF))
1238 if (cd->briefDescription())
1240 t << " <simplesect>" << endl;
1241 // A title as 'Brief Description' may not be necessary.
1242 //t << " <title>" << theTranslator->trBriefDescription() << "</title>" << endl;
1243 writeDocbookDocBlock(t,cd->briefFile(),cd->briefLine(),cd,0,cd->briefDescription());
1244 t << " </simplesect>" << endl;
1248 if (cd->documentation())
1250 t << " <simplesect>" << endl;
1251 t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl;
1252 writeDocbookDocBlock(t,cd->docFile(),cd->docLine(),cd,0,cd->documentation());
1253 t << " <para>Definition at line " << cd->getDefLine() << " of file " << stripPath(cd->getDefFileName()) << "</para>" << endl;
1254 t << " <para>The Documentation for this struct was generated from the following file: </para>" << endl;
1255 t << " <para><itemizedlist><listitem><para>" << stripPath(cd->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
1256 t << " </simplesect>" << endl;
1258 for (mli.toFirst();(ml=mli.current());++mli)
1260 if ((ml->listType()&MemberListType_detailedLists)==0)
1262 generateDocbookSection(cd,t,ml,g_docbookSectionMapper.find(ml->listType()),1);
1266 /*// TODO: Handling of Inheritance and Colloboration graph for Docbook to be implemented
1267 DotClassGraph inheritanceGraph(cd,DotNode::Inheritance);
1268 if (!inheritanceGraph.isTrivial())
1270 t << " <inheritancegraph>" << endl;
1271 inheritanceGraph.writeDocbook(t);
1272 t << " </inheritancegraph>" << endl;
1274 DotClassGraph collaborationGraph(cd,DotNode::Collaboration);
1275 if (!collaborationGraph.isTrivial())
1277 t << " <collaborationgraph>" << endl;
1278 collaborationGraph.writeDocbook(t);
1279 t << " </collaborationgraph>" << endl;
1281 t << " <location file=\""
1282 << cd->getDefFileName() << "\" line=\""
1283 << cd->getDefLine() << "\"";
1284 if (cd->getStartBodyLine()!=-1)
1286 FileDef *bodyDef = cd->getBodyDef();
1289 t << " bodyfile=\"" << bodyDef->absFilePath() << "\"";
1291 t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
1292 << cd->getEndBodyLine() << "\"";
1295 writeListOfAllMembers(cd,t);
1298 t << "</section>" << endl;
1302 static void generateDocbookForNamespace(NamespaceDef *nd,FTextStream &ti)
1304 // + contained class definitions
1305 // + contained namespace definitions
1311 // - files containing (parts of) the namespace definition
1313 if (nd->isReference() || nd->isHidden()) return; // skip external references
1315 QCString fileDocbook=nd->getOutputFileBase()+".xml";
1316 //Add the file Documentation info to index file
1317 ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
1319 QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
1320 QCString fileName=outputDirectory+"/"+nd->getOutputFileBase()+".xml";
1322 if (!f.open(IO_WriteOnly))
1324 err("Cannot open file %s for writing!\n",fileName.data());
1328 //t.setEncoding(FTextStream::UnicodeUTF8);
1330 writeDocbookHeader_ID(t, nd->getOutputFileBase());
1332 writeDocbookString(t,nd->name());
1333 t << "</title>" << endl;
1335 writeInnerClasses(nd->getClassSDict(),t);
1336 writeInnerNamespaces(nd->getNamespaceSDict(),t);
1338 if (nd->getMemberGroupSDict())
1340 MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
1342 for (;(mg=mgli.current());++mgli)
1344 generateDocbookSection(nd,t,mg->members(),"user-defined",0,mg->header(),
1345 mg->documentation());
1349 QListIterator<MemberList> mli(nd->getMemberLists());
1351 for (mli.toFirst();(ml=mli.current());++mli)
1353 if ((ml->listType()&MemberListType_declarationLists)!=0)
1355 generateDocbookSection(nd,t,ml,g_docbookSectionMapper.find(ml->listType()));
1359 if(Config_getBool(REPEAT_BRIEF))
1361 if (nd->briefDescription())
1363 t << " <simplesect>" << endl;
1364 //t << " <title>" << theTranslator->trBriefDescription() << "</title>" << endl;
1365 writeDocbookDocBlock(t,nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription());
1366 t << " </simplesect>" << endl;
1370 if (nd->documentation())
1372 t << " <simplesect>" << endl;
1373 t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl;
1374 writeDocbookDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation());
1375 t << " <para>Definition at line " << nd->getDefLine() << " of file " << stripPath(nd->getDefFileName()) << "</para>" << endl;
1376 t << " <para>The Documentation for this struct was generated from the following file: </para>" << endl;
1377 t << " <para><itemizedlist><listitem><para>" << stripPath(nd->getDefFileName()) << "</para></listitem></itemizedlist></para>" << endl;
1378 t << " </simplesect>" << endl;
1380 t << "</section>" << endl;
1383 static void generateDocbookForFile(FileDef *fd,FTextStream &ti)
1386 // + includedby files
1388 // + included by graph
1389 // + contained class definitions
1390 // + contained namespace definitions
1397 // - number of lines
1399 if (fd->isReference()) return; // skip external references
1401 QCString fileDocbook=fd->getOutputFileBase()+".xml";
1402 //Add the file Documentation info to index file
1403 ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
1405 QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
1406 QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml";
1407 QCString relPath = relativePathToRoot(fileName);
1410 if (!f.open(IO_WriteOnly))
1412 err("Cannot open file %s for writing!\n",fileName.data());
1416 //t.setEncoding(FTextStream::UnicodeUTF8);
1417 writeDocbookHeader_ID(t, fd->getOutputFileBase());
1420 writeDocbookString(t,fd->name());
1421 t << " File Reference";
1422 t << "</title>" << endl;
1426 if (fd->includeFileList())
1428 QListIterator<IncludeInfo> ili1(*fd->includeFileList());
1429 for (ili1.toFirst();(inc=ili1.current());++ili1)
1431 t << " <programlisting>#include ";
1440 t << convertToXML(inc->includeName);
1449 t << "</programlisting>" << endl;
1452 if (Config_getBool(HAVE_DOT))
1454 if (Config_getBool(INCLUDE_GRAPH))
1456 t << "<para>Include dependency diagram for " << convertToXML(fd->name()) << "</para>" << endl;
1457 DotInclDepGraph idepGraph(fd, FALSE);
1458 idepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE);
1460 if (Config_getBool(INCLUDED_BY_GRAPH))
1462 t << "<para>Included by dependency diagram for " << convertToXML(fd->name()) << "</para>" << endl;
1463 DotInclDepGraph ibdepGraph(fd, TRUE);
1464 ibdepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE);
1468 if (fd->getClassSDict())
1470 writeInnerClasses(fd->getClassSDict(),t);
1472 if (fd->getNamespaceSDict())
1474 writeInnerNamespaces(fd->getNamespaceSDict(),t);
1477 if (fd->getMemberGroupSDict())
1479 MemberGroupSDict::Iterator mgli(*fd->getMemberGroupSDict());
1481 for (;(mg=mgli.current());++mgli)
1483 generateDocbookSection(fd,t,mg->members(),"user-defined",0,mg->header(),
1484 mg->documentation());
1488 QListIterator<MemberList> mli(fd->getMemberLists());
1490 for (mli.toFirst();(ml=mli.current());++mli)
1492 if ((ml->listType()&MemberListType_declarationLists)!=0)
1494 generateDocbookSection(fd,t,ml,g_docbookSectionMapper.find(ml->listType()));
1498 t << " <simplesect>" << endl;
1499 t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl;
1500 writeDocbookDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription());
1501 writeDocbookDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation());
1502 if (Config_getBool(FULL_PATH_NAMES))
1504 t << " <para>Definition in file " << fd->getDefFileName() << "</para>" << endl;
1508 t << " <para>Definition in file " << stripPath(fd->getDefFileName()) << "</para>" << endl;
1510 t << " </simplesect>" << endl;
1512 if (Config_getBool(DOCBOOK_PROGRAMLISTING))
1514 t << " <literallayout><computeroutput>" << endl;
1515 writeDocbookCodeBlock(t,fd);
1516 t << " </computeroutput></literallayout>" << endl;
1519 t << "</section>" << endl;
1522 static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti)
1533 // + brief description
1534 // + detailed description
1536 if (gd->isReference()) return; // skip external references
1538 if (!gd->isASubGroup())
1540 QCString fileDocbook=gd->getOutputFileBase()+".xml";
1541 //Add the file Documentation info to index file
1542 ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
1545 QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
1546 QCString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml";
1547 QCString relPath = relativePathToRoot(fileName);
1550 if (!f.open(IO_WriteOnly))
1552 err("Cannot open file %s for writing!\n",fileName.data());
1557 //t.setEncoding(FTextStream::UnicodeUTF8);
1558 writeDocbookHeader_ID(t, gd->getOutputFileBase());
1560 t << " <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl;
1562 if (Config_getBool(GROUP_GRAPHS) && Config_getBool(HAVE_DOT))
1564 t << "<para>Collaboration diagram for " << convertToXML(gd->groupTitle()) << "</para>" << endl;
1565 DotGroupCollaboration collaborationGraph(gd);
1566 collaborationGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE);
1569 if (gd->briefDescription())
1571 //t << " <section>" << endl;
1572 //t << " <title>" << theTranslator->trBriefDescription() << "</title>" << endl;
1573 writeDocbookDocBlock(t,gd->briefFile(),gd->briefLine(),gd,0,gd->briefDescription());
1574 //t << " </section>" << endl;
1577 if (gd->documentation())
1579 t << " <section>" << endl;
1580 t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl;
1581 writeDocbookDocBlock(t,gd->docFile(),gd->docLine(),gd,0,gd->documentation());
1582 t << " </section>" << endl;
1585 writeInnerFiles(gd->getFiles(),t);
1586 writeInnerClasses(gd->getClasses(),t);
1587 writeInnerNamespaces(gd->getNamespaces(),t);
1588 writeInnerPages(gd->getPages(),t);
1589 writeInnerGroups(gd->getSubGroups(),t);
1591 if (gd->getMemberGroupSDict())
1593 MemberGroupSDict::Iterator mgli(*gd->getMemberGroupSDict());
1595 for (;(mg=mgli.current());++mgli)
1597 generateDocbookSection(gd,t,mg->members(),"user-defined",0,mg->header(),
1598 mg->documentation());
1602 QListIterator<MemberList> mli(gd->getMemberLists());
1604 for (mli.toFirst();(ml=mli.current());++mli)
1606 if ((ml->listType()&MemberListType_declarationLists)!=0)
1608 generateDocbookSection(gd,t,ml,g_docbookSectionMapper.find(ml->listType()));
1611 for (mli.toFirst();(ml=mli.current());++mli)
1613 if ((ml->listType()&MemberListType_declarationLists)!=0)
1615 generateDocbookSection(gd,t,ml,g_docbookSectionMapper.find(ml->listType()),1);
1619 writeInnerGroupFiles(gd->getSubGroups(),t);
1621 t << "</section>" << endl;
1625 static void generateDocbookForDir(DirDef *dd,FTextStream &ti)
1627 if (dd->isReference()) return; // skip external references
1629 QCString fileDocbook=dd->getOutputFileBase()+".xml";
1630 //Add the file Documentation info to index file
1631 ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
1633 QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
1634 QCString fileName=outputDirectory+"/"+dd->getOutputFileBase()+".xml";
1636 QCString relPath = relativePathToRoot(fileName);
1638 if (!f.open(IO_WriteOnly))
1640 err("Cannot open file %s for writing!\n",fileName.data());
1645 //t.setEncoding(FTextStream::UnicodeUTF8);
1646 writeDocbookHeader_ID(t, dd->getOutputFileBase());
1649 t << theTranslator->trDirReference(dd->displayName());
1650 t << "</title>" << endl;
1651 if (Config_getBool(DIRECTORY_GRAPH) && Config_getBool(HAVE_DOT))
1653 t << "<para>Directory dependency diagram for " << convertToXML(dd->displayName()) << "</para>" << endl;
1654 DotDirDeps dirdepGraph(dd);
1655 dirdepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString(DOCBOOK_OUTPUT),fileName,relPath,FALSE);
1658 writeInnerDirs(&dd->subDirs(),t);
1659 writeInnerFiles(dd->getFiles(),t);
1661 t << " <simplesect>" << endl;
1662 t << " <title>" << theTranslator->trDetailedDescription() << "</title>" << endl;
1663 writeDocbookDocBlock(t,dd->briefFile(),dd->briefLine(),dd,0,dd->briefDescription());
1664 writeDocbookDocBlock(t,dd->docFile(),dd->docLine(),dd,0,dd->documentation());
1665 t << " <para>Directory location is " << dd->name() << "</para>" << endl;
1666 t << " </simplesect>" << endl;
1668 t << "</section>" << endl;
1671 static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample)
1677 if (pd->isReference()) return;
1679 QCString pageName = pd->getOutputFileBase();
1680 if (pd->getGroupDef())
1682 pageName+=(QCString)"_"+pd->name();
1684 if (pageName=="index")
1686 pageName="mainpage"; // to prevent overwriting the generated index page.
1689 QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
1690 QCString fileName=outputDirectory+"/"+pageName+".xml";
1692 if (!f.open(IO_WriteOnly))
1694 err("Cannot open file %s for writing!\n",fileName.data());
1699 //t.setEncoding(FTextStream::UnicodeUTF8);
1703 QCString fileDocbook=pageName+".xml";
1704 ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
1707 if (!pd->hasParentPage() && !isExample)
1709 QCString fileDocbook=pageName+".xml";
1710 //Add the file Documentation info to index file
1711 ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl;
1712 writeDocbookHeaderMainpage(t);
1723 pid = pageName+"_1"+pageName;
1725 writeDocbookHeader_ID(t, pid);
1728 SectionInfo *si = Doxygen::sectionDict->find(pd->name());
1731 t << " <title>" << convertToXML(si->title) << "</title>" << endl;
1735 t << " <title>" << convertToXML(pd->name()) << "</title>" << endl;
1740 writeDocbookDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
1741 pd->documentation()+"\n\\include "+pd->name());
1745 writeDocbookDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
1746 pd->documentation());
1748 writeInnerPages(pd->getSubPages(),t);
1750 if (!pd->hasParentPage() && !isExample)
1752 t << endl << "</chapter>" << endl;
1756 t << endl << "</section>" << endl;
1760 void generateDocbook()
1770 QCString outputDirectory = Config_getString(DOCBOOK_OUTPUT);
1771 if (outputDirectory.isEmpty())
1773 outputDirectory=QDir::currentDirPath().utf8();
1777 QDir dir(outputDirectory);
1780 dir.setPath(QDir::currentDirPath());
1781 if (!dir.mkdir(outputDirectory))
1783 err("tag DOCBOOK_OUTPUT: Output directory `%s' does not "
1784 "exist and cannot be created\n",outputDirectory.data());
1789 msg("Notice: Output directory `%s' does not exist. "
1790 "I have created it for you.\n", outputDirectory.data());
1792 dir.cd(outputDirectory);
1794 outputDirectory=dir.absPath().utf8();
1797 QDir dir(outputDirectory);
1800 dir.setPath(QDir::currentDirPath());
1801 if (!dir.mkdir(outputDirectory))
1803 err("Cannot create directory %s\n",outputDirectory.data());
1807 QDir docbookDir(outputDirectory);
1808 createSubDirs(docbookDir);
1810 QCString fileName=outputDirectory+"/index.xml";
1811 QCString dbk_projectName = Config_getString(PROJECT_NAME);
1814 f.setName(fileName);
1815 if (!f.open(IO_WriteOnly))
1817 err("Cannot open file %s for writing!\n",fileName.data());
1821 //t.setEncoding(FTextStream::UnicodeUTF8);
1823 // write index header for Docbook which calls the structure file
1824 t << "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" << endl;;
1825 t << "<book xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" << endl;
1826 t << " <info>" << endl;
1827 t << " <title>" << dbk_projectName << "</title>" << endl;
1828 t << " </info>" << endl;
1830 // NAMESPACE DOCUMENTATION
1831 NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
1834 //Namespace Documentation index header
1837 t << " <chapter>" << endl;
1838 t << " <title>Namespace Documentation</title>" << endl;
1841 for (nli.toFirst();(nd=nli.current());++nli)
1843 msg("Generating Docbook output for namespace %s\n",nd->name().data());
1844 generateDocbookForNamespace(nd,t);
1847 //Namespace Documentation index footer
1850 t << " </chapter>" << endl;
1853 /** MAINPAGE DOCUMENTATION **/
1855 if (Doxygen::mainPage)
1857 msg("Generating Docbook output for the main page\n");
1858 generateDocbookForPage(Doxygen::mainPage,t,FALSE);
1861 // PAGE DOCUMENTATION
1863 PageSDict::Iterator pdi(*Doxygen::pageSDict);
1866 for (pdi.toFirst();(pd=pdi.current());++pdi)
1868 msg("Generating Docbook output for page %s\n",pd->name().data());
1869 generateDocbookForPage(pd,t,FALSE);
1873 /** MODULE GROUP DOCUMENTATION **/
1875 GroupSDict::Iterator gli(*Doxygen::groupSDict);
1878 //Module group Documentation index header
1881 t << " <chapter>" << endl;
1882 t << " <title>" << theTranslator->trModuleDocumentation() << "</title>" << endl;
1885 for (;(gd=gli.current());++gli)
1887 msg("Generating Docbook output for group %s\n",gd->name().data());
1888 generateDocbookForGroup(gd,t);
1891 //Module group Documentation index footer
1894 t << " </chapter>" << endl;
1897 //CLASS DOCUMENTATION
1900 ClassSDict::Iterator cli(*Doxygen::classSDict);
1903 //Class Documentation index header
1906 t << " <chapter>" << endl;
1907 t << " <title>" << theTranslator->trClassDocumentation() << "</title>" << endl;
1910 for (cli.toFirst();(cd=cli.current());++cli)
1912 generateDocbookForClass(cd,t);
1915 //Class Documentation index footer
1918 t << " </chapter>" << endl;
1922 // FILE DOCUMENTATION
1924 static bool showFiles = Config_getBool(SHOW_FILES);
1927 FileNameListIterator fnli(*Doxygen::inputNameList);
1930 //File Documentation index header
1933 t << " <chapter>" << endl;
1934 t << " <title>" << theTranslator->trFileDocumentation() << "</title>" << endl;
1937 for (;(fn=fnli.current());++fnli)
1939 FileNameIterator fni(*fn);
1941 for (;(fd=fni.current());++fni)
1943 msg("Generating Docbook output for file %s\n",fd->name().data());
1944 generateDocbookForFile(fd,t);
1948 //File Documentation index footer
1951 t << " </chapter>" << endl;
1955 // DIRECTORY DOCUMENTATION
1956 if (Config_getBool(DIRECTORY_GRAPH) && Config_getBool(HAVE_DOT))
1959 DirSDict::Iterator sdi(*Doxygen::directories);
1961 //Directory Documentation index header
1964 t << " <chapter>" << endl;
1965 t << " <title>" << theTranslator->trDirDocumentation() << "</title>" << endl;
1968 for (sdi.toFirst();(dir=sdi.current());++sdi)
1970 msg("Generate Docbook output for dir %s\n",dir->name().data());
1971 generateDocbookForDir(dir,t);
1974 //Module group Documentation index footer
1977 t << " </chapter>" << endl;
1981 // EXAMPLE PAGE DOCUMENTATION
1984 PageSDict::Iterator pdi(*Doxygen::exampleSDict);
1987 //Example Page Documentation index header
1990 t << " <chapter>" << endl;
1991 t << " <title>" << theTranslator->trExampleDocumentation() << "</title>" << endl;
1994 for (pdi.toFirst();(pd=pdi.current());++pdi)
1996 msg("Generating Docbook output for example %s\n",pd->name().data());
1997 generateDocbookForPage(pd,t,TRUE);
2000 //Example Page Documentation index footer
2003 t << " </chapter>" << endl;
2007 t << "</book>" << endl;