/******************************************************************************
*
* Copyright (C) 1997-2020 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.
*
*/
#ifndef HTMLGEN_H
#define HTMLGEN_H
#include "outputgen.h"
class OutputCodeList;
/** Generator for HTML code fragments */
class HtmlCodeGenerator
{
public:
HtmlCodeGenerator(TextStream *t,const QCString &relPath);
HtmlCodeGenerator(TextStream *t);
void setTextStream(TextStream *t) { m_t = t; }
OutputType type() const { return OutputType::Html; }
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 &id,
const DocLinkInfo &docInfo,
const QCString &decl,
const QCString &desc,
const SourceLinkInfo &defInfo,
const SourceLinkInfo &declInfo
);
void writeLineNumber(const QCString &,const QCString &,const QCString &,int, bool);
void startCodeLine(bool);
void endCodeLine();
void startFontClass(const QCString &s);
void endFontClass();
void writeCodeAnchor(const QCString &anchor);
void startCodeFragment(const QCString &style);
void endCodeFragment(const QCString &);
void startFold(int,const QCString &,const QCString &);
void endFold();
void setRelativePath(const QCString &path);
private:
void _writeCodeLink(const QCString &className,
const QCString &ref,const QCString &file,
const QCString &anchor,const QCString &name,
const QCString &tooltip);
void docify(const QCString &str);
TextStream *m_t;
int m_col = 0;
QCString m_relPath;
bool m_lineOpen = false;
};
/** Generator for HTML output */
class HtmlGenerator : public OutputGenerator
{
public:
HtmlGenerator();
HtmlGenerator(const HtmlGenerator &);
HtmlGenerator &operator=(const HtmlGenerator &);
HtmlGenerator(HtmlGenerator &&);
HtmlGenerator &operator=(HtmlGenerator &&) = delete;
~HtmlGenerator();
OutputType type() const { return OutputType::Html; }
static void init();
void cleanup();
static void writeStyleSheetFile(TextStream &t);
static void writeHeaderFile(TextStream &t, const QCString &cssname);
static void writeFooterFile(TextStream &t);
static void writeTabData();
static void writeSearchInfoStatic(TextStream &t,const QCString &relPath);
static void writeSearchData(const QCString &dir);
static void writeSearchPage();
static void writeExternalSearchPage();
static QCString writeLogoAsString(const QCString &path);
static QCString writeSplitBarAsString(const QCString &name,const QCString &relpath);
static QCString getMathJaxMacros();
static QCString getNavTreeCss();
void writeDoc(const IDocNodeAST *node,const Definition *,const MemberDef *,int id);
void startFile(const QCString &name,const QCString &manName,const QCString &title,int id, int hierarchyLevel);
void writeFooter(const QCString &navPath);
void endFile();
void clearBuffer();
void writeSearchInfo();
void startIndexSection(IndexSection) {}
void endIndexSection(IndexSection) {}
void writePageLink(const QCString &,bool) {}
void startProjectNumber();
void endProjectNumber();
void writeStyleInfo(int part);
void startTitleHead(const QCString &);
void endTitleHead(const QCString &,const QCString &);
void startParagraph(const QCString &classDef);
void endParagraph();
void writeString(const QCString &text);
void startIndexListItem();
void endIndexListItem();
void startIndexList();
void endIndexList();
void startIndexKey();
void endIndexKey();
void startIndexValue(bool);
void endIndexValue(const QCString &,bool);
void startItemList() { m_t << "
\n"; }
void endItemList() { m_t << "
\n"; }
void startIndexItem(const QCString &ref,const QCString &file);
void endIndexItem(const QCString &ref,const QCString &file);
void docify(const QCString &text);
void writeObjectLink(const QCString &ref,const QCString &file,
const QCString &anchor,const QCString &name);
void startTextLink(const QCString &file,const QCString &anchor);
void endTextLink();
void startTypewriter() { m_t << ""; }
void endTypewriter() { m_t << "
"; }
void startGroupHeader(int);
void endGroupHeader(int);
void startItemListItem() { m_t << ""; }
void endItemListItem() { m_t << "\n"; }
void startMemberSections();
void endMemberSections();
void startHeaderSection();
void endHeaderSection();
void startMemberHeader(const QCString &, int);
void endMemberHeader();
void startMemberSubtitle();
void endMemberSubtitle();
void startMemberDocList();
void endMemberDocList();
void startMemberList();
void endMemberList();
void startInlineHeader();
void endInlineHeader();
void startAnonTypeScope(int) {}
void endAnonTypeScope(int) {}
void startMemberItem(const QCString &anchor,MemberItemType,const QCString &inheritId);
void endMemberItem(MemberItemType);
void startMemberTemplateParams();
void endMemberTemplateParams(const QCString &anchor,const QCString &inheritId);
void startCompoundTemplateParams();
void endCompoundTemplateParams();
void startMemberGroupHeader(bool);
void endMemberGroupHeader();
void startMemberGroupDocs();
void endMemberGroupDocs();
void startMemberGroup();
void endMemberGroup(bool);
void insertMemberAlign(bool);
void insertMemberAlignLeft(MemberItemType,bool);
void startMemberDescription(const QCString &anchor,const QCString &inheritId, bool typ);
void endMemberDescription();
void startMemberDeclaration() {}
void endMemberDeclaration(const QCString &anchor,const QCString &inheritId);
void writeInheritedSectionTitle(const QCString &id, const QCString &ref,
const QCString &file, const QCString &anchor,
const QCString &title,const QCString &name);
void writeRuler() { m_t << "
"; }
void writeAnchor(const QCString &,const QCString &name)
{ m_t << ""; }
void startEmphasis() { m_t << ""; }
void endEmphasis() { m_t << ""; }
void startBold() { m_t << ""; }
void endBold() { m_t << ""; }
void startDescForItem() { m_t << ""; }
void endDescForItem() { m_t << "\n"; }
void lineBreak(const QCString &style);
void writeChar(char c);
void startMemberDoc(const QCString &clName, const QCString &memName,
const QCString &anchor, const QCString &title,
int memCount, int memTotal, bool showInline);
void endMemberDoc(bool);
void startDoxyAnchor(const QCString &fName,const QCString &manName,
const QCString &anchor,const QCString &name,
const QCString &args);
void endDoxyAnchor(const QCString &fName,const QCString &anchor);
void writeLatexSpacing() {}
void writeStartAnnoItem(const QCString &type,const QCString &file,
const QCString &path,const QCString &name);
void startCenter() { m_t << "\n"; }
void endCenter() { m_t << "\n"; }
void startSmall() { m_t << "\n"; }
void endSmall() { m_t << "\n"; }
void startExamples();
void endExamples();
void startSection(const QCString &,const QCString &,SectionType);
void endSection(const QCString &,SectionType);
void addIndexItem(const QCString &,const QCString &);
void startIndent();
void endIndent();
void writeSynopsis() {}
void startClassDiagram();
void endClassDiagram(const ClassDiagram &,const QCString &,const QCString &);
void startPageRef() {}
void endPageRef(const QCString &,const QCString &) {}
void startQuickIndices() {}
void endQuickIndices();
void writeSplitBar(const QCString &name);
void writeNavigationPath(const QCString &s);
void writeLogo();
void writeQuickLinks(bool compact,HighlightedItem hli,const QCString &file,bool needsFolding);
void writeSummaryLink(const QCString &file,const QCString &anchor,const QCString &title,bool first);
void startContents();
void endContents();
void startPageDoc(const QCString &pageTitle);
void endPageDoc();
void writeNonBreakableSpace(int);
void startDescTable(const QCString &title);
void endDescTable();
void startDescTableRow();
void endDescTableRow();
void startDescTableTitle();
void endDescTableTitle();
void startDescTableData();
void endDescTableData();
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 &g);
void startTextBlock(bool)
{ m_t << ""; }
void endTextBlock(bool)
{ m_t << "
"; }
void lastIndexPage() {}
void startMemberDocPrefixItem();
void endMemberDocPrefixItem();
void startMemberDocName(bool);
void endMemberDocName();
void startParameterType(bool first,const QCString &key);
void endParameterType();
void startParameterName(bool);
void endParameterName(bool last,bool emptyList,bool closeBracket);
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 &l,bool isLast);
void endLabels();
void writeLocalToc(const SectionRefs &sr,const LocalToc <);
void addCodeGen(OutputCodeList &list);
private:
void startTitle() { m_t << ""; }
void endTitle() { m_t << "
"; }
static void writePageFooter(TextStream &t,const QCString &,const QCString &,const QCString &);
void docify_(const QCString &text,bool inHtmlComment);
QCString m_lastTitle;
QCString m_lastFile;
QCString m_relPath;
int m_sectionCount = 0;
bool m_emptySection = false;
std::unique_ptr m_codeList;
HtmlCodeGenerator *m_codeGen = nullptr;
};
#endif