/****************************************************************************** * * * * Copyright (C) 1997-2015 by Dimitri van Heesch. * * Permission to use, copy, modify, and distribute this software and its * documentation under the terms of the GNU General Public License is hereby * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * * Documents produced by Doxygen are derivative works derived from the * input used in their production; they are not affected by this license. * */ #include #include #include #include #include #include "docbookgen.h" #include "doxygen.h" #include "message.h" #include "config.h" #include "classlist.h" #include "classdef.h" #include "diagram.h" #include "util.h" #include "defargs.h" #include "outputgen.h" #include "dot.h" #include "dotcallgraph.h" #include "dotclassgraph.h" #include "dotdirdeps.h" #include "dotgroupcollaboration.h" #include "dotincldepgraph.h" #include "pagedef.h" #include "filename.h" #include "version.h" #include "docbookvisitor.h" #include "docparser.h" #include "language.h" #include "parserintf.h" #include "arguments.h" #include "memberlist.h" #include "groupdef.h" #include "memberdef.h" #include "namespacedef.h" #include "membername.h" #include "membergroup.h" #include "dirdef.h" #include "section.h" // no debug info #define Docbook_DB(x) do {} while(0) // debug to stdout //#define Docbook_DB(x) printf x // debug inside output //#define Docbook_DB(x) QCString __t;__t.sprintf x;m_t << __t #if 0 #define DB_GEN_C DB_GEN_C1(t) #define DB_GEN_C1(x) x << "\n"; #define DB_GEN_C2(y) DB_GEN_C2a(t,y) #define DB_GEN_C2a(x,y) x << "\n"; #else #define DB_GEN_C #define DB_GEN_C1(x) #define DB_GEN_C2(y) #define DB_GEN_C2a(x,y) #endif //------------------ inline void writeDocbookString(FTextStream &t,const char *s) { t << convertToDocBook(s); } inline void writeDocbookCodeString(FTextStream &t,const char *s, int &col) { char c; while ((c=*s++)) { switch(c) { case '\t': { int tabSize = Config_getInt(TAB_SIZE); int spacesToNextTabStop = tabSize - (col%tabSize); col+=spacesToNextTabStop; while (spacesToNextTabStop--) t << " "; break; } case ' ': t << " "; col++; break; case '<': t << "<"; col++; break; case '>': t << ">"; col++; break; case '&': t << "&"; col++; break; case '\'': t << "'"; col++; break; case '"': t << """; col++; break; default: { uchar uc = static_cast(c); static const char *hex="0123456789ABCDEF"; if (uc<32) { t << "$" << hex[uc>>4] << hex[uc&0xF] << ";"; } else { t << c; } col++; } break; } } } static void addIndexTerm(FTextStream &t, QCString prim, QCString sec = "") { t << ""; t << convertToDocBook(prim); t << ""; if (!sec.isEmpty()) { t << ""; t << convertToDocBook(sec); t << ""; } t << "" << endl; } void writeDocbookLink(FTextStream &t,const char * /*extRef*/,const char *compoundId, const char *anchorId,const char * text,const char * /*tooltip*/) { t << ""; writeDocbookString(t,text); t << ""; } DocbookCodeGenerator::DocbookCodeGenerator(FTextStream &t) { m_prettyCode=Config_getBool(DOCBOOK_PROGRAMLISTING); setTextStream(t); } DocbookCodeGenerator::DocbookCodeGenerator() { } DocbookCodeGenerator::~DocbookCodeGenerator() {} void DocbookCodeGenerator::codify(const char *text) { Docbook_DB(("(codify \"%s\")\n",text)); writeDocbookCodeString(m_t,text,m_col); } void DocbookCodeGenerator::writeCodeLink(const char *ref,const char *file, const char *anchor,const char *name, const char *tooltip) { Docbook_DB(("(writeCodeLink)\n")); writeDocbookLink(m_t,ref,file,anchor,name,tooltip); m_col+=(int)strlen(name); } void DocbookCodeGenerator::writeCodeLinkLine(const char *,const char *file, const char *,const char *name, const char *) { Docbook_DB(("(writeCodeLinkLine)\n")); m_t << ""; m_col+=(int)strlen(name); } void DocbookCodeGenerator::writeTooltip(const char *, const DocLinkInfo &, const char *, const char *, const SourceLinkInfo &, const SourceLinkInfo & ) { Docbook_DB(("(writeToolTip)\n")); } void DocbookCodeGenerator::startCodeLine(bool) { Docbook_DB(("(startCodeLine)\n")); m_insideCodeLine=TRUE; m_col=0; } void DocbookCodeGenerator::endCodeLine() { if (m_insideCodeLine) m_t << endl; Docbook_DB(("(endCodeLine)\n")); m_lineNumber = -1; m_refId.resize(0); m_external.resize(0); m_insideCodeLine=FALSE; } void DocbookCodeGenerator::startFontClass(const char *colorClass) { Docbook_DB(("(startFontClass)\n")); m_t << ""; m_insideSpecialHL=TRUE; } void DocbookCodeGenerator::endFontClass() { Docbook_DB(("(endFontClass)\n")); m_t << ""; // non DocBook m_insideSpecialHL=FALSE; } void DocbookCodeGenerator::writeCodeAnchor(const char *) { Docbook_DB(("(writeCodeAnchor)\n")); } void DocbookCodeGenerator::writeLineNumber(const char *ref,const char *fileName, const char *anchor,int l) { Docbook_DB(("(writeLineNumber)\n")); m_insideCodeLine = TRUE; if (m_prettyCode) { QCString lineNumber; lineNumber.sprintf("%05d",l); if (fileName && !m_sourceFileName.isEmpty()) { writeCodeLinkLine(ref,m_sourceFileName,anchor,lineNumber,0); writeCodeLink(ref,fileName,anchor,lineNumber,0); } else { codify(lineNumber); } m_t << " "; } else { m_t << l << " "; } m_col=0; } void DocbookCodeGenerator::setCurrentDoc(const Definition *,const char *,bool) { } void DocbookCodeGenerator::addWord(const char *,bool) { } void DocbookCodeGenerator::finish() { endCodeLine(); } void DocbookCodeGenerator::startCodeFragment(const char *) { DB_GEN_C1(m_t) m_t << ""; } void DocbookCodeGenerator::endCodeFragment(const char *) { DB_GEN_C1(m_t) //endCodeLine checks is there is still an open code line, if so closes it. endCodeLine(); m_t << ""; } //------------------------------------------------------------------------------- DocbookGenerator::DocbookGenerator() : OutputGenerator(Config_getString(DOCBOOK_OUTPUT)) { DB_GEN_C } DocbookGenerator::DocbookGenerator(const DocbookGenerator &og) : OutputGenerator(og) { } DocbookGenerator &DocbookGenerator::operator=(const DocbookGenerator &og) { OutputGenerator::operator=(og); return *this; } std::unique_ptr DocbookGenerator::clone() const { return std::make_unique(*this); } DocbookGenerator::~DocbookGenerator() { DB_GEN_C } void DocbookGenerator::init() { QCString dir=Config_getString(DOCBOOK_OUTPUT); QDir d(dir); if (!d.exists() && !d.mkdir(dir)) { term("Could not create output directory %s\n",dir.data()); } createSubDirs(d); } void DocbookGenerator::startFile(const char *name,const char *,const char *,int) { DB_GEN_C QCString fileName=name; QCString pageName; QCString fileType="section"; if (fileName == "refman") { fileName="index"; fileType="book"; } else if (fileName == "index") { fileName="mainpage"; fileType="chapter"; } pageName = fileName; relPath = relativePathToRoot(fileName); if (fileName.right(4)!=".xml") fileName+=".xml"; startPlainFile(fileName); m_codeGen.setTextStream(t); m_codeGen.setRelativePath(relPath); m_codeGen.setSourceFileName(stripPath(fileName)); t << "" << endl;; t << "<" << fileType << " xmlns=\"http://docbook.org/ns/docbook\" version=\"5.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\""; if (!pageName.isEmpty()) t << " xml:id=\"_" << stripPath(pageName) << "\""; t << " xml:lang=\"" << theTranslator->trISOLang() << "\""; t << ">" << endl; } void DocbookGenerator::endFile() { DB_GEN_C if (m_inDetail) t << "" << endl; m_inDetail = FALSE; while (m_inLevel != -1) { t << "" << endl; m_inLevel--; } if (m_inGroup) t << "" << endl; m_inGroup = FALSE; QCString fileType="section"; QCString fileName= m_codeGen.sourceFileName(); if (fileName == "index.xml") { fileType="book"; } else if (fileName == "mainpage.xml") { fileType="chapter"; } t << "" << endl; endPlainFile(); m_codeGen.setSourceFileName(""); } void DocbookGenerator::startIndexSection(IndexSections is) { DB_GEN_C2("IndexSections " << is) switch (is) { case isTitlePageStart: { QCString dbk_projectName = Config_getString(PROJECT_NAME); t << " " << endl; t << " " << convertToDocBook(dbk_projectName) << "" << endl; t << " " << endl; } break; case isTitlePageAuthor: break; case isMainPage: t << "" << endl; t << " "; break; case isModuleIndex: //Module Index}\n" break; case isDirIndex: //Directory Index}\n" break; case isNamespaceIndex: //Namespace Index}\n" break; case isClassHierarchyIndex: //Hierarchical Index}\n" break; case isCompoundIndex: //t << "{"; //Class Index}\n" break; case isFileIndex: //Annotated File Index}\n" break; case isPageIndex: //Annotated Page Index}\n" break; case isModuleDocumentation: t << "<chapter>\n"; t << " <title>"; break; case isDirDocumentation: t << "<chapter>\n"; t << " <title>"; break; case isNamespaceDocumentation: t << "<chapter>\n"; t << " <title>"; break; case isClassDocumentation: t << "<chapter>\n"; t << " <title>"; break; case isFileDocumentation: t << "<chapter>\n"; t << " <title>"; break; case isExampleDocumentation: t << "<chapter>\n"; t << " <title>"; break; case isPageDocumentation: break; case isPageDocumentation2: break; case isEndIndex: break; } } void DocbookGenerator::endIndexSection(IndexSections is) { DB_GEN_C2("IndexSections " << is) bool sourceBrowser = Config_getBool(SOURCE_BROWSER); switch (is) { case isTitlePageStart: break; case isTitlePageAuthor: break; case isMainPage: t << "" << endl; t << " " << endl; t << "" << endl; break; case isModuleIndex: //t << "" << endl; break; case isDirIndex: //t << ""; //t << "" << endl; break; case isNamespaceIndex: //t << ""; //t << "" << endl; break; case isClassHierarchyIndex: //t << ""; //t << "" << endl; break; case isCompoundIndex: //t << "" << endl; break; case isFileIndex: //t << ""; //t << "" << endl; break; case isPageIndex: //t << ""; //t << "" << endl; break; case isModuleDocumentation: { t << "" << endl; for (const auto &gd : *Doxygen::groupLinkedMap) { if (!gd->isReference()) { t << " getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; } } } t << "\n"; break; case isDirDocumentation: { t << "" << endl; for (const auto &dd : *Doxygen::dirLinkedMap) { if (dd->isLinkableInProject()) { t << "< xi:include href=\"" << dd->getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; } } } t << "\n"; break; case isNamespaceDocumentation: { t << "" << endl; for (const auto &nd : *Doxygen::namespaceLinkedMap) { if (nd->isLinkableInProject() && !nd->isAlias()) { t << "getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; } } } t << "\n"; break; case isClassDocumentation: { t << "" << endl; for (const auto &cd : *Doxygen::classLinkedMap) { if (cd->isLinkableInProject() && cd->templateMaster()==0 && !cd->isEmbeddedInOuterScope() && !cd->isAlias() ) { t << " getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; } } } t << "\n"; break; case isFileDocumentation: { t << "" << endl; bool isFirst=TRUE; for (const auto &fn : *Doxygen::inputNameLinkedMap) { for (const auto &fd : *fn) { if (fd->isLinkableInProject()) { if (isFirst) { t << " getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; if (sourceBrowser && m_prettyCode && fd->generateSourceFile()) { t << " getSourceFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; } isFirst=FALSE; } else { t << " getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; if (sourceBrowser && m_prettyCode && fd->generateSourceFile()) { t << " getSourceFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; } } } } } } t << "\n"; break; case isExampleDocumentation: { t << "" << endl; for (const auto &pd : *Doxygen::exampleLinkedMap) { t << " getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; } } t << "\n"; break; case isPageDocumentation: break; case isPageDocumentation2: break; case isEndIndex: t << "" << endl; break; } } void DocbookGenerator::writePageLink(const char *name, bool /*first*/) { DB_GEN_C for (const auto &pd : *Doxygen::pageLinkedMap) { if (!pd->getGroupDef() && !pd->isReference() && pd->name() == stripPath(name)) { t << "\n"; if (pd->hasTitle()) { t << " " << convertToDocBook(pd->title()) << "" << endl; } else { t << " " << convertToDocBook(pd->name()) << "" << endl; } t << " getOutputFileBase() << ".xml\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; t << "\n"; } } } void DocbookGenerator::writeDoc(DocNode *n,const Definition *,const MemberDef *,int) { DB_GEN_C DocbookDocVisitor *visitor = new DocbookDocVisitor(t,*this); n->accept(visitor); delete visitor; } void DocbookGenerator::startParagraph(const char *) { DB_GEN_C t << "" << endl; } void DocbookGenerator::endParagraph() { DB_GEN_C t << "" << endl; } void DocbookGenerator::writeString(const char *text) { DB_GEN_C t << text; } void DocbookGenerator::startMemberHeader(const char *,int) { DB_GEN_C t << "" << endl; m_inSimpleSect[m_levelListItem] = TRUE; t << " "; } void DocbookGenerator::endMemberHeader() { DB_GEN_C t << " " << endl; } void DocbookGenerator::docify(const char *str) { DB_GEN_C t << convertToDocBook(str); } void DocbookGenerator::writeObjectLink(const char *, const char *f, const char *anchor, const char *text) { DB_GEN_C if (anchor) if (f) t << ""; else t << ""; else t << ""; docify(text); t << ""; } void DocbookGenerator::startMemberList() { DB_GEN_C t << " " << endl; m_levelListItem++; } void DocbookGenerator::endMemberList() { DB_GEN_C if (m_inListItem[m_levelListItem]) t << "" << endl; m_inListItem[m_levelListItem] = FALSE; t << " " << endl; m_levelListItem = (m_levelListItem> 0 ? m_levelListItem - 1 : 0); if (m_inSimpleSect[m_levelListItem]) t << "" << endl; m_inSimpleSect[m_levelListItem] = FALSE; } void DocbookGenerator::startMemberItem(const char *,int,const char *) { DB_GEN_C if (m_inListItem[m_levelListItem]) t << "" << endl; t << " "; m_inListItem[m_levelListItem] = TRUE; } void DocbookGenerator::endMemberItem() { DB_GEN_C t << "" << endl; } void DocbookGenerator::startBold() { DB_GEN_C t << ""; } void DocbookGenerator::endBold() { DB_GEN_C t << ""; } void DocbookGenerator::startGroupHeader(int extraIndentLevel) { DB_GEN_C2("m_inLevel " << m_inLevel) DB_GEN_C2("extraIndentLevel " << extraIndentLevel) m_firstMember = TRUE; if (m_inSimpleSect[m_levelListItem]) t << "" << endl; m_inSimpleSect[m_levelListItem] = FALSE; if (m_inLevel != -1) m_inGroup = TRUE; if (m_inLevel == extraIndentLevel) t << "" << endl; m_inLevel = extraIndentLevel; t << "
" << endl; t << ""; } void DocbookGenerator::writeRuler() { DB_GEN_C2("m_inLevel " << m_inLevel) DB_GEN_C2("m_inGroup " << m_inGroup) if (m_inGroup) t << "</section>" << endl; m_inGroup = FALSE; } void DocbookGenerator::endGroupHeader(int) { DB_GEN_C t << "" << endl; } void DocbookGenerator::startParameterList(bool openBracket) { DB_GEN_C if (openBracket) t << "("; } void DocbookGenerator::endParameterList() { DB_GEN_C } void DocbookGenerator::writeNonBreakableSpace(int n) { DB_GEN_C for (int i=0;i"; } void DocbookGenerator::endTypewriter() { DB_GEN_C if (!m_denseText) t << "" << endl; } void DocbookGenerator::startTextBlock(bool dense) { DB_GEN_C if (dense) { m_denseText = TRUE; t << ""; } } void DocbookGenerator::endTextBlock(bool) { DB_GEN_C if (m_denseText) { m_denseText = FALSE; t << ""; } } void DocbookGenerator::startMemberDoc(const char *clname, const char *memname, const char *, const char *title, int memCount, int memTotal, bool) { DB_GEN_C2("m_inLevel " << m_inLevel) t << "
" << endl; t << " " << convertToDocBook(title); if (memTotal>1) { t << "<computeroutput>[" << memCount << "/" << memTotal << "]</computeroutput>"; } t << "" << endl; if (memname && memname[0]!='@') { addIndexTerm(t,memname,clname); addIndexTerm(t,clname,memname); } } void DocbookGenerator::endMemberDoc(bool) { DB_GEN_C t << ""; } void DocbookGenerator::startTitleHead(const char *) { DB_GEN_C t << ""; } void DocbookGenerator::endTitleHead(const char *,const char *name) { DB_GEN_C t << "" << endl; if (name) addIndexTerm(t, name); } void DocbookGenerator::startDoxyAnchor(const char *fName,const char *, const char *anchor,const char *, const char *) { DB_GEN_C if (!m_inListItem[m_levelListItem] && !m_descTable) { if (!m_firstMember) t << "
"; m_firstMember = FALSE; } if (anchor) { t << ""; } } void DocbookGenerator::endDoxyAnchor(const char *,const char *) { DB_GEN_C } void DocbookGenerator::startMemberDocName(bool) { DB_GEN_C t << ""; } void DocbookGenerator::endMemberDocName() { DB_GEN_C } void DocbookGenerator::startMemberGroupHeader(bool) { DB_GEN_C t << ""; } void DocbookGenerator::endMemberGroupHeader() { DB_GEN_C t << "" << endl; } void DocbookGenerator::startMemberGroup() { DB_GEN_C } void DocbookGenerator::endMemberGroup(bool) { DB_GEN_C t << "" << endl; } void DocbookGenerator::startClassDiagram() { DB_GEN_C t << ""; } void DocbookGenerator::endClassDiagram(const ClassDiagram &d, const char *fileName,const char *) { DB_GEN_C t << " " << endl; t << " " << endl; t << " " << endl; t << " " << "" << endl; t << " " << endl; d.writeImage(t,dir(),relPath,fileName,FALSE); t << " " << endl; t << " " << endl; t << "" << endl; } void DocbookGenerator::startLabels() { DB_GEN_C } void DocbookGenerator::writeLabel(const char *l,bool isLast) { DB_GEN_C t << "[" << l << "]"; if (!isLast) t << ", "; } void DocbookGenerator::endLabels() { DB_GEN_C } void DocbookGenerator::startExamples() { DB_GEN_C t << ""; docify(theTranslator->trExamples()); t << ""; } void DocbookGenerator::endExamples() { DB_GEN_C t << "" << endl; } void DocbookGenerator::startSubsubsection() { DB_GEN_C t << ""; } void DocbookGenerator::endSubsubsection() { DB_GEN_C t << "" << endl; } void DocbookGenerator::writeChar(char c) { DB_GEN_C char cs[2]; cs[0]=c; cs[1]=0; docify(cs); } void DocbookGenerator::startMemberDocPrefixItem() { DB_GEN_C t << ""; } void DocbookGenerator::endMemberDocPrefixItem() { DB_GEN_C t << ""; } void DocbookGenerator::exceptionEntry(const char* prefix,bool closeBracket) { DB_GEN_C if (prefix) t << " " << prefix << "("; else if (closeBracket) t << ")"; t << " "; } void DocbookGenerator::startParameterName(bool) { DB_GEN_C t << " "; } void DocbookGenerator::endParameterName(bool last,bool /*emptyList*/,bool closeBracket) { DB_GEN_C if (last) { if (closeBracket) t << ")"; } } void DocbookGenerator::startMemberTemplateParams() { DB_GEN_C } void DocbookGenerator::endMemberTemplateParams(const char *,const char *) { DB_GEN_C t << ""; t << ""; } void DocbookGenerator::startSection(const char *lab,const char *,SectionType) { DB_GEN_C t << "
"; t << ""; } void DocbookGenerator::endSection(const char *,SectionType) { DB_GEN_C t << ""; t << "
"; } void DocbookGenerator::addIndexItem(const char *prim,const char *sec) { DB_GEN_C addIndexTerm(t, prim, sec); } void DocbookGenerator::startDescTable(const char *title) { DB_GEN_C int ncols = 2; t << "" << endl; if (title)t << "" << convertToDocBook(title) << "" << endl; t << " " << endl; for (int i = 0; i < ncols; i++) { t << " \n"; } t << "\n"; m_descTable = TRUE; } void DocbookGenerator::endDescTable() { DB_GEN_C t << " " << endl; t << " " << endl; t << "" << endl; m_descTable = FALSE; } void DocbookGenerator::startDescTableRow() { DB_GEN_C t << ""; t << ""; } void DocbookGenerator::endDescTableRow() { DB_GEN_C t << ""; } void DocbookGenerator::startDescTableTitle() { DB_GEN_C } void DocbookGenerator::endDescTableTitle() { DB_GEN_C } void DocbookGenerator::startDescTableData() { DB_GEN_C t << ""; } void DocbookGenerator::endDescTableData() { DB_GEN_C t << ""; } void DocbookGenerator::startGroupCollaboration() { DB_GEN_C } void DocbookGenerator::endGroupCollaboration(DotGroupCollaboration &g) { DB_GEN_C g.writeGraph(t,GOF_BITMAP,EOF_DocBook,dir(),fileName(),relPath,FALSE); } void DocbookGenerator::startDotGraph() { DB_GEN_C } void DocbookGenerator::endDotGraph(DotClassGraph &g) { DB_GEN_C g.writeGraph(t,GOF_BITMAP,EOF_DocBook,dir(),fileName(),relPath,TRUE,FALSE); } void DocbookGenerator::startInclDepGraph() { DB_GEN_C } void DocbookGenerator::endInclDepGraph(DotInclDepGraph &g) { DB_GEN_C QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_DocBook,dir(),fileName(),relPath,FALSE); } void DocbookGenerator::startCallGraph() { DB_GEN_C } void DocbookGenerator::endCallGraph(DotCallGraph &g) { DB_GEN_C QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_DocBook,dir(),fileName(),relPath,FALSE); } void DocbookGenerator::startDirDepGraph() { DB_GEN_C } void DocbookGenerator::endDirDepGraph(DotDirDeps &g) { DB_GEN_C QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_DocBook,dir(),fileName(),relPath,FALSE); } void DocbookGenerator::startMemberDocList() { DB_GEN_C } void DocbookGenerator::endMemberDocList() { DB_GEN_C m_inGroup = TRUE; } void DocbookGenerator::startConstraintList(const char *header) { DB_GEN_C t << ""; docify(header); t << "" << endl; } void DocbookGenerator::startConstraintParam() { DB_GEN_C t << ""; } void DocbookGenerator::endConstraintParam() { DB_GEN_C } void DocbookGenerator::startConstraintType() { DB_GEN_C t << ":"; } void DocbookGenerator::endConstraintType() { DB_GEN_C t << "" << endl; } void DocbookGenerator::startConstraintDocs() { DB_GEN_C } void DocbookGenerator::endConstraintDocs() { DB_GEN_C } void DocbookGenerator::endConstraintList() { DB_GEN_C t << "" << endl; }