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.
21 #include "outputgen.h"
23 class DocbookCodeGenerator : public CodeOutputInterface
26 DocbookCodeGenerator(TextStream &t);
27 virtual ~DocbookCodeGenerator();
28 void setRelativePath(const QCString &path) { m_relPath = path; }
29 void setSourceFileName(const QCString &sourceFileName) { m_sourceFileName = sourceFileName; }
30 QCString sourceFileName() { return m_sourceFileName; }
32 void codify(const QCString &text);
33 void writeCodeLink(CodeSymbolType type,
34 const QCString &ref,const QCString &file,
35 const QCString &anchor,const QCString &name,
36 const QCString &tooltip);
37 void writeCodeLinkLine(CodeSymbolType type,
38 const QCString &ref,const QCString &file,
39 const QCString &anchor,const QCString &name,
40 const QCString &tooltip, bool);
41 void writeTooltip(const QCString &, const DocLinkInfo &, const QCString &,
42 const QCString &, const SourceLinkInfo &, const SourceLinkInfo &
44 void startCodeLine(bool);
46 void startFontClass(const QCString &colorClass);
48 void writeCodeAnchor(const QCString &);
49 void writeLineNumber(const QCString &extRef,const QCString &compId,
50 const QCString &anchorId,int l, bool writeLineAnchor);
51 void setCurrentDoc(const Definition *,const QCString &,bool);
52 void addWord(const QCString &,bool);
54 void startCodeFragment(const QCString &style);
55 void endCodeFragment(const QCString &style);
61 int m_lineNumber = -1;
63 bool m_insideCodeLine = false;
64 bool m_insideSpecialHL = false;
66 QCString m_sourceFileName;
71 // define for cases that have been implemented with an empty body
72 #define DB_GEN_EMPTY m_t << "<!-- DBG_GEN_head_check " << __LINE__ << " -->\n";
78 // Generic debug statements
79 #define DB_GEN_H DB_GEN_H1(m_t)
80 #define DB_GEN_H1(x) x << "<!-- DBG_GEN_head " << __LINE__ << " -->\n";
81 #define DB_GEN_H2(y) DB_GEN_H2a(m_t,y)
82 #define DB_GEN_H2a(x,y) x << "<!-- DBG_GEN_head " << __LINE__ << " " << y << " -->\n";
83 // define for cases that have NOT yet been implemented / considered
84 #define DB_GEN_NEW fprintf(stderr,"DBG_GEN_head %d\n",__LINE__); DB_GEN_H
89 #define DB_GEN_H2a(x,y)
93 class DocbookGenerator : public OutputGenerator
97 DocbookGenerator(const DocbookGenerator &o);
98 DocbookGenerator &operator=(const DocbookGenerator &o);
99 virtual ~DocbookGenerator();
100 virtual std::unique_ptr<OutputGenerator> clone() const;
105 OutputType type() const { return Docbook; }
107 // --- CodeOutputInterface
108 void codify(const QCString &text)
109 { m_codeGen.codify(text); }
110 void writeCodeLink(CodeSymbolType type,
111 const QCString &ref, const QCString &file,
112 const QCString &anchor,const QCString &name,
113 const QCString &tooltip)
114 { m_codeGen.writeCodeLink(type,ref,file,anchor,name,tooltip); }
115 void writeLineNumber(const QCString &ref,const QCString &file,const QCString &anchor,int lineNumber, bool writeLineAnchor)
116 { m_codeGen.writeLineNumber(ref,file,anchor,lineNumber,writeLineAnchor); }
117 void writeTooltip(const QCString &id, const DocLinkInfo &docInfo, const QCString &decl,
118 const QCString &desc, const SourceLinkInfo &defInfo, const SourceLinkInfo &declInfo
120 { m_codeGen.writeTooltip(id,docInfo,decl,desc,defInfo,declInfo); }
121 void startCodeLine(bool hasLineNumbers)
122 { m_codeGen.startCodeLine(hasLineNumbers); }
124 { m_codeGen.endCodeLine(); }
125 void startFontClass(const QCString &s)
126 { m_codeGen.startFontClass(s); }
128 { m_codeGen.endFontClass(); }
129 void writeCodeAnchor(const QCString &anchor)
130 { m_codeGen.writeCodeAnchor(anchor); }
131 void startCodeFragment(const QCString &style)
132 { m_codeGen.startCodeFragment(style); }
133 void endCodeFragment(const QCString &style)
134 { m_codeGen.endCodeFragment(style); }
135 // ---------------------------
137 void writeDoc(DocNode *,const Definition *ctx,const MemberDef *md,int id);
139 ///////////////////////////////////////////////////////////////
140 // structural output interface
141 ///////////////////////////////////////////////////////////////
142 void startFile(const QCString &name,const QCString &manName,
143 const QCString &title,int id);
144 void writeSearchInfo(){DB_GEN_EMPTY};
145 void writeFooter(const QCString &){DB_GEN_NEW};
147 void startIndexSection(IndexSections);
148 void endIndexSection(IndexSections);
149 void writePageLink(const QCString &,bool);
150 void startProjectNumber(){DB_GEN_NEW};
151 void endProjectNumber(){DB_GEN_NEW};
152 void writeStyleInfo(int){DB_GEN_EMPTY};
153 void startTitleHead(const QCString &);
154 void endTitleHead(const QCString &fileName,const QCString &name);
155 void startIndexListItem(){DB_GEN_NEW};
156 void endIndexListItem(){DB_GEN_NEW};
157 void startIndexList(){DB_GEN_NEW};
158 void endIndexList(){DB_GEN_NEW};
159 void startIndexKey(){DB_GEN_NEW};
160 void endIndexKey(){DB_GEN_NEW};
161 void startIndexValue(bool){DB_GEN_NEW};
162 void endIndexValue(const QCString &,bool){DB_GEN_NEW};
163 void startItemList() {DB_GEN_EMPTY};
164 void endItemList() {DB_GEN_EMPTY};
166 void startIndexItem(const QCString &,const QCString &){DB_GEN_NEW};
167 void endIndexItem(const QCString &,const QCString &){DB_GEN_NEW};
168 void startItemListItem() {DB_GEN_EMPTY};
169 void endItemListItem() {DB_GEN_EMPTY};
170 void docify(const QCString &text);
171 void writeChar(char);
172 void writeString(const QCString &);
173 void startParagraph(const QCString &);
175 void writeObjectLink(const QCString &,const QCString &,const QCString &,const QCString &);
176 void startHtmlLink(const QCString &){DB_GEN_NEW};
177 void endHtmlLink(){DB_GEN_NEW};
180 void startTypewriter();
181 void endTypewriter();
182 void startEmphasis(){DB_GEN_NEW};
183 void endEmphasis(){DB_GEN_NEW};
185 void startDescription(){DB_GEN_NEW};
186 void endDescription(){DB_GEN_NEW};
187 void startDescItem(){DB_GEN_NEW};
188 void startDescForItem(){DB_GEN_EMPTY};
189 void endDescForItem(){DB_GEN_EMPTY};
190 void endDescItem(){DB_GEN_NEW};
191 void startCenter(){DB_GEN_NEW};
192 void endCenter(){DB_GEN_NEW};
193 void startSmall(){DB_GEN_NEW};
194 void endSmall(){DB_GEN_NEW};
195 void startExamples();
197 void startParamList(BaseOutputDocInterface::ParamListTypes,const QCString &){DB_GEN_NEW};
198 void endParamList(){DB_GEN_NEW};
199 void startTitle(){DB_GEN_NEW};
200 void endTitle(){DB_GEN_NEW};
201 void writeAnchor(const QCString &,const QCString &){DB_GEN_EMPTY};
202 void startSection(const QCString &,const QCString &,SectionType);
203 void endSection(const QCString &,SectionType);
204 void lineBreak(const QCString &);
205 void addIndexItem(const QCString &,const QCString &);
206 void writeNonBreakableSpace(int);
207 void startDescTable(const QCString &);
209 void startDescTableRow();
210 void endDescTableRow();
211 void startDescTableTitle();
212 void endDescTableTitle();
213 void startDescTableData();
214 void endDescTableData();
215 void startTextLink(const QCString &,const QCString &){DB_GEN_NEW};
216 void endTextLink(){DB_GEN_NEW};
217 void startPageRef(){DB_GEN_NEW};
218 void endPageRef(const QCString &,const QCString &){DB_GEN_NEW};
219 void startSubsection(){DB_GEN_NEW};
220 void endSubsection(){DB_GEN_NEW};
221 void startSubsubsection();
222 void endSubsubsection();
225 void startGroupHeader(int);
226 void endGroupHeader(int);
227 void startMemberSections(){DB_GEN_EMPTY};
228 void endMemberSections(){DB_GEN_EMPTY};
229 void startHeaderSection(){DB_GEN_EMPTY};
230 void endHeaderSection(){DB_GEN_EMPTY};
231 void startMemberHeader(const QCString &anchor, int typ);
232 void endMemberHeader();
233 void startMemberSubtitle(){DB_GEN_EMPTY};
234 void endMemberSubtitle(){DB_GEN_EMPTY};
235 void startMemberDocList();
236 void endMemberDocList();
237 void startMemberList();
238 void endMemberList();
239 void startInlineHeader(){DB_GEN_NEW};
240 void endInlineHeader(){DB_GEN_NEW};
241 void startAnonTypeScope(int){DB_GEN_EMPTY};
242 void endAnonTypeScope(int){DB_GEN_EMPTY};
243 void startMemberItem(const QCString &,int,const QCString &);
244 void endMemberItem();
245 void startMemberTemplateParams();
246 void endMemberTemplateParams(const QCString &,const QCString &);
247 void startCompoundTemplateParams() { startSubsubsection(); }
248 void endCompoundTemplateParams() { endSubsubsection(); }
249 void startMemberGroupHeader(bool);
250 void endMemberGroupHeader();
251 void startMemberGroupDocs(){DB_GEN_EMPTY};
252 void endMemberGroupDocs(){DB_GEN_EMPTY};
253 void startMemberGroup();
254 void endMemberGroup(bool);
255 void insertMemberAlign(bool){DB_GEN_EMPTY};
256 void insertMemberAlignLeft(int,bool){DB_GEN_EMPTY};
257 void startMemberDoc(const QCString &,const QCString &,
258 const QCString &,const QCString &,int,int,bool);
259 void endMemberDoc(bool);
260 void startDoxyAnchor(const QCString &fName,const QCString &manName,
261 const QCString &anchor,const QCString &name,
262 const QCString &args);
263 void endDoxyAnchor(const QCString &fileName,const QCString &anchor);
264 void writeLatexSpacing(){DB_GEN_EMPTY}
265 void writeStartAnnoItem(const QCString &,const QCString &,
266 const QCString &,const QCString &){DB_GEN_NEW};
267 void writeEndAnnoItem(const QCString &){DB_GEN_NEW};
268 void startMemberDescription(const QCString &,const QCString &,bool){DB_GEN_EMPTY};
269 void endMemberDescription(){DB_GEN_EMPTY};
270 void startMemberDeclaration(){DB_GEN_EMPTY};
271 void endMemberDeclaration(const QCString &,const QCString &){DB_GEN_EMPTY};
272 void writeInheritedSectionTitle(const QCString &,const QCString &,
273 const QCString &,const QCString &,
274 const QCString &,const QCString &){DB_GEN_NEW};
275 void startIndent(){DB_GEN_EMPTY};
276 void endIndent(){DB_GEN_EMPTY};
277 void writeSynopsis(){DB_GEN_EMPTY};
278 void startClassDiagram();
279 void endClassDiagram(const ClassDiagram &,const QCString &,const QCString &);
280 void startDotGraph();
281 void endDotGraph(DotClassGraph &g);
282 void startInclDepGraph();
283 void endInclDepGraph(DotInclDepGraph &g);
284 void startGroupCollaboration();
285 void endGroupCollaboration(DotGroupCollaboration &g);
286 void startCallGraph();
287 void endCallGraph(DotCallGraph &g);
288 void startDirDepGraph();
289 void endDirDepGraph(DotDirDeps &g);
290 void writeGraphicalHierarchy(DotGfxHierarchyTable &){DB_GEN_NEW};
291 void startQuickIndices(){DB_GEN_EMPTY};
292 void endQuickIndices(){DB_GEN_EMPTY};
293 void writeSplitBar(const QCString &){DB_GEN_EMPTY};
294 void writeNavigationPath(const QCString &){DB_GEN_NEW};
295 void writeLogo(){DB_GEN_NEW};
296 void writeQuickLinks(bool,HighlightedItem,const QCString &){DB_GEN_EMPTY};
297 void writeSummaryLink(const QCString &,const QCString &,const QCString &,bool){DB_GEN_EMPTY};
298 void startContents(){DB_GEN_EMPTY};
299 void endContents(){DB_GEN_EMPTY};
300 void startPageDoc(const QCString &){DB_GEN_EMPTY}
301 void endPageDoc() {DB_GEN_EMPTY}
302 void startTextBlock(bool);
303 void endTextBlock(bool);
304 void lastIndexPage(){DB_GEN_EMPTY};
305 void startMemberDocPrefixItem();
306 void endMemberDocPrefixItem();
307 void startMemberDocName(bool);
308 void endMemberDocName();
309 void startParameterType(bool,const QCString &){DB_GEN_EMPTY};
310 void endParameterType(){DB_GEN_EMPTY};
311 void startParameterName(bool);
312 void endParameterName(bool,bool,bool);
313 void startParameterList(bool);
314 void endParameterList();
315 void exceptionEntry(const QCString &,bool);
317 void startConstraintList(const QCString &);
318 void startConstraintParam();
319 void endConstraintParam();
320 void startConstraintType();
321 void endConstraintType();
322 void startConstraintDocs();
323 void endConstraintDocs();
324 void endConstraintList();
326 void startMemberDocSimple(bool);
327 void endMemberDocSimple(bool);
328 void startInlineMemberType();
329 void endInlineMemberType();
330 void startInlineMemberName();
331 void endInlineMemberName();
332 void startInlineMemberDoc();
333 void endInlineMemberDoc();
336 void writeLabel(const QCString &,bool);
339 void setCurrentDoc(const Definition *,const QCString &,bool) {DB_GEN_EMPTY}
340 void addWord(const QCString &,bool) {DB_GEN_EMPTY}
343 void openSection(const QCString &attr=QCString());
345 void closeAllSections();
348 DocbookCodeGenerator m_codeGen;
349 bool m_denseText = false;
350 bool m_inGroup = false;
351 int m_levelListItem = 0;
352 bool m_inListItem[20] = { false, };
353 bool m_inSimpleSect[20] = { false, };
354 bool m_descTable = false;
355 bool m_simpleTable = false;
357 bool m_firstMember = false;
358 int m_openSectionCount = 0;