44#define DBG_RTF(x) do {} while(0)
48 for (
const auto &attr : cell.
attribs())
50 if (attr.name.lower()==
"align")
52 if (attr.value.lower()==
"center")
return "\\qc ";
53 else if (attr.value.lower()==
"right")
return "\\qr ";
61 const QCString &langExt,
int hierarchyLevel)
96 err(
"Maximum indent level ({}) exceeded while generating RTF output!\n",
maxIndentLevels-1);
112 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocWord)}\n");
120 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocLinkedWord)}\n");
130 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocWhiteSpace)}\n");
145 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocSymbol)}\n");
161 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocEmoji)}\n");
172 case '&':
case '#':
case 'x':
176 val = 0xd800 + ( ( val1 - 0x10000 ) & 0xffc00 ) / 0x400 - 0x10000;
177 m_t <<
"\\u" << val <<
"?";
178 val = 0xdC00 + ( ( val1 - 0x10000 ) & 0x3ff ) - 0x10000 ;
179 m_t <<
"\\u" << val <<
"?";
182 case '0':
case '1':
case '2':
case '3':
case '4':
183 case '5':
case '6':
case '7':
case '8':
case '9':
184 val = val * 16 + *p -
'0';
186 case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
187 val = val * 16 + *p -
'a' + 10;
203 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocURL)}\n");
233 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocLineBreak)}\n");
241 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocHorRuler)}\n");
242 m_t <<
"{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw5\\brsp20 \\adjustright \\par}\n";
250 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocStyleChange)}\n");
312 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocVerbatim)}\n");
366 if (!fileName.isEmpty())
379 "msc {"+s.
text()+
"}",
381 if (!fileName.isEmpty())
396 for (
const auto &baseName: baseNameVector)
405 if (
Config_getBool(MERMAID_RENDER_MODE)!=MERMAID_RENDER_MODE_t::CLIENT_SIDE)
425 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocAnchor)}\n");
448 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocInclude)}\n");
528 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocIncOperator)}\n");
548 std::unique_ptr<FileDef> fd =
nullptr;
587 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocFormula)}\n");
593 m_t <<
"\\pard\\plain";
597 m_t <<
"{ \\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"" << f.
relPath() << f.
name() <<
".png\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt Image}}";
608 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocIndexEntry)}\n");
609 m_t <<
"{\\xe \\v " << i.
entry() <<
"}\n";
620 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocCite &)}\n");
633 if (!opt.noPar())
filter(
"[");
635 if (!opt.noPar())
filter(
"]");
648 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocAutoList &)}\n");
665 static int prevLevel = -1;
667 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocAutoListItem &)}\n");
669 if ((level != prevLevel-1) &&
670 (!(level==prevLevel && level != 0 &&
m_listItemInfo[level].isCheck)) &&
706 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocPara &)}\n");
711 std::get_if<DocParamSect>(p.
parent())
723 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocRoot &)}\n");
725 m_t <<
"{" <<
rtf_Style[
"BodyText"].reference() <<
"\n";
736 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocSimpleSect &)}\n");
740 m_t <<
"{" <<
rtf_Style[
"Heading5"].reference() <<
"\n";
786 m_t <<
"{\\s17 \\sa60 \\sb30\n";
792 std::visit(*
this,*s.
title());
812 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocTitle &)}\n");
820 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocSimpleSect &)}\n");
834 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocSimpleListItem &)}\n");
843 DBG_RTF(
"{\\comment RTFDocVisitor::visitPost(DocSimpleListItem)}\n");
849 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocSection &)}\n");
859 heading.
sprintf(
"Heading%d",level);
865 std::visit(*
this,*s.
title());
867 m_t <<
"\n\\par" <<
"}\n";
868 m_t <<
"{\\tc\\tcl" << level <<
" \\v ";
871 std::visit(*
this,*s.
title());
883 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlList &)}\n");
890 for (
const auto &opt : l.
attribs())
892 if (opt.name==
"type")
896 if (opt.name==
"start")
899 int val = opt.value.toInt(&ok);
905 m_t <<
"\\par" <<
"}\n";
912 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlListItem &)}\n");
918 for (
const auto &opt : l.
attribs())
920 if (opt.name==
"value")
923 int val = opt.value.toInt(&ok);
960 DBG_RTF(
"{\\comment RTFDocVisitor::visitPost(DocHtmlListItem)}\n");
966 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlDescList &)}\n");
979 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlDescTitle &)}\n");
982 m_t <<
"{" <<
rtf_Style[
"Heading5"].reference() <<
"\n";
993 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlDescData &)}\n");
1006 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlTable &)}\n");
1012 m_t <<
"\\pard \\qc \\b";
1018 m_t <<
"{Table \\field\\flddirty{\\*\\fldinst { SEQ Table \\\\*Arabic }}{\\fldrslt {\\noproof 1}} ";
1019 std::visit(*
this,*t.
caption());
1022 m_t <<
"\\pard\\plain\n";
1029 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlCaption &)}\n");
1031 m_t <<
"}\n\\par\n";
1037 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlRow &)}\n");
1039 m_t <<
"\\trowd \\trgaph108\\trleft-108"
1040 "\\trbrdrt\\brdrs\\brdrw10 "
1041 "\\trbrdrl\\brdrs\\brdrw10 "
1042 "\\trbrdrb\\brdrs\\brdrw10 "
1043 "\\trbrdrr\\brdrs\\brdrw10 "
1044 "\\trbrdrh\\brdrs\\brdrw10 "
1045 "\\trbrdrv\\brdrs\\brdrw10 \n";
1046 for (
size_t i=0;i<r.
numCells();i++)
1050 m_t <<
"\\clcbpat16";
1052 m_t <<
"\\clvertalt\\clbrdrt\\brdrs\\brdrw10 "
1053 "\\clbrdrl\\brdrs\\brdrw10 "
1054 "\\clbrdrb\\brdrs\\brdrw10 "
1055 "\\clbrdrr \\brdrs\\brdrw10 "
1057 "\\cellx" << ((i+1)*columnWidth) <<
"\n";
1059 m_t <<
"\\pard \\widctlpar\\intbl\\adjustright\n";
1063 m_t <<
"\\pard \\widctlpar\\intbl\\adjustright\n";
1064 m_t <<
"{\\row }\n";
1071 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlCell &)}\n");
1088 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHRef &)}\n");
1102 "{\\cs37\\ul\\cf2 ";
1108 "{ HYPERLINK \"" << href.
url() <<
"\" "
1112 "{\\cs37\\ul\\cf2 ";
1145 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlDetails &)}\n");
1150 std::visit(*
this,*summary);
1168 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlHeader &)}\n");
1173 heading.
sprintf(
"Heading%d",level);
1177 m_t <<
"{\\tc\\tcl" << level <<
" ";
1196 m_t <<
"\\pard \\qc ";
1198 m_t <<
"{ \\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
1200 m_t <<
"\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt Image}}\n";
1206 m_t <<
"\\pard \\qc \\b";
1207 m_t <<
"{Image \\field\\flddirty{\\*\\fldinst { SEQ Image \\\\*Arabic }}{\\fldrslt {\\noproof 1}} ";
1213 if (hasCaption)
m_t <<
"{\\comment ";
1230 if (hasCaption)
m_t <<
" }";
1253 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocImage &)}\n");
1262 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocDotFile &)}\n");
1263 bool exists =
false;
1271 if (!fileName.isEmpty())
1281 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocMscFile &)}\n");
1282 bool exists =
false;
1290 if (!fileName.isEmpty())
1301 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocDiaFile &)}\n");
1302 bool exists =
false;
1310 if (!fileName.isEmpty())
1321 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocPlantUmlFile &)}\n");
1329 for(
const auto &baseName: baseNameVector)
1339 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocMermaidFile &)}\n");
1340 if (
Config_getBool(MERMAID_RENDER_MODE)==MERMAID_RENDER_MODE_t::CLIENT_SIDE)
return;
1348 rtfOutput,
QCString(),inBuf,imageFormat,
1358 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocLink &)}\n");
1367 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocRef &)}\n");
1387 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocSecRefItem &)}\n");
1394 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocSecRefList &)}\n");
1410 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocParamSect &)}\n");
1414 m_t <<
"{" <<
rtf_Style[
"Heading5"].reference() <<
"\n";
1456 static int columnPos[4][5] =
1457 { { 2, 25, 100, 100, 100 },
1458 { 3, 14, 35, 100, 100 },
1459 { 3, 25, 50, 100, 100 },
1460 { 4, 14, 35, 55, 100 },
1464 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocParamList &)}\n");
1470 parentType = sect->
type();
1480 m_t <<
"\\trowd \\trgaph108\\trleft426\\tblind426"
1481 "\\trbrdrt\\brdrs\\brdrw10\\brdrcf15 "
1482 "\\trbrdrl\\brdrs\\brdrw10\\brdrcf15 "
1483 "\\trbrdrb\\brdrs\\brdrw10\\brdrcf15 "
1484 "\\trbrdrr\\brdrs\\brdrw10\\brdrcf15 "
1485 "\\trbrdrh\\brdrs\\brdrw10\\brdrcf15 "
1486 "\\trbrdrv\\brdrs\\brdrw10\\brdrcf15 "<<
"\n";
1487 for (
int i=0;i<columnPos[config][0];i++)
1489 m_t <<
"\\clvertalt\\clbrdrt\\brdrs\\brdrw10\\brdrcf15 "
1490 "\\clbrdrl\\brdrs\\brdrw10\\brdrcf15 "
1491 "\\clbrdrb\\brdrs\\brdrw10\\brdrcf15 "
1492 "\\clbrdrr \\brdrs\\brdrw10\\brdrcf15 "
1494 "\\cellx" << (
rtf_pageWidth*columnPos[config][i+1]/100) <<
"\n";
1496 m_t <<
"\\pard \\widctlpar\\intbl\\adjustright\n";
1537 std::visit(*
this,type);
1555 if (!first)
m_t <<
",";
else first=
FALSE;
1556 std::visit(*
this,param);
1568 std::visit(*
this,par);
1573 m_t <<
"\\cell }\n";
1575 m_t <<
"{\\row }\n";
1589 bool anonymousEnum = x.
file()==
"@";
1590 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocXRefItem &)}\n");
1598 m_t <<
"{" <<
rtf_Style[
"Heading5"].reference() <<
"\n";
1621 "{\\cs37\\ul\\cf2 ";
1639 DBG_RTF(
"{\\comment RTFDocVisitor::visitPost(DocXRefItem)}\n");
1649 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocInternalRef &)}\n");
1659 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocText &)}\n");
1666 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlBlockQuote &)}\n");
1700 const char *p=str.
data();
1706 case '{':
m_t <<
"\\{";
break;
1707 case '}':
m_t <<
"\\}";
break;
1708 case '\\':
m_t <<
"\\\\";
break;
1709 case '\n':
if (verbatim)
1742 m_t <<
"{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
1745 m_t <<
"}{\\fldrslt {\\cs37\\ul\\cf2 ";
1768 const QCString &srcFile,
int srcLine,
bool newFile)
1778 const QCString &srcFile,
int srcLine,
bool newFile)
1787 const QCString &srcFile,
int srcLine,
bool newFile)
1805 if (
Config_getBool(MERMAID_RENDER_MODE)==MERMAID_RENDER_MODE_t::CLIENT_SIDE)
return;
void parseCodeFragment(OutputCodeList &codeOutList, const QCString &fileName, const QCString &blockId, const QCString &scopeName, bool showLineNumbers, bool trimLeft, bool stripCodeComments)
static CodeFragmentManager & instance()
virtual void parseCode(OutputCodeList &codeOutList, const QCString &scopeName, const QCString &input, SrcLangExt lang, bool stripCodeComments, const CodeParserOptions &options)=0
Parses a source file or fragment with the goal to produce highlighted and cross-referenced output.
Node representing an anchor.
Node representing an auto List.
bool isCheckedList() const
Node representing an item of a auto list.
Node representing a citation of some bibliographic reference.
CiteInfoOption option() const
Node representing a dia file.
Node representing a dot file.
Node representing an emoji.
Node representing a Hypertext reference.
Node representing a horizontal ruler.
Node representing an HTML blockquote.
Node representing a HTML table caption.
Node representing a HTML table cell.
const HtmlAttribList & attribs() const
Node representing a HTML description data.
Node representing a Html description list.
Node representing a Html description item.
const DocNodeVariant * summary() const
Node representing a Html list.
const HtmlAttribList & attribs() const
Node representing a HTML list item.
const HtmlAttribList & attribs() const
Node representing a HTML table row.
Node representing a HTML table.
const DocNodeVariant * caption() const
Node representing an image.
bool isInlineImage() const
Node representing a include/dontinclude operator block.
bool stripCodeComments() const
QCString includeFileName() const
QCString exampleFile() const
Node representing an included text block from file.
QCString extension() const
bool stripCodeComments() const
QCString exampleFile() const
Node representing an entry in the index.
Node representing an internal section of documentation.
Node representing an internal reference to some item.
Node representing a line break.
Node representing a link to some item.
Node representing a word that can be linked to something.
Node representing a mermaid file.
Node representing a msc file.
DocNodeVariant * parent()
Node representing an block of paragraphs.
Node representing a paragraph in the documentation tree.
Node representing a parameter list.
const DocNodeList & parameters() const
const DocNodeList & paramTypes() const
DocParamSect::Direction direction() const
const DocNodeList & paragraphs() const
Node representing a parameter section.
bool hasInOutSpecifier() const
bool hasTypeSpecifier() const
Node representing a uml file.
Node representing a reference to some item.
QCString targetTitle() const
Root node of documentation tree.
Node representing a reference to a section.
Node representing a list of section references.
Node representing a normal section.
const DocNodeVariant * title() const
Node representing a separator.
Node representing a simple list.
Node representing a simple list item.
const DocNodeVariant * paragraph() const
Node representing a simple section.
const DocNodeVariant * title() const
Node representing a separator between two simple sections of the same type.
Node representing a style change.
Node representing a special symbol.
HtmlEntityMapper::SymType symbol() const
Root node of a text fragment.
Node representing a simple section title.
Node representing a URL (or email address).
Node representing a verbatim, unparsed text fragment.
QCString language() const
QCString exampleFile() const
Node representing a VHDL flow chart.
CodeParserInterface & getCodeParser(const QCString &langExt)
void pushHidden(bool hide)
Node representing some amount of white space.
Node representing a word.
Node representing an item of a cross-referenced list.
const char * unicode(int index) const
Access routine to the unicode sequence for the Emoji entity.
static EmojiEntityMapper & instance()
Returns the one and only instance of the Emoji entity mapper.
Minimal replacement for QFileInfo.
std::string fileName() const
std::string dirPath(bool absPath=true) const
static HtmlEntityMapper & instance()
Returns the one and only instance of the HTML entity mapper.
const char * rtf(SymType symb) const
Access routine to the RTF code of the HTML entity.
void generateMermaidOutput(const QCString &baseName, const QCString &outDir, ImageFormat format, bool toIndex)
Register a generated Mermaid image with the index.
static QCString imageExtension(ImageFormat imageFormat)
static MermaidManager & instance()
static ImageFormat convertToImageFormat(OutputFormat outputFormat)
QCString writeMermaidSource(const QCString &outDirArg, const QCString &fileName, const QCString &content, ImageFormat format, const QCString &srcFile, int srcLine)
Write a Mermaid source file and register it for CLI rendering.
Class representing a list of different code generators.
void generatePlantUMLOutput(const QCString &baseName, const QCString &outDir, OutputFormat format, bool toIndex)
Convert a PlantUML file to an image.
StringVector writePlantUMLSource(const QCString &outDirArg, const QCString &fileName, const QCString &content, OutputFormat format, const QCString &engine, const QCString &srcFile, int srcLine, bool inlineCode)
Write a PlantUML compatible file.
static PlantumlManager & instance()
This is an alternative implementation of QCString.
size_t length() const
Returns the length of the string, not counting the 0-terminator.
bool startsWith(const char *s) const
bool isEmpty() const
Returns TRUE iff the string is empty.
const std::string & str() const
QCString & setNum(short n)
QCString right(size_t len) const
QCString & sprintf(const char *format,...)
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
void startLink(const QCString &ref, const QCString &file, const QCString &anchor)
void filter(const QCString &str, bool verbatim=FALSE)
void visitChildren(const T &t)
void includePicturePreRTF(const QCString &name, bool isTypeRTF, bool hasCaption, bool inlineImage=FALSE)
void writeDotFile(const QCString &fileName, bool hasCaption, const QCString &srcFile, int srcLine, bool newFile=true)
void includePicturePostRTF(bool isTypeRTF, bool hasCaption, bool inlineImage=FALSE)
RTFDocVisitor(TextStream &t, OutputCodeList &ci, const QCString &langExt, int hierarchyLevel=0)
QCString getStyle(const QCString &name)
void writePlantUMLFile(const QCString &fileName, bool hasCaption)
static const int maxIndentLevels
void writeMermaidFile(const QCString &fileName, bool hasCaption)
QCString getListTable(const int id)
void writeMscFile(const QCString &fileName, bool hasCaption, const QCString &srcFile, int srcLine, bool newFile=true)
void endLink(const QCString &ref)
RTFListItemInfo m_listItemInfo[maxIndentLevels]
void operator()(const DocWord &)
void writeDiaFile(const QCString &fileName, bool hasCaption, const QCString &srcFile, int srcLine, bool newFile=true)
static constexpr int MaxLevel
static constexpr int MinLevel
Text streaming class that buffers data.
#define Config_getBool(name)
#define Config_getString(name)
void writeDiaGraphFromFile(const QCString &inFile, const QCString &outDir, const QCString &outFile, DiaOutputFormat format, const QCString &srcFile, int srcLine, bool toIndex)
void writeDotGraphFromFile(const QCString &inFile, const QCString &outDir, const QCString &outFile, GraphOutputFormat format, const QCString &srcFile, int srcLine, bool toIndex)
std::unique_ptr< FileDef > createFileDef(const QCString &p, const QCString &n, const QCString &ref, const QCString &dn)
Translator * theTranslator
void writeMscGraphFromFile(const QCString &inFile, const QCString &outDir, const QCString &outFile, MscOutputFormat format, const QCString &srcFile, int srcLine, bool toIndex)
Portable versions of functions that are platform dependent.
static QCString align(const DocHtmlCell &cell)
QCString rtfFormatBmkStr(const QCString &name)
Rtf_Table_Default rtf_Table_Default[]
Options to configure the code parser.
CodeParserOptions & setStartLine(int lineNr)
CodeParserOptions & setInlineFragment(bool enable)
CodeParserOptions & setShowLineNumbers(bool enable)
CodeParserOptions & setFileDef(const FileDef *fd)
QCString reference() const
QCString writeFileContents(const QCString &baseName, const QCString &extension, const QCString &content, bool &exists)
Thread-safe function to write a string to a file.
SrcLangExt getLanguageFromFileName(const QCString &fileName, SrcLangExt defLang)
QCString integerToRoman(int n, bool upper)
QCString stripPath(const QCString &s)
bool readInputFile(const QCString &fileName, std::string &contents, bool filter, bool isSourceCode)
read a file name fileName and optionally filter and transcode it
SrcLangExt getLanguageFromCodeLang(QCString &fileName)
Routine to handle the language attribute of the \code command.
QCString integerToAlpha(int n, bool upper)
QCString getDotImageExtension()
QCString makeBaseName(const QCString &name, const QCString &ext)
bool copyFile(const QCString &src, const QCString &dest)
Copies the contents of file with name src to the newly created file with name dest.
QCString getFileNameExtension(const QCString &fn)
A bunch of utility functions.