43#define DBG_RTF(x) do {} while(0)
47 for (
const auto &attr : cell.
attribs())
49 if (attr.name.lower()==
"align")
51 if (attr.value.lower()==
"center")
return "\\qc ";
52 else if (attr.value.lower()==
"right")
return "\\qr ";
65 baseName=baseName.
mid(i+1);
71 const QCString &langExt,
int hierarchyLevel)
106 err(
"Maximum indent level ({}) exceeded while generating RTF output!\n",
maxIndentLevels-1);
122 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocWord)}\n");
130 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocLinkedWord)}\n");
140 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocWhiteSpace)}\n");
155 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocSymbol)}\n");
171 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocEmoji)}\n");
182 case '&':
case '#':
case 'x':
186 val = 0xd800 + ( ( val1 - 0x10000 ) & 0xffc00 ) / 0x400 - 0x10000;
187 m_t <<
"\\u" << val <<
"?";
188 val = 0xdC00 + ( ( val1 - 0x10000 ) & 0x3ff ) - 0x10000 ;
189 m_t <<
"\\u" << val <<
"?";
192 case '0':
case '1':
case '2':
case '3':
case '4':
193 case '5':
case '6':
case '7':
case '8':
case '9':
194 val = val * 16 + *p -
'0';
196 case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
197 val = val * 16 + *p -
'a' + 10;
213 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocURL)}\n");
243 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocLineBreak)}\n");
251 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocHorRuler)}\n");
252 m_t <<
"{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw5\\brsp20 \\adjustright \\par}\n";
260 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocStyleChange)}\n");
322 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocVerbatim)}\n");
371 static int dotindex = 1;
382 err(
"Could not open file {} for writing\n",
qPrint(fileName));
400 static int mscindex = 1;
411 err(
"Could not open file {} for writing\n",
qPrint(baseName));
433 for (
const auto &baseName: baseNameVector)
448 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocAnchor)}\n");
471 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocInclude)}\n");
559 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocIncOperator)}\n");
579 std::unique_ptr<FileDef> fd =
nullptr;
620 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocFormula)}\n");
626 m_t <<
"\\pard\\plain";
630 m_t <<
"{ \\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"" << f.
relPath() << f.
name() <<
".png\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt Image}}";
641 DBG_RTF(
"{\\comment RTFDocVisitor::visit(DocIndexEntry)}\n");
642 m_t <<
"{\\xe \\v " << i.
entry() <<
"}\n";
653 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocCite &)}\n");
666 if (!opt.noPar())
filter(
"[");
668 if (!opt.noPar())
filter(
"]");
681 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocAutoList &)}\n");
698 static int prevLevel = -1;
700 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocAutoListItem &)}\n");
702 if ((level != prevLevel-1) &&
703 (!(level==prevLevel && level != 0 &&
m_listItemInfo[level].isCheck)) &&
739 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocPara &)}\n");
744 std::get_if<DocParamSect>(p.
parent())
756 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocRoot &)}\n");
758 m_t <<
"{" <<
rtf_Style[
"BodyText"].reference() <<
"\n";
769 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocSimpleSect &)}\n");
773 m_t <<
"{" <<
rtf_Style[
"Heading5"].reference() <<
"\n";
819 m_t <<
"{\\s17 \\sa60 \\sb30\n";
825 std::visit(*
this,*s.
title());
845 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocTitle &)}\n");
853 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocSimpleSect &)}\n");
867 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocSimpleListItem &)}\n");
876 DBG_RTF(
"{\\comment RTFDocVisitor::visitPost(DocSimpleListItem)}\n");
882 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocSection &)}\n");
892 heading.
sprintf(
"Heading%d",level);
898 std::visit(*
this,*s.
title());
900 m_t <<
"\n\\par" <<
"}\n";
901 m_t <<
"{\\tc\\tcl" << level <<
" \\v ";
904 std::visit(*
this,*s.
title());
916 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlList &)}\n");
923 for (
const auto &opt : l.
attribs())
925 if (opt.name==
"type")
929 if (opt.name==
"start")
932 int val = opt.value.toInt(&ok);
938 m_t <<
"\\par" <<
"}\n";
945 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlListItem &)}\n");
951 for (
const auto &opt : l.
attribs())
953 if (opt.name==
"value")
956 int val = opt.value.toInt(&ok);
993 DBG_RTF(
"{\\comment RTFDocVisitor::visitPost(DocHtmlListItem)}\n");
999 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlDescList &)}\n");
1012 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlDescTitle &)}\n");
1015 m_t <<
"{" <<
rtf_Style[
"Heading5"].reference() <<
"\n";
1026 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlDescData &)}\n");
1039 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlTable &)}\n");
1045 m_t <<
"\\pard \\qc \\b";
1051 m_t <<
"{Table \\field\\flddirty{\\*\\fldinst { SEQ Table \\\\*Arabic }}{\\fldrslt {\\noproof 1}} ";
1052 std::visit(*
this,*t.
caption());
1055 m_t <<
"\\pard\\plain\n";
1062 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlCaption &)}\n");
1064 m_t <<
"}\n\\par\n";
1070 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlRow &)}\n");
1072 m_t <<
"\\trowd \\trgaph108\\trleft-108"
1073 "\\trbrdrt\\brdrs\\brdrw10 "
1074 "\\trbrdrl\\brdrs\\brdrw10 "
1075 "\\trbrdrb\\brdrs\\brdrw10 "
1076 "\\trbrdrr\\brdrs\\brdrw10 "
1077 "\\trbrdrh\\brdrs\\brdrw10 "
1078 "\\trbrdrv\\brdrs\\brdrw10 \n";
1079 for (
size_t i=0;i<r.
numCells();i++)
1083 m_t <<
"\\clcbpat16";
1085 m_t <<
"\\clvertalt\\clbrdrt\\brdrs\\brdrw10 "
1086 "\\clbrdrl\\brdrs\\brdrw10 "
1087 "\\clbrdrb\\brdrs\\brdrw10 "
1088 "\\clbrdrr \\brdrs\\brdrw10 "
1090 "\\cellx" << ((i+1)*columnWidth) <<
"\n";
1092 m_t <<
"\\pard \\widctlpar\\intbl\\adjustright\n";
1096 m_t <<
"\\pard \\widctlpar\\intbl\\adjustright\n";
1097 m_t <<
"{\\row }\n";
1104 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlCell &)}\n");
1121 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHRef &)}\n");
1135 "{\\cs37\\ul\\cf2 ";
1141 "{ HYPERLINK \"" << href.
url() <<
"\" "
1145 "{\\cs37\\ul\\cf2 ";
1178 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlDetails &)}\n");
1183 std::visit(*
this,*summary);
1201 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlHeader &)}\n");
1206 heading.
sprintf(
"Heading%d",level);
1210 m_t <<
"{\\tc\\tcl" << level <<
" ";
1229 m_t <<
"\\pard \\qc ";
1231 m_t <<
"{ \\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
1233 m_t <<
"\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt Image}}\n";
1239 m_t <<
"\\pard \\qc \\b";
1240 m_t <<
"{Image \\field\\flddirty{\\*\\fldinst { SEQ Image \\\\*Arabic }}{\\fldrslt {\\noproof 1}} ";
1246 if (hasCaption)
m_t <<
"{\\comment ";
1263 if (hasCaption)
m_t <<
" }";
1286 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocImage &)}\n");
1295 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocDotFile &)}\n");
1303 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocMscFile &)}\n");
1312 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocDiaFile &)}\n");
1321 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocPlantUmlFile &)}\n");
1329 for(
const auto &baseName: baseNameVector)
1340 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocLink &)}\n");
1349 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocRef &)}\n");
1369 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocSecRefItem &)}\n");
1376 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocSecRefList &)}\n");
1392 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocParamSect &)}\n");
1396 m_t <<
"{" <<
rtf_Style[
"Heading5"].reference() <<
"\n";
1438 static int columnPos[4][5] =
1439 { { 2, 25, 100, 100, 100 },
1440 { 3, 14, 35, 100, 100 },
1441 { 3, 25, 50, 100, 100 },
1442 { 4, 14, 35, 55, 100 },
1446 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocParamList &)}\n");
1452 parentType = sect->
type();
1462 m_t <<
"\\trowd \\trgaph108\\trleft426\\tblind426"
1463 "\\trbrdrt\\brdrs\\brdrw10\\brdrcf15 "
1464 "\\trbrdrl\\brdrs\\brdrw10\\brdrcf15 "
1465 "\\trbrdrb\\brdrs\\brdrw10\\brdrcf15 "
1466 "\\trbrdrr\\brdrs\\brdrw10\\brdrcf15 "
1467 "\\trbrdrh\\brdrs\\brdrw10\\brdrcf15 "
1468 "\\trbrdrv\\brdrs\\brdrw10\\brdrcf15 "<<
"\n";
1469 for (
int i=0;i<columnPos[config][0];i++)
1471 m_t <<
"\\clvertalt\\clbrdrt\\brdrs\\brdrw10\\brdrcf15 "
1472 "\\clbrdrl\\brdrs\\brdrw10\\brdrcf15 "
1473 "\\clbrdrb\\brdrs\\brdrw10\\brdrcf15 "
1474 "\\clbrdrr \\brdrs\\brdrw10\\brdrcf15 "
1476 "\\cellx" << (
rtf_pageWidth*columnPos[config][i+1]/100) <<
"\n";
1478 m_t <<
"\\pard \\widctlpar\\intbl\\adjustright\n";
1519 std::visit(*
this,type);
1537 if (!first)
m_t <<
",";
else first=
FALSE;
1538 std::visit(*
this,param);
1550 std::visit(*
this,par);
1555 m_t <<
"\\cell }\n";
1557 m_t <<
"{\\row }\n";
1571 bool anonymousEnum = x.
file()==
"@";
1572 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocXRefItem &)}\n");
1580 m_t <<
"{" <<
rtf_Style[
"Heading5"].reference() <<
"\n";
1603 "{\\cs37\\ul\\cf2 ";
1621 DBG_RTF(
"{\\comment RTFDocVisitor::visitPost(DocXRefItem)}\n");
1631 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocInternalRef &)}\n");
1641 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocText &)}\n");
1648 DBG_RTF(
"{\\comment RTFDocVisitor::operator()(const DocHtmlBlockQuote &)}\n");
1682 const char *p=str.
data();
1688 case '{':
m_t <<
"\\{";
break;
1689 case '}':
m_t <<
"\\}";
break;
1690 case '\\':
m_t <<
"\\\\";
break;
1691 case '\n':
if (verbatim)
1724 m_t <<
"{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
1727 m_t <<
"}{\\fldrslt {\\cs37\\ul\\cf2 ";
1754 const QCString &srcFile,
int srcLine)
1768 const QCString &srcFile,
int srcLine)
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, bool isExampleBlock, const QCString &exampleName=QCString(), const FileDef *fileDef=nullptr, int startLine=-1, int endLine=-1, bool inlineFragment=FALSE, const MemberDef *memberDef=nullptr, bool showLineNumbers=TRUE, const Definition *searchCtx=nullptr, bool collectXRefs=TRUE)=0
Parses a source file or fragment with the goal to produce highlighted and cross-referenced output.
Class representing a directory in the file system.
bool remove(const std::string &path, bool acceptsAbsPath=true) const
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 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.
Class representing a list of different code generators.
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()
void generatePlantUMLOutput(const QCString &baseName, const QCString &outDir, OutputFormat format)
Convert a PlantUML file to an image.
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
QCString mid(size_t index, size_t len=static_cast< size_t >(-1)) 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,...)
int findRev(char c, int index=-1, bool cs=TRUE) const
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 writeDotFile(const QCString &fileName, bool hasCaption, const QCString &srcFile, int srcLine)
void includePicturePreRTF(const QCString &name, bool isTypeRTF, bool hasCaption, bool inlineImage=FALSE)
void writeDiaFile(const DocDiaFile &)
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 writeMscFile(const QCString &fileName, bool hasCaption, const QCString &srcFile, int srcLine)
QCString getListTable(const int id)
void endLink(const QCString &ref)
RTFListItemInfo m_listItemInfo[maxIndentLevels]
void operator()(const DocWord &)
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)
static QCString makeBaseName(const QCString &name)
void writeDotGraphFromFile(const QCString &inFile, const QCString &outDir, const QCString &outFile, GraphOutputFormat format, const QCString &srcFile, int srcLine)
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)
std::ofstream openOutputStream(const QCString &name, bool append=false)
Portable versions of functions that are platform dependent.
const char * qPrint(const char *s)
static QCString align(const DocHtmlCell &cell)
static QCString makeBaseName(const QCString &name)
QCString rtfFormatBmkStr(const QCString &name)
Rtf_Table_Default rtf_Table_Default[]
const char * reference() const
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()
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.