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.
19 #include "outputgen.h"
21 class DocbookCodeGenerator : public CodeOutputInterface
24 DocbookCodeGenerator(FTextStream &t);
25 DocbookCodeGenerator();
26 virtual ~DocbookCodeGenerator();
27 void setTextStream(FTextStream &t)
29 m_streamSet = t.device()!=0;
30 m_t.setDevice(t.device());
32 void setRelativePath(const QCString &path) { m_relPath = path; }
33 void setSourceFileName(const QCString &sourceFileName) { m_sourceFileName = sourceFileName; }
34 QCString sourceFileName() { return m_sourceFileName; }
36 void codify(const char *text);
37 void writeCodeLink(const char *ref,const char *file,
38 const char *anchor,const char *name,
40 void writeCodeLinkLine(const char *ref,const char *file,
41 const char *anchor,const char *name,
43 void writeTooltip(const char *, const DocLinkInfo &, const char *,
44 const char *, const SourceLinkInfo &, const SourceLinkInfo &
46 void startCodeLine(bool);
48 void startFontClass(const char *colorClass);
50 void writeCodeAnchor(const char *);
51 void writeLineNumber(const char *extRef,const char *compId,
52 const char *anchorId,int l);
53 void setCurrentDoc(const Definition *,const char *,bool);
54 void addWord(const char *,bool);
56 void startCodeFragment(const char *style);
57 void endCodeFragment(const char *style);
61 bool m_streamSet = false;
64 int m_lineNumber = -1;
66 bool m_insideCodeLine = false;
67 bool m_insideSpecialHL = false;
69 QCString m_sourceFileName;
70 bool m_prettyCode = Config_getBool(DOCBOOK_PROGRAMLISTING);
75 // define for cases that have been implemented with an empty body
76 #define DB_GEN_EMPTY t << "<!-- DBG_GEN_head_check " << __LINE__ << " -->\n";
82 // Generic debug statements
83 #define DB_GEN_H DB_GEN_H1(t)
84 #define DB_GEN_H1(x) x << "<!-- DBG_GEN_head " << __LINE__ << " -->\n";
85 #define DB_GEN_H2(y) DB_GEN_H2a(t,y)
86 #define DB_GEN_H2a(x,y) x << "<!-- DBG_GEN_head " << __LINE__ << " " << y << " -->\n";
87 // define for cases that have NOT yet been implemented / considered
88 #define DB_GEN_NEW fprintf(stderr,"DBG_GEN_head %d\n",__LINE__); DB_GEN_H
93 #define DB_GEN_H2a(x,y)
97 class DocbookGenerator : public OutputGenerator
101 DocbookGenerator(const DocbookGenerator &o);
102 DocbookGenerator &operator=(const DocbookGenerator &o);
103 virtual ~DocbookGenerator();
104 virtual std::unique_ptr<OutputGenerator> clone() const;
108 OutputType type() const { return Docbook; }
110 // --- CodeOutputInterface
111 void codify(const char *text)
112 { m_codeGen.codify(text); }
113 void writeCodeLink(const char *ref, const char *file,
114 const char *anchor,const char *name,
116 { m_codeGen.writeCodeLink(ref,file,anchor,name,tooltip); }
117 void writeLineNumber(const char *ref,const char *file,const char *anchor,int lineNumber)
118 { m_codeGen.writeLineNumber(ref,file,anchor,lineNumber); }
119 void writeTooltip(const char *id, const DocLinkInfo &docInfo, const char *decl,
120 const char *desc, const SourceLinkInfo &defInfo, const SourceLinkInfo &declInfo
122 { m_codeGen.writeTooltip(id,docInfo,decl,desc,defInfo,declInfo); }
123 void startCodeLine(bool hasLineNumbers)
124 { m_codeGen.startCodeLine(hasLineNumbers); }
126 { m_codeGen.endCodeLine(); }
127 void startFontClass(const char *s)
128 { m_codeGen.startFontClass(s); }
130 { m_codeGen.endFontClass(); }
131 void writeCodeAnchor(const char *anchor)
132 { m_codeGen.writeCodeAnchor(anchor); }
133 void startCodeFragment(const char *style)
134 { m_codeGen.startCodeFragment(style); }
135 void endCodeFragment(const char *style)
136 { m_codeGen.endCodeFragment(style); }
137 // ---------------------------
139 void writeDoc(DocNode *,const Definition *ctx,const MemberDef *md,int id);
141 ///////////////////////////////////////////////////////////////
142 // structural output interface
143 ///////////////////////////////////////////////////////////////
144 void startFile(const char *name,const char *manName,
145 const char *title,int id);
146 void writeSearchInfo(){DB_GEN_EMPTY};
147 void writeFooter(const char *){DB_GEN_NEW};
149 void startIndexSection(IndexSections);
150 void endIndexSection(IndexSections);
151 void writePageLink(const char *,bool);
152 void startProjectNumber(){DB_GEN_NEW};
153 void endProjectNumber(){DB_GEN_NEW};
154 void writeStyleInfo(int){DB_GEN_EMPTY};
155 void startTitleHead(const char *);
156 void endTitleHead(const char *fileName,const char *name);
157 void startIndexListItem(){DB_GEN_NEW};
158 void endIndexListItem(){DB_GEN_NEW};
159 void startIndexList(){DB_GEN_NEW};
160 void endIndexList(){DB_GEN_NEW};
161 void startIndexKey(){DB_GEN_NEW};
162 void endIndexKey(){DB_GEN_NEW};
163 void startIndexValue(bool){DB_GEN_NEW};
164 void endIndexValue(const char *,bool){DB_GEN_NEW};
165 void startItemList() {DB_GEN_EMPTY};
166 void endItemList() {DB_GEN_EMPTY};
168 void startIndexItem(const char *,const char *){DB_GEN_NEW};
169 void endIndexItem(const char *,const char *){DB_GEN_NEW};
170 void startItemListItem() {DB_GEN_EMPTY};
171 void endItemListItem() {DB_GEN_EMPTY};
172 void docify(const char *text);
173 void writeChar(char);
174 void writeString(const char *);
175 void startParagraph(const char *);
177 void writeObjectLink(const char *,const char *,const char *,const char *);
178 void startHtmlLink(const char *){DB_GEN_NEW};
179 void endHtmlLink(){DB_GEN_NEW};
182 void startTypewriter();
183 void endTypewriter();
184 void startEmphasis(){DB_GEN_NEW};
185 void endEmphasis(){DB_GEN_NEW};
187 void startDescription(){DB_GEN_NEW};
188 void endDescription(){DB_GEN_NEW};
189 void startDescItem(){DB_GEN_NEW};
190 void startDescForItem(){DB_GEN_EMPTY};
191 void endDescForItem(){DB_GEN_EMPTY};
192 void endDescItem(){DB_GEN_NEW};
193 void startCenter(){DB_GEN_NEW};
194 void endCenter(){DB_GEN_NEW};
195 void startSmall(){DB_GEN_NEW};
196 void endSmall(){DB_GEN_NEW};
197 void startExamples();
199 void startParamList(BaseOutputDocInterface::ParamListTypes,const char *){DB_GEN_NEW};
200 void endParamList(){DB_GEN_NEW};
201 void startTitle(){DB_GEN_NEW};
202 void endTitle(){DB_GEN_NEW};
203 void writeAnchor(const char *,const char *){DB_GEN_EMPTY};
204 void startSection(const char *,const char *,SectionType);
205 void endSection(const char *,SectionType);
206 void lineBreak(const char *);
207 void addIndexItem(const char *,const char *);
208 void writeNonBreakableSpace(int);
209 void startDescTable(const char *);
211 void startDescTableRow();
212 void endDescTableRow();
213 void startDescTableTitle();
214 void endDescTableTitle();
215 void startDescTableData();
216 void endDescTableData();
217 void startTextLink(const char *,const char *){DB_GEN_NEW};
218 void endTextLink(){DB_GEN_NEW};
219 void startPageRef(){DB_GEN_NEW};
220 void endPageRef(const char *,const char *){DB_GEN_NEW};
221 void startSubsection(){DB_GEN_NEW};
222 void endSubsection(){DB_GEN_NEW};
223 void startSubsubsection();
224 void endSubsubsection();
227 void startGroupHeader(int);
228 void endGroupHeader(int);
229 void startMemberSections(){DB_GEN_EMPTY};
230 void endMemberSections(){DB_GEN_EMPTY};
231 void startHeaderSection(){DB_GEN_EMPTY};
232 void endHeaderSection(){DB_GEN_EMPTY};
233 void startMemberHeader(const char *anchor, int typ);
234 void endMemberHeader();
235 void startMemberSubtitle(){DB_GEN_EMPTY};
236 void endMemberSubtitle(){DB_GEN_EMPTY};
237 void startMemberDocList();
238 void endMemberDocList();
239 void startMemberList();
240 void endMemberList();
241 void startInlineHeader(){DB_GEN_NEW};
242 void endInlineHeader(){DB_GEN_NEW};
243 void startAnonTypeScope(int){DB_GEN_EMPTY};
244 void endAnonTypeScope(int){DB_GEN_EMPTY};
245 void startMemberItem(const char *,int,const char *);
246 void endMemberItem();
247 void startMemberTemplateParams();
248 void endMemberTemplateParams(const char *,const char *);
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 char *,const char *,
258 const char *,const char *,int,int,bool);
259 void endMemberDoc(bool);
260 void startDoxyAnchor(const char *fName,const char *manName,
261 const char *anchor,const char *name,
263 void endDoxyAnchor(const char *fileName,const char *anchor);
264 void writeLatexSpacing(){DB_GEN_EMPTY}
265 void writeStartAnnoItem(const char *,const char *,
266 const char *,const char *){DB_GEN_NEW};
267 void writeEndAnnoItem(const char *){DB_GEN_NEW};
268 void startMemberDescription(const char *,const char *,bool){DB_GEN_EMPTY};
269 void endMemberDescription(){DB_GEN_EMPTY};
270 void startMemberDeclaration(){DB_GEN_EMPTY};
271 void endMemberDeclaration(const char *,const char *){DB_GEN_EMPTY};
272 void writeInheritedSectionTitle(const char *,const char *,
273 const char *,const char *,
274 const char *,const char *){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 char *,const char *);
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 char *){DB_GEN_EMPTY};
294 void writeNavigationPath(const char *){DB_GEN_NEW};
295 void writeLogo(){DB_GEN_NEW};
296 void writeQuickLinks(bool,HighlightedItem,const char *){DB_GEN_EMPTY};
297 void writeSummaryLink(const char *,const char *,const char *,bool){DB_GEN_EMPTY};
298 void startContents(){DB_GEN_EMPTY};
299 void endContents(){DB_GEN_EMPTY};
300 void startPageDoc(const char *){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 char *){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 char*,bool);
317 void startConstraintList(const char *);
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){DB_GEN_NEW};
327 void endMemberDocSimple(bool){DB_GEN_NEW};
328 void startInlineMemberType(){DB_GEN_NEW};
329 void endInlineMemberType(){DB_GEN_NEW};
330 void startInlineMemberName(){DB_GEN_NEW};
331 void endInlineMemberName(){DB_GEN_NEW};
332 void startInlineMemberDoc(){DB_GEN_NEW};
333 void endInlineMemberDoc(){DB_GEN_NEW};
336 void writeLabel(const char *,bool);
339 void setCurrentDoc(const Definition *,const char *,bool) {DB_GEN_EMPTY}
340 void addWord(const char *,bool) {DB_GEN_EMPTY}
345 DocbookCodeGenerator m_codeGen;
346 bool m_prettyCode = Config_getBool(DOCBOOK_PROGRAMLISTING);
347 bool m_denseText = false;
348 bool m_inGroup = false;
349 bool m_inDetail = false;
350 int m_levelListItem = 0;
351 bool m_inListItem[20] = { false, };
352 bool m_inSimpleSect[20] = { false, };
353 bool m_descTable = false;
355 bool m_firstMember = false;