21#include <unordered_map>
65 case TIMESTAMP_t::YES:
66 case TIMESTAMP_t::DATETIME:
67 result.
sprintf(
"\\yr%d\\mo%d\\dy%d\\hr%d\\min%d\\sec%d",
68 tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday,
69 tm.tm_hour, tm.tm_min, tm.tm_sec);
71 case TIMESTAMP_t::DATE:
72 result.
sprintf(
"\\yr%d\\mo%d\\dy%d",
73 tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday);
78 return "{\\creatim " + result +
"}\n";
87 const char *p=str.
data();
94 case '{': result +=
"\\{";
break;
95 case '}': result +=
"\\}";
break;
96 case '\\': result +=
"\\\\";
break;
97 default: result += c;
break;
107 result+=
static_cast<char>(i+
'0');
138 *
m_t <<
"{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
141 *
m_t <<
"}{\\fldrslt {\\cs37\\ul\\cf2 ";
161 const char *p=str.
data();
173 int spacesToNextTabStop = tabSize - (
m_col%tabSize);
174 while (spacesToNextTabStop--)
184 case '\n': *
m_t <<
"\\par\n";
187 case '{': *
m_t <<
"\\{";
m_col++;
break;
188 case '}': *
m_t <<
"\\}";
m_col++;
break;
189 case '\\': *
m_t <<
"\\\\";
m_col++;
break;
219 DBG_RTF(*
m_t <<
"{\\comment (startCodeFragment) }\n")
232 DBG_RTF(*
m_t <<
"{\\comment (endCodeFragment) }\n")
251 lineAnchor.
sprintf(
"_l%05d",l);
254 bool showTarget = rtfHyperlinks && !lineAnchor.
empty() && writeLineAnchor;
257 *
m_t <<
"{\\bkmkstart ";
260 *
m_t <<
"{\\bkmkend ";
264 if (!fileName.
empty())
299 static const std::unordered_map<std::string,int> map {
301 {
"keywordtype", 18 },
302 {
"keywordflow", 19 },
304 {
"preprocessor", 21 },
305 {
"stringliteral", 22 },
306 {
"charliteral", 23 },
309 {
"vhdlkeyword", 26 },
312 auto it = map.find(name.
str());
317 *
m_t <<
"{\\cf" << cod <<
" ";
396 t <<
"# Generated by doxygen " << getDoxygenVersion() <<
"\n\n";
397 t <<
"# This file describes styles used for generating RTF output.\n";
398 t <<
"# All text after a hash (#) is considered a comment and will be ignored.\n";
399 t <<
"# Remove a hash to activate a line.\n\n";
411 t <<
"# Generated by doxygen " << getDoxygenVersion() <<
"\n\n";
412 t <<
"# This file describes extensions used for generating RTF output.\n";
413 t <<
"# All text after a hash (#) is considered a comment and will be ignored.\n";
414 t <<
"# Remove a hash to activate a line.\n\n";
416 t <<
"# Overrides the project title.\n";
418 t <<
"#Title = \n\n";
420 t <<
"# Name of the company that produced this document.\n";
421 t <<
"#Company = \n\n";
423 t <<
"# Filename of a company or project logo.\n";
424 t <<
"#LogoFilename = \n\n";
426 t <<
"# Author of the document.\n";
427 t <<
"#Author = \n\n";
429 t <<
"# Type of document (e.g. Design Specification, User Manual, etc.).\n";
430 t <<
"#DocumentType = \n\n";
432 t <<
"# Document tracking number.\n";
433 t <<
"#DocumentId = \n\n";
435 t <<
"# Name of the author's manager.\n";
436 t <<
"# This field is not displayed in the document itself, but it is \n";
437 t <<
"# available in the information block of the rtf file. In Microsoft \n";
438 t <<
"# Word, it is available under File:Properties.\n";
439 t <<
"#Manager = \n\n";
441 t <<
"# Subject of the document.\n";
442 t <<
"# This field is not displayed in the document itself, but it is \n";
443 t <<
"# available in the information block of the rtf file. In Microsoft \n";
444 t <<
"# Word, it is available under File:Properties.\n";
445 t <<
"#Subject = \n\n";
447 t <<
"# Comments regarding the document.\n";
448 t <<
"# This field is not displayed in the document itself, but it is \n";
449 t <<
"# available in the information block of the rtf file. In Microsoft \n";
450 t <<
"# Word, it is available under File:Properties.\n";
451 t <<
"#Comments = \n\n";
453 t <<
"# Keywords associated with the document.\n";
454 t <<
"# This field is not displayed in the document itself, but it is \n";
455 t <<
"# available in the information block of the rtf file. In Microsoft \n";
456 t <<
"# Word, it is available under File:Properties.\n";
457 t <<
"#Keywords = \n\n";
467 term(
"Could not create output directory {}\n",
dir);
476 err(
"Internal: rtf_Style_Default[{}] has no definition.\n", def->
name);
487 if (!rtfStyleSheetFile.
empty())
494 if (!rtfExtensionsFile.
empty())
503 err(
"Logo '{}' specified by 'LogoFilename' in the rtf extension file '{}' does not exist!\n",
532 m_t <<
"\\uc1 \\deff0\\deflang1033\\deflangfe1033\n";
534 DBG_RTF(
m_t <<
"{\\comment Beginning font list}\n")
535 m_t <<
"{\\fonttbl ";
537 m_t <<
"\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}\n";
539 m_t <<
"\\fprq2{\\*\\panose 020b0604020202020204}Arial;}\n";
541 m_t <<
"\\fprq1{\\*\\panose 02070309020205020404}Courier New;}\n";
542 m_t <<
"{\\f3\\froman\\fcharset2\\fprq2{\\*\\panose 05050102010706020507}Symbol;}\n";
545 m_t <<
"{\\colortbl;";
546 m_t <<
"\\red0\\green0\\blue0;";
547 m_t <<
"\\red0\\green0\\blue255;";
548 m_t <<
"\\red0\\green255\\blue255;";
549 m_t <<
"\\red0\\green255\\blue0;";
550 m_t <<
"\\red255\\green0\\blue255;";
551 m_t <<
"\\red255\\green0\\blue0;";
552 m_t <<
"\\red255\\green255\\blue0;";
553 m_t <<
"\\red255\\green255\\blue255;";
554 m_t <<
"\\red0\\green0\\blue128;";
555 m_t <<
"\\red0\\green128\\blue128;";
556 m_t <<
"\\red0\\green128\\blue0;";
557 m_t <<
"\\red128\\green0\\blue128;";
558 m_t <<
"\\red128\\green0\\blue0;";
559 m_t <<
"\\red128\\green128\\blue0;";
560 m_t <<
"\\red128\\green128\\blue128;";
561 m_t <<
"\\red192\\green192\\blue192;";
564 m_t <<
"\\red0\\green128\\blue0;";
565 m_t <<
"\\red96\\green64\\blue32;";
566 m_t <<
"\\rede0\\green128\\blue0;";
567 m_t <<
"\\red128\\green0\\blue0;";
568 m_t <<
"\\red128\\green96\\blue32;";
569 m_t <<
"\\red0\\green32\\blue128;";
570 m_t <<
"\\red0\\green128\\blue128;";
571 m_t <<
"\\red255\\green0\\blue255;";
572 m_t <<
"\\red0\\green0\\blue0;";
573 m_t <<
"\\red112\\green0\\blue112;";
574 m_t <<
"\\red255\\green0\\blue0;";
578 DBG_RTF(
m_t <<
"{\\comment Beginning style list}\n")
579 m_t <<
"{\\stylesheet\n";
580 m_t <<
"{\\widctlpar\\adjustright \\fs20\\cgrid \\snext0 Normal;}\n";
588 case PAPER_TYPE_t::a4:
m_t <<
"\\paperw11900\\paperh16840";
break;
589 case PAPER_TYPE_t::letter:
m_t <<
"\\paperw12240\\paperh15840";
break;
590 case PAPER_TYPE_t::legal:
m_t <<
"\\paperw12240\\paperh20160";
break;
591 case PAPER_TYPE_t::executive:
m_t <<
"\\paperw10440\\paperh15120";
break;
593 m_t <<
"\\margl1800\\margr1800\\margt1440\\margb1440\\gutter0\\ltrsect}\n";
596 unsigned maxIndex = 0;
597 for (
const auto &[name,data] :
rtf_Style)
599 uint32_t index = data.index();
600 if (index > maxIndex) maxIndex = index;
602 std::vector<const StyleData*> array(maxIndex + 1,
nullptr);
603 ASSERT(maxIndex < array.size());
605 for (
const auto &[name,data] :
rtf_Style)
607 uint32_t index = data.index();
608 if (array[index] !=
nullptr)
610 err(
"Style '{}' redefines \\s{}.\n", name, index);
612 array[index] = &data;
616 size_t size = array.size();
617 for(
size_t i = 0; i < size; i++)
630 m_t <<
"{\\*\\listtable" <<
"\n";
637 m_t <<
"\\listid" <<
id <<
"}" <<
"\n";
644 m_t <<
"\\listid" <<
id <<
"}" <<
"\n";
646 m_t <<
"{\\listoverridetable" <<
"\n";
653 m_t <<
"{\\listoverride\\listid" <<
id <<
"\\listoverridecount0\\ls" <<
id <<
"}" <<
"\n";
659 m_t <<
"{\\comment begin body}\n";
666 DBG_RTF(
m_t <<
"{\\comment BeginRTFChapter}\n")
673 m_t <<
"\\sect\\sbknone\n";
677 m_t <<
"\\sect\\sbkpage\n";
686 DBG_RTF(
m_t <<
"{\\comment BeginRTFSection}\n")
692 m_t <<
"\\sect\\sbknone\n";
697 m_t <<
"\\sect\\sbkpage\n";
729 DBG_RTF(
m_t <<
"{\\comment startProjectNumber }\n")
735 DBG_RTF(
m_t <<
"{\\comment endProjectNumber }\n")
751 m_t <<
"{\\title {\\comment ";
762 m_t <<
"{\\comment ";
790 DBG_RTF(
m_t <<
"{\\comment start classhierarchy}\n")
810 if (!gd->isReference())
823 if (!mod->isReference() && mod->isPrimaryInterface())
836 if (dd->isLinkableInProject())
849 if (nd->isLinkableInProject())
862 if (cd->isLinkableInProject())
875 if (cd->isLinkableInProject() &&
876 !cd->isImplicitTemplateInstance() &&
877 !cd->isEmbeddedInOuterScope() &&
893 for (
const auto &fd : *fn)
895 if (fd->isLinkableInProject() || fd->generateSourceFile())
940 m_t <<
"}" << projectName;
944 m_t <<
" doxygen " << getDoxygenVersion() <<
".}\n";
946 DBG_RTF(
m_t <<
"{\\comment end of infoblock}\n");
950 m_t <<
"\\sectd\\pgnlcrm\n";
951 m_t <<
"{\\footer "<<
rtf_Style[
"Footer"].reference() <<
"{\\chpgn}}\n";
953 DBG_RTF(
m_t <<
"{\\comment begin title page}\n")
958 m_t <<
"\\vertalc\\qc\\par\\par\\par\\par\\par\\par\\par\n";
962 m_t <<
"\" \\\\d \\\\*MERGEFORMAT} {\\fldrslt IMAGE }}\\par\\par\n";
973 m_t <<
"{\\field\\fldedit {\\*\\fldinst TITLE \\\\*MERGEFORMAT}{\\fldrslt " <<
rtf_title <<
"}}\\par\n";
981 m_t <<
"{\\field\\fldedit {\\*\\fldinst TITLE \\\\*MERGEFORMAT}{\\fldrslt ";
982 writeDoc(ast.get(),
nullptr,
nullptr,0,-1);
997 m_t <<
"\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\\par\n";
1002 m_t <<
"{\\field\\fldedit {\\*\\fldinst AUTHOR \\\\*MERGEFORMAT}{\\fldrslt "<<
rtf_author <<
" }}\\par\n";
1006 m_t <<
"{\\field\\fldedit {\\*\\fldinst AUTHOR \\\\*MERGEFORMAT}{\\fldrslt AUTHOR}}\\par\n";
1012 case TIMESTAMP_t::YES:
1013 case TIMESTAMP_t::DATETIME:
1014 m_t <<
"{\\field\\fldedit {\\*\\fldinst CREATEDATE \\\\*MERGEFORMAT}"
1017 case TIMESTAMP_t::DATE:
1018 m_t <<
"{\\field\\fldedit {\\*\\fldinst CREATEDATE \\\\*MERGEFORMAT}"
1021 case TIMESTAMP_t::NO:
1024 m_t <<
"\\page\\page";
1025 DBG_RTF(
m_t <<
"{\\comment End title page}\n")
1028 DBG_RTF(
m_t <<
"{\\comment Table of contents}\n")
1029 m_t <<
"\\vertalt\n";
1034 m_t <<
"{\\field\\fldedit {\\*\\fldinst TOC \\\\f \\\\*MERGEFORMAT}{\\fldrslt Table of contents}}\\par\n";
1047 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"topics.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1052 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"modules.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1057 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"dirs.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1070 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"namespaces.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1075 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"concepts.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1080 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"hierarchy.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1096 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"annotated.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1101 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"files.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1106 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"pages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1113 if (!gd->isReference() && !gd->isASubGroup())
1125 if (!mod->isReference() && mod->isPrimaryInterface())
1138 if (dd->isLinkableInProject())
1146 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
1147 m_t << dd->getOutputFileBase();
1148 m_t <<
".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1158 if (nd->isLinkableInProject() && !nd->isAlias())
1166 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
1167 m_t << nd->getOutputFileBase();
1168 m_t <<
".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1178 if (cd->isLinkableInProject() && !cd->isAlias())
1186 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
1187 m_t << cd->getOutputFileBase();
1188 m_t <<
".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1206 if (cd->isLinkableInProject() &&
1207 !cd->isImplicitTemplateInstance() &&
1208 !cd->isEmbeddedInOuterScope() &&
1218 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
1219 m_t << cd->getOutputFileBase();
1220 m_t <<
".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1232 for (
const auto &fd : *fn)
1234 if (fd->isLinkableInProject())
1242 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
1243 m_t << fd->getOutputFileBase();
1244 m_t <<
".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1246 if (fd->generateSourceFile())
1254 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
1255 m_t << fd->getSourceFileBase();
1256 m_t <<
".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1275 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
1276 m_t << pd->getOutputFileBase();
1277 m_t <<
".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1286 if (!pd->getGroupDef() && !pd->isReference() && !pd->hasParentPage()
1302 m_t <<
"{\\field\\fldedit {\\*\\fldinst INDEX \\\\c2 \\\\*MERGEFORMAT}{\\fldrslt INDEX}}\n";
1311 m_t <<
"{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
1313 m_t <<
".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
1318 DBG_RTF(
m_t <<
"{\\comment Beginning Body of RTF Document}\n")
1320 m_t <<
"\\sect \\sbkpage \\pgndec \\pgnrestart\n";
1321 m_t <<
"\\sect \\sectd \\sbknone\n";
1324 m_t <<
"{\\footer "<<
rtf_Style[
"Footer"].reference() <<
"{\\chpgn}}\n";
1334 DBG_RTF(
m_t <<
"{\\comment (lineBreak)}" <<
"\n")
1346 DBG_RTF(
m_t <<
"{\\comment (startIndexList)}\n")
1356 DBG_RTF(
m_t <<
"{\\comment (endIndexList)}\n")
1372 DBG_RTF(
m_t <<
"{\\comment (startItemList level=" << level <<
") }\n")
1392 DBG_RTF(
m_t <<
"{\\comment (startItemListItem)}\n")
1411 DBG_RTF(
m_t <<
"{\\comment (endItemListItem)}\n")
1416 DBG_RTF(
m_t <<
"{\\comment (startIndexItem)}\n")
1427 DBG_RTF(
m_t <<
"{\\comment (endIndexItem)}\n")
1444 DBG_RTF(
m_t <<
"{\\comment (writeStartAnnoItem)}\n")
1449 m_t <<
"{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
1452 m_t <<
"}{\\fldrslt {\\cs37\\ul\\cf2 ";
1467 DBG_RTF(
m_t <<
"{\\comment (startIndexKey)}\n")
1473 DBG_RTF(
m_t <<
"{\\comment (endIndexKey)}\n")
1478 DBG_RTF(
m_t <<
"{\\comment (startIndexValue)}\n")
1480 if (hasBrief)
m_t <<
"(";
1485 DBG_RTF(
m_t <<
"{\\comment (endIndexValue)}\n")
1486 if (hasBrief)
m_t <<
")";
1506 DBG_RTF(
m_t <<
"{\\comment Begin SubSubSection}\n")
1527 if (!anchor.
empty())
1533 m_t <<
"{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
1536 m_t <<
"}{\\fldrslt {\\cs37\\ul\\cf2 ";
1559 if (!anchor.
empty())
1565 result +=
"{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
1568 result +=
"}{\\fldrslt {\\cs37\\ul\\cf2 ";
1598 if (!clname.
empty())
1602 if (!anchor.
empty())
1614 DBG_RTF(
m_t <<
"{\\comment startTitleHead}\n")
1617 heading.
sprintf(
"Heading%d", level);
1630 m_t <<
"{\\tc\\tcl" << level <<
" \\v ";
1645 DBG_RTF(
m_t <<
"{\\comment startGroupHeader}\n")
1652 else if (extraIndent==1)
1665 DBG_RTF(
m_t <<
"{\\comment endGroupHeader}\n")
1678 DBG_RTF(
m_t <<
"{\\comment startMemberDoc}\n")
1679 if (!memname.
empty() && memname[0]!=
'@')
1716 DBG_RTF(
m_t <<
"{\\comment startDoxyAnchor}\n")
1726 if (!anchor.
empty())
1732 DBG_RTF(
m_t <<
"{\\comment endDoxyAnchor}\n")
1733 m_t <<
"{\\bkmkstart ";
1736 m_t <<
"{\\bkmkend ";
1751 m_t <<
"{\\xe \\v ";
1765 DBG_RTF(
m_t <<
"{\\comment (startIndent) }\n")
1779 DBG_RTF(
m_t <<
"{\\comment (startMemberDescription)}\n")
1788 DBG_RTF(
m_t <<
"{\\comment (endMemberDescription)}\n")
1798 DBG_RTF(
m_t <<
"{\\comment (startDescForItem) }\n")
1803 DBG_RTF(
m_t <<
"{\\comment (endDescForItem) }\n")
1808 DBG_RTF(
m_t <<
"{\\comment (startSection)}\n")
1821 default:
ASSERT(0);
break;
1825 heading.
sprintf(
"Heading%d",num);
1829 m_t <<
"{\\tc\\tcl" << num <<
" \\v ";
1846 if (str.
empty())
return;
1861 DBG_RTF(
m_t <<
"{\\comment startClassDiagram }\n")
1875 m_t <<
"\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
1877 m_t <<
" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par\n";
1883 DBG_RTF(
m_t <<
"{\\comment startMemberItem }\n")
1889 DBG_RTF(
m_t <<
"{\\comment endMemberItem }\n")
1910 DBG_RTF(
m_t <<
"{\\comment writeAnchor (" << anchor <<
")}\n")
1917 m_t <<
"{\\field\\fldedit {\\*\\fldinst PAGEREF ";
1919 m_t <<
" \\\\*MERGEFORMAT}{\\fldrslt pagenum}}";
1931 DBG_RTF(
m_t <<
"{\\comment (startMemberList) }\n")
1935 m_t <<
"\\begin{CompactItemize}\n";
1941 DBG_RTF(
m_t <<
"{\\comment (endMemberList) }\n")
1945 m_t <<
"\\end{CompactItemize}\n";
1951 DBG_RTF(
m_t <<
"{\\comment (startDescTable) }\n")
1953 m_t <<
"{" <<
rtf_Style[
"Heading5"].reference() <<
"\n";
1957 m_t <<
"\\trowd \\trgaph108\\trleft426\\tblind426"
1958 "\\trbrdrt\\brdrs\\brdrw10\\brdrcf15 "
1959 "\\trbrdrl\\brdrs\\brdrw10\\brdrcf15 "
1960 "\\trbrdrb\\brdrs\\brdrw10\\brdrcf15 "
1961 "\\trbrdrr\\brdrs\\brdrw10\\brdrcf15 "
1962 "\\trbrdrh\\brdrs\\brdrw10\\brdrcf15 "
1963 "\\trbrdrv\\brdrs\\brdrw10\\brdrcf15 \n";
1964 int columnPos2[2] = { 25, 100 };
1965 int columnPos3[3] = { 25, 45, 100 };
1966 for (
int i=0;i<(hasInits?3:2);i++)
1968 m_t <<
"\\clvertalt\\clbrdrt\\brdrs\\brdrw10\\brdrcf15 "
1969 "\\clbrdrl\\brdrs\\brdrw10\\brdrcf15 "
1970 "\\clbrdrb\\brdrs\\brdrw10\\brdrcf15 "
1971 "\\clbrdrr \\brdrs\\brdrw10\\brdrcf15 "
1973 "\\cellx" << (
rtf_pageWidth*(hasInits?columnPos3[i]:columnPos2[i])/100) <<
"\n";
1975 m_t <<
"\\pard \\widctlpar\\intbl\\adjustright\n";
1980 DBG_RTF(
m_t <<
"{\\comment (endDescTable)}\n")
1994 DBG_RTF(
m_t <<
"{\\comment (startDescTableTitle) }\n")
2001 DBG_RTF(
m_t <<
"{\\comment (endDescTableTitle) }\n")
2007 DBG_RTF(
m_t <<
"{\\comment (startDescTableInit) }" << endl)
2015 DBG_RTF(
m_t <<
"{\\comment (endDescTableInit) }" << endl)
2021 DBG_RTF(
m_t <<
"{\\comment (startDescTableData) }\n")
2027 DBG_RTF(
m_t <<
"{\\comment (endDescTableData) }\n")
2028 m_t <<
"\\cell }{\\row }\n";
2045 err(
"Maximum indent level ({}) exceeded while generating RTF output!\n",m);
2055 err(
"Negative indent level while generating RTF output!\n");
2097 DBG_RTF(
m_t <<
"{\\comment startTextBlock}\n")
2122 DBG_RTF(
m_t <<
"{\\comment (newParagraph)}\n")
2130 DBG_RTF(
m_t <<
"{\\comment startParagraph}\n")
2133 if (
DString(txt) ==
"reference")
m_t <<
"\\ql\n";
2145 DBG_RTF(
m_t <<
"{\\comment startMemberSubtitle}\n")
2152 DBG_RTF(
m_t <<
"{\\comment endMemberSubtitle}\n")
2163 if (codePage ==
"932")
2165 result = (0x81<=c && c<=0x9f) || (0xe0<=c && c<=0xfc);
2167 else if (codePage ==
"936")
2169 result = 0x81<=c && c<=0xFE;
2171 else if (codePage ==
"949")
2173 result = 0x81<=c && c<=0xFE;
2175 else if (codePage ==
"950")
2177 result = 0x81<=c && c<=0xFE;
2187 if (s==
nullptr)
return;
2189 bool converted=
false;
2191 static std::vector<char> enc;
2192 if (l*4>enc.size()) enc.resize(l*4);
2194 if (!encoding.
empty())
2198 if (cd!=
reinterpret_cast<void *
>(-1))
2201 size_t oLeft=enc.size();
2202 const char *inputPtr = s.
data();
2203 char *outputPtr = &enc[0];
2206 enc.resize(enc.size()-oLeft);
2214 memcpy(enc.data(),s.
data(),l);
2217 bool multiByte =
false;
2219 for (
size_t i=0;i<enc.size();i++)
2221 uint8_t c =
static_cast<uint8_t
>(enc.at(i));
2223 if (c>=0x80 || multiByte)
2226 snprintf(esc,10,
"\\'%X",c);
2255 err(
"problems opening rtf file '{}' for reading\n",infName);
2259 const int maxLineLength = 10240;
2267 while (getline(f,line))
2270 if (line.find(
"\\comment begin body")!=std::string::npos)
break;
2274 std::string prevLine;
2276 while (getline(f,line))
2279 size_t pos=prevLine.find(
"INCLUDETEXT \"");
2280 if (pos!=std::string::npos)
2282 size_t startNamePos = prevLine.find(
'"',pos)+1;
2283 size_t endNamePos = prevLine.find(
'"',startNamePos);
2284 DString fileName = prevLine.
substr(startNamePos,endNamePos-startNamePos);
2285 DBG_RTF(t <<
"{\\comment begin include " << fileName <<
"}\n")
2287 DBG_RTF(t <<
"{\\comment end include " << fileName <<
"}\n")
2296 if (!bIncludeHeader)
2298 size_t pos = line.rfind(
'}');
2299 if (pos==std::string::npos)
2301 err(
"Strange, the last char was not a '}}'\n");
2302 pos = line.length();
2318 DBG_RTF(
m_t <<
"{\\comment (startDotGraph)}\n")
2330 m_t <<
"\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
2332 m_t << fn <<
"." << imgExt;
2333 m_t <<
"\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par\n";
2336 DBG_RTF(
m_t <<
"{\\comment (endDotGraph)}\n")
2341 DBG_RTF(
m_t <<
"{\\comment (startInclDepGraph)}\n")
2353 m_t <<
"\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
2355 m_t << fn <<
"." << imgExt;
2356 m_t <<
"\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par\n";
2358 DBG_RTF(
m_t <<
"{\\comment (endInclDepGraph)}\n")
2371 DBG_RTF(
m_t <<
"{\\comment (startCallGraph)}\n")
2383 m_t <<
"\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
2385 m_t << fn <<
"." << imgExt;
2386 m_t <<
"\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par\n";
2388 DBG_RTF(
m_t <<
"{\\comment (endCallGraph)}\n")
2393 DBG_RTF(
m_t <<
"{\\comment (startDirDepGraph)}\n")
2405 m_t <<
"\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
2407 m_t << fn <<
"." << imgExt;
2408 m_t <<
"\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par\n";
2410 DBG_RTF(
m_t <<
"{\\comment (endDirDepGraph)}\n")
2424 while ((c=f.get())!=-1)
2450 if (bcount==0)
return;
2452 err(
"RTF integrity test failed at line {:d} of {} due to a bracket mismatch.\n"
2453 " Please try to create a small code example that produces this error \n"
2454 " and send that to doxygen@gmail.com.\n",line,
name);
2469 err(
"Output dir {} does not exist!\n",path);
2478 DString combinedName = path+
"/combined.rtf";
2479 DString mainRTFName = path+
"/"+name;
2484 err(
"Failed to open {} for writing!\n",combinedName);
2509 thisDir.
rename(mainRTFName.
str(),mainRTFName.
str() +
".org");
2528 DBG_RTF(
m_t <<
"{\\comment startMemberGroupHeader}\n")
2536 DBG_RTF(
m_t <<
"{\\comment endMemberGroupHeader}\n")
2543 DBG_RTF(
m_t <<
"{\\comment startMemberGroupDocs}\n")
2549 DBG_RTF(
m_t <<
"{\\comment endMemberGroupDocs}\n")
2556 DBG_RTF(
m_t <<
"{\\comment startMemberGroup}\n")
2562 DBG_RTF(
m_t <<
"{\\comment endMemberGroup}\n")
2569 DBG_RTF(
m_t <<
"{\\comment (startExamples)}\n")
2584 DBG_RTF(
m_t <<
"{\\comment (endExamples)}\n")
2594 DBG_RTF(
m_t <<
"{\\comment (startParameterType)}\n")
2595 if (!first && !key.
empty())
2597 m_t <<
" " << key <<
" ";
2603 DBG_RTF(
m_t <<
"{\\comment (endParameterType)}\n")
2609 DBG_RTF(
m_t <<
"{\\comment (exceptionEntry)}\n")
2614 else if (closeBracket)
2623 auto astImpl =
dynamic_cast<const DocNodeAST*
>(ast);
2627 std::visit(visitor,astImpl->root);
2634 DBG_RTF(
m_t <<
"{\\comment (rtfwriteRuler_doubleline)}\n")
2635 m_t <<
"{\\pard\\widctlpar\\brdrb\\brdrdb\\brdrw15\\brsp20 \\adjustright \\par}\n";
2640 DBG_RTF(
m_t <<
"{\\comment (rtfwriteRuler_emboss)}\n")
2641 m_t <<
"{\\pard\\widctlpar\\brdrb\\brdremboss\\brdrw15\\brsp20 \\adjustright \\par}\n";
2646 DBG_RTF(
m_t <<
"{\\comment (rtfwriteRuler_thick)}\n")
2647 m_t <<
"{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw75\\brsp20 \\adjustright \\par}\n";
2652 DBG_RTF(
m_t <<
"{\\comment (rtfwriteRuler_thin)}\n")
2653 m_t <<
"{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw5\\brsp20 \\adjustright \\par}\n";
2658 DBG_RTF(
m_t <<
"{\\comment (startConstraintList)}\n")
2673 DBG_RTF(
m_t <<
"{\\comment (startConstraintParam)}\n")
2679 DBG_RTF(
m_t <<
"{\\comment (endConstraintParam)}\n")
2686 DBG_RTF(
m_t <<
"{\\comment (startConstraintType)}\n")
2692 DBG_RTF(
m_t <<
"{\\comment (endConstraintType)}\n")
2699 DBG_RTF(
m_t <<
"{\\comment (startConstraintDocs)}\n")
2704 DBG_RTF(
m_t <<
"{\\comment (endConstraintDocs)}\n")
2710 DBG_RTF(
m_t <<
"{\\comment (endConstraintList)}\n")
2719 DBG_RTF(
m_t <<
"{\\comment (startIndexListItem)}\n")
2724 DBG_RTF(
m_t <<
"{\\comment (endIndexListItem)}\n")
2730 DBG_RTF(
m_t <<
"{\\comment (startInlineHeader)}\n")
2738 DBG_RTF(
m_t <<
"{\\comment (endInlineHeader)}\n")
2746 DBG_RTF(
m_t <<
"{\\comment (startMemberDocSimple)}\n")
2748 m_t <<
"{" <<
rtf_Style[
"Heading5"].reference() <<
"\n";
2759 m_t <<
"\\trowd \\trgaph108\\trleft426\\tblind426"
2760 "\\trbrdrt\\brdrs\\brdrw10\\brdrcf15 "
2761 "\\trbrdrl\\brdrs\\brdrw10\\brdrcf15 "
2762 "\\trbrdrb\\brdrs\\brdrw10\\brdrcf15 "
2763 "\\trbrdrr\\brdrs\\brdrw10\\brdrcf15 "
2764 "\\trbrdrh\\brdrs\\brdrw10\\brdrcf15 "
2765 "\\trbrdrv\\brdrs\\brdrw10\\brdrcf15 \n";
2766 int n=3,columnPos[3] = { 25, 50, 100 };
2773 for (
int i=0;i<n;i++)
2775 m_t <<
"\\clvertalt\\clbrdrt\\brdrs\\brdrw10\\brdrcf15 "
2776 "\\clbrdrl\\brdrs\\brdrw10\\brdrcf15 "
2777 "\\clbrdrb\\brdrs\\brdrw10\\brdrcf15 "
2778 "\\clbrdrr \\brdrs\\brdrw10\\brdrcf15 "
2782 m_t <<
"\\pard \\widctlpar\\intbl\\adjustright\n";
2787 DBG_RTF(
m_t <<
"{\\comment (endMemberDocSimple)}\n")
2793 DBG_RTF(
m_t <<
"{\\comment (startInlineMemberType)}\n")
2799 DBG_RTF(
m_t <<
"{\\comment (endInlineMemberType)}\n")
2805 DBG_RTF(
m_t <<
"{\\comment (startInlineMemberName)}\n")
2811 DBG_RTF(
m_t <<
"{\\comment (endInlineMemberName)}\n")
2817 DBG_RTF(
m_t <<
"{\\comment (startInlineMemberDoc)}\n")
2823 DBG_RTF(
m_t <<
"{\\comment (endInlineMemberDoc)}\n")
2824 m_t <<
"\\cell }{\\row }\n";
2833 m_t <<
"{\\f2 [" << l <<
"]}";
2834 if (!isLast)
m_t <<
", ";
2856 if (openBracket)
m_t <<
"(";
2861 if (last && closeBracket)
2870static std::unordered_map<std::string,std::string>
g_tagMap;
2897 if ( ( ++(*nxtTag) ) >
'Z' )
Class representing a built-in class diagram.
void writeImage(TextStream &t, const DString &path, const DString &relPath, const DString &file, bool generateMap, bool toIndex) const
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
DString substr(size_t pos=0, size_t count=npos) const
Returns a substring of length count starting at pos.
char * rawData()
Returns a writable pointer to the data.
DString & prepend(const char *s)
DString & sprintf(const char *format,...)
void reserve(size_t size)
Reserve space for size bytes without changing the string contents.
const std::string & str() const
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
bool startsWith(const char *s) const
bool endsWith(const char *s) const
size_t length() const
Returns the length of the string, not counting the 0-terminator.
static bool isFlagSet(const DebugMask mask)
static void print(DebugMask mask, int prio, fmt::format_string< Args... > fmt, Args &&... args)
The common base class of all entity definitions found in the sources.
virtual DString getDefFileExtension() const =0
Class representing a directory in the file system.
static std::string currentDirPath()
std::string absPath() const
bool mkdir(const std::string &path, bool acceptsAbsPath=true) const
bool remove(const std::string &path, bool acceptsAbsPath=true) const
std::string filePath(const std::string &path, bool acceptsAbsPath=true) const
bool rename(const std::string &orgName, const std::string &newName, bool acceptsAbsPath=true) const
static bool setCurrent(const std::string &path)
Class representing the abstract syntax tree of a documentation block.
Representation of an call graph.
DString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const DString &path, const DString &fileName, const DString &relPath, bool writeImageMap=true, int graphId=-1)
Representation of a class inheritance or dependency graph.
DString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const DString &path, const DString &fileName, const DString &relPath, bool TBRank=true, bool imageMap=true, int graphId=-1)
Representation of an directory dependency graph.
DString writeGraph(TextStream &out, GraphOutputFormat gf, EmbeddedOutputFormat ef, const DString &path, const DString &fileName, const DString &relPath, bool writeImageMap=true, int graphId=-1, bool linkRelations=true)
Representation of a group collaboration graph.
Representation of an include dependency graph.
DString writeGraph(TextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const DString &path, const DString &fileName, const DString &relPath, bool writeImageMap=true, int graphId=-1)
static NamespaceLinkedMap * namespaceLinkedMap
static ConceptLinkedMap * conceptLinkedMap
static std::unique_ptr< PageDef > mainPage
static FileNameLinkedMap * inputNameLinkedMap
static ClassLinkedMap * classLinkedMap
static PageLinkedMap * exampleLinkedMap
static PageLinkedMap * pageLinkedMap
static DirLinkedMap * dirLinkedMap
static GroupLinkedMap * groupLinkedMap
Minimal replacement for QFileInfo.
FileInfo(const std::string &name)
std::string fileName() const
opaque representation of the abstract syntax tree (AST)
A model of a class/file/namespace member symbol.
static ModuleManager & instance()
Class representing a list of different code generators.
void add(OutputCodeIntfPtr &&p)
Abstract interface for output generators.
Generator for RTF code fragments.
void startSpecialComment() override
void endCodeLine() override
size_t m_stripIndentAmount
void endFontClass() override
void writeCodeLink(CodeSymbolType type, const DString &ref, const DString &file, const DString &anchor, const DString &name, const DString &tooltip) override
void setSourceFileName(const DString &name)
DString rtf_Code_DepthStyle()
void writeLineNumber(const DString &, const DString &, const DString &, int l, bool) override
void startCodeFragment(const DString &style) override
RTFCodeGenerator(TextStream *t)
void endSpecialComment() override
void setIndentLevel(int level)
void startFontClass(const DString &) override
void setTextStream(TextStream *t)
void stripCodeComments(bool b) override
void endCodeFragment(const DString &) override
void setStripIndentAmount(size_t amount) override
void codify(const DString &text) override
void startCodeLine(int) override
Concrete visitor implementation for RTF output.
void startTextBlock(bool dense) override
void startGroupCollaboration() override
void startCallGraph() override
void endConstraintList() override
void endMemberList() override
void endConstraintType() override
void startTextLink(const DString &f, const DString &anchor) override
void endDescTableRow() override
void startDescTable(const DString &title, const bool hasInits) override
void endTitleHead(const DString &, const DString &name) override
void startLabels() override
void lineBreak(const DString &style=DString()) override
void startInlineMemberName() override
void writeChar(char c) override
void endDescTableData() override
void startDescTableData() override
void endDescTable() override
OutputType type() const override
RTFCodeGenerator * m_codeGen
void endDirDepGraph(DotDirDeps &g) override
std::unique_ptr< OutputCodeList > m_codeList
void startIndexKey() override
void endMemberItem(MemberItemType) override
void endPlainFile() override
void startIndexListItem() override
void endCompoundTemplateParams() override
static bool preProcessFileInplace(const DString &path, const DString &name)
This is an API to a VERY brittle RTF preprocessor that combines nested RTF files.
void rtfwriteRuler_thick()
void writeStartAnnoItem(const DString &type, const DString &file, const DString &path, const DString &name) override
static void writeStyleSheetFile(TextStream &t)
void setRelativePath(const DString &path)
void endInlineMemberType() override
void startParagraph(const DString &classDef) override
void endDescForItem() override
void startIndent() override
void lastIndexPage() override
void endInlineMemberName() override
void endItemList() override
std::array< RTFListItemInfo, maxIndentLevels > m_listItemInfo
void startDescTableInit() override
void endMemberGroup(bool) override
void startIndexItem(const DString &ref, const DString &file) override
void endMemberGroupDocs() override
DString rtf_BList_DepthStyle()
void addIndexItem(const DString &, const DString &) override
void startPlainFile(const DString &name) override
void endMemberDocSimple(bool) override
void endPageRef(const DString &, const DString &) override
void startDirDepGraph() override
void startMemberSubtitle() override
DString rtf_DList_DepthStyle()
void startDotGraph() override
void writeInheritedSectionTitle(const DString &, const DString &, const DString &, const DString &, const DString &, const DString &) override
void endTextBlock(bool) override
static void writeExtensionsFile(TextStream &t)
void startItemListItem() override
void startBold() override
void endMemberSubtitle() override
void setSourceFileName(const DString &sourceFileName)
void startEmphasis() override
void endSection(const DString &, SectionType) override
void endMemberDoc(bool) override
void startConstraintDocs() override
void startDescForItem() override
DString rtf_LCList_DepthStyle()
void endProjectNumber() override
void startDescTableTitle() override
void startParameterList(bool) override
void startConstraintList(const DString &) override
void endDotGraph(DotClassGraph &) override
void rtfwriteRuler_doubleline()
void writeAnchor(const DString &fileName, const DString &name) override
void endIndexSection(IndexSection) override
void writeObjectLink(const DString &ref, const DString &file, const DString &anchor, const DString &name) override
void writeNonBreakableSpace(int) override
void endMemberDescription() override
void exceptionEntry(const DString &, bool) override
void startIndexList() override
void startDoxyAnchor(const DString &, const DString &, const DString &, const DString &, const DString &) override
void rtfwriteRuler_emboss()
static const int maxIndentLevels
void startParameterType(bool, const DString &) override
void endClassDiagram(const ClassDiagram &, const DString &filename, const DString &name) override
void endInclDepGraph(DotInclDepGraph &) override
void startMemberDoc(const DString &, const DString &, const DString &, const DString &, int, int, bool) override
void endDescTableTitle() override
void startItemList() override
DString rtf_CList_DepthStyle()
void endGroupCollaboration(DotGroupCollaboration &g) override
void endItemListItem() override
void addCodeGen(OutputCodeList &list) override
void writeDoc(const IDocNodeAST *ast, const Definition *, const MemberDef *, int, int) override
void startMemberDocSimple(bool) override
void startCompoundTemplateParams() override
void addLabel(const DString &, const DString &) override
void startDescTableRow() override
void writeLabel(const DString &l, bool isLast) override
void startInlineMemberType() override
void endParameterExtra(bool, bool, bool) override
void startPageRef() override
void startMemberGroup() override
void rtfwriteRuler_thin()
void startIndexValue(bool) override
void startClassDiagram() override
void endIndexValue(const DString &, bool) override
void endIndexItem(const DString &ref, const DString &file) override
void endInlineHeader() override
void startInlineMemberDoc() override
void endIndexList() override
void endInlineMemberDoc() override
void endParagraph() override
void endTextLink() override
void startConstraintType() override
void startInclDepGraph() override
void writeString(const DString &text) override
void endIndexKey() override
void endMemberGroupHeader(bool) override
void startMemberGroupDocs() override
void endDoxyAnchor(const DString &, const DString &) override
void writePageLink(const DString &, bool) override
void endGroupHeader(int) override
void startMemberItem(const DString &, MemberItemType, const DString &) override
void startMemberDescription(const DString &, const DString &, bool) override
void startExamples() override
void startMemberGroupHeader(const DString &, bool) override
void startFile(const DString &name, bool isSource, const DString &manName, const DString &title, int id, int hierarchyLevel) override
void endCallGraph(DotCallGraph &) override
void endConstraintDocs() override
void endParameterType() override
void startSection(const DString &, const DString &, SectionType) override
void endEmphasis() override
void endConstraintParam() override
void startGroupHeader(const DString &, int) override
void startProjectNumber() override
void docify(const DString &text) override
void startIndexSection(IndexSection) override
RTFGenerator & operator=(const RTFGenerator &)
void startInlineHeader() override
void writeRTFReference(const DString &label)
void startMemberList() override
void endIndent() override
void writeStyleInfo(int part) override
void endDescTableInit() override
void endIndexListItem() override
void startTitleHead(const DString &) override
void startConstraintParam() override
DString rtf_EList_DepthStyle()
void endLabels() override
void endExamples() override
static constexpr int Section
static constexpr int MaxLevel
static constexpr int Subsection
static constexpr int Subsubsection
constexpr int level() const
static constexpr int Page
static constexpr int MinLevel
static constexpr int Paragraph
static constexpr int Subsubparagraph
static constexpr int Subparagraph
Text streaming class that buffers data.
void flush()
Flushes the buffer.
virtual DString trCompoundMembers()=0
virtual DString trFileDocumentation()=0
virtual DString trRTFCharSet()=0
virtual DString trInheritedFrom(const DString &members, const DString &what)=0
virtual DString trClassDocumentation()=0
virtual DString trHierarchicalIndex()=0
virtual DString trVersion()=0
virtual DString trConceptIndex()=0
virtual DString trTopicIndex()=0
virtual DString trModuleIndex()=0
virtual DString trTypeDocumentation()=0
virtual DString trPageIndex()=0
virtual DString trModuleDocumentation()=0
virtual DString trRTFansicp()=0
virtual DString trCompoundIndexFortran()=0
virtual DString trModulesIndex()=0
virtual DString trTopicDocumentation()=0
virtual DString trRTFGeneralIndex()=0
virtual DString trEnumerationValues()=0
virtual DString trRTFTableOfContents()=0
virtual DString trDirDocumentation()=0
virtual DString trDirIndex()=0
virtual DString trCompoundIndex()=0
virtual DString trDesignUnitIndex()=0
virtual DString trFileIndex()=0
virtual DString trExamples()=0
virtual DString trNamespaceIndex()=0
#define Config_getInt(name)
#define Config_getBool(name)
#define Config_getString(name)
#define Config_getEnum(name)
std::set< std::string > StringSet
std::tm getCurrentDateTime()
Returns the filled in std::tm for the current date and time.
DString dateToString(DateTimeType includeTime)
Returns the current date, when includeTime is set also the time is provided.
IDocParserPtr createDocParser()
factory function to create a parser
IDocNodeASTPtr validatingParseText(IDocParser &parserIntf, const DString &input)
const char * qPrint(const char *s)
@ isNamespaceDocumentation
Translator * theTranslator
std::ifstream openInputStream(const DString &name, bool binary=false, bool openAtEnd=false)
void unlink(const DString &fileName)
std::ofstream openOutputStream(const DString &name, bool append=false)
OutputCodeDefer< RTFCodeGenerator > RTFCodeGeneratorDefer
Portable versions of functions that are platform dependent.
int portable_iconv_close(void *cd)
size_t portable_iconv(void *cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
void * portable_iconv_open(const char *tocode, const char *fromcode)
DString rtfFormatBmkStr(const DString &name)
static void encodeForOutput(TextStream &t, const DString &s)
static std::mutex g_rtfFormatMutex
static StringSet removeSet
static DString docifyToString(const DString &str)
static DString objectLinkToString(const DString &ref, const DString &f, const DString &anchor, const DString &text)
static std::unordered_map< std::string, std::string > g_tagMap
static bool preProcessFile(Dir &d, const DString &infName, TextStream &t, bool bIncludeHeader=true, bool removeFile=true)
VERY brittle routine inline RTF's included by other RTF's.
static DString dateToRTFDateString()
void testRTFOutput(const DString &name)
Tests the integrity of the result by counting brackets.
static DString makeIndexName(const DString &s, int i)
static DString g_nextTag("AAAAAAAAAA")
DString rtfFormatBmkStr(const DString &name)
Rtf_Style_Default rtf_Style_Default[]
void loadExtensions(const DString &name)
void loadStylesheet(const DString &name, StyleDataMap &map)
Rtf_Table_Default rtf_Table_Default[]
DString reference() const
DString definition() const
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.
Various UTF8 related helper functions.
size_t updateColumnCount(const char *s, size_t col)
DString stripExtensionGeneral(const DString &fName, const DString &ext)
void clearSubDirs(const Dir &d)
void createSubDirs(const Dir &d)
DString relativePathToRoot(const DString &name)
bool copyFile(const DString &src, const DString &dest)
Copies the contents of file with name src to the newly created file with name dest.
DString getDotImageExtension()
DString stripPath(const DString &s)
A bunch of utility functions.