Imported Upstream version 1.9.8
[platform/upstream/doxygen.git] / src / docbookgen.h
index 344cb5b..ced02db 100644 (file)
@@ -1,8 +1,6 @@
 /******************************************************************************
 *
-* 
-*
-* Copyright (C) 1997-2012 by Dimitri van Heesch.
+* Copyright (C) 1997-2022 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
 #ifndef DOCBOOKGEN_H
 #define DOCBOOKGEN_H
 
-void generateDocbook();
+#include <memory>
+#include <array>
+
+#include "config.h"
+#include "outputgen.h"
+
+#if 0
+// define for cases that have been implemented with an empty body
+#define DB_GEN_EMPTY  m_t << "<!-- DBG_GEN_head_check " << __LINE__ << " -->\n";
+#else
+#define DB_GEN_EMPTY
+#endif
+
+#if 0
+// Generic debug statements
+#define DB_GEN_H DB_GEN_H1(m_t)
+#define DB_GEN_H1(x) x << "<!-- DBG_GEN_head " << __LINE__ << " -->\n";
+#define DB_GEN_H2(y) DB_GEN_H2a(m_t,y)
+#define DB_GEN_H2a(x,y) x << "<!-- DBG_GEN_head " << __LINE__ << " " << y << " -->\n";
+// define for cases that have NOT yet been implemented / considered
+#define DB_GEN_NEW fprintf(stderr,"DBG_GEN_head %d\n",__LINE__); DB_GEN_H
+#else
+#define DB_GEN_H
+#define DB_GEN_H1(x)
+#define DB_GEN_H2(y)
+#define DB_GEN_H2a(x,y)
+#define DB_GEN_NEW
+#endif
+
+class OutputCodeList;
+
+class DocbookCodeGenerator
+{
+  public:
+    DocbookCodeGenerator(TextStream *t);
+    void setTextStream(TextStream *t) { m_t = t; }
+
+    OutputType type() const { return OutputType::Docbook; }
+
+    void codify(const QCString &text);
+    void writeCodeLink(CodeSymbolType type,
+        const QCString &ref,const QCString &file,
+        const QCString &anchor,const QCString &name,
+        const QCString &tooltip);
+    void writeTooltip(const QCString &, const DocLinkInfo &, const QCString &,
+                      const QCString &, const SourceLinkInfo &, const SourceLinkInfo &
+                     );
+    void startCodeLine(bool);
+    void endCodeLine();
+    void startFontClass(const QCString &colorClass);
+    void endFontClass();
+    void writeCodeAnchor(const QCString &);
+    void writeLineNumber(const QCString &extRef,const QCString &compId,
+        const QCString &anchorId,int l, bool writeLineAnchor);
+    void startCodeFragment(const QCString &style);
+    void endCodeFragment(const QCString &style);
+    void startFold(int,const QCString &,const QCString &) {}
+    void endFold() {}
+
+    void setRelativePath(const QCString &path) { m_relPath = path; }
+    void setSourceFileName(const QCString &sourceFileName) { m_sourceFileName = sourceFileName; }
+    QCString sourceFileName() { return m_sourceFileName; }
+    void finish();
+
+  private:
+    void writeCodeLinkLine(CodeSymbolType type,
+        const QCString &ref,const QCString &file,
+        const QCString &anchor,const QCString &name,
+        const QCString &tooltip, bool);
+    TextStream *m_t;
+    QCString    m_refId;
+    QCString    m_external;
+    int         m_lineNumber = -1;
+    int         m_col = 0;
+    bool        m_insideCodeLine = false;
+    bool        m_insideSpecialHL = false;
+    QCString    m_relPath;
+    QCString    m_sourceFileName;
+};
+
+class DocbookGenerator : public OutputGenerator
+{
+  public:
+    DocbookGenerator();
+    DocbookGenerator(const DocbookGenerator &);
+    DocbookGenerator &operator=(const DocbookGenerator &);
+    DocbookGenerator(DocbookGenerator &&);
+    DocbookGenerator &operator=(DocbookGenerator &&) = delete;
+   ~DocbookGenerator();
+
+    static void init();
+    void cleanup();
+
+    OutputType type() const { return OutputType::Docbook; }
+
+    void writeDoc(const IDocNodeAST *node,const Definition *ctx,const MemberDef *md,int id);
+
+    ///////////////////////////////////////////////////////////////
+    // structural output interface
+    ///////////////////////////////////////////////////////////////
+    void startFile(const QCString &name,const QCString &manName,
+                           const QCString &title,int id,int hierarchyLevel);
+    void writeSearchInfo(){DB_GEN_EMPTY};
+    void writeFooter(const QCString &){DB_GEN_NEW};
+    void endFile();
+    void startIndexSection(IndexSection);
+    void endIndexSection(IndexSection);
+    void writePageLink(const QCString &,bool);
+    void startProjectNumber(){DB_GEN_NEW};
+    void endProjectNumber(){DB_GEN_NEW};
+    void writeStyleInfo(int){DB_GEN_EMPTY};
+    void startTitleHead(const QCString &);
+    void endTitleHead(const QCString &fileName,const QCString &name);
+    void startIndexListItem(){DB_GEN_NEW};
+    void endIndexListItem(){DB_GEN_NEW};
+    void startIndexList(){DB_GEN_NEW};
+    void endIndexList(){DB_GEN_NEW};
+    void startIndexKey(){DB_GEN_NEW};
+    void endIndexKey(){DB_GEN_NEW};
+    void startIndexValue(bool){DB_GEN_NEW};
+    void endIndexValue(const QCString &,bool){DB_GEN_NEW};
+    void startItemList()  {DB_GEN_EMPTY};
+    void endItemList()    {DB_GEN_EMPTY};
+
+    void startIndexItem(const QCString &,const QCString &){DB_GEN_NEW};
+    void endIndexItem(const QCString &,const QCString &){DB_GEN_NEW};
+    void startItemListItem() {DB_GEN_EMPTY};
+    void endItemListItem() {DB_GEN_EMPTY};
+    void docify(const QCString &text);
+    void writeChar(char);
+    void writeString(const QCString &);
+    void startParagraph(const QCString &);
+    void endParagraph();
+    void writeObjectLink(const QCString &,const QCString &,const QCString &,const QCString &);
+    void startBold();
+    void endBold();
+    void startTypewriter();
+    void endTypewriter();
+    void startEmphasis(){DB_GEN_NEW};
+    void endEmphasis(){DB_GEN_NEW};
+    void writeRuler();
+    void startDescForItem(){DB_GEN_EMPTY};
+    void endDescForItem(){DB_GEN_EMPTY};
+    void startCenter(){DB_GEN_NEW};
+    void endCenter(){DB_GEN_NEW};
+    void startSmall(){DB_GEN_NEW};
+    void endSmall(){DB_GEN_NEW};
+    void startExamples();
+    void endExamples();
+    void writeAnchor(const QCString &,const QCString &){DB_GEN_EMPTY};
+    void startSection(const QCString &,const QCString &,SectionType);
+    void endSection(const QCString &,SectionType);
+    void lineBreak(const QCString &);
+    void addIndexItem(const QCString &,const QCString &);
+    void writeNonBreakableSpace(int);
+    void startDescTable(const QCString &);
+    void endDescTable();
+    void startDescTableRow();
+    void endDescTableRow();
+    void startDescTableTitle();
+    void endDescTableTitle();
+    void startDescTableData();
+    void endDescTableData();
+    void startTextLink(const QCString &,const QCString &){DB_GEN_NEW};
+    void endTextLink(){DB_GEN_NEW};
+    void startPageRef(){DB_GEN_NEW};
+    void endPageRef(const QCString &,const QCString &){DB_GEN_NEW};
+
+    void startGroupHeader(int);
+    void endGroupHeader(int);
+    void startMemberSections(){DB_GEN_EMPTY};
+    void endMemberSections(){DB_GEN_EMPTY};
+    void startHeaderSection(){DB_GEN_EMPTY};
+    void endHeaderSection(){DB_GEN_EMPTY};
+    void startMemberHeader(const QCString &anchor, int typ);
+    void endMemberHeader();
+    void startMemberSubtitle(){DB_GEN_EMPTY};
+    void endMemberSubtitle(){DB_GEN_EMPTY};
+    void startMemberDocList();
+    void endMemberDocList();
+    void startMemberList();
+    void endMemberList();
+    void startInlineHeader(){DB_GEN_NEW};
+    void endInlineHeader(){DB_GEN_NEW};
+    void startAnonTypeScope(int){DB_GEN_EMPTY};
+    void endAnonTypeScope(int){DB_GEN_EMPTY};
+    void startMemberItem(const QCString &,MemberItemType,const QCString &);
+    void endMemberItem(MemberItemType);
+    void startMemberTemplateParams();
+    void endMemberTemplateParams(const QCString &,const QCString &);
+    void startCompoundTemplateParams();
+    void endCompoundTemplateParams();
+    void startMemberGroupHeader(bool);
+    void endMemberGroupHeader();
+    void startMemberGroupDocs(){DB_GEN_EMPTY};
+    void endMemberGroupDocs(){DB_GEN_EMPTY};
+    void startMemberGroup();
+    void endMemberGroup(bool);
+    void insertMemberAlign(bool){DB_GEN_EMPTY};
+    void insertMemberAlignLeft(MemberItemType,bool){DB_GEN_EMPTY};
+    void startMemberDoc(const QCString &,const QCString &,
+                        const QCString &,const QCString &,int,int,bool);
+    void endMemberDoc(bool);
+    void startDoxyAnchor(const QCString &fName,const QCString &manName,
+                         const QCString &anchor,const QCString &name,
+                         const QCString &args);
+    void endDoxyAnchor(const QCString &fileName,const QCString &anchor);
+    void writeLatexSpacing(){DB_GEN_EMPTY}
+    void writeStartAnnoItem(const QCString &,const QCString &,
+                            const QCString &,const QCString &){DB_GEN_NEW};
+    void startMemberDescription(const QCString &,const QCString &,bool){DB_GEN_EMPTY};
+    void endMemberDescription(){DB_GEN_EMPTY};
+    void startMemberDeclaration(){DB_GEN_EMPTY};
+    void endMemberDeclaration(const QCString &,const QCString &){DB_GEN_EMPTY};
+    void writeInheritedSectionTitle(const QCString &,const QCString &,
+                                    const QCString &,const QCString &,
+                                    const QCString &,const QCString &);
+    void startIndent(){DB_GEN_EMPTY};
+    void endIndent(){DB_GEN_EMPTY};
+    void writeSynopsis(){DB_GEN_EMPTY};
+    void startClassDiagram();
+    void endClassDiagram(const ClassDiagram &,const QCString &,const QCString &);
+    void startDotGraph();
+    void endDotGraph(DotClassGraph &g);
+    void startInclDepGraph();
+    void endInclDepGraph(DotInclDepGraph &g);
+    void startGroupCollaboration();
+    void endGroupCollaboration(DotGroupCollaboration &g);
+    void startCallGraph();
+    void endCallGraph(DotCallGraph &g);
+    void startDirDepGraph();
+    void endDirDepGraph(DotDirDeps &g);
+    void writeGraphicalHierarchy(DotGfxHierarchyTable &){DB_GEN_NEW};
+    void startQuickIndices(){DB_GEN_EMPTY};
+    void endQuickIndices(){DB_GEN_EMPTY};
+    void writeSplitBar(const QCString &){DB_GEN_EMPTY};
+    void writeNavigationPath(const QCString &){DB_GEN_NEW};
+    void writeLogo(){DB_GEN_NEW};
+    void writeQuickLinks(bool,HighlightedItem,const QCString &,bool){DB_GEN_EMPTY};
+    void writeSummaryLink(const QCString &,const QCString &,const QCString &,bool){DB_GEN_EMPTY};
+    void startContents(){DB_GEN_EMPTY};
+    void endContents(){DB_GEN_EMPTY};
+    void startPageDoc(const QCString &){DB_GEN_EMPTY}
+    void endPageDoc() {DB_GEN_EMPTY}
+    void startTextBlock(bool);
+    void endTextBlock(bool);
+    void lastIndexPage(){DB_GEN_EMPTY};
+    void startMemberDocPrefixItem();
+    void endMemberDocPrefixItem();
+    void startMemberDocName(bool);
+    void endMemberDocName();
+    void startParameterType(bool,const QCString &){DB_GEN_EMPTY};
+    void endParameterType(){DB_GEN_EMPTY};
+    void startParameterName(bool);
+    void endParameterName(bool,bool,bool);
+    void startParameterList(bool);
+    void endParameterList();
+    void exceptionEntry(const QCString &,bool);
+
+    void startConstraintList(const QCString &);
+    void startConstraintParam();
+    void endConstraintParam();
+    void startConstraintType();
+    void endConstraintType();
+    void startConstraintDocs();
+    void endConstraintDocs();
+    void endConstraintList();
+
+    void startMemberDocSimple(bool);
+    void endMemberDocSimple(bool);
+    void startInlineMemberType();
+    void endInlineMemberType();
+    void startInlineMemberName();
+    void endInlineMemberName();
+    void startInlineMemberDoc();
+    void endInlineMemberDoc();
+
+    void startLabels();
+    void writeLabel(const QCString &,bool);
+    void endLabels();
+
+    void writeLocalToc(const SectionRefs &sr,const LocalToc &lt);
+
+    void setCurrentDoc(const Definition *,const QCString &,bool) {DB_GEN_EMPTY}
+    void addWord(const QCString &,bool) {DB_GEN_EMPTY}
+
+    void addCodeGen(OutputCodeList &list);
+private:
+    void openSection(const QCString &attr=QCString());
+    void closeSection();
+    void closeAllSections();
+
+    QCString relPath;
+    std::unique_ptr<OutputCodeList>  m_codeList;
+    DocbookCodeGenerator *m_codeGen = nullptr;
+    bool m_denseText = false;
+    bool m_inGroup = false;
+    int  m_levelListItem = 0;
+    std::array<bool,20> m_inListItem = { false, };
+    std::array<bool,20> m_inSimpleSect = { false, };
+    bool m_descTable = false;
+    bool m_simpleTable = false;
+    int m_inLevel = -1;
+    bool m_firstMember = false;
+    int m_openSectionCount = 0;
+    QCString m_pageLinks;
+};
+
+QCString convertToDocBook(const QCString &s, const bool retainNewline = false);
+
 
 #endif