48 void move(
int dx,
int dy) {
m_x=
static_cast<uint32_t
>(
m_x+dx);
m_y=
static_cast<uint32_t
>(
m_y+dy); }
51 float xfPos()
const {
return static_cast<float>(
m_x); }
52 float yfPos()
const {
return static_cast<float>(
m_y); }
79 using Ptr = std::unique_ptr<DiagramItem>;
80 using Vec = std::vector<Ptr>;
103 using Ptr = std::unique_ptr<DiagramRow>;
104 using Vec = std::vector<Ptr>;
112 bool doBase,
bool bitmap,
113 uint32_t baseRows,uint32_t superRows,
114 uint32_t cellWidth,uint32_t cellHeight,
116 bool generateMap=
TRUE);
118 bool doBase,
bool bitmap,
119 uint32_t baseRows,uint32_t superRows,
120 uint32_t cellWidth,uint32_t cellheight);
124 {
m_rows.push_back(std::make_unique<DiagramRow>(
this,l));
return m_rows.back().get(); }
149 case Protection::Public:
return 0xffffffff;
150 case Protection::Package:
151 case Protection::Protected:
return 0xcccccccc;
152 case Protection::Private:
return 0xaaaaaaaa;
161 case Protection::Public:
return 6;
162 case Protection::Package:
163 case Protection::Protected:
return 5;
164 case Protection::Private:
return 4;
173 case Protection::Public:
return "solid";
174 case Protection::Package:
175 case Protection::Protected:
return "dashed";
176 case Protection::Private:
return "dotted";
185 case Specifier::Normal:
return 0xffffffff;
186 case Specifier::Virtual:
return 0xf0f0f0f0;
197 const char *p=s.
data();
203 case '(': result+=
"\\(";
break;
204 case ')': result+=
"\\)";
break;
205 default: result+=c;
break;
214 auto it = dil.begin();
218 result=(*it)->protection();
219 for (++it;it!=dil.end();++it)
224 if (result==Protection::Protected && p==Protection::Public) result=p;
225 else if (result==Protection::Private) result=p;
233 uint32_t x,uint32_t y,uint32_t w,uint32_t h,
bool firstRow,
234 bool hasDocs,
bool children=
FALSE)
236 uint8_t colFill = hasDocs ? (firstRow ? 8 : 2) : 7;
237 uint8_t colBorder = (firstRow || !hasDocs) ? 1 : 3;
240 image->
fillRect(x+1,y+1,w-2,h-2,colFill,mask);
241 image->
drawRect(x,y,w,h,colBorder,mask);
245 for (uint32_t i=0;i<5;i++)
247 image->
drawHorzLine(y+h+i-6,x+w-2-i,x+w-2,firstRow?1:3,0xffffffff);
253 float x,
float y,
bool children=
FALSE)
255 if (di->
virtualness()==Specifier::Virtual) t <<
"dashed\n";
257 if (children) t << x <<
" " << y <<
" mark\n";
258 if (di->
virtualness()==Specifier::Virtual) t <<
"solid\n";
262 uint32_t x,uint32_t y,uint32_t w,uint32_t h)
288 t <<
"\" shape=\"rect\" coords=\"" << x <<
"," << y <<
",";
289 t << (x+w) <<
"," << (y+h) <<
"\"/>\n";
338 return static_cast<uint32_t
>(
m_children.size());
356 m_items.push_back(std::move(di));
364 if (count>0 && (prot!=Protection::Private || !doBases))
381 doBases ? bcd.virt : Specifier::Normal,
382 doBases ? bcd.templSpecifiers :
QCString());
392 auto row = std::make_unique<DiagramRow>(
this,0);
395 row_ptr->
insertClass(
nullptr,root,doBases,Protection::Public,Specifier::Normal,
QCString());
415 uint32_t pPos=root->
xPos();
422 for (uint32_t k=children.front()->number();k<row->numItems();k++)
424 row->item(k)->move(
static_cast<int>(pPos-cPos),0);
433 for (uint32_t k=root->
number();k<row->numItems();k++)
435 row->item(k)->move(
static_cast<int>(cPos-pPos),0);
441 auto it = children.begin();
442 for (;it!=children.end() && !moved && !(*it)->isInList();++it)
456 const auto &
row = *it;
461 for (
const auto &di : *
row)
464 if (pi==opi && !first) { delta-=
gridWidth; }
480 const auto &
row = *it;
481 auto rit =
row->begin();
482 while (rit!=
row->end())
488 while (rit!=
row->end() && (*rit)->parentItem()==pi)
506 while (it!=
m_rows.end() && !(*it)->item(0)->isInList())
515 const auto &
row = *it;
516 uint32_t maxListLen=0;
517 uint32_t curListLen=0;
519 for (
const auto &di : *
row)
521 if (di->parentItem()!=opi) curListLen=1;
else curListLen++;
522 if (curListLen>maxListLen) maxListLen=curListLen;
534 for (
const auto &dr :
m_rows)
537 for (
const auto &di : *dr)
539 if (di->isInList()) done=
TRUE;
540 if (maxXPos) mx=std::max(mx,di->xPos());
545 if (maxLabelLen) *maxLabelLen=ml;
546 if (maxXPos) *maxXPos=mx;
550template<
class C,
class I>
557 if (fwd)
m_it = container.begin();
558 else m_rit = container.rbegin();
585 bool doBase,
bool bitmap,
586 uint32_t baseRows,uint32_t superRows,
587 uint32_t cellWidth,uint32_t cellHeight,
592 if (it!=
m_rows.end() && !doBase) ++it;
593 bool firstRow = doBase;
595 float superRowsF =
static_cast<float>(superRows);
596 for (;it!=
m_rows.end() && !done;++it)
598 const auto &dr = *it;
600 float xf=0.0f,yf=0.0f;
618 if (doBase) yf += 1.0f;
630 superRows*cellHeight-
660 if (!firstRow && generateMap)
674 for (
const auto &di : *dr)
682 superRows*cellHeight-
691 bool hasDocs=di->getClassDef()->isLinkable();
692 writeBitmapBox(di.get(),image,x,y,cellWidth,cellHeight,firstRow,hasDocs);
693 if (!firstRow && generateMap)
694 writeMapArea(t,di->getClassDef(),relPath,x,y,cellWidth,cellHeight);
716 bool doBase,
bool bitmap,
717 uint32_t baseRows,uint32_t superRows,
718 uint32_t cellWidth,uint32_t cellHeight)
722 float superRowsF =
static_cast<float>(superRows);
723 for (;it!=
m_rows.end() && !done;++it)
725 const auto &dr = *it;
729 uint32_t x=0,y=0,ys=0;
730 float xf=0.0f,yf=0.0f,ysf=0.0f;
731 auto rit = dr->begin();
732 while (rit!=dr->end())
789 y = ys - cellHeight/2;
795 y = ys + cellHeight/2;
836 t <<
"1 " << xf <<
" " << yf <<
" hedge\n";
841 t <<
"0 " << xf <<
" " << yf <<
" hedge\n";
846 if (rit!=dr->end()) di = (*rit).get();
else di=
nullptr;
875 t <<
"1 " << xf <<
" " << yf <<
" hedge\n";
879 t <<
"0 " << xf <<
" " << yf <<
" hedge\n";
884 t << xf <<
" " << ysf <<
" " << yf <<
" vedge\n";
888 t << xf <<
" " << (ysf + 0.25f) <<
" " << yf <<
" vedge\n";
892 if (rit!=dr->end()) ++rit;
898 for (
const auto &di : *dr)
934 t <<
"1 " << di->xfPos()/
gridWidth <<
" "
935 << (di->yfPos()/
gridHeight+superRowsF-1.0f) <<
" in\n";
939 t <<
"0 " << di->xfPos()/
gridWidth <<
" "
974 t <<
"0 " << di->xfPos()/
gridWidth <<
" "
975 << (di->yfPos()/
gridHeight+superRowsF-1.0f) <<
" out\n";
979 t <<
"1 " << di->xfPos()/
gridWidth <<
" "
987 if (first!=last && !first->
isInList())
1043 p->base.computeLayout();
1044 p->super.computeLayout();
1047 uint32_t xbase = baseItem->
xPos();
1048 uint32_t xsuper = superItem->
xPos();
1051 int dist=
static_cast<int>(xbase-xsuper);
1052 superItem->
move(dist,0);
1053 p->super.moveChildren(superItem,dist);
1055 else if (xbase<xsuper)
1057 int dist=
static_cast<int>(xsuper-xbase);
1058 baseItem->
move(dist,0);
1059 p->base.moveChildren(baseItem,dist);
1068 uint32_t baseRows=
p->base.computeRows();
1069 uint32_t superRows=
p->super.computeRows();
1070 uint32_t baseMaxX = 0, baseMaxLabelWidth = 0, superMaxX = 0, superMaxLabelWidth = 0;
1071 p->base.computeExtremes(&baseMaxLabelWidth,&baseMaxX);
1072 p->super.computeExtremes(&superMaxLabelWidth,&superMaxX);
1074 uint32_t rows=std::max(1u,baseRows+superRows-1);
1078 float estHeight =
static_cast<float>(rows)*40.0f;
1079 float estWidth =
static_cast<float>(cols)*(20+
static_cast<float>(std::max(baseMaxLabelWidth,superMaxLabelWidth)));
1082 const float pageWidth = 14.0f;
1087 float realHeight =
static_cast<float>(std::min(rows,12u));
1088 float realWidth = realHeight * estWidth/estHeight;
1089 if (realWidth>pageWidth)
1091 realHeight*=pageWidth/realWidth;
1095 output <<
"\\begin{figure}[H]\n"
1098 output <<
"\\includegraphics[height=" << realHeight <<
"cm]{"
1099 << fileName <<
"}\n";
1100 output <<
"\\end{center}\n"
1106 QCString epsName=epsBaseName+
".eps";
1110 term(
"Could not open file {} for writing\n",epsName);
1120 t <<
"%!PS-Adobe-2.0 EPSF-2.0\n";
1121 t <<
"%%Title: ClassName\n";
1122 t <<
"%%Creator: Doxygen\n";
1123 t <<
"%%CreationDate: Time\n";
1125 t <<
"%Magnification: 1.00\n";
1126 t <<
"%%Orientation: Portrait\n";
1127 t <<
"%%BoundingBox: 0 0 500 " << estHeight*500.0f/estWidth <<
"\n";
1128 t <<
"%%Pages: 0\n";
1129 t <<
"%%BeginSetup\n";
1130 t <<
"%%EndSetup\n";
1131 t <<
"%%EndComments\n";
1133 t <<
"% ----- variables -----\n";
1135 t <<
"/boxwidth 0 def\n";
1136 t <<
"/boxheight 40 def\n";
1137 t <<
"/fontheight 24 def\n";
1138 t <<
"/marginwidth 10 def\n";
1139 t <<
"/distx 20 def\n";
1140 t <<
"/disty 40 def\n";
1141 t <<
"/boundaspect " << estWidth/estHeight <<
" def % aspect ratio of the BoundingBox (width/height)\n";
1142 t <<
"/boundx 500 def\n";
1143 t <<
"/boundy boundx boundaspect div def\n";
1144 t <<
"/xspacing 0 def\n";
1145 t <<
"/yspacing 0 def\n";
1146 t <<
"/rows " << rows <<
" def\n";
1147 t <<
"/cols " << cols <<
" def\n";
1148 t <<
"/scalefactor 0 def\n";
1149 t <<
"/boxfont /Times-Roman findfont fontheight scalefont def\n";
1151 t <<
"% ----- procedures -----\n";
1153 t <<
"/dotted { [1 4] 0 setdash } def\n";
1154 t <<
"/dashed { [5] 0 setdash } def\n";
1155 t <<
"/solid { [] 0 setdash } def\n";
1157 t <<
"/max % result = MAX(arg1,arg2)\n";
1159 t <<
" /a exch def\n";
1160 t <<
" /b exch def\n";
1161 t <<
" a b gt {a} {b} ifelse\n";
1164 t <<
"/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2)\n";
1166 t <<
" 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max\n";
1169 t <<
"/cw % boxwidth = MAX(boxwidth, stringwidth(arg1))\n";
1171 t <<
" /str exch def\n";
1172 t <<
" /boxwidth boxwidth str stringwidth pop max def\n";
1175 t <<
"/box % draws a box with text 'arg1' at grid pos (arg2,arg3)\n";
1177 t <<
" 2 setlinewidth\n";
1179 t <<
" exch xspacing mul xoffset add\n";
1180 t <<
" exch yspacing mul\n";
1182 t <<
" boxwidth 0 rlineto \n";
1183 t <<
" 0 boxheight rlineto \n";
1184 t <<
" boxwidth neg 0 rlineto \n";
1185 t <<
" 0 boxheight neg rlineto \n";
1186 t <<
" closepath\n";
1187 t <<
" dup stringwidth pop neg boxwidth add 2 div\n";
1188 t <<
" boxheight fontheight 2 div sub 2 div\n";
1189 t <<
" rmoveto show stroke\n";
1195 t <<
" exch xspacing mul xoffset add boxwidth add\n";
1196 t <<
" exch yspacing mul\n";
1198 t <<
" 0 boxheight 4 div rlineto\n";
1199 t <<
" boxheight neg 4 div boxheight neg 4 div rlineto\n";
1200 t <<
" closepath\n";
1208 t <<
" 3 -8 rlineto\n";
1209 t <<
" -6 0 rlineto\n";
1210 t <<
" 3 8 rlineto\n";
1211 t <<
" closepath\n";
1216 t <<
"/out % draws an output connector for the block at (arg1,arg2)\n";
1219 t <<
" exch xspacing mul xoffset add boxwidth 2 div add\n";
1220 t <<
" exch yspacing mul boxheight add\n";
1221 t <<
" /y exch def\n";
1222 t <<
" /x exch def\n";
1223 t <<
" x y moveto\n";
1224 t <<
" 0 disty 2 div rlineto \n";
1226 t <<
" 1 eq { x y disty 2 div add arrow } if\n";
1229 t <<
"/in % draws an input connector for the block at (arg1,arg2)\n";
1232 t <<
" exch xspacing mul xoffset add boxwidth 2 div add\n";
1233 t <<
" exch yspacing mul disty 2 div sub\n";
1234 t <<
" /y exch def\n";
1235 t <<
" /x exch def\n";
1236 t <<
" x y moveto\n";
1237 t <<
" 0 disty 2 div rlineto\n";
1239 t <<
" 1 eq { x y disty 2 div add arrow } if\n";
1244 t <<
" exch xspacing mul xoffset add boxwidth 2 div add\n";
1245 t <<
" exch yspacing mul boxheight 2 div sub\n";
1246 t <<
" /y exch def\n";
1247 t <<
" /x exch def\n";
1249 t <<
" x y moveto\n";
1250 t <<
" boxwidth 2 div distx add 0 rlineto\n";
1253 t <<
" { newpath x boxwidth 2 div distx add add y moveto\n";
1254 t <<
" -8 3 rlineto\n";
1255 t <<
" 0 -6 rlineto\n";
1256 t <<
" 8 3 rlineto\n";
1257 t <<
" closepath\n";
1265 t <<
" /ye exch def\n";
1266 t <<
" /ys exch def\n";
1267 t <<
" /xs exch def\n";
1269 t <<
" xs xspacing mul xoffset add boxwidth 2 div add dup\n";
1270 t <<
" ys yspacing mul boxheight 2 div sub\n";
1272 t <<
" ye yspacing mul boxheight 2 div sub\n";
1277 t <<
"/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3'\n";
1279 t <<
" /ys exch def\n";
1280 t <<
" /xe exch def\n";
1281 t <<
" /xs exch def\n";
1283 t <<
" xs xspacing mul xoffset add boxwidth 2 div add\n";
1284 t <<
" ys yspacing mul disty 2 div sub\n";
1286 t <<
" xspacing xe xs sub mul 0\n";
1291 t <<
"% ----- main ------\n";
1293 t <<
"boxfont setfont\n";
1294 t <<
"1 boundaspect scale\n";
1297 for (
const auto &dr :
p->base)
1300 for (
const auto &di : *dr)
1302 done=di->isInList();
1308 auto it =
p->super.begin();
1309 if (it!=
p->super.end()) ++it;
1310 for (;it!=
p->super.end();++it)
1312 const auto &dr = *it;
1314 for (
const auto &di : *dr)
1316 done=di->isInList();
1322 t <<
"/boxwidth boxwidth marginwidth 2 mul add def\n"
1323 <<
"/xspacing boxwidth distx add def\n"
1324 <<
"/yspacing boxheight disty add def\n"
1325 <<
"/scalefactor \n"
1326 <<
" boxwidth cols mul distx cols 1 sub mul add\n"
1327 <<
" boxheight rows mul disty rows 1 sub mul add boundaspect mul \n"
1329 <<
"boundx scalefactor div boundy scalefactor div scale\n";
1331 t <<
"\n% ----- classes -----\n\n";
1332 p->base.drawBoxes(t,
nullptr,
TRUE,
FALSE,baseRows,superRows,0,0);
1333 p->super.drawBoxes(t,
nullptr,
FALSE,
FALSE,baseRows,superRows,0,0);
1335 t <<
"\n% ----- relations -----\n\n";
1336 p->base.drawConnectors(t,
nullptr,
TRUE,
FALSE,baseRows,superRows,0,0);
1337 p->super.drawConnectors(t,
nullptr,
FALSE,
FALSE,baseRows,superRows,0,0);
1345 epstopdfArgs.
sprintf(
"\"%s.eps\" --outfile=\"%s.pdf\"",
1350 err(
"Problems running epstopdf. Check your TeX installation!\n");
1363 bool generateMap)
const
1365 uint32_t baseRows=
p->base.computeRows();
1366 uint32_t superRows=
p->super.computeRows();
1367 uint32_t rows=baseRows+superRows-1;
1369 uint32_t lb=0,ls=0,xb=0,xs=0;
1370 p->base.computeExtremes(&lb,&xb);
1371 p->super.computeExtremes(&ls,&xs);
1374 uint32_t maxXPos = std::max(xb,xs);
1375 uint32_t labelVertMargin = 6;
1376 uint32_t cellHeight = labelVertMargin*2+
fontHeight;
1381 Image image(imageWidth,imageHeight);
1383 p->base.drawBoxes(t,&image,
TRUE,
TRUE,baseRows,superRows,cellWidth,cellHeight,relPath,generateMap);
1384 p->super.drawBoxes(t,&image,
FALSE,
TRUE,baseRows,superRows,cellWidth,cellHeight,relPath,generateMap);
1385 p->base.drawConnectors(t,&image,
TRUE,
TRUE,baseRows,superRows,cellWidth,cellHeight);
1386 p->super.drawConnectors(t,&image,
FALSE,
TRUE,baseRows,superRows,cellWidth,cellHeight);
1388#define IMAGE_EXT ".png"
A abstract class representing of a compound symbol.
virtual bool isVisibleInHierarchy() const =0
the class is visible in a class diagram, or class hierarchy
virtual const BaseClassList & baseClasses() const =0
Returns the list of base classes from which this class directly inherits.
virtual const BaseClassList & subClasses() const =0
Returns the list of sub classes that directly derive from this class.
void writeImage(TextStream &t, const QCString &path, const QCString &relPath, const QCString &file, bool generateMap=true) const
ClassDiagram(const ClassDef *root)
void writeFigure(TextStream &t, const QCString &path, const QCString &file) const
std::unique_ptr< Private > p
virtual bool isLinkable() const =0
virtual QCString anchor() const =0
virtual QCString briefDescriptionAsTooltip() const =0
virtual QCString getReference() const =0
virtual QCString displayName(bool includeScope=TRUE) const =0
virtual QCString getOutputFileBase() const =0
Class representing a single node in the built-in class diagram.
Specifier virtualness() const
DiagramItem(DiagramItem *p, uint32_t number, const ClassDef *cd, Protection prot, Specifier virt, const QCString &ts)
void addChild(DiagramItem *di)
DiagramItemList getChildren()
const ClassDef * m_classDef
uint32_t avgChildPos() const
DiagramItem * parentItem()
const ClassDef * getClassDef() const
uint32_t numChildren() const
Protection protection() const
void move(int dx, int dy)
DiagramItemList m_children
Class representing a row in the built-in class diagram.
uint32_t numItems() const
std::unique_ptr< DiagramItem > Ptr
DiagramItem * item(int index)
typename Vec::reverse_iterator reverse_iterator
DiagramRow(TreeDiagram *d, uint32_t l)
typename Vec::iterator iterator
void insertClass(DiagramItem *parent, const ClassDef *cd, bool doBases, Protection prot, Specifier virt, const QCString &ts)
reverse_iterator rbegin()
Class representing a directory in the file system.
bool remove(const std::string &path, bool acceptsAbsPath=true) const
static IndexList * indexList
helper class representing an iterator that can iterate forwards or backwards
C::reverse_iterator m_rit
DualDirIterator(C &container, bool fwd)
Class representing a bitmap image generated by doxygen.
void drawVertLine(uint32_t x, uint32_t ys, uint32_t ye, uint8_t colIndex, uint32_t mask)
void drawHorzLine(uint32_t y, uint32_t xs, uint32_t xe, uint8_t colIndex, uint32_t mask)
void drawVertArrow(uint32_t x, uint32_t ys, uint32_t ye, uint8_t colIndex, uint32_t mask)
void fillRect(uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint8_t colIndex, uint32_t mask)
void drawHorzArrow(uint32_t y, uint32_t xs, uint32_t xe, uint8_t colIndex, uint32_t mask)
void drawRect(uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint8_t colIndex, uint32_t mask)
void writeString(uint32_t x, uint32_t y, const QCString &s, uint8_t fg)
friend uint32_t stringLength(const QCString &s)
This is an alternative implementation of QCString.
size_t length() const
Returns the length of the string, not counting the 0-terminator.
bool endsWith(const char *s) const
bool isEmpty() const
Returns TRUE iff the string is empty.
const std::string & str() const
void reserve(size_t size)
Reserve space for size bytes without changing the string contents.
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.
QCString left(size_t len) const
Text streaming class that buffers data.
Class representing the tree layout for the built-in class diagram.
void drawConnectors(TextStream &t, Image *image, bool doBase, bool bitmap, uint32_t baseRows, uint32_t superRows, uint32_t cellWidth, uint32_t cellheight)
std::unique_ptr< DiagramRow > Ptr
bool layoutTree(DiagramItem *root, uint32_t row)
DiagramRow * row(int index)
void drawBoxes(TextStream &t, Image *image, bool doBase, bool bitmap, uint32_t baseRows, uint32_t superRows, uint32_t cellWidth, uint32_t cellHeight, QCString relPath="", bool generateMap=TRUE)
void moveChildren(DiagramItem *root, int dx)
typename Vec::iterator iterator
TreeDiagram(const ClassDef *root, bool doBases)
DiagramRow * addRow(uint32_t l)
void computeExtremes(uint32_t *labelWidth, uint32_t *xpos)
#define Config_getBool(name)
const uint32_t maxTreeWidth
const uint32_t labelHorMargin
static void writeMapArea(TextStream &t, const ClassDef *cd, QCString relPath, uint32_t x, uint32_t y, uint32_t w, uint32_t h)
const uint32_t labelHorSpacing
static void writeBitmapBox(DiagramItem *di, Image *image, uint32_t x, uint32_t y, uint32_t w, uint32_t h, bool firstRow, bool hasDocs, bool children=FALSE)
std::vector< DiagramItem * > DiagramItemList
const uint32_t gridHeight
const uint32_t fontHeight
static Protection getMinProtectionLevel(const DiagramItemList &dil)
static QCString convertToPSString(const QCString &s)
static void writeVectorBox(TextStream &t, DiagramItem *di, float x, float y, bool children=FALSE)
static uint32_t virtToMask(Specifier p)
static uint8_t protToColor(Protection p)
static QCString protToString(Protection p)
static uint32_t protToMask(Protection p)
const uint32_t labelVertSpacing
constexpr DocNodeVariant * parent(DocNodeVariant *n)
returns the parent node of a given node n or nullptr if the node has no parent.
std::ofstream openOutputStream(const QCString &name, bool append=false)
int system(const QCString &command, const QCString &args, bool commandHasConsole=true)
Portable versions of functions that are platform dependent.
const char * qPrint(const char *s)
Private(const ClassDef *root)
QCString externalRef(const QCString &relPath, const QCString &ref, bool href)
QCString insertTemplateSpecifierInScope(const QCString &scope, const QCString &templ)
QCString convertToHtml(const QCString &s, bool keepEntities)
QCString stripScope(const QCString &name)
QCString convertToXML(const QCString &s, bool keepEntities)
QCString externalLinkTarget(const bool parent)
void addHtmlExtensionIfMissing(QCString &fName)
A bunch of utility functions.