Doxygen
rtfgen.cpp
浏览该文件的文档.
1 /******************************************************************************
2  *
3  *
4  *
5  * Copyright (C) 1997-2015 by Parker Waechter & Dimitri van Heesch.
6  *
7  * Style sheet additions by Alexander Bartolich
8  *
9  * Permission to use, copy, modify, and distribute this software and its
10  * documentation under the terms of the GNU General Public License is hereby
11  * granted. No representations are made about the suitability of this software
12  * for any purpose. It is provided "as is" without express or implied warranty.
13  * See the GNU General Public License for more details.
14  *
15  * Documents produced by Doxygen are derivative works derived from the
16  * input used in their production; they are not affected by this license.
17  *
18  */
19 
20 #include <chrono>
21 #include <ctime>
22 #include <stdlib.h>
23 
24 #include "rtfgen.h"
25 #include "config.h"
26 #include "message.h"
27 #include "doxygen.h"
28 #include "util.h"
29 #include "diagram.h"
30 #include "language.h"
31 #include "dot.h"
32 #include "dotcallgraph.h"
33 #include "dotclassgraph.h"
34 #include "dotdirdeps.h"
35 #include "dotincldepgraph.h"
36 #include "version.h"
37 #include "pagedef.h"
38 #include "rtfstyle.h"
39 #include "rtfdocvisitor.h"
40 #include "docparser.h"
41 #include "dirdef.h"
42 #include "vhdldocgen.h"
43 #include "portable.h"
44 #include "groupdef.h"
45 #include "classlist.h"
46 #include "filename.h"
47 #include "namespacedef.h"
48 #include "dir.h"
49 #include "utf8.h"
50 #include "debug.h"
51 
52 
53 //#define DBG_RTF(x) x;
54 #define DBG_RTF(x)
55 
57 {
58  auto now = std::chrono::system_clock::now();
59  auto time = std::chrono::system_clock::to_time_t(now);
60  auto tm = *localtime(&time);
61 
62  QCString result;
63  result.sprintf("\\yr%d\\mo%d\\dy%d\\hr%d\\min%d\\sec%d",
64  tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,
65  tm.tm_hour, tm.tm_min, tm.tm_sec);
66  return result;
67 }
68 
70 {
71 }
72 
74 {
75 }
76 
78 {
80  return *this;
81 }
82 
83 std::unique_ptr<OutputGenerator> RTFGenerator::clone() const
84 {
85  return std::make_unique<RTFGenerator>(*this);
86 }
87 
89 {
90 }
91 
93 {
94  m_relPath = path;
95 }
96 
98 {
99  m_sourceFileName = name;
100 }
101 
103 {
104  t << "# Generated by doxygen " << getDoxygenVersion() << "\n\n";
105  t << "# This file describes styles used for generating RTF output.\n";
106  t << "# All text after a hash (#) is considered a comment and will be ignored.\n";
107  t << "# Remove a hash to activate a line.\n\n";
108 
109  int i;
110  for ( i=0 ; rtf_Style_Default[i].reference!=0 ; i++ )
111  {
112  t << "# " << rtf_Style_Default[i].name << " = "
114  << rtf_Style_Default[i].definition << "\n";
115  }
116 }
117 
119 {
120  t << "# Generated by doxygen " << getDoxygenVersion() << "\n\n";
121  t << "# This file describes extensions used for generating RTF output.\n";
122  t << "# All text after a hash (#) is considered a comment and will be ignored.\n";
123  t << "# Remove a hash to activate a line.\n\n";
124 
125  t << "# Overrides the project title.\n";
126 
127  t << "#Title = \n\n";
128 
129  t << "# Name of the company that produced this document.\n";
130  t << "#Company = \n\n";
131 
132  t << "# Filename of a company or project logo.\n";
133  t << "#LogoFilename = \n\n";
134 
135  t << "# Author of the document.\n";
136  t << "#Author = \n\n";
137 
138  t << "# Type of document (e.g. Design Specification, User Manual, etc.).\n";
139  t << "#DocumentType = \n\n";
140 
141  t << "# Document tracking number.\n";
142  t << "#DocumentId = \n\n";
143 
144  t << "# Name of the author's manager.\n";
145  t << "# This field is not displayed in the document itself, but it is \n";
146  t << "# available in the information block of the rtf file. In Microsoft \n";
147  t << "# Word, it is available under File:Properties.\n";
148  t << "#Manager = \n\n";
149 
150  t << "# Subject of the document.\n";
151  t << "# This field is not displayed in the document itself, but it is \n";
152  t << "# available in the information block of the rtf file. In Microsoft \n";
153  t << "# Word, it is available under File:Properties.\n";
154  t << "#Subject = \n\n";
155 
156  t << "# Comments regarding the document.\n";
157  t << "# This field is not displayed in the document itself, but it is \n";
158  t << "# available in the information block of the rtf file. In Microsoft \n";
159  t << "# Word, it is available under File:Properties.\n";
160  t << "#Comments = \n\n";
161 
162  t << "# Keywords associated with the document.\n";
163  t << "# This field is not displayed in the document itself, but it is \n";
164  t << "# available in the information block of the rtf file. In Microsoft \n";
165  t << "# Word, it is available under File:Properties.\n";
166  t << "#Keywords = \n\n";
167 }
168 
169 
171 {
172  QCString dir=Config_getString(RTF_OUTPUT);
173  Dir d(dir.str());
174  if (!d.exists() && !d.mkdir(dir.str()))
175  {
176  term("Could not create output directory %s\n",qPrint(dir));
177  }
178 
179  // first duplicate strings of rtf_Style_Default
180  const struct Rtf_Style_Default* def = rtf_Style_Default;
181  while (def->reference)
182  {
183  if (def->definition == 0)
184  {
185  err("Internal: rtf_Style_Default[%s] has no definition.\n", def->name);
186  }
187  else
188  {
189  rtf_Style.insert(std::make_pair(def->name, StyleData(def->reference, def->definition)));
190  }
191  def++;
192  }
193 
194  // overwrite some (or all) definitions from file
195  QCString rtfStyleSheetFile = Config_getString(RTF_STYLESHEET_FILE);
196  if (!rtfStyleSheetFile.isEmpty())
197  {
198  loadStylesheet(rtfStyleSheetFile, rtf_Style);
199  }
200 
201  // If user has defined an extension file, load its contents.
202  QCString rtfExtensionsFile = Config_getString(RTF_EXTENSIONS_FILE);
203  if (!rtfExtensionsFile.isEmpty())
204  {
205  loadExtensions(rtfExtensionsFile);
206  }
207 
208  createSubDirs(d);
209 }
210 
212 {
213  QCString dname = Config_getString(RTF_OUTPUT);
214  Dir d(dname.str());
215  clearSubDirs(d);
216 }
217 
218 static QCString makeIndexName(const QCString &s,int i)
219 {
220  QCString result=s;
221  result+=(char)(i+'0');
222  return result;
223 }
224 
226 {
227  /* all the included RTF files should begin with the
228  * same header
229  */
230  m_t << "{\\rtf1\\ansi\\ansicpg" << theTranslator->trRTFansicp();
231  m_t << "\\uc1 \\deff0\\deflang1033\\deflangfe1033\n";
232 
233  DBG_RTF(m_t << "{\\comment Beginning font list}\n")
234  m_t << "{\\fonttbl ";
235  m_t << "{\\f0\\froman\\fcharset" << theTranslator->trRTFCharSet();
236  m_t << "\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}\n";
237  m_t << "{\\f1\\fswiss\\fcharset" << theTranslator->trRTFCharSet();
238  m_t << "\\fprq2{\\*\\panose 020b0604020202020204}Arial;}\n";
239  m_t << "{\\f2\\fmodern\\fcharset" << theTranslator->trRTFCharSet();
240  m_t << "\\fprq1{\\*\\panose 02070309020205020404}Courier New;}\n";
241  m_t << "{\\f3\\froman\\fcharset2\\fprq2{\\*\\panose 05050102010706020507}Symbol;}\n";
242  m_t << "}\n";
243  DBG_RTF(m_t << "{\\comment begin colors}\n")
244  m_t << "{\\colortbl;";
245  m_t << "\\red0\\green0\\blue0;";
246  m_t << "\\red0\\green0\\blue255;";
247  m_t << "\\red0\\green255\\blue255;";
248  m_t << "\\red0\\green255\\blue0;";
249  m_t << "\\red255\\green0\\blue255;";
250  m_t << "\\red255\\green0\\blue0;";
251  m_t << "\\red255\\green255\\blue0;";
252  m_t << "\\red255\\green255\\blue255;";
253  m_t << "\\red0\\green0\\blue128;";
254  m_t << "\\red0\\green128\\blue128;";
255  m_t << "\\red0\\green128\\blue0;";
256  m_t << "\\red128\\green0\\blue128;";
257  m_t << "\\red128\\green0\\blue0;";
258  m_t << "\\red128\\green128\\blue0;";
259  m_t << "\\red128\\green128\\blue128;";
260  m_t << "\\red192\\green192\\blue192;";
261 
262  // code highlighting colors. Note order is important see also RTFGenerator::startFontClass
263  m_t << "\\red0\\green128\\blue0;"; // keyword = index 17
264  m_t << "\\red96\\green64\\blue32;"; // keywordtype
265  m_t << "\\rede0\\green128\\blue0;"; // keywordflow
266  m_t << "\\red128\\green0\\blue0;"; // comment
267  m_t << "\\red128\\green96\\blue32;"; // preprocessor
268  m_t << "\\red0\\green32\\blue128;"; // stringliteral
269  m_t << "\\red0\\green128\\blue128;"; // charliteral
270  m_t << "\\red255\\green0\\blue255;"; // vhdldigit
271  m_t << "\\red0\\green0\\blue0;"; // vhdlchar
272  m_t << "\\red112\\green0\\blue112;"; // vhdlkeyword
273  m_t << "\\red255\\green0\\blue0;"; // vhdllogic
274 
275  m_t << "}\n";
276 
277  DBG_RTF(m_t << "{\\comment Beginning style list}\n")
278  m_t << "{\\stylesheet\n";
279  m_t << "{\\widctlpar\\adjustright \\fs20\\cgrid \\snext0 Normal;}\n";
280 
281  // set the paper dimensions according to PAPER_TYPE
282  static auto paperType = Config_getEnum(PAPER_TYPE);
283  m_t << "{";
284  switch (paperType)
285  {
286  // width & height values are inches * 1440
287  case PAPER_TYPE_t::a4: m_t << "\\paperw11900\\paperh16840"; break;
288  case PAPER_TYPE_t::letter: m_t << "\\paperw12240\\paperh15840"; break;
289  case PAPER_TYPE_t::legal: m_t << "\\paperw12240\\paperh20160"; break;
290  case PAPER_TYPE_t::executive: m_t << "\\paperw10440\\paperh15120"; break;
291  }
292  m_t << "\\margl1800\\margr1800\\margt1440\\margb1440\\gutter0\\ltrsect}\n";
293 
294  // sort styles ascending by \s-number via an intermediate QArray
295  unsigned maxIndex = 0;
296  for (const auto &kv : rtf_Style)
297  {
298  uint index = kv.second.index();
299  if (index > maxIndex) maxIndex = index;
300  }
301  std::vector<const StyleData*> array(maxIndex + 1, 0);
302  ASSERT(maxIndex < array.size());
303 
304  for (const auto &kv : rtf_Style)
305  {
306  uint index = kv.second.index();
307  if (array[index] != 0)
308  {
309  msg("Style '%s' redefines \\s%d.\n", kv.first.c_str(), index);
310  }
311  array[index] = &kv.second;
312  }
313 
314  // write array elements
315  size_t size = array.size();
316  for(size_t i = 0; i < size; i++)
317  {
318  const StyleData *pStyle = array[i];
319  if (pStyle)
320  {
321  m_t << "{" << pStyle->reference() << pStyle->definition() << ";}\n";
322  }
323  }
324 
325  m_t << "}\n";
326  // this comment is needed for postprocessing!
327  m_t << "{\\comment begin body}\n";
328 
329 }
330 
332 {
333  m_t << "\n";
334  DBG_RTF(m_t << "{\\comment BeginRTFChapter}\n")
335  m_t << rtf_Style_Reset;
336 
337  // if we are compact, no extra page breaks...
338  if (Config_getBool(COMPACT_RTF))
339  {
340  // m_t << "\\sect\\sectd\\sbknone\n";
341  m_t << "\\sect\\sbknone\n";
343  }
344  else
345  m_t << "\\sect\\sbkpage\n";
346  //m_t << "\\sect\\sectd\\sbkpage\n";
347 
348  m_t << rtf_Style["Heading1"].reference() << "\n";
349 }
350 
352 {
353  m_t << "\n";
354  DBG_RTF(m_t << "{\\comment BeginRTFSection}\n")
355  m_t << rtf_Style_Reset;
356 
357  // if we are compact, no extra page breaks...
358  if (Config_getBool(COMPACT_RTF))
359  {
360  m_t << "\\sect\\sbknone\n";
362  }
363  else
364  {
365  m_t << "\\sect\\sbkpage\n";
366  }
367 
368  m_t << rtf_Style["Heading2"].reference() << "\n";
369 }
370 
371 void RTFGenerator::startFile(const QCString &name,const QCString &,const QCString &,int)
372 {
373  //setEncoding(QCString().sprintf("CP%s",theTranslator->trRTFansicp()));
376 
377  if (fileName.right(4)!=".rtf" ) fileName+=".rtf";
382 }
383 
385 {
386  DBG_RTF(m_t << "{\\comment endFile}\n")
387  m_t << "}";
388 
389  endPlainFile();
390  setSourceFileName("");
391 }
392 
394 {
395  DBG_RTF(m_t << "{\\comment startProjectNumber }\n")
396  m_t << " ";
397 }
398 
400 {
401  DBG_RTF(m_t << "{\\comment endProjectNumber }\n")
402 }
403 
405 {
406  //QCString paperName;
407 
408  //m_indentLevel = 0;
409 
410  switch (is)
411  {
412  case isTitlePageStart:
413  // basic RTFstart
414  // get readyfor author etc
415 
416  m_t << "{\\info \n";
417  m_t << "{\\title {\\comment ";
418  break;
419  case isTitlePageAuthor:
420  m_t << "}\n";
421  if (!rtf_subject.isEmpty()) m_t << "{\\subject " << rtf_subject << "}\n";
422  if (!rtf_comments.isEmpty()) m_t << "{\\comment " << rtf_comments << "}\n";
423  if (!rtf_company.isEmpty()) m_t << "{\\company " << rtf_company << "}\n";
424  if (!rtf_author.isEmpty()) m_t << "{\\author " << rtf_author << "}\n";
425  if (!rtf_manager.isEmpty()) m_t << "{\\manager " << rtf_manager << "}\n";
426  if (!rtf_documentType.isEmpty()) m_t << "{\\category " << rtf_documentType << "}\n";
427  if (!rtf_keywords.isEmpty()) m_t << "{\\keywords " << rtf_keywords << "}\n";
428  m_t << "{\\comment ";
429  break;
430  case isMainPage:
431  //Introduction
432  beginRTFChapter();
433  break;
434  //case isPackageIndex:
435  // //Package Index
436  // beginRTFChapter();
437  // break;
438  case isModuleIndex:
439  //Module Index
440  beginRTFChapter();
441  break;
442  case isDirIndex:
443  //Directory Index
444  beginRTFChapter();
445  break;
446  case isNamespaceIndex:
447  //Namespace Index
448  beginRTFChapter();
449  break;
450  case isConceptIndex:
451  //Concept Index
452  beginRTFChapter();
453  break;
455  //Hierarchical Index
456  DBG_RTF(m_t << "{\\comment start classhierarchy}\n")
457  beginRTFChapter();
458  break;
459  case isCompoundIndex:
460  //Annotated Compound Index
461  beginRTFChapter();
462  break;
463  case isFileIndex:
464  //Annotated File Index
465  beginRTFChapter();
466  break;
467  case isPageIndex:
468  //Related Page Index
469  beginRTFChapter();
470  break;
472  {
473  //Module Documentation
474  for (const auto &gd : *Doxygen::groupLinkedMap)
475  {
476  if (!gd->isReference())
477  {
478  beginRTFChapter();
479  break;
480  }
481  }
482  }
483  break;
484  case isDirDocumentation:
485  {
486  //Directory Documentation
487  for (const auto &dd : *Doxygen::dirLinkedMap)
488  {
489  if (dd->isLinkableInProject())
490  {
491  beginRTFChapter();
492  break;
493  }
494  }
495  }
496  break;
498  {
499  // Namespace Documentation
500  for (const auto &nd : *Doxygen::namespaceLinkedMap)
501  {
502  if (nd->isLinkableInProject())
503  {
504  beginRTFChapter();
505  break;
506  }
507  }
508  }
509  break;
511  {
512  // Concept Documentation
513  for (const auto &cd : *Doxygen::conceptLinkedMap)
514  {
515  if (cd->isLinkableInProject())
516  {
517  beginRTFChapter();
518  break;
519  }
520  }
521  }
522  break;
524  {
525  //Compound Documentation
526  for (const auto &cd : *Doxygen::classLinkedMap)
527  {
528  if (cd->isLinkableInProject() &&
529  cd->templateMaster()==0 &&
530  !cd->isEmbeddedInOuterScope() &&
531  !cd->isAlias()
532  )
533  {
534  beginRTFChapter();
535  break;
536  }
537  }
538  }
539  break;
540  case isFileDocumentation:
541  {
542  //File Documentation
543  bool isFirst=TRUE;
544  for (const auto &fn : *Doxygen::inputNameLinkedMap)
545  {
546  for (const auto &fd : *fn)
547  {
548  if (fd->isLinkableInProject() || fd->generateSourceFile())
549  {
550  if (isFirst)
551  {
552  beginRTFChapter();
553  isFirst=FALSE;
554  break;
555  }
556  }
557  }
558  if (!isFirst)
559  {
560  break;
561  }
562  }
563  }
564  break;
566  {
567  //Example Documentation
568  beginRTFChapter();
569  }
570  break;
571  case isPageDocumentation:
572  {
573  //Page Documentation
574  beginRTFChapter();
575  }
576  break;
578  {
579  m_t << "{\\tc \\v ";
580  }
581  break;
582  case isEndIndex:
583  break;
584  }
585 }
586 
588 {
589  bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
590  bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
591  QCString projectName = Config_getString(PROJECT_NAME);
592 
593  switch (is)
594  {
595  case isTitlePageStart:
596  if (!rtf_title.isEmpty())
597  // User has overridden document title in extensions file
598  m_t << "}" << rtf_title;
599  else
600  m_t << "}" << projectName;
601  break;
602  case isTitlePageAuthor:
603  {
604  m_t << " doxygen" << getDoxygenVersion() << ".}\n";
605  m_t << "{\\creatim " << dateToRTFDateString() << "}\n}";
606  DBG_RTF(m_t << "{\\comment end of infoblock}\n");
607  // setup for this section
608  m_t << rtf_Style_Reset <<"\n";
609  m_t << "\\sectd\\pgnlcrm\n";
610  m_t << "{\\footer "<<rtf_Style["Footer"].reference() << "{\\chpgn}}\n";
611  // the title entry
612  DBG_RTF(m_t << "{\\comment begin title page}\n")
613 
614 
615  m_t << rtf_Style_Reset << rtf_Style["SubTitle"].reference() << "\n"; // set to title style
616 
617  m_t << "\\vertalc\\qc\\par\\par\\par\\par\\par\\par\\par\n";
618  if (!rtf_logoFilename.isEmpty())
619  {
620  m_t << "{\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"" << rtf_logoFilename;
621  m_t << "\" \\\\d \\\\*MERGEFORMAT} {\\fldrslt IMAGE }}\\par\\par\n";
622  }
623  if (!rtf_company.isEmpty())
624  {
625  m_t << rtf_company << "\\par\\par\n";
626  }
627 
628  m_t << rtf_Style_Reset << rtf_Style["Title"].reference() << "\n"; // set to title style
629  if (!rtf_title.isEmpty())
630  {
631  // User has overridden document title in extensions file
632  m_t << "{\\field\\fldedit {\\*\\fldinst TITLE \\\\*MERGEFORMAT}{\\fldrslt " << rtf_title << "}}\\par\n";
633  }
634  else
635  {
636  std::unique_ptr<IDocParser> parser { createDocParser() };
637  std::unique_ptr<DocText> root { validatingParseText(*parser.get(), projectName) };
638  m_t << "{\\field\\fldedit {\\*\\fldinst TITLE \\\\*MERGEFORMAT}{\\fldrslt ";
639  writeDoc(root.get(),0,0,0);
640  m_t << "}}\\par\n";
641  }
642 
643  m_t << rtf_Style_Reset << rtf_Style["SubTitle"].reference() << "\n"; // set to title style
644  m_t << "\\par\n";
645  if (!rtf_documentType.isEmpty())
646  {
647  m_t << rtf_documentType << "\\par\n";
648  }
649  if (!rtf_documentId.isEmpty())
650  {
651  m_t << rtf_documentId << "\\par\n";
652  }
653  m_t << "\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\n";
654 
655  m_t << rtf_Style_Reset << rtf_Style["SubTitle"].reference() << "\n"; // set to subtitle style
656  if (!rtf_author.isEmpty())
657  {
658  m_t << "{\\field\\fldedit {\\*\\fldinst AUTHOR \\\\*MERGEFORMAT}{\\fldrslt "<< rtf_author << " }}\\par\n";
659  }
660  else
661  {
662  m_t << "{\\field\\fldedit {\\*\\fldinst AUTHOR \\\\*MERGEFORMAT}{\\fldrslt AUTHOR}}\\par\n";
663  }
664 
665  m_t << theTranslator->trVersion() << " " << Config_getString(PROJECT_NUMBER) << "\\par";
666  m_t << "{\\field\\fldedit {\\*\\fldinst CREATEDATE \\\\*MERGEFORMAT}"
667  "{\\fldrslt "<< dateToString(FALSE) << " }}\\par\n";
668  m_t << "\\page\\page";
669  DBG_RTF(m_t << "{\\comment End title page}\n")
670 
671  // table of contents section
672  DBG_RTF(m_t << "{\\comment Table of contents}\n")
673  m_t << "\\vertalt\n";
674  m_t << rtf_Style_Reset << "\n";
675  m_t << rtf_Style["Heading1"].reference();
676  m_t << theTranslator->trRTFTableOfContents() << "\\par\n";
677  m_t << rtf_Style_Reset << "\\par\n";
678  m_t << "{\\field\\fldedit {\\*\\fldinst TOC \\\\f \\\\*MERGEFORMAT}{\\fldrslt Table of contents}}\\par\n";
679  m_t << rtf_Style_Reset << "\n";
680  }
681  break;
682  case isMainPage:
683  m_t << "\\par " << rtf_Style_Reset << "\n";
684  if (!mainPageHasTitle())
685  {
686  m_t << "{\\tc \\v " << theTranslator->trMainPage() << "}\n";
687  }
688  else
689  {
690  m_t << "{\\tc \\v " << substitute(Doxygen::mainPage->title(),"%","") << "}\n";
691  }
692  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
693  //if (Config_getBool(GENERATE_TREEVIEW)) m_t << "main"; else m_t << "index";
694  m_t << "index";
695  m_t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
696  break;
697  //case isPackageIndex:
698  // m_t << "\\par " << rtf_Style_Reset << "\n";
699  // m_t << "{\\tc \\v " << theTranslator->trPackageList() << "}\n";
700  // m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"packages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
701  // break;
702  case isModuleIndex:
703  m_t << "\\par " << rtf_Style_Reset << "\n";
704  m_t << "{\\tc \\v " << theTranslator->trModuleIndex() << "}\n";
705  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"modules.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
706  break;
707  case isDirIndex:
708  m_t << "\\par " << rtf_Style_Reset << "\n";
709  m_t << "{\\tc \\v " << theTranslator->trDirIndex() << "}\n";
710  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"dirs.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
711  break;
712  case isNamespaceIndex:
713  m_t << "\\par " << rtf_Style_Reset << "\n";
714  if (fortranOpt)
715  {
716  m_t << "{\\tc \\v " << theTranslator->trModulesIndex() << "}\n";
717  }
718  else
719  {
720  m_t << "{\\tc \\v " << theTranslator->trNamespaceIndex() << "}\n";
721  }
722 
723  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"namespaces.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
724  break;
725  case isConceptIndex:
726  m_t << "\\par " << rtf_Style_Reset << "\n";
727  m_t << "{\\tc \\v " << theTranslator->trConceptIndex() << "}\n";
728  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"concepts.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
729  break;
731  m_t << "\\par " << rtf_Style_Reset << "\n";
732  m_t << "{\\tc \\v " << theTranslator->trHierarchicalIndex() << "}\n";
733  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"hierarchy.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
734  break;
735  case isCompoundIndex:
736  m_t << "\\par " << rtf_Style_Reset << "\n";
737  if (fortranOpt)
738  {
739  m_t << "{\\tc \\v " << theTranslator->trCompoundIndexFortran() << "}\n";
740  }
741  else if (vhdlOpt)
742  {
743  m_t << "{\\tc \\v " << theTranslator->trDesignUnitIndex() << "}\n";
744  }
745  else
746  {
747  m_t << "{\\tc \\v " << theTranslator->trCompoundIndex() << "}\n";
748  }
749  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"annotated.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
750  break;
751  case isFileIndex:
752  m_t << "\\par " << rtf_Style_Reset << "\n";
753  m_t << "{\\tc \\v " << theTranslator->trFileIndex() << "}\n";
754  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"files.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
755  break;
756  case isPageIndex:
757  m_t << "\\par " << rtf_Style_Reset << "\n";
758  m_t << "{\\tc \\v " << theTranslator->trPageIndex() << "}\n";
759  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"pages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
760  break;
762  {
763  bool first=true;
764  m_t << "{\\tc \\v " << theTranslator->trModuleDocumentation() << "}\n";
765  for (const auto &gd : *Doxygen::groupLinkedMap)
766  {
767  if (!gd->isReference())
768  {
769  m_t << "\\par " << rtf_Style_Reset << "\n";
770  if (!first)
771  {
772  beginRTFSection();
773  }
774  first=false;
775  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
776  m_t << gd->getOutputFileBase();
777  m_t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
778  }
779  }
780  }
781  break;
782  case isDirDocumentation:
783  {
784  bool first=true;
785  m_t << "{\\tc \\v " << theTranslator->trDirDocumentation() << "}\n";
786  for (const auto &dd : *Doxygen::dirLinkedMap)
787  {
788  if (dd->isLinkableInProject())
789  {
790  m_t << "\\par " << rtf_Style_Reset << "\n";
791  if (!first)
792  {
793  beginRTFSection();
794  }
795  first=false;
796  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
797  m_t << dd->getOutputFileBase();
798  m_t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
799  }
800  }
801  }
802  break;
804  {
805  bool first=true;
806  for (const auto &nd : *Doxygen::namespaceLinkedMap)
807  {
808  if (nd->isLinkableInProject() && !nd->isAlias())
809  {
810  m_t << "\\par " << rtf_Style_Reset << "\n";
811  if (!first)
812  {
813  beginRTFSection();
814  }
815  first=false;
816  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
817  m_t << nd->getOutputFileBase();
818  m_t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
819  }
820  }
821  }
822  break;
824  {
825  bool first=true;
826  for (const auto &cd : *Doxygen::conceptLinkedMap)
827  {
828  if (cd->isLinkableInProject() && !cd->isAlias())
829  {
830  m_t << "\\par " << rtf_Style_Reset << "\n";
831  if (!first)
832  {
833  beginRTFSection();
834  }
835  first=false;
836  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
837  m_t << cd->getOutputFileBase();
838  m_t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
839  }
840  }
841  }
842  break;
844  {
845  bool first=true;
846  if (fortranOpt)
847  {
848  m_t << "{\\tc \\v " << theTranslator->trTypeDocumentation() << "}\n";
849  }
850  else
851  {
852  m_t << "{\\tc \\v " << theTranslator->trClassDocumentation() << "}\n";
853  }
854  for (const auto &cd : *Doxygen::classLinkedMap)
855  {
856  if (cd->isLinkableInProject() &&
857  cd->templateMaster()==0 &&
858  !cd->isEmbeddedInOuterScope() &&
859  !cd->isAlias()
860  )
861  {
862  m_t << "\\par " << rtf_Style_Reset << "\n";
863  if (!first)
864  {
865  beginRTFSection();
866  }
867  first=false;
868  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
869  m_t << cd->getOutputFileBase();
870  m_t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
871  }
872  }
873  }
874  break;
875  case isFileDocumentation:
876  {
877  bool isFirst=TRUE;
878 
879  m_t << "{\\tc \\v " << theTranslator->trFileDocumentation() << "}\n";
880  for (const auto &fn : *Doxygen::inputNameLinkedMap)
881  {
882  for (const auto &fd : *fn)
883  {
884  if (fd->isLinkableInProject())
885  {
886  m_t << "\\par " << rtf_Style_Reset << "\n";
887  if (!isFirst)
888  {
889  beginRTFSection();
890  }
891  isFirst=FALSE;
892  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
893  m_t << fd->getOutputFileBase();
894  m_t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
895  }
896  if (fd->generateSourceFile())
897  {
898  m_t << "\\par " << rtf_Style_Reset << "\n";
899  if (!isFirst)
900  {
901  beginRTFSection();
902  }
903  isFirst=FALSE;
904  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
905  m_t << fd->getSourceFileBase();
906  m_t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
907  }
908  }
909  }
910  }
911  break;
913  {
914  //m_t << "}\n";
915  bool isFirst=true;
916  m_t << "{\\tc \\v " << theTranslator->trExampleDocumentation() << "}\n";
917  for (const auto &pd : *Doxygen::exampleLinkedMap)
918  {
919  m_t << "\\par " << rtf_Style_Reset << "\n";
920  if (!isFirst)
921  {
922  beginRTFSection();
923  }
924  isFirst=false;
925  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
926  m_t << pd->getOutputFileBase();
927  m_t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
928  }
929  }
930  break;
931  case isPageDocumentation:
932  {
933 //#error "fix me in the same way as the latex index..."
934  //m_t << "{\\tc \\v " << theTranslator->trPageDocumentation() << "}\n";
935  //m_t << "}\n";
936  //bool first=TRUE;
937  //for (const auto *pd : Doxygen::pageLinkedMap)
938  //{
939  // if (!pd->getGroupDef() && !pd->isReference())
940  // {
941  // if (first) m_t << "\\par " << rtf_Style_Reset << "\n";
942  // m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
943  // m_t << pd->getOutputFileBase();
944  // m_t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
945  // first=FALSE;
946  // }
947  //}
948  }
949  break;
951  {
952  m_t << "}";
953  m_t << "\\par " << rtf_Style_Reset << "\n";
954  }
955  break;
956  case isEndIndex:
957  beginRTFChapter();
958  m_t << rtf_Style["Heading1"].reference();
959  m_t << theTranslator->trRTFGeneralIndex() << "\\par \n";
960  m_t << rtf_Style_Reset << "\n";
961  m_t << "{\\tc \\v " << theTranslator->trRTFGeneralIndex() << "}\n";
962  m_t << "{\\field\\fldedit {\\*\\fldinst INDEX \\\\c2 \\\\*MERGEFORMAT}{\\fldrslt INDEX}}\n";
963 
964  break;
965  }
966 }
967 
969 {
970  if (first) m_t << "\\par " << rtf_Style_Reset << "\n";
971  m_t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
972  m_t << name;
973  m_t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
974 }
975 
977 {
978  DBG_RTF(m_t << "{\\comment Beginning Body of RTF Document}\n")
979  // end page and setup for rest of document
980  m_t << "\\sect \\sbkpage \\pgndec \\pgnrestart\n";
981  m_t << "\\sect \\sectd \\sbknone\n";
982 
983  // set new footer with arabic numbers
984  m_t << "{\\footer "<< rtf_Style["Footer"].reference() << "{\\chpgn}}\n";
985 
986 }
987 
989 {
990 }
991 
993 {
994  DBG_RTF(m_t << "{\\comment (lineBreak)}" << "\n")
995  m_t << "\\par\n";
997 }
998 
1000 {
1001  m_t << text;
1002 }
1003 
1005 {
1006  DBG_RTF(m_t << "{\\comment (startIndexList)}\n")
1007  m_t << "{\n";
1008  m_t << "\\par\n";
1009  incIndentLevel();
1010  m_t << rtf_Style_Reset << rtf_LCList_DepthStyle() << "\n";
1012 }
1013 
1015 {
1016  DBG_RTF(m_t << "{\\comment (endIndexList)}\n")
1017  if (!m_omitParagraph)
1018  {
1019  m_t << "\\par";
1021  }
1022  m_t << "}";
1023  decIndentLevel();
1024 }
1025 
1026 /*! start bullet list */
1028 {
1029  newParagraph();
1030  incIndentLevel();
1031  int level = indentLevel();
1032  DBG_RTF(m_t << "{\\comment (startItemList level=" << level << ") }\n")
1033  m_t << "{";
1034  m_listItemInfo[level].number = 1;
1035  m_listItemInfo[level].isEnum = false;
1036  m_listItemInfo[level].type = '1';
1037 }
1038 
1039 /*! end bullet list */
1041 {
1042  newParagraph();
1043  DBG_RTF(m_t << "{\\comment (endItemList level=" << indentLevel() << ")}\n")
1044  m_t << "}";
1045  decIndentLevel();
1047 }
1048 
1049 /*! write bullet or enum item */
1051 {
1052  DBG_RTF(m_t << "{\\comment (startItemListItem)}\n")
1053  newParagraph();
1054  m_t << rtf_Style_Reset;
1055  int level = indentLevel();
1056  if (m_listItemInfo[level].isEnum)
1057  {
1058  m_t << rtf_EList_DepthStyle() << "\n";
1059  m_t << m_listItemInfo[level].number << ".\\tab ";
1060  m_listItemInfo[level].number++;
1061  }
1062  else
1063  {
1064  m_t << rtf_BList_DepthStyle() << "\n";
1065  }
1067 }
1068 
1070 {
1071  DBG_RTF(m_t << "{\\comment (endItemListItem)}\n")
1072 }
1073 
1075 {
1076  DBG_RTF(m_t << "{\\comment (startIndexItem)}\n")
1077 
1078  if (!m_omitParagraph)
1079  {
1080  m_t << "\\par\n";
1082  }
1083 }
1084 
1086 {
1087  DBG_RTF(m_t << "{\\comment (endIndexItem)}\n")
1088  if (ref.isEmpty() && !fn.isEmpty())
1089  {
1090  m_t << "\\tab ";
1091  writeRTFReference(fn);
1092  m_t << "\n";
1093  }
1094  else
1095  {
1096  m_t << "\n";
1097  }
1099 }
1100 
1102 {
1103 
1104  if (Config_getBool(RTF_HYPERLINKS))
1105  {
1106  m_t << "{\\field {\\*\\fldinst { HYPERLINK \"";
1107  m_t << url;
1108  m_t << "\" }{}";
1109  m_t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
1110  }
1111  else
1112  {
1113  startTypewriter();
1114  }
1115 }
1116 
1118 {
1119  if (Config_getBool(RTF_HYPERLINKS))
1120  {
1121  m_t << "}}}\n";
1122  }
1123  else
1124  {
1125  endTypewriter();
1126  }
1127 }
1128 
1130  const QCString &path,const QCString &name)
1131 {
1132  DBG_RTF(m_t << "{\\comment (writeStartAnnoItem)}\n")
1133  m_t << "{\\b ";
1134  if (!path.isEmpty()) docify(path);
1135  if (!f.isEmpty() && Config_getBool(RTF_HYPERLINKS))
1136  {
1137  m_t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
1138  m_t << rtfFormatBmkStr(stripPath(f));
1139  m_t << "\" }{}";
1140  m_t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
1141 
1142  docify(name);
1143 
1144  m_t << "}}}\n";
1145  }
1146  else
1147  {
1148  docify(name);
1149  }
1150  m_t << "} ";
1151 }
1152 
1154 {
1155  DBG_RTF(m_t << "{\\comment (writeEndAnnoItem)}\n")
1156  if (!name.isEmpty())
1157  {
1158  m_t << "\\tab ";
1160  m_t << "\n";
1161  }
1162  else
1163  {
1164  m_t << "\n";
1165  }
1166  newParagraph();
1167 }
1168 
1170 {
1171  DBG_RTF(m_t << "{\\comment (startIndexKey)}\n")
1172  m_t << "{\\b ";
1173 }
1174 
1176 {
1177  DBG_RTF(m_t << "{\\comment (endIndexKey)}\n")
1178 }
1179 
1181 {
1182  DBG_RTF(m_t << "{\\comment (startIndexValue)}\n")
1183  m_t << " ";
1184  if (hasBrief) m_t << "(";
1185 }
1186 
1187 void RTFGenerator::endIndexValue(const QCString &name,bool hasBrief)
1188 {
1189  DBG_RTF(m_t << "{\\comment (endIndexValue)}\n")
1190  if (hasBrief) m_t << ")";
1191  m_t << "} ";
1192  if (!name.isEmpty())
1193  {
1194  m_t << "\\tab ";
1196  m_t << "\n";
1197  }
1198  else
1199  {
1200  m_t << "\n";
1201  }
1203  newParagraph();
1204 }
1205 
1207 {
1208  //beginRTFSubSection();
1209  m_t << "\n";
1210  DBG_RTF(m_t << "{\\comment Begin SubSection}\n")
1211  m_t << rtf_Style_Reset;
1212  m_t << rtf_Style["Heading3"].reference() << "\n";
1213 }
1214 
1216 {
1217  newParagraph();
1218  m_t << rtf_Style_Reset << "\n";
1219 }
1220 
1222 {
1223  //beginRTFSubSubSection();
1224  m_t << "\n";
1225  DBG_RTF(m_t << "{\\comment Begin SubSubSection}\n")
1226  m_t << "{\n";
1227  m_t << rtf_Style_Reset << rtf_Style["Heading4"].reference() << "\n";
1228 }
1229 
1231 {
1232  newParagraph();
1233  m_t << "}\n";
1234 }
1235 
1236 void RTFGenerator::startTextLink(const QCString &f,const QCString &anchor)
1237 {
1238  if (Config_getBool(RTF_HYPERLINKS))
1239  {
1240  QCString ref;
1241  if (!f.isEmpty())
1242  {
1243  ref+=stripPath(f);
1244  }
1245  if (!anchor.isEmpty())
1246  {
1247  ref+='_';
1248  ref+=anchor;
1249  }
1250 
1251  m_t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
1252  m_t << rtfFormatBmkStr(ref);
1253  m_t << "\" }{}";
1254  m_t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
1255  }
1256 }
1257 
1259 {
1260  if (Config_getBool(RTF_HYPERLINKS))
1261  {
1262  m_t << "}}}\n";
1263  }
1264 }
1265 
1267  const QCString &anchor, const QCString &text)
1268 {
1269  if (ref.isEmpty() && Config_getBool(RTF_HYPERLINKS))
1270  {
1271  QCString refName;
1272  if (!f.isEmpty())
1273  {
1274  refName+=stripPath(f);
1275  }
1276  if (!anchor.isEmpty())
1277  {
1278  refName+='_';
1279  refName+=anchor;
1280  }
1281 
1282  m_t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
1283  m_t << rtfFormatBmkStr(refName);
1284  m_t << "\" }{}";
1285  m_t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
1286 
1287  docify(text);
1288 
1289  m_t << "}}}\n";
1290  }
1291  else
1292  {
1293  startBold();
1294  docify(text);
1295  endBold();
1296  }
1297 }
1298 
1300 {
1301  m_t << " (";
1302  startEmphasis();
1303 }
1304 
1305 void RTFGenerator::endPageRef(const QCString &clname, const QCString &anchor)
1306 {
1307  QCString ref;
1308  if (!clname.isEmpty())
1309  {
1310  ref+=clname;
1311  }
1312  if (!anchor.isEmpty())
1313  {
1314  ref+='_';
1315  ref+=anchor;
1316  }
1317  writeRTFReference(ref);
1318  endEmphasis();
1319  m_t << ")";
1320 }
1321 
1323  const QCString &ref,const QCString &f,
1324  const QCString &anchor,const QCString &name,
1325  const QCString &)
1326 {
1327  if (ref.isEmpty() && Config_getBool(RTF_HYPERLINKS))
1328  {
1329  QCString refName;
1330  if (!f.isEmpty())
1331  {
1332  refName+=stripPath(f);
1333  }
1334  if (!anchor.isEmpty())
1335  {
1336  refName+='_';
1337  refName+=anchor;
1338  }
1339 
1340  m_t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
1341  m_t << rtfFormatBmkStr(refName);
1342  m_t << "\" }{}";
1343  m_t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
1344 
1345  codify(name);
1346 
1347  m_t << "}}}\n";
1348  }
1349  else
1350  {
1351  codify(name);
1352  }
1353 }
1354 
1356 {
1357  DBG_RTF(m_t << "{\\comment startTitleHead}\n")
1358 
1359  // beginRTFSection();
1360  m_t << rtf_Style_Reset << rtf_Style["Heading2"].reference() << "\n";
1361 }
1362 
1363 void RTFGenerator::endTitleHead(const QCString &fileName,const QCString &name)
1364 {
1365  DBG_RTF(m_t << "{\\comment endTitleHead}\n")
1366  m_t << "\\par " << rtf_Style_Reset << "\n";
1367  if (!name.isEmpty())
1368  {
1369  // make table of contents entry
1370  m_t << "{\\tc\\tcl2 \\v ";
1371  docify(name);
1372  m_t << "}\n";
1373 
1374  // make an index entry
1376  }
1377  if (!fileName.isEmpty())
1378  {
1380  }
1381 }
1382 
1384 {
1385  DBG_RTF(m_t << "{\\comment startTitle}\n")
1386  if (Config_getBool(COMPACT_RTF))
1387  beginRTFSection();
1388  else
1389  beginRTFChapter();
1390 }
1391 
1392 void RTFGenerator::startGroupHeader(int extraIndent)
1393 {
1394  DBG_RTF(m_t << "{\\comment startGroupHeader}\n")
1395  //newParagraph();
1396  m_t << rtf_Style_Reset;
1397  if (extraIndent==2)
1398  {
1399  m_t << rtf_Style["Heading5"].reference();
1400  }
1401  else if (extraIndent==1)
1402  {
1403  m_t << rtf_Style["Heading4"].reference();
1404  }
1405  else // extraIndent==0
1406  {
1407  m_t << rtf_Style["Heading3"].reference();
1408  }
1409  m_t << "\n";
1410 }
1411 
1413 {
1414  DBG_RTF(m_t << "{\\comment endGroupHeader}\n")
1415  m_t << "\\par\n";
1416  m_t << rtf_Style_Reset << "\n";
1417 }
1418 
1420  const QCString &memname,
1421  const QCString &,
1422  const QCString &,
1423  int,
1424  int,
1425  bool showInline)
1426 {
1427  DBG_RTF(m_t << "{\\comment startMemberDoc}\n")
1428  if (!memname.isEmpty() && memname[0]!='@')
1429  {
1430  addIndexItem(memname,clname);
1431  addIndexItem(clname,memname);
1432  }
1433  m_t << rtf_Style_Reset << rtf_Style[showInline ? "Heading5" : "Heading4"].reference();
1434  //styleStack.push(rtf_Style_Heading4);
1435  m_t << "{\n";
1436  //printf("RTFGenerator::startMemberDoc() '%s'\n",rtf_Style["Heading4"].reference());
1437  startBold();
1438  m_t << "\n";
1439 }
1440 
1442 {
1443  DBG_RTF(m_t << "{\\comment endMemberDoc}\n")
1444  //const QCString &style = styleStack.pop();
1445  //printf("RTFGenerator::endMemberDoc() '%s'\n",style);
1446  //ASSERT(style==rtf_Style["Heading4"].reference());
1447  endBold();
1448  m_t << "}\n";
1449  newParagraph();
1450 }
1451 
1453  const QCString &,const QCString &,
1454  const QCString &
1455  )
1456 {
1457  DBG_RTF(m_t << "{\\comment startDoxyAnchor}\n")
1458 }
1459 
1460 void RTFGenerator::endDoxyAnchor(const QCString &fName,const QCString &anchor)
1461 {
1462  QCString ref;
1463  if (!fName.isEmpty())
1464  {
1465  ref+=stripPath(fName);
1466  }
1467  if (!anchor.isEmpty())
1468  {
1469  ref+='_';
1470  ref+=anchor;
1471  }
1472 
1473  DBG_RTF(m_t << "{\\comment endDoxyAnchor}\n")
1474  m_t << "{\\bkmkstart ";
1475  m_t << rtfFormatBmkStr(ref);
1476  m_t << "}\n";
1477  m_t << "{\\bkmkend ";
1478  m_t << rtfFormatBmkStr(ref);
1479  m_t << "}\n";
1480 }
1481 
1483 {
1484  if (!s1.isEmpty())
1485  {
1486  m_t << "{\\xe \\v ";
1487  docify(s1);
1488  if (!s2.isEmpty())
1489  {
1490  m_t << "\\:";
1491  docify(s2);
1492  }
1493  m_t << "}\n";
1494  }
1495 }
1496 
1498 {
1499  incIndentLevel();
1500  DBG_RTF(m_t << "{\\comment (startIndent) }\n")
1501  m_t << "{\n";
1502  m_t << rtf_Style_Reset << rtf_CList_DepthStyle() << "\n";
1503 }
1504 
1506 {
1507  m_t << "}\n";
1508  decIndentLevel();
1509 }
1510 
1511 
1513 {
1514  DBG_RTF(m_t << "{\\comment (startDescription)}" << "\n")
1515  m_t << "{\n";
1517 }
1518 
1520 {
1521  DBG_RTF(m_t << "{\\comment (endDescription)}" << "\n")
1522  newParagraph();
1523  m_t << "}";
1524 }
1525 
1527 {
1528  newParagraph();
1529  DBG_RTF(m_t << "{\\comment (startDescItem)}\n")
1530  m_t << "{\\b ";
1531 }
1532 
1534 {
1535  DBG_RTF(m_t << "{\\comment (endDescItem)}\n")
1536  m_t << "}\n";
1537  newParagraph();
1538 }
1539 
1541 {
1542  DBG_RTF(m_t << "{\\comment (startMemberDescription)}\n")
1543  m_t << "{\n";
1544  incIndentLevel();
1546  startEmphasis();
1547 }
1548 
1550 {
1551  DBG_RTF(m_t << "{\\comment (endMemberDescription)}\n")
1552  endEmphasis();
1553  //newParagraph();
1554  decIndentLevel();
1555  m_t << "\\par";
1556  m_t << "}\n";
1558 }
1559 
1561 {
1562  DBG_RTF(m_t << "{\\comment (startDescList)}\n")
1563  m_t << "{"; // ends at endDescList
1564  m_t << "{"; // ends at endDescTitle
1565  startBold();
1566  newParagraph();
1567 }
1568 
1570 {
1571  DBG_RTF(m_t << "{\\comment (startDescForItem) }\n")
1572 }
1573 
1575 {
1576  DBG_RTF(m_t << "{\\comment (endDescForItem) }\n")
1577 }
1578 
1580 {
1581  DBG_RTF(m_t << "{\\comment (startSection)}\n")
1582  m_t << "{";
1583  m_t << rtf_Style_Reset;
1584  int num=4;
1585  switch(type)
1586  {
1587  case SectionType::Page: num=2; break;
1588  case SectionType::Section: num=3; break;
1589  case SectionType::Subsection: num=4; break;
1590  case SectionType::Subsubsection: num=4; break;
1591  case SectionType::Paragraph: num=4; break;
1592  default: ASSERT(0); break;
1593  }
1594  QCString heading;
1595  heading.sprintf("Heading%d",num);
1596  // set style
1597  m_t << rtf_Style[heading.str()].reference();
1598  // make table of contents entry
1599  m_t << "{\\tc\\tcl" << num << " \\v ";
1600  docify(title);
1601  m_t << "}\n";
1602 }
1603 
1605 {
1606  DBG_RTF(m_t << "{\\comment (endSection)}\n")
1607  // make bookmark
1609  newParagraph();
1610  writeAnchor(QCString(),lab);
1611  m_t << "}";
1612 }
1613 
1615 {
1616  if (!str.isEmpty())
1617  {
1618  const unsigned char *p=(const unsigned char *)str.data();
1619  unsigned char c;
1620  //unsigned char pc='\0';
1621  while (*p)
1622  {
1623  //static bool MultiByte = FALSE;
1624  c=*p++;
1625 
1626  switch (c)
1627  {
1628  case '{': m_t << "\\{"; break;
1629  case '}': m_t << "\\}"; break;
1630  case '\\': m_t << "\\\\"; break;
1631  default:
1632  {
1633  // see if we can insert an hyphenation hint
1634  //if (isupper(c) && islower(pc) && !insideTabbing) m_t << "\\-";
1635  m_t << (char)c;
1636  }
1637  }
1638  //pc = c;
1640  }
1641  }
1642 }
1643 
1645 {
1646  // note that RTF does not have a "verbatim", so "\n" means
1647  // nothing... add a "newParagraph()";
1648  //static char spaces[]=" ";
1649  if (!str.isEmpty())
1650  {
1651  const unsigned char *p=(const unsigned char *)str.data();
1652  unsigned char c;
1653  int spacesToNextTabStop;
1654 
1655  while (*p)
1656  {
1657  //static bool MultiByte = FALSE;
1658 
1659  c=*p++;
1660 
1661  switch(c)
1662  {
1663  case '\t': spacesToNextTabStop = Config_getInt(TAB_SIZE) - (m_col%Config_getInt(TAB_SIZE));
1664  m_t << Doxygen::spaces.left(spacesToNextTabStop);
1665  m_col+=spacesToNextTabStop;
1666  break;
1667  case '\n': newParagraph();
1668  m_t << '\n'; m_col=0;
1669  break;
1670  case '{': m_t << "\\{"; m_col++; break;
1671  case '}': m_t << "\\}"; m_col++; break;
1672  case '\\': m_t << "\\\\"; m_col++; break;
1673  default: p=(const unsigned char *)writeUTF8Char(m_t,(const char *)p-1); m_col++; break;
1674  }
1675  }
1676  }
1677 }
1678 
1680 {
1681  char cs[2];
1682  cs[0]=c;
1683  cs[1]=0;
1684  docify(cs);
1685 }
1686 
1688 {
1689  DBG_RTF(m_t << "{\\comment startClassDiagram }\n")
1690 }
1691 
1693  const QCString &fileName,const QCString &)
1694 {
1695  newParagraph();
1696 
1697  // create a png file
1699 
1700  // display the file
1701  m_t << "{\n";
1702  m_t << rtf_Style_Reset << "\n";
1703  m_t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
1704  m_t << fileName << ".png\"";
1705  m_t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par\n";
1706  m_t << "}\n";
1707 }
1708 
1710 {
1711  DBG_RTF(m_t << "{\\comment startMemberItem }\n")
1712  m_t << rtf_Style_Reset << rtf_BList_DepthStyle() << "\n"; // set style to appropriate depth
1713 }
1714 
1716 {
1717  DBG_RTF(m_t << "{\\comment endMemberItem }\n")
1718  newParagraph();
1719 }
1720 
1721 void RTFGenerator::writeAnchor(const QCString &fileName,const QCString &name)
1722 {
1723  QCString anchor;
1724  if (!fileName.isEmpty())
1725  {
1726  anchor+=stripPath(fileName);
1727  }
1728  if (!fileName.isEmpty() && !name.isEmpty())
1729  {
1730  anchor+='_';
1731  }
1732  if (!name.isEmpty())
1733  {
1734  anchor+=name;
1735  }
1736  //printf("writeAnchor(%s->%s)\n",qPrint(anchor),qPrint(rtfFormatBmkStr(anchor)));
1737 
1738  DBG_RTF(m_t << "{\\comment writeAnchor (" << anchor << ")}\n")
1739  m_t << "{\\bkmkstart " << rtfFormatBmkStr(anchor) << "}\n";
1740  m_t << "{\\bkmkend " << rtfFormatBmkStr(anchor) << "}\n";
1741 }
1742 
1744 {
1745  m_t << "{\\field\\fldedit {\\*\\fldinst PAGEREF ";
1746  m_t << rtfFormatBmkStr(stripPath(label));
1747  m_t << " \\\\*MERGEFORMAT}{\\fldrslt pagenum}}";
1748 }
1749 
1751 {
1752  DBG_RTF(m_t << "{\\comment (startCodeFragment) }\n")
1753  m_t << "{\n";
1755 }
1756 
1758 {
1759  endCodeLine();
1760 
1761  DBG_RTF(m_t << "{\\comment (endCodeFragment) }\n")
1762  m_t << "}\n";
1764 }
1765 
1767 {
1768  m_t << "\\~ ";
1769 }
1770 
1771 
1773 {
1774  m_t << "\n";
1775  DBG_RTF(m_t << "{\\comment (startMemberList) }\n")
1776  m_t << "{\n";
1777 #ifdef DELETEDCODE
1778  if (!insideTabbing)
1779  m_t << "\\begin{CompactItemize}\n";
1780 #endif
1781 }
1782 
1784 {
1785  DBG_RTF(m_t << "{\\comment (endMemberList) }\n")
1786  m_t << "}\n";
1787 #ifdef DELETEDCODE
1788  if (!insideTabbing)
1789  m_t << "\\end{CompactItemize}\n";
1790 #endif
1791 }
1792 
1794 {
1795  DBG_RTF(m_t << "{\\comment (startDescTable) }\n")
1796  m_t << "{\\par\n";
1797  m_t << "{" << rtf_Style["Heading5"].reference() << "\n";
1798  docify(title);
1799  m_t << ":\\par}\n";
1801  m_t << "\\trowd \\trgaph108\\trleft426\\tblind426"
1802  "\\trbrdrt\\brdrs\\brdrw10\\brdrcf15 "
1803  "\\trbrdrl\\brdrs\\brdrw10\\brdrcf15 "
1804  "\\trbrdrb\\brdrs\\brdrw10\\brdrcf15 "
1805  "\\trbrdrr\\brdrs\\brdrw10\\brdrcf15 "
1806  "\\trbrdrh\\brdrs\\brdrw10\\brdrcf15 "
1807  "\\trbrdrv\\brdrs\\brdrw10\\brdrcf15 \n";
1808  int i,columnPos[2] = { 25, 100 };
1809  for (i=0;i<2;i++)
1810  {
1811  m_t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10\\brdrcf15 "
1812  "\\clbrdrl\\brdrs\\brdrw10\\brdrcf15 "
1813  "\\clbrdrb\\brdrs\\brdrw10\\brdrcf15 "
1814  "\\clbrdrr \\brdrs\\brdrw10\\brdrcf15 "
1815  "\\cltxlrtb "
1816  "\\cellx" << (rtf_pageWidth*columnPos[i]/100) << "\n";
1817  }
1818  m_t << "\\pard \\widctlpar\\intbl\\adjustright\n";
1819 }
1820 
1822 {
1823  DBG_RTF(m_t << "{\\comment (endDescTable)}\n")
1824  m_t << "}\n";
1825 }
1826 
1828 {
1829 }
1830 
1832 {
1833 }
1834 
1836 {
1837  DBG_RTF(m_t << "{\\comment (startDescTableTitle) }\n")
1838  m_t << "{\\qr ";
1839 }
1840 
1842 {
1843  DBG_RTF(m_t << "{\\comment (endDescTableTitle) }\n")
1844  m_t << "\\cell }";
1845 }
1846 
1848 {
1849  DBG_RTF(m_t << "{\\comment (startDescTableData) }\n")
1850  m_t << "{";
1851 }
1852 
1854 {
1855  DBG_RTF(m_t << "{\\comment (endDescTableData) }\n")
1856  m_t << "\\cell }{\\row }\n";
1857 }
1858 
1859 // a style for list formatted as a "bulleted list"
1860 
1862 {
1863  return std::min(m_indentLevel,maxIndentLevels-1);
1864 }
1865 
1867 {
1868  m_indentLevel++;
1870  {
1871  err("Maximum indent level (%d) exceeded while generating RTF output!\n",maxIndentLevels);
1872  }
1873 }
1874 
1876 {
1877  m_indentLevel--;
1878  if (m_indentLevel<0)
1879  {
1880  err("Negative indent level while generating RTF output!\n");
1881  m_indentLevel=0;
1882  }
1883 }
1884 
1885 // a style for list formatted with "list continue" style
1887 {
1888  QCString n=makeIndexName("ListContinue",indentLevel());
1889  return rtf_Style[n.str()].reference();
1890 }
1891 
1892 // a style for list formatted as a "latext style" table of contents
1894 {
1895  QCString n=makeIndexName("LatexTOC",indentLevel());
1896  return rtf_Style[n.str()].reference();
1897 }
1898 
1899 // a style for list formatted as a "bullet" style
1901 {
1902  QCString n=makeIndexName("ListBullet",indentLevel());
1903  return rtf_Style[n.str()].reference();
1904 }
1905 
1906 // a style for list formatted as a "enumeration" style
1908 {
1909  QCString n=makeIndexName("ListEnum",indentLevel());
1910  return rtf_Style[n.str()].reference();
1911 }
1912 
1914 {
1915  QCString n=makeIndexName("DescContinue",indentLevel());
1916  return rtf_Style[n.str()].reference();
1917 }
1918 
1920 {
1921  QCString n=makeIndexName("CodeExample",indentLevel());
1922  return rtf_Style[n.str()].reference();
1923 }
1924 
1926 {
1927  DBG_RTF(m_t << "{\\comment startTextBlock}\n")
1928  m_t << "{\n";
1929  m_t << rtf_Style_Reset;
1930  if (dense) // no spacing between "paragraphs"
1931  {
1932  m_t << rtf_Style["DenseText"].reference();
1933  }
1934  else // some spacing
1935  {
1936  m_t << rtf_Style["BodyText"].reference();
1937  }
1938 }
1939 
1940 void RTFGenerator::endTextBlock(bool /*paraBreak*/)
1941 {
1942  newParagraph();
1943  DBG_RTF(m_t << "{\\comment endTextBlock}\n")
1944  m_t << "}\n";
1945  //m_omitParagraph = TRUE;
1946 }
1947 
1949 {
1950  if (!m_omitParagraph)
1951  {
1952  DBG_RTF(m_t << "{\\comment (newParagraph)}\n")
1953  m_t << "\\par\n";
1954  }
1956 }
1957 
1959 {
1960  DBG_RTF(m_t << "{\\comment startParagraph}\n")
1961  newParagraph();
1962  m_t << "{\n";
1963  if (QCString(txt) == "reference") m_t << "\\ql\n";
1964 }
1965 
1967 {
1968  DBG_RTF(m_t << "{\\comment endParagraph}\n")
1969  m_t << "}\\par\n";
1971 }
1972 
1974 {
1975  DBG_RTF(m_t << "{\\comment startMemberSubtitle}\n")
1976  m_t << "{\n";
1977  m_t << rtf_Style_Reset << rtf_CList_DepthStyle() << "\n";
1978 }
1979 
1981 {
1982  DBG_RTF(m_t << "{\\comment endMemberSubtitle}\n")
1983  newParagraph();
1984  m_t << "}\n";
1985 }
1986 
1987 bool isLeadBytes(int c)
1988 {
1989  bool result;
1990 
1991  QCString codePage = theTranslator->trRTFansicp();
1992 
1993  if (codePage == "932") // cp932 (Japanese Shift-JIS)
1994  {
1995  result = (0x81<=c && c<=0x9f) || (0xe0<=c && c<=0xfc);
1996  }
1997  else if (codePage == "936") // cp936 (Simplified Chinese GBK)
1998  {
1999  result = 0x81<=c && c<=0xFE;
2000  }
2001  else if (codePage == "949") // cp949 (Korean)
2002  {
2003  result = 0x81<=c && c<=0xFE;
2004  }
2005  else if (codePage == "950") // cp950 (Traditional Chinese Big5)
2006  {
2007  result = 0x81<=c && c<=0xFE;
2008  }
2009  else // for SBCS Codepages (cp1252,1251 etc...)
2010  {
2011  result = false;
2012  }
2013 
2014  return result;
2015 }
2016 
2017 
2018 // note: function is not reentrant!
2019 static void encodeForOutput(TextStream &t,const QCString &s)
2020 {
2021  if (s==0) return;
2022  QCString encoding;
2023  bool converted=FALSE;
2024  int l = (int)s.length();
2025  static std::vector<char> enc;
2026  if (l*4>(int)enc.size()) enc.resize(l*4); // worst case
2027  encoding.sprintf("CP%s",qPrint(theTranslator->trRTFansicp()));
2028  if (!encoding.isEmpty())
2029  {
2030  // convert from UTF-8 back to the output encoding
2031  void *cd = portable_iconv_open(encoding.data(),"UTF-8");
2032  if (cd!=(void *)(-1))
2033  {
2034  size_t iLeft=l;
2035  size_t oLeft=enc.size();
2036  const char *inputPtr = s.data();
2037  char *outputPtr = &enc[0];
2038  if (!portable_iconv(cd, &inputPtr, &iLeft, &outputPtr, &oLeft))
2039  {
2040  enc.resize(enc.size()-(unsigned int)oLeft);
2041  converted=TRUE;
2042  }
2044  }
2045  }
2046  if (!converted) // if we did not convert anything, copy as is.
2047  {
2048  memcpy(enc.data(),s.data(),l);
2049  enc.resize(l);
2050  }
2051  uint i;
2052  bool multiByte = FALSE;
2053 
2054  for (i=0;i<enc.size();i++)
2055  {
2056  uchar c = (uchar)enc.at(i);
2057 
2058  if (c>=0x80 || multiByte)
2059  {
2060  char esc[10];
2061  sprintf(esc,"\\'%X",c); // escape sequence for SBCS and DBCS(1st&2nd bytes).
2062  t << esc;
2063 
2064  if (!multiByte)
2065  {
2066  multiByte = isLeadBytes(c); // It may be DBCS Codepages.
2067  }
2068  else
2069  {
2070  multiByte = FALSE; // end of Double Bytes Character.
2071  }
2072  }
2073  else
2074  {
2075  t << (char)c;
2076  }
2077  }
2078 }
2079 
2080 /**
2081  * VERY brittle routine inline RTF's included by other RTF's.
2082  * it is recursive and ugly.
2083  */
2084 static bool preProcessFile(Dir &d,const QCString &infName, TextStream &t, bool bIncludeHeader=TRUE)
2085 {
2086  static bool rtfDebug = Debug::isFlagSet(Debug::Rtf);
2087  std::ifstream f(infName.str(),std::ifstream::in);
2088  if (!f.is_open())
2089  {
2090  err("problems opening rtf file '%s' for reading\n",infName.data());
2091  return false;
2092  }
2093 
2094  const int maxLineLength = 10240;
2095  static QCString lineBuf(maxLineLength);
2096 
2097  // scan until find end of header
2098  // this is EXTREEEEEEEMLY brittle. It works on OUR rtf
2099  // files because the first line before the body
2100  // ALWAYS contains "{\comment begin body}"
2101  std::string line;
2102  while (getline(f,line))
2103  {
2104  line+='\n';
2105  if (line.find("\\comment begin body")!=std::string::npos) break;
2106  if (bIncludeHeader) encodeForOutput(t,line.c_str());
2107  }
2108 
2109  std::string prevLine;
2110  bool first=true;
2111  while (getline(f,line))
2112  {
2113  line+='\n';
2114  size_t pos;
2115  if ((pos=prevLine.find("INCLUDETEXT \""))!=std::string::npos)
2116  {
2117  size_t startNamePos = prevLine.find('"',pos)+1;
2118  size_t endNamePos = prevLine.find('"',startNamePos);
2119  std::string fileName = prevLine.substr(startNamePos,endNamePos-startNamePos);
2120  DBG_RTF(m_t << "{\\comment begin include " << fileName << "}\n")
2121  if (!preProcessFile(d,fileName.c_str(),t,FALSE)) return FALSE;
2122  DBG_RTF(m_t << "{\\comment end include " << fileName << "}\n")
2123  }
2124  else if (!first) // no INCLUDETEXT on this line
2125  {
2126  encodeForOutput(t,prevLine.c_str());
2127  }
2128  prevLine = line;
2129  first=false;
2130  }
2131  if (!bIncludeHeader) // skip final '}' in case we don't include headers
2132  {
2133  size_t pos = line.rfind('}');
2134  if (pos==std::string::npos)
2135  {
2136  err("Strange, the last char was not a '}'\n");
2137  pos = line.length();
2138  }
2139  encodeForOutput(t,line.substr(0,pos).c_str());
2140  }
2141  else
2142  {
2143  encodeForOutput(t,line.c_str());
2144  }
2145  f.close();
2146  // remove temporary file
2147  if (!rtfDebug) d.remove(infName.str());
2148  return TRUE;
2149 }
2150 
2152 {
2153  DBG_RTF(m_t << "{\\comment (startDotGraph)}\n")
2154 }
2155 
2157 {
2158  newParagraph();
2159 
2160  QCString fn =
2162 
2163  // display the file
2164  m_t << "{\n";
2165  m_t << rtf_Style_Reset << "\n";
2166  m_t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
2167  QCString imgExt = getDotImageExtension();
2168  m_t << fn << "." << imgExt;
2169  m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par\n";
2170  m_t << "}\n";
2171  newParagraph();
2172  DBG_RTF(m_t << "{\\comment (endDotGraph)}\n")
2173 }
2174 
2176 {
2177  DBG_RTF(m_t << "{\\comment (startInclDepGraph)}\n")
2178 }
2179 
2181 {
2182  newParagraph();
2183 
2185 
2186  // display the file
2187  m_t << "{\n";
2188  m_t << rtf_Style_Reset << "\n";
2189  m_t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
2190  QCString imgExt = getDotImageExtension();
2191  m_t << fn << "." << imgExt;
2192  m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par\n";
2193  m_t << "}\n";
2194  DBG_RTF(m_t << "{\\comment (endInclDepGraph)}\n")
2195 }
2196 
2198 {
2199 }
2200 
2202 {
2203 }
2204 
2206 {
2207  DBG_RTF(m_t << "{\\comment (startCallGraph)}\n")
2208 }
2209 
2211 {
2212  newParagraph();
2213 
2215 
2216  // display the file
2217  m_t << "{\n";
2218  m_t << rtf_Style_Reset << "\n";
2219  m_t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
2220  QCString imgExt = getDotImageExtension();
2221  m_t << fn << "." << imgExt;
2222  m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par\n";
2223  m_t << "}\n";
2224  DBG_RTF(m_t << "{\\comment (endCallGraph)}\n")
2225 }
2226 
2228 {
2229  DBG_RTF(m_t << "{\\comment (startDirDepGraph)}\n")
2230 }
2231 
2233 {
2234  newParagraph();
2235 
2237 
2238  // display the file
2239  m_t << "{\n";
2240  m_t << rtf_Style_Reset << "\n";
2241  m_t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
2242  QCString imgExt = getDotImageExtension();
2243  m_t << fn << "." << imgExt;
2244  m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par\n";
2245  m_t << "}\n";
2246  DBG_RTF(m_t << "{\\comment (endDirDepGraph)}\n")
2247 }
2248 
2249 /** Tests the integrity of the result by counting brackets.
2250  *
2251  */
2253 {
2254  int bcount=0;
2255  int line=1;
2256  int c;
2257  std::ifstream f(name.data(),std::ifstream::in);
2258  if (f.is_open())
2259  {
2260  while ((c=f.get())!=-1)
2261  {
2262  if (c=='\\') // escape char
2263  {
2264  c=f.get();
2265  if (c==-1) break;
2266  }
2267  else if (c=='{') // open bracket
2268  {
2269  bcount++;
2270  }
2271  else if (c=='}') // close bracket
2272  {
2273  bcount--;
2274  if (bcount<0)
2275  {
2276  goto err;
2277  break;
2278  }
2279  }
2280  else if (c=='\n') // newline
2281  {
2282  line++;
2283  }
2284  }
2285  }
2286  if (bcount==0) return; // file is OK.
2287 err:
2288  err("RTF integrity test failed at line %d of %s due to a bracket mismatch.\n"
2289  " Please try to create a small code example that produces this error \n"
2290  " and send that to doxygen@gmail.com.\n",line,qPrint(name));
2291 }
2292 
2293 /**
2294  * This is an API to a VERY brittle RTF preprocessor that combines nested
2295  * RTF files. This version replaces the infile with the new file
2296  */
2298 {
2299  static bool rtfDebug = Debug::isFlagSet(Debug::Rtf);
2300  Dir d(path.str());
2301  // store the original directory
2302  if (!d.exists())
2303  {
2304  err("Output dir %s does not exist!\n",qPrint(path));
2305  return FALSE;
2306  }
2307  std::string oldDir = Dir::currentDirPath();
2308 
2309  // go to the html output directory (i.e. path)
2310  Dir::setCurrent(d.absPath());
2311  Dir thisDir;
2312 
2313  QCString combinedName = path+"/combined.rtf";
2314  QCString mainRTFName = path+"/"+name;
2315 
2316  std::ofstream f(combinedName.str(),std::ofstream::out | std::ofstream::binary);
2317  if (!f.is_open())
2318  {
2319  err("Failed to open %s for writing!\n",combinedName.data());
2320  Dir::setCurrent(oldDir);
2321  return FALSE;
2322  }
2323  TextStream outt(&f);
2324 
2325  if (!preProcessFile(thisDir,mainRTFName,outt))
2326  {
2327  // it failed, remove the temp file
2328  outt.flush();
2329  f.close();
2330  if (!rtfDebug) thisDir.remove(combinedName.str());
2331  Dir::setCurrent(oldDir);
2332  return FALSE;
2333  }
2334 
2335  // everything worked, move the files
2336  outt.flush();
2337  f.close();
2338  if (!rtfDebug)
2339  {
2340  thisDir.remove(mainRTFName.str());
2341  }
2342  else
2343  {
2344  thisDir.rename(mainRTFName.str(),mainRTFName.str() + ".org");
2345  }
2346  thisDir.rename(combinedName.str(),mainRTFName.str());
2347 
2348  testRTFOutput(mainRTFName);
2349 
2350  Dir::setCurrent(oldDir);
2351  return TRUE;
2352 }
2353 
2355 {
2356  DBG_RTF(m_t << "{\\comment startMemberGroupHeader}\n")
2357  m_t << "{\n";
2358  if (hasHeader) incIndentLevel();
2359  m_t << rtf_Style_Reset << rtf_Style["GroupHeader"].reference();
2360 }
2361 
2363 {
2364  DBG_RTF(m_t << "{\\comment endMemberGroupHeader}\n")
2365  newParagraph();
2367 }
2368 
2370 {
2371  DBG_RTF(m_t << "{\\comment startMemberGroupDocs}\n")
2372  startEmphasis();
2373 }
2374 
2376 {
2377  DBG_RTF(m_t << "{\\comment endMemberGroupDocs}\n")
2378  endEmphasis();
2379  newParagraph();
2380 }
2381 
2383 {
2384  DBG_RTF(m_t << "{\\comment startMemberGroup}\n")
2385  m_t << rtf_Style_Reset << rtf_BList_DepthStyle() << "\n";
2386 }
2387 
2388 void RTFGenerator::endMemberGroup(bool hasHeader)
2389 {
2390  DBG_RTF(m_t << "{\\comment endMemberGroup}\n")
2391  if (hasHeader) decIndentLevel();
2392  m_t << "}";
2393 }
2394 
2396 {
2397  DBG_RTF(m_t << "{\\comment (startExamples)}\n")
2398  m_t << "{"; // ends at endDescList
2399  m_t << "{"; // ends at endDescTitle
2400  startBold();
2401  newParagraph();
2403  endBold();
2404  m_t << "}";
2405  newParagraph();
2406  incIndentLevel();
2408 }
2409 
2411 {
2412  DBG_RTF(m_t << "{\\comment (endExamples)}\n")
2414  newParagraph();
2415  decIndentLevel();
2417  m_t << "}";
2418 }
2419 
2421 {
2422  DBG_RTF(m_t << "{\\comment (startParamList)}\n")
2423  m_t << "{"; // ends at endParamList
2424  m_t << "{"; // ends at endDescTitle
2425  startBold();
2426  newParagraph();
2427  docify(title);
2428  endBold();
2429  m_t << "}";
2430  newParagraph();
2431  incIndentLevel();
2433 }
2434 
2436 {
2437  DBG_RTF(m_t << "{\\comment (endParamList)}\n")
2438  newParagraph();
2439  decIndentLevel();
2441  m_t << "}";
2442 }
2443 
2444 void RTFGenerator::startParameterType(bool first,const QCString &key)
2445 {
2446  DBG_RTF(m_t << "{\\comment (startParameterType)}\n")
2447  if (!first && !key.isEmpty())
2448  {
2449  m_t << " " << key << " ";
2450  }
2451 }
2452 
2454 {
2455  DBG_RTF(m_t << "{\\comment (endParameterType)}\n")
2456  m_t << " ";
2457 }
2458 
2459 void RTFGenerator::exceptionEntry(const QCString &prefix,bool closeBracket)
2460 {
2461  DBG_RTF(m_t << "{\\comment (exceptionEntry)}\n")
2462  if (!prefix.isEmpty())
2463  {
2464  m_t << " " << prefix << "(";
2465  }
2466  else if (closeBracket)
2467  {
2468  m_t << ")";
2469  }
2470  m_t << " ";
2471 }
2472 
2473 void RTFGenerator::writeDoc(DocNode *n,const Definition *ctx,const MemberDef *,int)
2474 {
2475  RTFDocVisitor *visitor = new RTFDocVisitor(m_t,*this,ctx?ctx->getDefFileExtension():QCString(""));
2476  n->accept(visitor);
2477  delete visitor;
2479 }
2480 
2482 {
2483  DBG_RTF(m_t << "{\\comment (rtfwriteRuler_doubleline)}\n")
2484  m_t << "{\\pard\\widctlpar\\brdrb\\brdrdb\\brdrw15\\brsp20 \\adjustright \\par}\n";
2485 }
2486 
2488 {
2489  DBG_RTF(m_t << "{\\comment (rtfwriteRuler_emboss)}\n")
2490  m_t << "{\\pard\\widctlpar\\brdrb\\brdremboss\\brdrw15\\brsp20 \\adjustright \\par}\n";
2491 }
2492 
2494 {
2495  DBG_RTF(m_t << "{\\comment (rtfwriteRuler_thick)}\n")
2496  m_t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw75\\brsp20 \\adjustright \\par}\n";
2497 }
2498 
2500 {
2501  DBG_RTF(m_t << "{\\comment (rtfwriteRuler_thin)}\n")
2502  m_t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw5\\brsp20 \\adjustright \\par}\n";
2503 }
2504 
2506 {
2507  DBG_RTF(m_t << "{\\comment (startConstraintList)}\n")
2508  m_t << "{"; // ends at endConstraintList
2509  m_t << "{";
2510  startBold();
2511  newParagraph();
2512  docify(header);
2513  endBold();
2514  m_t << "}";
2515  newParagraph();
2516  incIndentLevel();
2518 }
2519 
2521 {
2522  DBG_RTF(m_t << "{\\comment (startConstraintParam)}\n")
2523  startEmphasis();
2524 }
2525 
2527 {
2528  DBG_RTF(m_t << "{\\comment (endConstraintParam)}\n")
2529  endEmphasis();
2530  m_t << " : ";
2531 }
2532 
2534 {
2535  DBG_RTF(m_t << "{\\comment (startConstraintType)}\n")
2536  startEmphasis();
2537 }
2538 
2540 {
2541  DBG_RTF(m_t << "{\\comment (endConstraintType)}\n")
2542  endEmphasis();
2543  m_t << " ";
2544 }
2545 
2547 {
2548  DBG_RTF(m_t << "{\\comment (startConstraintDocs)}\n")
2549 }
2550 
2552 {
2553  DBG_RTF(m_t << "{\\comment (endConstraintDocs)}\n")
2554  newParagraph();
2555 }
2556 
2558 {
2559  DBG_RTF(m_t << "{\\comment (endConstraintList)}\n")
2560  newParagraph();
2561  decIndentLevel();
2563  m_t << "}";
2564 }
2565 
2567 {
2568  DBG_RTF(m_t << "{\\comment (startIndexListItem)}\n")
2569 }
2570 
2572 {
2573  DBG_RTF(m_t << "{\\comment (endIndexListItem)}\n")
2574  m_t << "\\par\n";
2575 }
2576 
2578 {
2579  DBG_RTF(m_t << "{\\comment (startInlineHeader)}\n")
2580  m_t << "{\n";
2581  m_t << rtf_Style_Reset << rtf_Style["Heading5"].reference();
2582  startBold();
2583 }
2584 
2586 {
2587  DBG_RTF(m_t << "{\\comment (endInlineHeader)}\n")
2588  endBold();
2589  m_t << "\\par";
2590  m_t << "}\n";
2591 }
2592 
2594 {
2595  DBG_RTF(m_t << "{\\comment (startMemberDocSimple)}\n")
2596  m_t << "{\\par\n";
2597  m_t << "{" << rtf_Style["Heading5"].reference() << "\n";
2598  if (isEnum)
2599  {
2601  }
2602  else
2603  {
2605  }
2606  m_t << ":\\par}\n";
2608  m_t << "\\trowd \\trgaph108\\trleft426\\tblind426"
2609  "\\trbrdrt\\brdrs\\brdrw10\\brdrcf15 "
2610  "\\trbrdrl\\brdrs\\brdrw10\\brdrcf15 "
2611  "\\trbrdrb\\brdrs\\brdrw10\\brdrcf15 "
2612  "\\trbrdrr\\brdrs\\brdrw10\\brdrcf15 "
2613  "\\trbrdrh\\brdrs\\brdrw10\\brdrcf15 "
2614  "\\trbrdrv\\brdrs\\brdrw10\\brdrcf15 \n";
2615  int i,n=3,columnPos[3] = { 25, 50, 100 };
2616  if (isEnum)
2617  {
2618  columnPos[0]=30;
2619  columnPos[1]=100;
2620  n=2;
2621  }
2622  for (i=0;i<n;i++)
2623  {
2624  m_t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10\\brdrcf15 "
2625  "\\clbrdrl\\brdrs\\brdrw10\\brdrcf15 "
2626  "\\clbrdrb\\brdrs\\brdrw10\\brdrcf15 "
2627  "\\clbrdrr \\brdrs\\brdrw10\\brdrcf15 "
2628  "\\cltxlrtb "
2629  "\\cellx" << (rtf_pageWidth*columnPos[i]/100) << "\n";
2630  }
2631  m_t << "\\pard \\widctlpar\\intbl\\adjustright\n";
2632 }
2633 
2635 {
2636  DBG_RTF(m_t << "{\\comment (endMemberDocSimple)}\n")
2637  m_t << "}\n";
2638 }
2639 
2641 {
2642  DBG_RTF(m_t << "{\\comment (startInlineMemberType)}\n")
2643  m_t << "{\\qr ";
2644 }
2645 
2647 {
2648  DBG_RTF(m_t << "{\\comment (endInlineMemberType)}\n")
2649  m_t << "\\cell }";
2650 }
2651 
2653 {
2654  DBG_RTF(m_t << "{\\comment (startInlineMemberName)}\n")
2655  m_t << "{";
2656 }
2657 
2659 {
2660  DBG_RTF(m_t << "{\\comment (endInlineMemberName)}\n")
2661  m_t << "\\cell }";
2662 }
2663 
2665 {
2666  DBG_RTF(m_t << "{\\comment (startInlineMemberDoc)}\n")
2667  m_t << "{";
2668 }
2669 
2671 {
2672  DBG_RTF(m_t << "{\\comment (endInlineMemberDoc)}\n")
2673  m_t << "\\cell }{\\row }\n";
2674 }
2675 
2676 void RTFGenerator::writeLineNumber(const QCString &ref,const QCString &fileName,const QCString &anchor,int l,bool writeLineAnchor)
2677 {
2678  bool rtfHyperlinks = Config_getBool(RTF_HYPERLINKS);
2679 
2680  m_doxyCodeLineOpen = true;
2681  if (Config_getBool(SOURCE_BROWSER))
2682  {
2683  QCString lineNumber;
2684  lineNumber.sprintf("%05d",l);
2685 
2686  QCString lineAnchor;
2687  if (!m_sourceFileName.isEmpty())
2688  {
2689  lineAnchor.sprintf("_l%05d",l);
2691  }
2692  bool showTarget = rtfHyperlinks && !lineAnchor.isEmpty() && writeLineAnchor;
2693  if (showTarget)
2694  {
2695  m_t << "{\\bkmkstart ";
2696  m_t << rtfFormatBmkStr(lineAnchor);
2697  m_t << "}";
2698  m_t << "{\\bkmkend ";
2699  m_t << rtfFormatBmkStr(lineAnchor);
2700  m_t << "}\n";
2701  }
2702  if (!fileName.isEmpty())
2703  {
2704  writeCodeLink(CodeSymbolType::Default,ref,fileName,anchor,lineNumber,QCString());
2705  }
2706  else
2707  {
2708  m_t << lineNumber;
2709  }
2710  m_t << " ";
2711  }
2712  else
2713  {
2714  m_t << l << " ";
2715  }
2716  m_col=0;
2717 }
2719 {
2720  m_doxyCodeLineOpen = true;
2721  m_col=0;
2722 }
2724 {
2726  m_doxyCodeLineOpen = false;
2727 }
2728 
2730 {
2731 }
2732 
2733 void RTFGenerator::writeLabel(const QCString &l,bool isLast)
2734 {
2735  m_t << "{\\f2 [" << l << "]}";
2736  if (!isLast) m_t << ", ";
2737 }
2738 
2740 {
2741 }
2742 
2744 {
2745  int cod = 2;
2746  QCString qname(name);
2747  if (qname == "keyword") cod = 17;
2748  else if (qname == "keywordtype") cod = 18;
2749  else if (qname == "keywordflow") cod = 19;
2750  else if (qname == "comment") cod = 20;
2751  else if (qname == "preprocessor") cod = 21;
2752  else if (qname == "stringliteral") cod = 22;
2753  else if (qname == "charliteral") cod = 23;
2754  else if (qname == "vhdldigit") cod = 24;
2755  else if (qname == "vhdlchar") cod = 25;
2756  else if (qname == "vhdlkeyword") cod = 26;
2757  else if (qname == "vhdllogic") cod = 27;
2758  m_t << "{\\cf" << cod << " ";
2759 }
2760 
2762 {
2763  m_t << "}";
2764 }
getDotImageExtension
QCString getDotImageExtension()
Definition: util.cpp:7032
Definition::getDefFileExtension
virtual QCString getDefFileExtension() const =0
RTFGenerator::endDescForItem
void endDescForItem()
Definition: rtfgen.cpp:1574
RTFGenerator::writeStartAnnoItem
void writeStartAnnoItem(const QCString &type, const QCString &file, const QCString &path, const QCString &name)
Definition: rtfgen.cpp:1129
RTFGenerator::rtfwriteRuler_doubleline
void rtfwriteRuler_doubleline()
Definition: rtfgen.cpp:2481
OutputGenerator::fileName
QCString fileName() const
Definition: outputgen.cpp:85
Translator::trRTFGeneralIndex
virtual QCString trRTFGeneralIndex()=0
SectionType::Paragraph
@ Paragraph
isExampleDocumentation
@ isExampleDocumentation
Definition: index.h:134
Dir::currentDirPath
static std::string currentDirPath()
Definition: dir.cpp:282
Rtf_Style_Default::name
const char * name
Definition: rtfstyle.h:40
portable_iconv
size_t portable_iconv(void *cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
dotincldepgraph.h
RTFGenerator::startInlineMemberName
void startInlineMemberName()
Definition: rtfgen.cpp:2652
RTFGenerator::startTitle
void startTitle()
Definition: rtfgen.cpp:1383
RTFGenerator::endParamList
void endParamList()
Definition: rtfgen.cpp:2435
isDirDocumentation
@ isDirDocumentation
Definition: index.h:129
RTFGenerator::endMemberDescription
void endMemberDescription()
Definition: rtfgen.cpp:1549
Rtf_Style_Default::reference
const char * reference
Definition: rtfstyle.h:41
Translator::trCompoundMembers
virtual QCString trCompoundMembers()=0
RTFGenerator::RTFGenerator
RTFGenerator()
Definition: rtfgen.cpp:69
RTFGenerator::startLabels
void startLabels()
Definition: rtfgen.cpp:2729
RTFGenerator::m_indentLevel
int m_indentLevel
Definition: rtfgen.h:314
RTFGenerator::m_listItemInfo
RTFListItemInfo m_listItemInfo[maxIndentLevels]
Definition: rtfgen.h:321
Doxygen::mainPage
static std::unique_ptr< PageDef > mainPage
Definition: doxygen.h:83
isNamespaceIndex
@ isNamespaceIndex
Definition: index.h:122
RTFGenerator::startHtmlLink
void startHtmlLink(const QCString &url)
Definition: rtfgen.cpp:1101
stripExtensionGeneral
QCString stripExtensionGeneral(const QCString &fName, const QCString &ext)
Definition: util.cpp:5285
RTFGenerator::startInclDepGraph
void startInclDepGraph()
Definition: rtfgen.cpp:2175
Config_getEnum
#define Config_getEnum(name)
Definition: config.h:35
rtfstyle.h
DotDirDeps
Representation of an directory dependency graph
Definition: dotdirdeps.h:25
RTFGenerator::writeLabel
void writeLabel(const QCString &l, bool isLast)
Definition: rtfgen.cpp:2733
Definition
The common base class of all entity definitions found in the sources.
Definition: definition.h:76
RTFGenerator::endDescTableTitle
void endDescTableTitle()
Definition: rtfgen.cpp:1841
Dir::remove
bool remove(const std::string &path, bool acceptsAbsPath=true) const
Definition: dir.cpp:256
RTFGenerator::clone
virtual std::unique_ptr< OutputGenerator > clone() const
Definition: rtfgen.cpp:83
relativePathToRoot
QCString relativePathToRoot(const QCString &name)
Definition: util.cpp:3656
RTFGenerator::rtf_EList_DepthStyle
QCString rtf_EList_DepthStyle()
Definition: rtfgen.cpp:1907
BaseOutputDocInterface::ParamListTypes
ParamListTypes
Definition: outputgen.h:165
RTFGenerator::rtf_CList_DepthStyle
QCString rtf_CList_DepthStyle()
Definition: rtfgen.cpp:1886
Dir
Class representing a directory in the file system
Definition: dir.h:68
Translator::trClassDocumentation
virtual QCString trClassDocumentation()=0
RTFGenerator::endProjectNumber
void endProjectNumber()
Definition: rtfgen.cpp:399
pagedef.h
RTFGenerator::rtf_BList_DepthStyle
QCString rtf_BList_DepthStyle()
Definition: rtfgen.cpp:1900
RTFGenerator::endDoxyAnchor
void endDoxyAnchor(const QCString &, const QCString &)
Definition: rtfgen.cpp:1460
isFileIndex
@ isFileIndex
Definition: index.h:126
QCString::length
uint length() const
Returns the length of the string, not counting the 0-terminator.
Definition: qcstring.h:147
RTFGenerator::rtfwriteRuler_emboss
void rtfwriteRuler_emboss()
Definition: rtfgen.cpp:2487
RTFGenerator::startClassDiagram
void startClassDiagram()
Definition: rtfgen.cpp:1687
RTFGenerator::endItemList
void endItemList()
Definition: rtfgen.cpp:1040
isCompoundIndex
@ isCompoundIndex
Definition: index.h:125
ClassDiagram::writeImage
void writeImage(TextStream &t, const QCString &path, const QCString &relPath, const QCString &file, bool generateMap=true) const
Definition: diagram.cpp:1342
RTFGenerator::endIndexSection
void endIndexSection(IndexSections)
Definition: rtfgen.cpp:587
RTFGenerator::endConstraintDocs
void endConstraintDocs()
Definition: rtfgen.cpp:2551
RTFGenerator::endGroupHeader
void endGroupHeader(int)
Definition: rtfgen.cpp:1412
Doxygen::conceptLinkedMap
static ConceptLinkedMap * conceptLinkedMap
Definition: doxygen.h:80
isTitlePageStart
@ isTitlePageStart
Definition: index.h:117
RTFGenerator::maxIndentLevels
static const int maxIndentLevels
Definition: rtfgen.h:313
RTFGenerator::startCodeLine
void startCodeLine(bool)
Definition: rtfgen.cpp:2718
RTFGenerator::m_col
int m_col
Definition: rtfgen.h:305
RTFGenerator::startCallGraph
void startCallGraph()
Definition: rtfgen.cpp:2205
RTFGenerator::beginRTFDocument
void beginRTFDocument()
Definition: rtfgen.cpp:225
QCString::isEmpty
bool isEmpty() const
Returns TRUE iff the string is empty
Definition: qcstring.h:144
RTFGenerator::endCodeFragment
void endCodeFragment(const QCString &style)
Definition: rtfgen.cpp:1757
RTFGenerator
Generator for RTF output.
Definition: rtfgen.h:25
DocNode
Abstract node interface with type information.
Definition: docparser.h:96
isPageIndex
@ isPageIndex
Definition: index.h:127
RTFGenerator::writeStyleSheetFile
static void writeStyleSheetFile(TextStream &t)
Definition: rtfgen.cpp:102
namespacedef.h
RTFGenerator::docify
void docify(const QCString &text)
Definition: rtfgen.cpp:1614
rtf_Style_Reset
char rtf_Style_Reset[]
Definition: rtfstyle.cpp:49
dotdirdeps.h
RTFGenerator::startConstraintDocs
void startConstraintDocs()
Definition: rtfgen.cpp:2546
RTFGenerator::startIndexValue
void startIndexValue(bool)
Definition: rtfgen.cpp:1180
RTFGenerator::endTypewriter
void endTypewriter()
Definition: rtfgen.h:109
RTFGenerator::startItemList
void startItemList()
Definition: rtfgen.cpp:1027
RTFGenerator::startDescItem
void startDescItem()
Definition: rtfgen.cpp:1526
Translator::trTypeDocumentation
virtual QCString trTypeDocumentation()=0
RTFGenerator::exceptionEntry
void exceptionEntry(const QCString &, bool)
Definition: rtfgen.cpp:2459
RTFGenerator::startParamList
void startParamList(ParamListTypes, const QCString &)
Definition: rtfgen.cpp:2420
RTFGenerator::startSection
void startSection(const QCString &, const QCString &, SectionType)
Definition: rtfgen.cpp:1579
QCString::str
std::string str() const
Definition: qcstring.h:442
RTFGenerator::incIndentLevel
void incIndentLevel()
Definition: rtfgen.cpp:1866
RTFGenerator::startSubsection
void startSubsection()
Definition: rtfgen.cpp:1206
RTFGenerator::endIndexKey
void endIndexKey()
Definition: rtfgen.cpp:1175
DotClassGraph::writeGraph
QCString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const QCString &path, const QCString &fileName, const QCString &relPath, bool TBRank=TRUE, bool imageMap=TRUE, int graphId=-1)
Definition: dotclassgraph.cpp:447
EOF_Rtf
@ EOF_Rtf
Definition: dotgraph.h:28
RTFGenerator::RTFListItemInfo::number
int number
Definition: rtfgen.h:318
isClassDocumentation
@ isClassDocumentation
Definition: index.h:131
isModuleDocumentation
@ isModuleDocumentation
Definition: index.h:128
RTFGenerator::endMemberList
void endMemberList()
Definition: rtfgen.cpp:1783
isConceptIndex
@ isConceptIndex
Definition: index.h:123
RTFGenerator::startFontClass
void startFontClass(const QCString &)
Definition: rtfgen.cpp:2743
Rtf_Style_Default::definition
const char * definition
Definition: rtfstyle.h:42
Translator::trEnumerationValues
virtual QCString trEnumerationValues()=0
RTFGenerator::startProjectNumber
void startProjectNumber()
Definition: rtfgen.cpp:393
Translator::trConceptIndex
virtual QCString trConceptIndex()=0
err
void err(const char *fmt,...)
Definition: message.cpp:203
RTFGenerator::endDotGraph
void endDotGraph(DotClassGraph &)
Definition: rtfgen.cpp:2156
TextStream
Text streaming class that buffers data.
Definition: textstream.h:33
Doxygen::dirLinkedMap
static DirLinkedMap * dirLinkedMap
Definition: doxygen.h:109
rtf_company
QCString rtf_company
Definition: rtfstyle.cpp:26
portable_iconv_open
void * portable_iconv_open(const char *tocode, const char *fromcode)
Translator::trRTFTableOfContents
virtual QCString trRTFTableOfContents()=0
RTFGenerator::writeStyleInfo
void writeStyleInfo(int part)
Definition: rtfgen.cpp:988
Rtf_Style_Default
Definition: rtfstyle.h:38
RTFGenerator::endConstraintType
void endConstraintType()
Definition: rtfgen.cpp:2539
RTFGenerator::startCodeFragment
void startCodeFragment(const QCString &style)
Definition: rtfgen.cpp:1750
RTFGenerator::startMemberGroupDocs
void startMemberGroupDocs()
Definition: rtfgen.cpp:2369
RTFGenerator::codify
void codify(const QCString &text)
Definition: rtfgen.cpp:1644
filename.h
TextStream::flush
void flush()
Flushes the buffer.
Definition: textstream.h:188
DotDirDeps::writeGraph
QCString writeGraph(TextStream &out, GraphOutputFormat gf, EmbeddedOutputFormat ef, const QCString &path, const QCString &fileName, const QCString &relPath, bool writeImageMap=TRUE, int graphId=-1, bool linkRelations=TRUE)
Definition: dotdirdeps.cpp:432
RTFGenerator::endInlineMemberDoc
void endInlineMemberDoc()
Definition: rtfgen.cpp:2670
SectionType
SectionType
enum representing the various types of sections and entities that can be referred to.
Definition: section.h:28
RTFGenerator::startGroupHeader
void startGroupHeader(int)
Definition: rtfgen.cpp:1392
RTFGenerator::endParagraph
void endParagraph()
Definition: rtfgen.cpp:1966
RTFGenerator::writeChar
void writeChar(char c)
Definition: rtfgen.cpp:1679
Translator::trFileDocumentation
virtual QCString trFileDocumentation()=0
RTFGenerator::endDescItem
void endDescItem()
Definition: rtfgen.cpp:1533
RTFGenerator::startDescTable
void startDescTable(const QCString &title)
Definition: rtfgen.cpp:1793
mainPageHasTitle
bool mainPageHasTitle()
Definition: util.cpp:7027
RTFGenerator::startMemberDoc
void startMemberDoc(const QCString &, const QCString &, const QCString &, const QCString &, int, int, bool)
Definition: rtfgen.cpp:1419
Debug::isFlagSet
static bool isFlagSet(DebugMask mask)
Definition: debug.cpp:99
RTFGenerator::endIndexValue
void endIndexValue(const QCString &, bool)
Definition: rtfgen.cpp:1187
DBG_RTF
#define DBG_RTF(x)
Definition: rtfgen.cpp:54
StyleData::definition
const char * definition() const
Definition: rtfstyle.h:60
RTFGenerator::startIndexKey
void startIndexKey()
Definition: rtfgen.cpp:1169
preProcessFile
static bool preProcessFile(Dir &d, const QCString &infName, TextStream &t, bool bIncludeHeader=TRUE)
VERY brittle routine inline RTF's included by other RTF's.
Definition: rtfgen.cpp:2084
RTFGenerator::writeObjectLink
void writeObjectLink(const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name)
Definition: rtfgen.cpp:1266
RTFGenerator::startIndexSection
void startIndexSection(IndexSections)
Definition: rtfgen.cpp:404
RTFGenerator::endIndexListItem
void endIndexListItem()
Definition: rtfgen.cpp:2571
RTFGenerator::setSourceFileName
void setSourceFileName(const QCString &sourceFileName)
Definition: rtfgen.cpp:97
Doxygen::inputNameLinkedMap
static FileNameLinkedMap * inputNameLinkedMap
Definition: doxygen.h:88
RTFGenerator::endMemberGroup
void endMemberGroup(bool)
Definition: rtfgen.cpp:2388
RTFGenerator::endSubsection
void endSubsection()
Definition: rtfgen.cpp:1215
RTFGenerator::newParagraph
void newParagraph()
Definition: rtfgen.cpp:1948
StyleData
Definition: rtfstyle.h:48
rtf_keywords
QCString rtf_keywords
Definition: rtfstyle.cpp:32
RTFGenerator::~RTFGenerator
virtual ~RTFGenerator()
Definition: rtfgen.cpp:88
testRTFOutput
void testRTFOutput(const QCString &name)
Tests the integrity of the result by counting brackets.
Definition: rtfgen.cpp:2252
uint
unsigned uint
Definition: qcstring.h:40
rtfFormatBmkStr
QCString rtfFormatBmkStr(const QCString &name)
Definition: util.cpp:5230
RTFGenerator::rtf_DList_DepthStyle
QCString rtf_DList_DepthStyle()
Definition: rtfgen.cpp:1913
OutputGenerator::m_t
TextStream m_t
Definition: outputgen.h:511
RTFGenerator::endInlineMemberName
void endInlineMemberName()
Definition: rtfgen.cpp:2658
dot.h
RTFGenerator::endDescTableRow
void endDescTableRow()
Definition: rtfgen.cpp:1831
DotInclDepGraph::writeGraph
QCString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const QCString &path, const QCString &fileName, const QCString &relPath, bool writeImageMap=TRUE, int graphId=-1)
Definition: dotincldepgraph.cpp:184
RTFGenerator::m_sourceFileName
QCString m_sourceFileName
Definition: rtfgen.h:304
MemberDef
A model of a class/file/namespace member symbol.
Definition: memberdef.h:45
dateToString
QCString dateToString(bool includeTime)
Definition: util.cpp:1470
RTFGenerator::startDescList
void startDescList(SectionTypes)
Definition: rtfgen.cpp:1560
RTFGenerator::endDescription
void endDescription()
Definition: rtfgen.cpp:1519
isNamespaceDocumentation
@ isNamespaceDocumentation
Definition: index.h:130
Dir::rename
bool rename(const std::string &orgName, const std::string &newName, bool acceptsAbsPath=true) const
Definition: dir.cpp:263
rtf_Style
StyleDataMap rtf_Style
Definition: rtfstyle.cpp:313
Translator::trDirDocumentation
virtual QCString trDirDocumentation()=0
RTFGenerator::writeDoc
void writeDoc(DocNode *, const Definition *, const MemberDef *, int)
Definition: rtfgen.cpp:2473
classlist.h
RTFGenerator::indentLevel
int indentLevel() const
Definition: rtfgen.cpp:1861
Config_getInt
#define Config_getInt(name)
Definition: config.h:34
isDirIndex
@ isDirIndex
Definition: index.h:121
uchar
unsigned char uchar
Definition: qcstring.h:38
Translator::trVersion
virtual QCString trVersion()=0
RTFGenerator::operator=
RTFGenerator & operator=(const RTFGenerator &)
Definition: rtfgen.cpp:77
QCString::left
QCString left(size_t len) const
Definition: qcstring.h:212
message.h
SectionType::Subsubsection
@ Subsubsection
Translator::trDirIndex
virtual QCString trDirIndex()=0
isEndIndex
@ isEndIndex
Definition: index.h:137
RTFGenerator::endIndent
void endIndent()
Definition: rtfgen.cpp:1505
RTFGenerator::decIndentLevel
void decIndentLevel()
Definition: rtfgen.cpp:1875
RTFGenerator::rtf_LCList_DepthStyle
QCString rtf_LCList_DepthStyle()
Definition: rtfgen.cpp:1893
RTFGenerator::startMemberDocSimple
void startMemberDocSimple(bool)
Definition: rtfgen.cpp:2593
RTFGenerator::endPageRef
void endPageRef(const QCString &, const QCString &)
Definition: rtfgen.cpp:1305
DotCallGraph
Representation of an call graph
Definition: dotcallgraph.h:26
RTFGenerator::endMemberDoc
void endMemberDoc(bool)
Definition: rtfgen.cpp:1441
RTFGenerator::addIndexItem
void addIndexItem(const QCString &, const QCString &)
Definition: rtfgen.cpp:1482
loadExtensions
void loadExtensions(const QCString &name)
Definition: rtfstyle.cpp:315
loadStylesheet
void loadStylesheet(const QCString &name, StyleDataMap &map)
Definition: rtfstyle.cpp:273
RTFGenerator::startParameterType
void startParameterType(bool, const QCString &)
Definition: rtfgen.cpp:2444
RTFGenerator::beginRTFChapter
void beginRTFChapter()
Definition: rtfgen.cpp:331
RTFGenerator::endDescTableData
void endDescTableData()
Definition: rtfgen.cpp:1853
theTranslator
Translator * theTranslator
Definition: language.cpp:156
Dir::absPath
std::string absPath() const
Definition: dir.cpp:305
RTFGenerator::endFontClass
void endFontClass()
Definition: rtfgen.cpp:2761
RTFGenerator::writeLineNumber
void writeLineNumber(const QCString &, const QCString &, const QCString &, int l, bool)
Definition: rtfgen.cpp:2676
RTFGenerator::startFile
void startFile(const QCString &name, const QCString &manName, const QCString &title, int id)
Definition: rtfgen.cpp:371
Doxygen::groupLinkedMap
static GroupLinkedMap * groupLinkedMap
Definition: doxygen.h:96
RTFGenerator::m_doxyCodeLineOpen
bool m_doxyCodeLineOpen
Definition: rtfgen.h:310
RTFGenerator::startTitleHead
void startTitleHead(const QCString &)
Definition: rtfgen.cpp:1355
rtf_documentType
QCString rtf_documentType
Definition: rtfstyle.cpp:30
RTFGenerator::startMemberDescription
void startMemberDescription(const QCString &, const QCString &, bool)
Definition: rtfgen.cpp:1540
RTFGenerator::startMemberItem
void startMemberItem(const QCString &, int, const QCString &)
Definition: rtfgen.cpp:1709
doxygen.h
RTFGenerator::startDescTableTitle
void startDescTableTitle()
Definition: rtfgen.cpp:1835
RTFGenerator::endFile
void endFile()
Definition: rtfgen.cpp:384
language.h
stripPath
QCString stripPath(const QCString &s)
Definition: util.cpp:5318
RTFGenerator::writeString
void writeString(const QCString &text)
Definition: rtfgen.cpp:999
RTFGenerator::startBold
void startBold()
Definition: rtfgen.h:150
RTFGenerator::startInlineMemberDoc
void startInlineMemberDoc()
Definition: rtfgen.cpp:2664
RTFGenerator::writeEndAnnoItem
void writeEndAnnoItem(const QCString &name)
Definition: rtfgen.cpp:1153
Translator::trPageIndex
virtual QCString trPageIndex()=0
RTFGenerator::init
static void init()
Definition: rtfgen.cpp:170
RTFGenerator::endMemberSubtitle
void endMemberSubtitle()
Definition: rtfgen.cpp:1980
RTFGenerator::startIndexListItem
void startIndexListItem()
Definition: rtfgen.cpp:2566
BaseOutputDocInterface::SectionTypes
SectionTypes
Definition: outputgen.h:166
RTFGenerator::RTFListItemInfo::type
char type
Definition: rtfgen.h:319
RTFGenerator::endMemberDocSimple
void endMemberDocSimple(bool)
Definition: rtfgen.cpp:2634
Translator::trMainPage
virtual QCString trMainPage()=0
RTFGenerator::endMemberGroupHeader
void endMemberGroupHeader()
Definition: rtfgen.cpp:2362
OutputGenerator::dir
QCString dir() const
Definition: outputgen.cpp:80
RTFGenerator::startConstraintList
void startConstraintList(const QCString &)
Definition: rtfgen.cpp:2505
RTFGenerator::endEmphasis
void endEmphasis()
Definition: rtfgen.h:149
docparser.h
TRUE
#define TRUE
Definition: qcstring.h:36
RTFGenerator::cleanup
void cleanup()
Definition: rtfgen.cpp:211
rtf_author
QCString rtf_author
Definition: rtfstyle.cpp:28
RTFGenerator::endCallGraph
void endCallGraph(DotCallGraph &)
Definition: rtfgen.cpp:2210
RTFGenerator::startInlineHeader
void startInlineHeader()
Definition: rtfgen.cpp:2577
Dir::setCurrent
static bool setCurrent(const std::string &path)
Definition: dir.cpp:290
isModuleIndex
@ isModuleIndex
Definition: index.h:120
RTFGenerator::endDirDepGraph
void endDirDepGraph(DotDirDeps &g)
Definition: rtfgen.cpp:2232
RTFGenerator::endInlineMemberType
void endInlineMemberType()
Definition: rtfgen.cpp:2646
dateToRTFDateString
static QCString dateToRTFDateString()
Definition: rtfgen.cpp:56
RTFGenerator::writeNonBreakableSpace
void writeNonBreakableSpace(int)
Definition: rtfgen.cpp:1766
RTFGenerator::startDotGraph
void startDotGraph()
Definition: rtfgen.cpp:2151
RTFGenerator::rtfwriteRuler_thick
void rtfwriteRuler_thick()
Definition: rtfgen.cpp:2493
SectionType::Page
@ Page
isClassHierarchyIndex
@ isClassHierarchyIndex
Definition: index.h:124
RTFGenerator::startTypewriter
void startTypewriter()
Definition: rtfgen.h:108
validatingParseText
DocText * validatingParseText(IDocParser &parserIntf, const QCString &input)
Definition: docparser.cpp:7621
ClassDiagram
Class representing a built-in class diagram.
Definition: diagram.h:29
SectionType::Subsection
@ Subsection
DotClassGraph
Representation of a class inheritance or dependency graph
Definition: dotclassgraph.h:28
RTFGenerator::endMemberGroupDocs
void endMemberGroupDocs()
Definition: rtfgen.cpp:2375
dirdef.h
dotclassgraph.h
rtf_logoFilename
QCString rtf_logoFilename
Definition: rtfstyle.cpp:27
RTFGenerator::lastIndexPage
void lastIndexPage()
Definition: rtfgen.cpp:976
RTFGenerator::writeRTFReference
void writeRTFReference(const QCString &label)
Definition: rtfgen.cpp:1743
RTFGenerator::startIndexItem
void startIndexItem(const QCString &ref, const QCString &file)
Definition: rtfgen.cpp:1074
RTFGenerator::startParagraph
void startParagraph(const QCString &classDef)
Definition: rtfgen.cpp:1958
clearSubDirs
void clearSubDirs(const Dir &d)
Definition: util.cpp:3704
RTFGenerator::endConstraintParam
void endConstraintParam()
Definition: rtfgen.cpp:2526
RTFGenerator::startMemberGroup
void startMemberGroup()
Definition: rtfgen.cpp:2382
utf8.h
Various UTF8 related helper functions.
writeUTF8Char
const char * writeUTF8Char(TextStream &t, const char *s)
Writes the UTF8 character pointed to by s to stream t and returns a pointer to the next character.
Definition: utf8.cpp:197
RTFGenerator::startMemberList
void startMemberList()
Definition: rtfgen.cpp:1772
RTFGenerator::startTextBlock
void startTextBlock(bool dense)
Definition: rtfgen.cpp:1925
rtf_documentId
QCString rtf_documentId
Definition: rtfstyle.cpp:31
RTFGenerator::startPageRef
void startPageRef()
Definition: rtfgen.cpp:1299
RTFGenerator::endIndexList
void endIndexList()
Definition: rtfgen.cpp:1014
RTFGenerator::endConstraintList
void endConstraintList()
Definition: rtfgen.cpp:2557
RTFGenerator::startDoxyAnchor
void startDoxyAnchor(const QCString &, const QCString &, const QCString &, const QCString &, const QCString &)
Definition: rtfgen.cpp:1452
OutputGenerator
Abstract output generator.
Definition: outputgen.h:330
isTitlePageAuthor
@ isTitlePageAuthor
Definition: index.h:118
RTFGenerator::startConstraintType
void startConstraintType()
Definition: rtfgen.cpp:2533
substitute
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
Definition: qcstring.cpp:465
GOF_BITMAP
@ GOF_BITMAP
Definition: dotgraph.h:27
Translator::trRTFCharSet
virtual QCString trRTFCharSet()=0
RTFGenerator::startIndexList
void startIndexList()
Definition: rtfgen.cpp:1004
Translator::trModuleDocumentation
virtual QCString trModuleDocumentation()=0
rtf_title
QCString rtf_title
Definition: rtfstyle.cpp:23
dotcallgraph.h
RTFGenerator::startGroupCollaboration
void startGroupCollaboration()
Definition: rtfgen.cpp:2197
RTFGenerator::preProcessFileInplace
static bool preProcessFileInplace(const QCString &path, const QCString &name)
This is an API to a VERY brittle RTF preprocessor that combines nested RTF files.
Definition: rtfgen.cpp:2297
RTFGenerator::startExamples
void startExamples()
Definition: rtfgen.cpp:2395
RTFGenerator::endDescTable
void endDescTable()
Definition: rtfgen.cpp:1821
isFileDocumentation
@ isFileDocumentation
Definition: index.h:133
Config_getBool
#define Config_getBool(name)
Definition: config.h:33
RTFGenerator::rtfwriteRuler_thin
void rtfwriteRuler_thin()
Definition: rtfgen.cpp:2499
RTFGenerator::endInlineHeader
void endInlineHeader()
Definition: rtfgen.cpp:2585
Translator::trRTFansicp
virtual QCString trRTFansicp()=0
rtfgen.h
msg
void msg(const char *fmt,...)
Definition: message.cpp:53
DotCallGraph::writeGraph
QCString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const QCString &path, const QCString &fileName, const QCString &relPath, bool writeImageMap=TRUE, int graphId=-1)
Definition: dotcallgraph.cpp:183
IndexSections
IndexSections
Definition: index.h:115
RTFGenerator::endGroupCollaboration
void endGroupCollaboration(DotGroupCollaboration &g)
Definition: rtfgen.cpp:2201
RTFGenerator::type
OutputType type() const
Definition: rtfgen.h:53
term
void term(const char *fmt,...)
Definition: message.cpp:220
RTFGenerator::startInlineMemberType
void startInlineMemberType()
Definition: rtfgen.cpp:2640
SectionType::Section
@ Section
RTFGenerator::m_relPath
QCString m_relPath
Definition: rtfgen.h:309
RTFGenerator::startDescTableData
void startDescTableData()
Definition: rtfgen.cpp:1847
isLeadBytes
bool isLeadBytes(int c)
Definition: rtfgen.cpp:1987
Translator::trModulesIndex
virtual QCString trModulesIndex()=0
RTFGenerator::endHtmlLink
void endHtmlLink()
Definition: rtfgen.cpp:1117
RTFGenerator::RTFListItemInfo::isEnum
bool isEnum
Definition: rtfgen.h:317
isPageDocumentation
@ isPageDocumentation
Definition: index.h:135
RTFGenerator::startConstraintParam
void startConstraintParam()
Definition: rtfgen.cpp:2520
isPageDocumentation2
@ isPageDocumentation2
Definition: index.h:136
Translator::trExampleDocumentation
virtual QCString trExampleDocumentation()=0
qPrint
const char * qPrint(const char *s)
Definition: qcstring.h:589
RTFGenerator::rtf_Code_DepthStyle
QCString rtf_Code_DepthStyle()
Definition: rtfgen.cpp:1919
rtf_Style_Default
Rtf_Style_Default rtf_Style_Default[]
Definition: rtfstyle.cpp:88
RTFGenerator::beginRTFSection
void beginRTFSection()
Definition: rtfgen.cpp:351
Config_getString
#define Config_getString(name)
Definition: config.h:32
RTFGenerator::writePageLink
void writePageLink(const QCString &, bool)
Definition: rtfgen.cpp:968
rtf_manager
QCString rtf_manager
Definition: rtfstyle.cpp:29
RTFGenerator::startDescTableRow
void startDescTableRow()
Definition: rtfgen.cpp:1827
RTFGenerator::endExamples
void endExamples()
Definition: rtfgen.cpp:2410
RTFGenerator::endBold
void endBold()
Definition: rtfgen.h:151
isMainPage
@ isMainPage
Definition: index.h:119
config.h
DotGroupCollaboration
Representation of a group collaboration graph
Definition: dotgroupcollaboration.h:28
Doxygen::namespaceLinkedMap
static NamespaceLinkedMap * namespaceLinkedMap
Definition: doxygen.h:97
ASSERT
#define ASSERT(x)
Definition: qcstring.h:44
groupdef.h
QCString::data
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string
Definition: qcstring.h:153
makeIndexName
static QCString makeIndexName(const QCString &s, int i)
Definition: rtfgen.cpp:218
RTFGenerator::endParameterType
void endParameterType()
Definition: rtfgen.cpp:2453
RTFGenerator::endTextBlock
void endTextBlock(bool)
Definition: rtfgen.cpp:1940
Dir::exists
bool exists() const
Definition: dir.cpp:199
RTFGenerator::startSubsubsection
void startSubsubsection()
Definition: rtfgen.cpp:1221
DotInclDepGraph
Representation of an include dependency graph
Definition: dotincldepgraph.h:30
DocNode::accept
virtual void accept(DocVisitor *v)=0
rtfdocvisitor.h
RTFGenerator::endSubsubsection
void endSubsubsection()
Definition: rtfgen.cpp:1230
RTFGenerator::writeCodeLink
void writeCodeLink(CodeSymbolType type, const QCString &ref, const QCString &file, const QCString &anchor, const QCString &name, const QCString &tooltip)
Definition: rtfgen.cpp:1322
OutputGenerator::operator=
OutputGenerator & operator=(const OutputGenerator &o)
Definition: outputgen.cpp:48
CodeSymbolType::Default
@ Default
Debug::Rtf
@ Rtf
Definition: debug.h:44
RTFDocVisitor
Concrete visitor implementation for RTF output.
Definition: rtfdocvisitor.h:31
Translator::trDesignUnitIndex
virtual QCString trDesignUnitIndex()=0
RTFGenerator::endCodeLine
void endCodeLine()
Definition: rtfgen.cpp:2723
RTFGenerator::m_omitParagraph
bool m_omitParagraph
Definition: rtfgen.h:307
RTFGenerator::startMemberGroupHeader
void startMemberGroupHeader(bool)
Definition: rtfgen.cpp:2354
RTFGenerator::lineBreak
void lineBreak(const QCString &style=QCString())
Definition: rtfgen.cpp:992
OutputGenerator::endPlainFile
void endPlainFile()
Definition: outputgen.cpp:72
RTFGenerator::writeAnchor
void writeAnchor(const QCString &fileName, const QCString &name)
Definition: rtfgen.cpp:1721
rtf_subject
QCString rtf_subject
Definition: rtfstyle.cpp:24
portable.h
Portable versions of functions that are platform dependent.
RTFGenerator::startTextLink
void startTextLink(const QCString &f, const QCString &anchor)
Definition: rtfgen.cpp:1236
rtf_comments
QCString rtf_comments
Definition: rtfstyle.cpp:25
RTFGenerator::endTitleHead
void endTitleHead(const QCString &, const QCString &name)
Definition: rtfgen.cpp:1363
rtf_pageWidth
const int rtf_pageWidth
Definition: rtfstyle.h:25
portable_iconv_close
int portable_iconv_close(void *cd)
RTFGenerator::startEmphasis
void startEmphasis()
Definition: rtfgen.h:148
Translator::trExamples
virtual QCString trExamples()=0
RTFGenerator::startItemListItem
void startItemListItem()
Definition: rtfgen.cpp:1050
dir.h
Translator::trCompoundIndexFortran
virtual QCString trCompoundIndexFortran()=0
RTFGenerator::endTextLink
void endTextLink()
Definition: rtfgen.cpp:1258
Doxygen::classLinkedMap
static ClassLinkedMap * classLinkedMap
Definition: doxygen.h:78
StyleData::reference
const char * reference() const
Definition: rtfstyle.h:59
Dir::mkdir
bool mkdir(const std::string &path, bool acceptsAbsPath=true) const
Definition: dir.cpp:237
Translator::trNamespaceIndex
virtual QCString trNamespaceIndex()=0
util.h
A bunch of utility functions.
createSubDirs
void createSubDirs(const Dir &d)
Definition: util.cpp:3677
Translator::trFileIndex
virtual QCString trFileIndex()=0
RTFGenerator::startIndent
void startIndent()
Definition: rtfgen.cpp:1497
Translator::trModuleIndex
virtual QCString trModuleIndex()=0
CodeSymbolType
CodeSymbolType
Definition: types.h:204
RTFGenerator::endIndexItem
void endIndexItem(const QCString &ref, const QCString &file)
Definition: rtfgen.cpp:1085
RTFGenerator::endItemListItem
void endItemListItem()
Definition: rtfgen.cpp:1069
RTFGenerator::startDescription
void startDescription()
Definition: rtfgen.cpp:1512
QCString::right
QCString right(size_t len) const
Definition: qcstring.h:217
OutputGenerator::startPlainFile
void startPlainFile(const QCString &name)
Definition: outputgen.cpp:60
QCString::prepend
QCString & prepend(const char *s)
Definition: qcstring.h:339
Translator::trCompoundIndex
virtual QCString trCompoundIndex()=0
diagram.h
RTFGenerator::endLabels
void endLabels()
Definition: rtfgen.cpp:2739
encodeForOutput
static void encodeForOutput(TextStream &t, const QCString &s)
Definition: rtfgen.cpp:2019
QCString::sprintf
QCString & sprintf(const char *format,...)
Definition: qcstring.cpp:24
debug.h
RTFGenerator::endClassDiagram
void endClassDiagram(const ClassDiagram &, const QCString &filename, const QCString &name)
Definition: rtfgen.cpp:1692
RTFGenerator::startMemberSubtitle
void startMemberSubtitle()
Definition: rtfgen.cpp:1973
RTFGenerator::setRelativePath
void setRelativePath(const QCString &path)
Definition: rtfgen.cpp:92
RTFGenerator::startDirDepGraph
void startDirDepGraph()
Definition: rtfgen.cpp:2227
Doxygen::spaces
static QCString spaces
Definition: doxygen.h:116
vhdldocgen.h
createDocParser
std::unique_ptr< IDocParser > createDocParser()
Definition: docparser.cpp:179
RTFGenerator::writeExtensionsFile
static void writeExtensionsFile(TextStream &t)
Definition: rtfgen.cpp:118
FALSE
#define FALSE
Definition: qcstring.h:33
RTFGenerator::endSection
void endSection(const QCString &, SectionType)
Definition: rtfgen.cpp:1604
Translator::trHierarchicalIndex
virtual QCString trHierarchicalIndex()=0
Doxygen::exampleLinkedMap
static PageLinkedMap * exampleLinkedMap
Definition: doxygen.h:81
RTFGenerator::startDescForItem
void startDescForItem()
Definition: rtfgen.cpp:1569
isConceptDocumentation
@ isConceptDocumentation
Definition: index.h:132
RTFGenerator::endInclDepGraph
void endInclDepGraph(DotInclDepGraph &)
Definition: rtfgen.cpp:2180
QCString
This is an alternative implementation of QCString.
Definition: qcstring.h:108
RTFGenerator::endMemberItem
void endMemberItem()
Definition: rtfgen.cpp:1715