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.
13 * Documents produced by Doxygen are derivative works derived from the
14 * input used in their production; they are not affected by this license.
25 #include "ftextstream.h"
29 class DotInclDepGraph;
32 class DotGfxHierarchyTable;
33 class DotGroupCollaboration;
57 /** Output interface for code parser.
59 class CodeOutputInterface
62 virtual ~CodeOutputInterface() {}
64 /*! Writes an code fragment to the output. This function should keep
65 * spaces visible, should break lines at a newline and should convert
66 * tabs to the right number of spaces.
68 virtual void codify(const char *s) = 0;
70 /*! Writes a link to an object in a code fragment.
71 * \param ref If this is non-zero, the object is to be found in
72 * an external documentation file.
73 * \param file The file in which the object is located.
74 * \param anchor The anchor uniquely identifying the object within
76 * \param name The text to display as a placeholder for the link.
77 * \param tooltip The tooltip to display when the mouse is on the link.
79 virtual void writeCodeLink(const char *ref,const char *file,
80 const char *anchor,const char *name,
81 const char *tooltip) = 0;
83 /*! Writes the line number of a source listing
84 * \param ref External reference (when imported from a tag file)
85 * \param file The file part of the URL pointing to the docs.
86 * \param anchor The anchor part of the URL pointing to the docs.
87 * \param lineNumber The line number to write
89 virtual void writeLineNumber(const char *ref,const char *file,
90 const char *anchor,int lineNumber) = 0;
92 /*! Writes a tool tip definition
93 * \param id unique identifier for the tooltip
94 * \param docInfo Info about the symbol's documentation.
95 * \param decl full declaration of the symbol (for functions)
96 * \param desc brief description for the symbol
97 * \param defInfo Info about the symbol's definition in the source code
98 * \param declInfo Info about the symbol's declaration in the source code
100 virtual void writeTooltip(const char *id,
101 const DocLinkInfo &docInfo,
104 const SourceLinkInfo &defInfo,
105 const SourceLinkInfo &declInfo
108 virtual void startCodeLine(bool hasLineNumbers) = 0;
110 /*! Ends a line of code started with startCodeLine() */
111 virtual void endCodeLine() = 0;
113 /*! Starts a block with a certain meaning. Used for syntax highlighting,
114 * which elements of the same type are rendered using the same 'font class'.
115 * \param clsName The category name.
117 virtual void startFontClass(const char *clsName) = 0;
119 /*! Ends a block started with startFontClass() */
120 virtual void endFontClass() = 0;
122 /*! Write an anchor to a source listing.
123 * \param name The name of the anchor.
125 virtual void writeCodeAnchor(const char *name) = 0;
127 virtual void setCurrentDoc(Definition *context,const char *anchor,bool isSourceFile) = 0;
128 virtual void addWord(const char *word,bool hiPriority) = 0;
131 /** Base Interface used for generating output outside of the
134 * This abstract class is used by output generation functions
135 * to generate the output for a specific format,
136 * or a list of formats (see OutputList). This interface
137 * contains functions that generate fragments of the output.
139 class BaseOutputDocInterface : public CodeOutputInterface
142 virtual ~BaseOutputDocInterface() {}
143 enum ParamListTypes { Param, RetVal, Exception };
144 enum SectionTypes { /*See, Return, Author, Version,
145 Since, Date, Bug, Note,
146 Warning, Par, Deprecated, Pre,
147 Post, Invar, Remark, Attention,
148 Todo, Test, RCS, */ EnumValues,
152 virtual bool parseText(const QCString &s) { return s.isEmpty(); }
154 /*! Start of a bullet list: e.g. \c \<ul\> in html. startItemListItem() is
155 * Used for the bullet items.
157 virtual void startItemList() = 0;
159 /*! Writes a list item for a bullet or enumerated
160 * list: e.g. \c \<li\> in html
162 virtual void startItemListItem() = 0;
164 /*! Writes a list item for a bullet or enumerated
165 * list: e.g. \c \</li\> in html
167 virtual void endItemListItem() = 0;
169 /*! Ends a bullet list: e.g. \c \</ul\> in html */
170 virtual void endItemList() = 0;
172 /*! Writes an ASCII string to the output. Converts characters that have
173 * A special meaning, like \c & in html.
175 virtual void docify(const char *s) = 0;
177 /*! Writes a single ASCII character to the output. Converts characters
178 * that have a special meaning.
180 virtual void writeChar(char c) = 0;
182 /*! Writes an ASCII string to the output, \e without converting
183 * special characters.
185 virtual void writeString(const char *text) = 0;
187 /*! Starts a new paragraph */
188 //virtual void newParagraph() = 0;
190 /*! Starts a new paragraph */
191 virtual void startParagraph(const char *classDef) = 0;
192 /*! Ends a paragraph */
193 virtual void endParagraph() = 0;
195 /*! Writes a link to an object in the documentation.
196 * \param ref If this is non-zero, the object is to be found in
197 * an external documentation file.
198 * \param file The file in which the object is located.
199 * \param anchor The anchor uniquely identifying the object within
201 * \param name The text to display as a placeholder for the link.
203 virtual void writeObjectLink(const char *ref,const char *file,
204 const char *anchor, const char *name) = 0;
207 /*! Starts a (link to an) URL found in the documentation.
208 * \param url The URL to link to.
210 virtual void startHtmlLink(const char *url) = 0;
212 /*! Ends a link started by startHtmlLink().
214 virtual void endHtmlLink() = 0;
217 /*! Changes the text font to bold face. The bold section ends with
220 virtual void startBold() = 0;
222 /*! End a section of text displayed in bold face. */
223 virtual void endBold() = 0;
225 /*! Changes the text font to fixed size. The section ends with
228 virtual void startTypewriter() = 0;
230 /*! End a section of text displayed in typewriter style. */
231 virtual void endTypewriter() = 0;
233 /*! Changes the text font to italic. The italic section ends with
236 virtual void startEmphasis() = 0;
238 /*! Ends a section of text displayed in italic. */
239 virtual void endEmphasis() = 0;
241 /*! Starts a source code fragment. The fragment will be
242 * fed to the code parser (see code.h) for syntax highlighting
243 * and cross-referencing. The fragment ends by a call to
246 virtual void startCodeFragment() = 0;
248 /*! Ends a source code fragment
250 virtual void endCodeFragment() = 0;
255 /*! Writes a horizontal ruler to the output */
256 virtual void writeRuler() = 0;
258 /*! Starts a description list: e.g. \c \<dl\> in HTML
259 * Items are surrounded by startDescItem() and endDescItem()
261 virtual void startDescription() = 0;
263 /*! Ends a description list: e.g. \c \</dl\> in HTML */
264 virtual void endDescription() = 0;
266 /*! Starts an item of a description list: e.g. \c \<dt\> in HTML. */
267 virtual void startDescItem() = 0;
269 virtual void startDescForItem() = 0;
270 virtual void endDescForItem() = 0;
272 /*! Ends an item of a description list and starts the
273 * description itself: e.g. \c \</dt\> in HTML.
275 virtual void endDescItem() = 0;
277 virtual void startCenter() = 0;
278 virtual void endCenter() = 0;
279 virtual void startSmall() = 0;
280 virtual void endSmall() = 0;
282 virtual void startSimpleSect(SectionTypes t,const char *file,
283 const char *anchor,const char *title) = 0;
284 virtual void endSimpleSect() = 0;
285 virtual void startParamList(ParamListTypes t,const char *title) = 0;
286 virtual void endParamList() = 0;
288 //virtual void writeDescItem() = 0;
289 virtual void startTitle() = 0;
290 virtual void endTitle() = 0;
292 virtual void writeAnchor(const char *fileName,const char *name) = 0;
293 virtual void startSection(const char *,const char *,SectionInfo::SectionType) = 0;
294 virtual void endSection(const char *,SectionInfo::SectionType) = 0;
296 virtual void lineBreak(const char *style) = 0;
297 virtual void addIndexItem(const char *s1,const char *s2) = 0;
299 virtual void writeNonBreakableSpace(int) = 0;
300 virtual void startDescTable(const char *title) = 0;
301 virtual void endDescTable() = 0;
302 virtual void startDescTableRow() = 0;
303 virtual void endDescTableRow() = 0;
304 virtual void startDescTableTitle() = 0;
305 virtual void endDescTableTitle() = 0;
306 virtual void startDescTableData() = 0;
307 virtual void endDescTableData() = 0;
308 virtual void startTextLink(const char *file,const char *anchor) = 0;
309 virtual void endTextLink() = 0;
310 virtual void startPageRef() = 0;
311 virtual void endPageRef(const char *,const char *) = 0;
312 virtual void startSubsection() = 0;
313 virtual void endSubsection() = 0;
314 virtual void startSubsubsection() = 0;
315 virtual void endSubsubsection() = 0;
318 /** Abstract output generator.
320 * Subclass this class to add support for a new output format
322 class OutputGenerator : public BaseOutputDocInterface
325 enum OutputType { Html, Latex, Man, RTF, XML, DEF, Perl };
328 virtual ~OutputGenerator();
330 ///////////////////////////////////////////////////////////////
331 // generic generator methods
332 ///////////////////////////////////////////////////////////////
333 virtual void enable() = 0;
334 virtual void disable() = 0;
335 virtual void enableIf(OutputType o) = 0;
336 virtual void disableIf(OutputType o) = 0;
337 virtual void disableIfNot(OutputType o) = 0;
338 virtual bool isEnabled(OutputType o) = 0;
339 virtual OutputGenerator *get(OutputType o) = 0;
340 void startPlainFile(const char *name);
342 //QCString getContents() const;
343 bool isEnabled() const { return active; }
344 void pushGeneratorState();
345 void popGeneratorState();
346 //void setEncoding(const QCString &enc) { encoding = enc; }
347 //virtual void postProcess(QByteArray &) { }
349 virtual void writeDoc(DocNode *,Definition *ctx,MemberDef *md) = 0;
351 ///////////////////////////////////////////////////////////////
352 // structural output interface
353 ///////////////////////////////////////////////////////////////
354 virtual void startFile(const char *name,const char *manName,
355 const char *title) = 0;
356 virtual void writeSearchInfo() = 0;
357 virtual void writeFooter(const char *navPath) = 0;
358 virtual void endFile() = 0;
359 virtual void startIndexSection(IndexSections) = 0;
360 virtual void endIndexSection(IndexSections) = 0;
361 virtual void writePageLink(const char *,bool) = 0;
362 virtual void startProjectNumber() = 0;
363 virtual void endProjectNumber() = 0;
364 virtual void writeStyleInfo(int part) = 0;
365 virtual void startTitleHead(const char *) = 0;
366 virtual void endTitleHead(const char *fileName,const char *name) = 0;
367 virtual void startIndexListItem() = 0;
368 virtual void endIndexListItem() = 0;
369 virtual void startIndexList() = 0;
370 virtual void endIndexList() = 0;
371 virtual void startIndexKey() = 0;
372 virtual void endIndexKey() = 0;
373 virtual void startIndexValue(bool) = 0;
374 virtual void endIndexValue(const char *,bool) = 0;
375 virtual void startIndexItem(const char *ref,const char *file) = 0;
376 virtual void endIndexItem(const char *ref,const char *file) = 0;
377 virtual void startGroupHeader(int) = 0;
378 virtual void endGroupHeader(int) = 0;
379 virtual void startMemberSections() = 0;
380 virtual void endMemberSections() = 0;
381 virtual void startHeaderSection() = 0;
382 virtual void endHeaderSection() = 0;
383 virtual void startMemberHeader(const char *anchor) = 0;
384 virtual void endMemberHeader() = 0;
385 virtual void startMemberSubtitle() = 0;
386 virtual void endMemberSubtitle() = 0;
387 virtual void startMemberDocList() = 0;
388 virtual void endMemberDocList() = 0;
389 virtual void startMemberList() = 0;
390 virtual void endMemberList() = 0;
391 virtual void startInlineHeader() = 0;
392 virtual void endInlineHeader() = 0;
393 virtual void startAnonTypeScope(int) = 0;
394 virtual void endAnonTypeScope(int) = 0;
395 virtual void startMemberItem(const char *,int,const char *) = 0;
396 virtual void endMemberItem() = 0;
397 virtual void startMemberTemplateParams() = 0;
398 virtual void endMemberTemplateParams(const char *,const char *) = 0;
399 virtual void startMemberGroupHeader(bool) = 0;
400 virtual void endMemberGroupHeader() = 0;
401 virtual void startMemberGroupDocs() = 0;
402 virtual void endMemberGroupDocs() = 0;
403 virtual void startMemberGroup() = 0;
404 virtual void endMemberGroup(bool) = 0;
405 virtual void insertMemberAlign(bool) = 0;
406 virtual void startMemberDoc(const char *,const char *,
407 const char *,const char *,int,int,bool) = 0;
408 virtual void endMemberDoc(bool) = 0;
409 virtual void startDoxyAnchor(const char *fName,const char *manName,
410 const char *anchor,const char *name,
411 const char *args) = 0;
412 virtual void endDoxyAnchor(const char *fileName,const char *anchor) = 0;
413 virtual void writeLatexSpacing() = 0;
414 virtual void writeStartAnnoItem(const char *type,const char *file,
415 const char *path,const char *name) = 0;
416 virtual void writeEndAnnoItem(const char *name) = 0;
417 virtual void startMemberDescription(const char *anchor,const char *inheritId) = 0;
418 virtual void endMemberDescription() = 0;
419 virtual void startMemberDeclaration() = 0;
420 virtual void endMemberDeclaration(const char *anchor,const char *inheritId) = 0;
421 virtual void writeInheritedSectionTitle(const char *id,const char *ref,
422 const char *file,const char *anchor,
423 const char *title,const char *name) = 0;
424 virtual void startIndent() = 0;
425 virtual void endIndent() = 0;
426 virtual void writeSynopsis() = 0;
427 virtual void startClassDiagram() = 0;
428 virtual void endClassDiagram(const ClassDiagram &,const char *,const char *) = 0;
429 virtual void startDotGraph() = 0;
430 virtual void endDotGraph(const DotClassGraph &g) = 0;
431 virtual void startInclDepGraph() = 0;
432 virtual void endInclDepGraph(const DotInclDepGraph &g) = 0;
433 virtual void startGroupCollaboration() = 0;
434 virtual void endGroupCollaboration(const DotGroupCollaboration &g) = 0;
435 virtual void startCallGraph() = 0;
436 virtual void endCallGraph(const DotCallGraph &g) = 0;
437 virtual void startDirDepGraph() = 0;
438 virtual void endDirDepGraph(const DotDirDeps &g) = 0;
439 virtual void writeGraphicalHierarchy(const DotGfxHierarchyTable &g) = 0;
440 virtual void startQuickIndices() = 0;
441 virtual void endQuickIndices() = 0;
442 virtual void writeSplitBar(const char *) = 0;
443 virtual void writeNavigationPath(const char *) = 0;
444 virtual void writeLogo() = 0;
445 virtual void writeQuickLinks(bool compact,HighlightedItem hli,const char *file) = 0;
446 virtual void writeSummaryLink(const char *file,const char *anchor,const char *title,bool first) = 0;
447 virtual void startContents() = 0;
448 virtual void endContents() = 0;
449 virtual void startTextBlock(bool) = 0;
450 virtual void endTextBlock(bool) = 0;
451 virtual void lastIndexPage() = 0;
452 virtual void startMemberDocPrefixItem() = 0;
453 virtual void endMemberDocPrefixItem() = 0;
454 virtual void startMemberDocName(bool) = 0;
455 virtual void endMemberDocName() = 0;
456 virtual void startParameterType(bool,const char *key) = 0;
457 virtual void endParameterType() = 0;
458 virtual void startParameterName(bool) = 0;
459 virtual void endParameterName(bool,bool,bool) = 0;
460 virtual void startParameterList(bool) = 0;
461 virtual void endParameterList() = 0;
462 virtual void exceptionEntry(const char*,bool) = 0;
464 virtual void startConstraintList(const char *) = 0;
465 virtual void startConstraintParam() = 0;
466 virtual void endConstraintParam() = 0;
467 virtual void startConstraintType() = 0;
468 virtual void endConstraintType() = 0;
469 virtual void startConstraintDocs() = 0;
470 virtual void endConstraintDocs() = 0;
471 virtual void endConstraintList() = 0;
473 virtual void startMemberDocSimple(bool) = 0;
474 virtual void endMemberDocSimple(bool) = 0;
475 virtual void startInlineMemberType() = 0;
476 virtual void endInlineMemberType() = 0;
477 virtual void startInlineMemberName() = 0;
478 virtual void endInlineMemberName() = 0;
479 virtual void startInlineMemberDoc() = 0;
480 virtual void endInlineMemberDoc() = 0;
483 virtual void startLabels() = 0;
484 virtual void writeLabel(const char *,bool) = 0;
485 virtual void endLabels() = 0;
493 QStack<bool> *genStack;
496 OutputGenerator(const OutputGenerator &o);
497 OutputGenerator &operator=(const OutputGenerator &o);
500 /** Interface used for generating documentation.
502 * This abstract class is used by several functions
503 * to generate the output for a specific format.
504 * This interface contains some state saving and changing
505 * functions for dealing with format specific output.
507 class OutputDocInterface : public BaseOutputDocInterface
510 virtual ~OutputDocInterface() {}
512 /*! Create a new output generator. This can later by appended
513 * to the current one using append().
515 //virtual OutputDocInterface *clone() = 0;
517 /*! Disables all output formats except format \a o
518 * (useful for OutputList only)
520 virtual void disableAllBut(OutputGenerator::OutputType o) = 0;
522 /*! Enables all output formats as far as they have been enabled in
523 * the config file. (useful for OutputList only)
525 virtual void enableAll() = 0;
527 /*! Disables all output formats (useful for OutputList only) */
528 virtual void disableAll()= 0;
530 /*! Disables a specific output format (useful for OutputList only) */
531 virtual void disable(OutputGenerator::OutputType o) = 0;
533 /*! Enables a specific output format (useful for OutputList only) */
534 virtual void enable(OutputGenerator::OutputType o) = 0;
536 /*! Check whether a specific output format is currently enabled
537 * (useful for OutputList only)
539 virtual bool isEnabled(OutputGenerator::OutputType o) = 0;
541 /*! Appends the output generated by generator \a g to this
544 //virtual void append(const OutputDocInterface *g) = 0;
546 /*! Pushes the state of the current generator (or list of
547 * generators) on a stack.
549 virtual void pushGeneratorState() = 0;
551 /*! Pops the state of the current generator (or list of
552 * generators) on a stack. Should be preceded by a call
553 * the pushGeneratorState().
555 virtual void popGeneratorState() = 0;