13#include "RConfigure.h"
44 class THtmlThreadInfo {
46 THtmlThreadInfo(
THtml* html,
bool force): fHtml(html), fForce(force) {}
47 Bool_t GetForce()
const {
return fForce;}
48 THtml* GetHtml()
const {
return fHtml;}
75 if (fHtml && html && html != fHtml) {
76 Error(
"SetOwner()",
"Object already owned by an THtml instance!");
77 fHtml->HelperDeleted(
this);
107 out_modulename =
"USER";
108 if (!cl)
return false;
118 TString inputdir = GetOwner()->GetInputPath();
137 while (out_modulename[0] ==
'.')
138 out_modulename.
Remove(0, 1);
140 while (out_modulename[0] ==
'/')
141 out_modulename.
Remove(0, 1);
142 while (out_modulename.
EndsWith(
"/"))
145 if (!out_modulename[0])
146 out_modulename = trailingInclude;
148 if (!out_modulename[0])
149 out_modulename = trailingInclude;
159 pos = out_modulename.
Index(
"/inc/");
161 out_modulename.
Remove(pos);
164 while (out_modulename.
EndsWith(
"/"))
168 if (out_modulename ==
"MATH/GENVECTOR")
169 out_modulename =
"MATHCORE";
170 else if (out_modulename ==
"MATH/MATRIX")
171 out_modulename =
"SMATRIX";
172 else if (!out_modulename.
Length()) {
173 const char* cname= cl->
GetName();
174 if (strstr(cname,
"::SMatrix<") || strstr(cname,
"::SVector<"))
175 out_modulename =
"SMATRIX";
176 else if (strstr(cname,
"::TArrayProxy<") || strstr(cname,
"::TClaArrayProxy<")
177 || strstr(cname,
"::TImpProxy<") || strstr(cname,
"::TClaImpProxy<"))
178 out_modulename =
"TREEPLAYER";
186 out_modulename.
Remove(0,3);
187 pos = out_modulename.
Index(
'.');
191 if (!out_modulename.
Length()) {
192 out_modulename =
"USER";
208 THtml* owner = GetOwner();
241 while (clname.
Tokenize(token, from,
"::") ) {
265 return GetFileName(cl,
true, out_filename, out_fsys, fse);
282 return GetFileName(cl,
false, out_filename, out_fsys, fse);
291 static const char* delim[] = {
"/",
"\\\\"};
292 for (
int i = 0; i < 2; ++i) {
293 const char*
d = delim[i];
319 filename = filesysname;
320 if (!filename.
EndsWith(filesysname)) {
327 if (fse) *fse = fsentry;
354 NormalizePath(clfile);
356 out_filename = clfile;
363 if (clfile ==
"include/TMathBase.h") {
364 clfile =
"math/mathcore/inc/TMath.h";
365 out_filename = clfile;
374 longestMatch = inclDir.
Length();
376 if (longestMatch !=
kNPOS) {
377 clfile.
Remove(0, longestMatch);
381 GetOwner()->GetPathDefinition().GetFileNameFromInclude(asincl, clfile);
382 out_filename = clfile;
385 filesysname = MatchFileSysName(out_filename, fse);
386 if (filesysname[0]) {
387 clfile = out_filename;
393 int templateLevel = 0;
396 for (; start >= 0 && (templateLevel || filesysname[start] !=
':'); --start) {
397 if (filesysname[start] ==
'>')
399 else if (filesysname[start] ==
'<') {
405 filesysname = filesysname(start + 1, end - start - 1);
409 filesysname +=
".cxx";
410 out_filename = filesysname;
411 filesysname = MatchFileSysName(out_filename, fse);
412 if (filesysname[0]) {
413 clfile = out_filename;
417 if (!decl && !clfile.
Length()) {
422 if (
GetFileName(cl,
true, filesysname, declSysFileName)) {
426 filesysname.
Remove(posExt);
427 filesysname +=
".cxx";
428 out_filename = filesysname;
429 filesysname = MatchFileSysName(out_filename, fse);
430 if (filesysname[0]) {
431 clfile = out_filename;
436 if (clfile.
Length() && !decl) {
442 static const char* vetoClasses[] = {
"math/mathcore/",
"math/mathmore/",
"math/genvector/",
443 "math/minuit2/",
"math/smatrix/"};
444 for (
unsigned int i = 0; i <
sizeof(vetoClasses) /
sizeof(
char*); ++i) {
445 if (clfile.
Contains(vetoClasses[i])) {
448 if (strcmp(cl->
GetName(),
"TComplex")
449 && strcmp(cl->
GetName(),
"TMath")
450 && strncmp(cl->
GetName(),
"TKDTree", 7)
451 && strcmp(cl->
GetName(),
"TVirtualFitter")
452 && strncmp(cl->
GetName(),
"TRandom", 7)) {
470 SplitClassIntoDirFile(out_filename, possiblePath, possibleFileName);
473 if (possibleFileName.
Length()) {
475 possibleFileName +=
".h";
477 possibleFileName +=
".cxx";
479 if (possiblePath.
Length())
482 possiblePath +=
"inc/";
484 possiblePath +=
"src/";
485 out_filename = possiblePath +
"/" + possibleFileName;
491 if (possiblePath.
Length())
492 ExpandSearchPath(possiblePath);
493 else possiblePath=
".";
497 NormalizePath(out_fsys);
516 if (!GetDocDir(
module, moduledoc))
525 while (macropath.
Tokenize(macrodirpart, pos,
":")) {
526 out_dir += moduledoc +
"/" + macrodirpart +
":";
546 doc_dir =
"$ROOTSYS";
553 doc_dir += GetOwner()->GetPathInfo().fDocPath;
575 if (!cl || !GetOwner())
return false;
582 bool includePathMatches =
false;
588 if (out_dir[0] ==
'/' || out_dir[0] ==
'\\')
590 includePathMatches =
true;
593 if (!includePathMatches) {
602 if (posInc ==
kNPOS)
return true;
603 hdr.
Remove(0, posInc + 5);
607 return (out_dir.
Length());
623 if (!included)
return false;
625 out_fsname = included;
628 const TList* bucket = GetOwner()->GetLocalFiles()->
GetEntries().GetListForObject(incBase);
629 if (!bucket)
return false;
633 TIter iEntry(bucket);
636 if (incBase != entry->
GetName())
continue;
639 for (
int i = arrSubDirs->
GetEntries() - 1; parent && i >= 0; --i) {
641 if (!subdir.
Length() || subdir ==
".")
643 if (subdir == parent->
GetName())
664 if (
gDebug > 0 || GetLevel() < 2)
665 Info(
"Recurse",
"scanning %s...", path);
669 const char* direntry = 0;
671 if (!direntry[0] || direntry[0] ==
'.' || regexp.
Match(direntry))
continue;
672 TString entryPath(dir + direntry);
689 subdir->
Recurse(db, entryPath);
691 int delen = strlen(direntry);
693 if (strcmp(direntry + delen - 4,
".cxx")
694 && strcmp(direntry + delen - 2,
".h")
695 && strcmp(direntry + delen - 4,
".hxx"))
718 Warning(
"Fill",
"Cannot read InputPath \"%s\"!", dir.
Data());
726 Warning(
"Fill",
"InputPath \"%s\" already present as \"%s\"!", dir.
Data(), prevroot->
GetName());
737 Warning(
"Fill",
"Cannot read InputPath \"%s\"!", dir.
Data());
1000// This is the description block. //
1004<p>The environment variable Root.Html.Description
1005(see: <a href="http://root.cern.ch/root/html/TEnv.html">TEnv</a>) contains
1006the delimiter string (default value: <tt>//_________________</tt>). It means
1007that you can also write your class description block like this:</p>
1009 //_____________________________________________________________
1010 // A description of the class starts with the line above, and
1011 // will take place here !
1014<p>Note that <b><i>everything</i></b> until the first non-commented line is considered
1015as a valid class description block.</p>
1017<h4><a name="syntax:classidx">III.2 Class index</a></h4>
1019<p>All classes to be documented will have an entry in the ClassIndex.html,
1020showing their name with a link to their documentation page and a miniature
1021description. This discription for e.g. the class MyClass has to be given
1022in MyClass's header as a comment right after ClassDef(MyClass, n).</p>
1024<h4><a name="syntax:meth">III.3 Method documentation</a></h4>
1025<p>A member function description block starts immediately after '{'
1026and looks like this:</p>
1028 void TWorld::HelloWorldFunc(string *text)
1030 // This is an example of description for the
1031 // TWorld member function
1033 helloWorld.Print( text );
1036Like in a class description block, <b><i>everything</i></b> until the first
1037non-commented line is considered as a valid member function
1040If the rootrc variable <tt>Root.Html.DescriptionStyle</tt> is set to
1041<tt>Doc++</tt> THtml will also look for method documentation in front of
1042the function implementation. This feature is not recommended; source code
1043making use of this does not comply to the ROOT documentation standards, which
1044means future versions of THtml might not support it anymore.
1046<h4><a name="syntax:datamem">III.4 Data member documentation</a></h4>
1048<p>Data members are documented by putting a C++ comment behind their
1049declaration in the header file, e.g.</p>
1051 int fIAmADataMember; // this is a data member
1055<h3><a name="directive">IV. Documentation directives</a></h3>
1056<em>NOTE that THtml does not yet support nested directives
1057(i.e. latex inside html etc)!</em>
1059<h4><a name="directive:html">IV.1 <tt>BEGIN<!-- -->_HTML</tt> <tt>END<!-- -->_HTML</tt>: include 'raw' HTML</a></h4>
1061<p>You can insert pure html code into your documentation comments. During the
1062generation of the documentation, this code will be inserted as is
1063into the html file.</p>
1064<p>Pure html code must be surrounded by the keywords
1065<tt>BEGIN<!-- -->_HTML</tt> and <tt>END<!-- -->_HTML</tt>, where the
1067An example of pure html code is this class description you are reading right now.
1069<a href="http://root.cern.ch/root/html/TDocHtmlDirective.html">TDocHtmlDirective</a>
1070object to process this directive.</p>
1072<h4><a name="directive:macro">IV.2 <tt>BEGIN<!-- -->_MACRO</tt> <tt>END<!-- -->_MACRO</tt>: include a picture generated by a macro</a></h4>
1074<p>THtml can create images from scripts. You can either call an external
1075script by surrounding it by "begin_macro"/"end_macro", or include an unnamed
1076macro within these keywords. The macro should return a pointer to an object;
1077this object will then be saved as a GIF file.</p>
1078<p>Objects deriving from
1079<a href="http://root.cern.ch/root/html/TGObject.html">TGObject</a> (GUI elements)
1080will need to run in graphics mode (non-batch). You must specify this as a parameter:
1081"Begin_macro(GUI)...".
1082To create a second tab that displays the source of the macro you can specify
1083the argument "Begin_macro(source)...".
1084Of course you can combine them,
1085e.g. as "Begin_macro(source,gui)...".
1087<a href="http://root.cern.ch/root/html/TDocMacroDirective.html">TDocMacroDirective</a>
1088object to process this directive.</p>
1089<p>This is an example:</p> END_HTML
1092 TCanvas* macro_example_canvas = new TCanvas("macro_example_canvas", "", 150, 150);
1093 macro_example_canvas->SetBorderSize(0);
1094 macro_example_canvas->SetFillStyle(1001);
1095 macro_example_canvas->SetFillColor(kWhite);
1096 macro_example_canvas->cd();
1097 TArc* macro_example_arc = new TArc(0.5,0.32,0.11,180,360);
1098 macro_example_arc->Draw();
1099 TEllipse* macro_example_ellipsis = new TEllipse(0.42,0.58,0.014,0.014,0,360,0);
1100 macro_example_ellipsis->SetFillStyle(0);
1101 macro_example_ellipsis->Draw();
1102 macro_example_ellipsis = new TEllipse(0.58,0.58,0.014,0.014,0,360,0);
1103 macro_example_ellipsis->SetFillStyle(0);
1104 macro_example_ellipsis->Draw();
1105 macro_example_ellipsis = new TEllipse(0.50,0.48,0.22,0.32,0,360,0);
1106 macro_example_ellipsis->SetFillStyle(0);
1107 macro_example_ellipsis->Draw();
1108 TLine* macro_example_line = new TLine(0.48,0.53,0.52,0.41);
1109 macro_example_line->Draw();
1110 return macro_example_canvas;
1115<h4><a name="directive:latex">IV.3 <tt>BEGIN<!-- -->_LATEX</tt> <tt>END<!-- -->_LATEX</tt>: include a latex picture</a></h4>
1117<p>You can specify <a href="http://root.cern.ch/root/html/TLatex.html">TLatex</a>
1118style text and let THtml convert it into an image by surrounding it by "Begin_Latex", "End_Latex".
1119You can have multiple lines, and e.g. align each line at the '=' sign by passing
1120the argument <tt>separator='='</tt>. You can also specify how to align these parts;
1121if you want the part left of the separator to be right aligned, and the right part
1122to be left aligned, you could specify <tt>align='rl'</tt>.
1123THtml uses a <a href="http://root.cern.ch/root/html/TDocLatexDirective.html">TDocLatexDirective</a>
1124object to process the directive.
1125This is an example output with arguments <tt>separator='=', align='rl'</tt>:</p>
1126END_HTML BEGIN_LATEX(separator='=', align='rl')#kappa(x)^{2}=sin(x)^{x}
1131<h3><a name="index">V. Product and module index</a></h3>
1133<p><a href="#THtml:MakeIndex">THtml::MakeIndex()</a> will generate index files for classes
1134and types, all modules, and the product which you can set by
1135<a href="#THtml:SetProductName">THtml::SetProductName()</a>.
1136THtml will make use of external documentation in the module and product index,
1137either by linking it or by including it.
1138The files for modules are searched based on the source file directory of the
1139module's classes.</p>
1141<p>A filename starting with "index." will be included in the index page;
1142all other files will be linked.
1143Only files ending on <tt>.html</tt> or <tt>.txt</tt> will be taken into account;
1144the text files will first be run through
1145<a href="#THtml:Convert">THtml::Convert()</a>.
1146You can see an example <a href="http://root.cern.ch/root/html/HIST_Index.html">here</a>;
1147the part between "Index of HIST classes" and "Jump to" is created by parsing
1148the module's doc directory.</p>
1150<h3><a name="aux">VI. Auxiliary files: style sheet, JavaScript, help page</a></h3>
1152<p>The documentation pages share a common set of javascript and CSS files. They
1153are generated automatically when running <a href="#THtml:MakeAll">MakeAll()</a>;
1154they can be generated on
1155demand by calling <a href="#THtml:CreateAuxiliaryFiles">CreateAuxiliaryFiles()</a>.</p>
1158<h3><a name="charts">VII. Class Charts</a></h3>
1159THtml can generate a number of graphical representations for a class, which
1160are displayed as a tabbed set of imaged ontop of the class description.
1161It can show the inheritance, inherited and hidden members, directly and
1162indirectly included files, and library dependencies.
1164These graphs are generated using the <a href="http://www.graphviz.org/">Graphviz</a>
1165package. You can install it from <a href="http://www.graphviz.org">http://www.graphviz.org</a>.
1166You can either put it into your $PATH, or tell THtml where to find it by calling
1167<a href="#THtml:SetDotDir">SetDotDir()</a>.
1170<h3><a name="confvar">VIII. Configuration variables</a></h3>
1172<p>Here is a list of all configuration variables that are known to THtml.
1173You can set them in your .rootrc file, see
1174<a href="http://root.cern.ch/root/html/TEnv.html">TEnv</a>.</p>
1177 Root.Html.OutputDir (default: htmldoc)
1178 Root.Html.SourceDir (default: .:src/:include/)
1179 Root.Html.Author (default: // Author:) - start tag for authors
1180 Root.Html.LastUpdate (default: // @(#)) - start tag for last update
1181 Root.Html.Copyright (default: * Copyright) - start tag for copyright notice
1182 Root.Html.Description (default: //____________________ ) - start tag for class descr
1183 Root.Html.HomePage (default: ) - URL to the user defined home page
1184 Root.Html.Header (default: ) - location of user defined header
1185 Root.Html.Footer (default: ) - location of user defined footer
1186 Root.Html.Root (default: ) - URL of Root's class documentation
1187 Root.Html.SearchEngine (default: ) - link to the search engine
1188 Root.Html.Search (defualt: ) - link to search by replacing "%s" with user input
1189 Root.Html.ViewCVS (default: ) - URL of ViewCVS base
1190 Root.Html.XWho (default: http://consult.cern.ch/xwho/people?) - URL of CERN's xWho
1191 Root.Html.Charset (default: ISO-8859-1) - HTML character set
1194<h3><a name="how">IX. Behind the scene</a></h3>
1196<p>Internally, THtml is just an API class that sets up the list of known
1197classes, and forwards API invocations to the "work horses".
1198<a href="http://root.cern.ch/root/html/TDocOutput.html">TDocOutput</a>
1199generates the output by letting a
1200<a href="http://root.cern.ch/root/html/TDocParser.html">TDocParser</a>
1201object parse the sources, which in turn invokes objects deriving from
1202<a href="http://root.cern.ch/root/html/TDocDirective.html">TDocDirective</a>
1203to process directives.</p>
1260 if (
gHtml ==
this) {
1278 const char pathDelimiter =
1392 if (lib && strlen(lib)) {
1393 std::map<std::string, TString>::const_iterator iUrl =
fLinkInfo.
fLibURLs.find(lib);
1411 Info(
"HaveDot",
"Checking for Graphviz (dot)...");
1417 Info(
"HaveDot",
"Running: %s", runDot.
Data());
1434 for (
int i = 0; who && i < 3; ++i)
1435 if (who == helpers[i])
1436 helpers[i] = who = 0;
1464 const char *dirname ,
const char *relpath ,
1465 Int_t includeOutput ,
1466 const char* context )
1480 dir = dfltdir.
Data();
1490 char *cRealFilename =
1493 if (!cRealFilename) {
1494 Error(
"Convert",
"Can't find file '%s' !", filename);
1498 TString realFilename = cRealFilename;
1499 delete[] cRealFilename;
1502 std::ifstream sourceFile;
1503 sourceFile.open(realFilename, std::ios::in);
1505 if (!sourceFile.good()) {
1506 Error(
"Convert",
"Can't open file '%s' !", realFilename.
Data());
1512 "Directory '%s' doesn't exist, or it's write protected !", dir);
1523 Warning(
"Convert",
"Output requested but cannot initialize graphics: GUI and GL windows not be available");
1524 output.Convert(sourceFile, realFilename, tmp1, title, relpath, includeOutput, context,
fGClient);
1553 Info(
"CreateListOfClasses",
"Initializing - this might take a while...");
1565 if (filter && (!filter[0] || !strcmp(filter,
"*")))
1570 bool skipROOTClasses =
false;
1571 std::set<std::string> rootLibs;
1572 TList classesDeclFileNotFound;
1573 TList classesImplFileNotFound;
1576 for (
Int_t i = -1; i < totalNumberOfClasses; i++) {
1579 const char *cname = 0;
1580 if (i < 0) cname =
"TObject";
1585 if (i >= 0 && !strcmp(cname,
"TObject")) {
1591 if (strstr(cname,
"__gnu_cxx::"))
continue;
1593 if (!strcmp(cname,
"timespec"))
continue;
1595 if (!strncmp(cname,
"tuple<", 6))
continue;
1600 if (!classPtr)
continue;
1602 std::string shortName(
ShortType(cname));
1603 cname = shortName.c_str();
1630 skipROOTClasses =
true;
1631 Info(
"CreateListOfClasses",
"Cannot find header file for TObject at %s given the input path %s.",
1633 Info(
"CreateListOfClasses",
"Assuming documentation is not for ROOT classes, or you need to pass "
1634 "the proper directory to THtml::SetInputDir() so I can find %s.", classPtr->
GetDeclFileName());
1659 if (skipROOTClasses) {
1662 size_t posSpace = lib.find(
' ');
1663 if (posSpace != std::string::npos)
1664 lib.erase(posSpace);
1665 if (rootLibs.find(lib) == rootLibs.end()) {
1668 if (sLib.
Index(
'.') == -1) {
1676 classesDeclFileNotFound.
AddLast(classPtr);
1677 else rootLibs.insert(lib);
1681 static const char* rootClassesToIgnore[] =
1682 {
"ColorStruct_t",
"CpuInfo_t",
"Event_t",
"FileStat_t",
"GCValues_t",
"MemInfo_t",
1683 "PictureAttributes_t",
"Point_t",
"ProcInfo_t",
"ROOT",
"ROOT::Fit",
1684 "Rectangle_t",
"RedirectHandle_t",
"Segment_t",
"SetWindowAttributes_t",
1685 "SysInfo_t",
"TCint",
"UserGroup_t",
"WindowAttributes_t",
"timespec", 0};
1686 static const char* rootClassStemsToIgnore[] =
1687 {
"ROOT::Math",
"TKDTree",
"TMatrixT",
"TParameter",
"vector", 0 };
1688 static size_t rootClassStemsToIgnoreLen[] = {0, 0, 0, 0, 0};
1689 static std::set<std::string> setRootClassesToIgnore;
1690 if (setRootClassesToIgnore.empty()) {
1691 for (
int ii = 0; rootClassesToIgnore[ii]; ++ii)
1692 setRootClassesToIgnore.insert(rootClassesToIgnore[ii]);
1693 for (
int ii = 0; rootClassStemsToIgnore[ii]; ++ii)
1694 rootClassStemsToIgnoreLen[ii] = strlen(rootClassStemsToIgnore[ii]);
1697 if (setRootClassesToIgnore.find(cname) == setRootClassesToIgnore.end()) {
1698 bool matched =
false;
1699 for (
int ii = 0; !matched && rootClassStemsToIgnore[ii]; ++ii)
1700 matched = !strncmp(cname, rootClassStemsToIgnore[ii], rootClassStemsToIgnoreLen[ii]);
1702 classesDeclFileNotFound.
AddLast(classPtr);
1711 classesDeclFileNotFound.
AddLast(classPtr);
1722 classesImplFileNotFound.
AddLast(classPtr);
1725 if (!htmlfilename.
Length())
1729 cdi =
new TClassDocInfo(classPtr, htmlfilename, hdrFS, srcFS, hdr, src);
1743 if (!modulename.
Length() || modulename ==
"USER")
1752 if (parentModuleName.
Length() && parentModuleName !=
".") {
1758 while (parentModuleName.
Tokenize(token, pos,
"/")) {
1759 if (!token.
Length() || token ==
".")
continue;
1767 module->SetSelected(moduleSelected);
1782 Info(
"CreateListOfClasses",
"Adding class %s, module %s (%sselected)",
1789 bool cannotFind =
false;
1790 if (!classesDeclFileNotFound.
IsEmpty()) {
1791 Warning(
"CreateListOfClasses",
1792 "Cannot find the header for the following classes [reason]:");
1793 TIter iClassesDeclFileNotFound(&classesDeclFileNotFound);
1795 while ((iClass = (
TClass*)iClassesDeclFileNotFound())) {
1800 Warning(
"CreateListOfClasses",
" %s [header file is unknown]", iClass->
GetName());
1805 Warning(
"CreateListOfClasses",
1806 "Cannot find the source file for the following classes [reason]:");
1807 TIter iClassesDeclFileNotFound(&classesImplFileNotFound);
1809 while ((iClass = (
TClass*)iClassesDeclFileNotFound())) {
1814 Info(
"CreateListOfClasses",
" %s [source file is unknown, add \"ClassImpl(%s)\" to source file if it exists]",
1819 Warning(
"CreateListOfClasses",
"THtml cannot find all headers and sources. ");
1820 Warning(
"CreateListOfClasses",
1821 "You might need to adjust the input path (currently %s) by calling THtml::SetInputDir()",
1829 while ((dt = (
TDataType*) iTypedef())) {
1830 if (dt->
GetType() != -1)
continue;
1835 Info(
"CreateListOfClasses",
"Adding typedef %s to class %s",
1838 bool inNamespace =
true;
1840 Ssiz_t posTemplate = surroundingNamespace.
Last(
'>');
1841 inNamespace = inNamespace && (posTemplate ==
kNPOS);
1843 Ssiz_t posColumn = surroundingNamespace.
Last(
':');
1844 if (posColumn !=
kNPOS) {
1845 surroundingNamespace.
Remove(posColumn - 1);
1847 inNamespace = inNamespace && (!clSurrounding ||
IsNamespace(clSurrounding));
1852 output.NameSpace2FileName(htmlfilename);
1853 htmlfilename +=
".html";
1878 Warning(
"CreateListOfClasses",
"Product not set. You should call gHtml->SetProduct(\"MyProductName\");");
1880 if (
GetViewCVS().Contains(
"http://root.cern.ch/"))
1891 Info(
"CreateListOfClasses",
"Initializing - DONE.");
1901 output.CreateTypeIndex();
1902 output.CreateClassTypeDefs();
1919 Warning(
"CopyFileFromEtcDir",
"Could not copy %s to %s", inFile.
Data(), outFile.
Data());
1932 output.CreateHierarchy();
1963 if (!candidate)
continue;
1966 TClass* currentBaseOfCandidate = candidate;
1967 while (currentBaseOfCandidate != cl) {
1969 if (!bases)
continue;
1976 currentBaseOfCandidate = clBase;
1980 derived[candidate] = level;
1997 if (!classPtr)
return;
2009 const char *colon = strchr(cFilename,
':');
2012 libName =
TString(cFilename, colon - cFilename);
2022 if (posSpace !=
kNPOS)
2026 libnameBase.
Remove(0, 3);
2030 if (libnameBase.
Length())
2031 libName = libnameBase;
2034 filename = cFilename;
2036 if (!filename.
Length() ||
2038 htmlFileName =
GetURL(libName);
2040 htmlFileName =
"./";
2042 if (htmlFileName.
Length()) {
2043 filename = htmlFileName;
2046 output.NameSpace2FileName(className);
2048 filename = className;
2050 filename +=
".html";
2051 }
else filename.
Remove(0);
2071 if(!name1 || !name1[0])
return 0;
2073 if (strstr(name1,
"ROOT::")==name1) {
2075 if (!strncmp(name1 + 6,
"Math", 4)) ret =
kFALSE;
2123 bool determine = (!cdi);
2125 if (!determine) determine |= decl && !filesys && !cdi->
GetDeclFileName()[0];
2127 if (!determine) determine |= !decl && !filesys && !cdi->
GetImplFileName()[0];
2152 if (filesys) out_name = sysname;
2153 else out_name =
name;
2177 Long_t sId, sFlags, sModtime;
2181 if (st || !(sFlags & 2)) {
2183 Error(
"GetOutputDir",
"output directory %s is an existing file",
2223 if (numthreads == 1) {
2236 if (numthreads == -1) {
2239 numthreads = sysinfo.
fCpus;
2245 THtmlThreadInfo hti(
this, force);
2254 while (--numthreads >= 0) {
2257 threads.
Add(thread);
2260 TIter iThread(&threads);
2264 while (wait && (thread = (
TThread*) iThread()))
2271 while ((thread = (
TThread*) iThread()))
2292 Error(
"MakeClass",
"Unknown class '%s'!", className);
2314 if (!currentClass) {
2317 Error(
"MakeClass",
"Class '%s' is known, but I cannot find its TClass object!", cdi->
GetName());
2334 what +=
" (sources not found)";
2347 const THtmlThreadInfo* hti = (
const THtmlThreadInfo*)info;
2350 while ((classinfo = hti->GetHtml()->GetNextClass()))
2351 hti->GetHtml()->MakeClass(classinfo, hti->GetForce());
2368 output.CreateTypeIndex();
2369 output.CreateClassTypeDefs();
2370 output.CreateModuleIndex();
2371 output.CreateClassIndex();
2372 output.CreateProductIndex();
2375 output.CreateHierarchy();
2392 Error(
"MakeTree",
"Unknown class '%s' !", className);
2515 const char* tmplt = strchr(
name,
'<');
2516 if (!tmplt)
return name;
2517 tmplt = strrchr(tmplt,
':');
2518 if (tmplt >
name && tmplt[-1] ==
':') {
R__EXTERN TClassTable * gClassTable
void Printf(const char *fmt,...)
R__EXTERN const char * gProgName
Bool_t R_ISDIR(Int_t mode)
R__EXTERN TSystem * gSystem
R__EXTERN TVirtualMutex * gGlobalMutex
#define R__LOCKGUARD(mutex)
Each class (see TClass) has a linked list of its base class(es).
TClass * GetClassPointer(Bool_t load=kTRUE)
Get pointer to the base class TClass.
const char * GetImplFileName() const
Bool_t HaveSource() const
const char * GetImplFileSysName() const
void SetDeclFileName(const char *name)
TModuleDocInfo * GetModule() const
void SetImplFileSysName(const char *fsname)
virtual const char * GetName() const
Returns name of object.
void SetImplFileName(const char *name)
void SetModule(TModuleDocInfo *module)
void SetSelected(Bool_t sel=kTRUE)
const char * GetHtmlFileName() const
void SetDeclFileSysName(const char *fsname)
Bool_t IsSelected() const
const char * GetDeclFileSysName() const
void SetHtmlFileName(const char *name)
TList & GetListOfTypedefs()
const char * GetDeclFileName() const
TDictionary * GetClass() const
void MakeTree(Bool_t force=kFALSE)
Create an output file with a graphical representation of the class inheritance.
void Class2Html(Bool_t force=kFALSE)
Create HTML files for a single class.
static char * Next()
Returns next class from sorted class table.
TClass instances represent classes, structs and namespaces in the ROOT type system.
const char * GetImplFileName() const
TList * GetListOfBases()
Return list containing the TBaseClass(es) of a class.
ClassInfo_t * GetClassInfo() const
Long_t Property() const
Returns the properties of the TClass as a bit field stored as a Long_t value.
const char * GetSharedLibs()
Get the list of shared libraries containing the code for class cls.
Bool_t InheritsFrom(const char *cl) const
Return kTRUE if this class inherits from a class with name "classname".
const char * GetDeclFileName() const
Return name of the file containing the declaration of this class.
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
virtual Int_t GetEntries() const
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
virtual Bool_t IsEmpty() const
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
Basic data type descriptor (datatype information is obtained from CINT).
const char * GetFullTypeName() const
Get full type description of typedef, e,g.: "class TDirectory*".
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
void Add(ULong64_t hash, Long64_t key, Long64_t value)
Add an (key,value) pair to the table. The key should be unique.
Long64_t GetValue(ULong64_t hash, Long64_t key)
Return the value belonging to specified key and hash value.
TObject * FindObject(const char *name) const
Find object using its name.
void Clear(Option_t *option="")
Remove all objects from the list.
void Add(TObject *obj)
Add object to the hash table.
TString MatchFileSysName(TString &filename, TFileSysEntry **fse=0) const
Find filename in the list of system files; return the system file name and change filename to the fil...
virtual bool GetDeclFileName(const TClass *cl, TString &out_filename, TString &out_fsys, TFileSysEntry **fse=0) const
Determine cl's declaration file name.
void NormalizePath(TString &path) const
Remove "/./" and collapse "/subdir/../" to "/".
void SplitClassIntoDirFile(const TString &clname, TString &dir, TString &filename) const
Given a class name with a scope, split the class name into directory part and file name: A::B::C beco...
virtual bool GetImplFileName(const TClass *cl, TString &out_filename, TString &out_fsys, TFileSysEntry **fse=0) const
Determine cl's implementation file name.
virtual bool GetFileName(const TClass *cl, bool decl, TString &out_filename, TString &out_fsys, TFileSysEntry **fse=0) const
Common implementation for GetDeclFileName(), GetImplFileName()
void ExpandSearchPath(TString &path) const
Create all permutations of path and THtml's input path: path being PP/ and THtml's input being .
const TString & GetIgnore() const
THashTable & GetEntries()
Int_t GetMaxLevel() const
void Fill()
Recursively fill entries by parsing the path specified in GetName(); can be a THtml::GetDirDelimiter(...
void Recurse(TFileSysDB *db, const char *path)
Recursively fill entries by parsing the contents of path.
const char * GetName() const
Returns name of object.
TFileSysDir * GetParent() const
virtual void GetFullName(TString &fullname, Bool_t asIncluded) const
virtual ~THelperBase()
Helper's destructor.
void SetOwner(THtml *html)
Set the THtml object owning this object; if it's already set to a different THtml object than issue a...
virtual bool GetModule(TClass *cl, TFileSysEntry *fse, TString &out_modulename) const
Set out_modulename to cl's module name; return true if it's valid.
virtual bool GetIncludeAs(TClass *cl, TString &out_include_as) const
Determine the path and filename used in an include statement for the header file of the given class.
virtual bool GetFileNameFromInclude(const char *included, TString &out_fsname) const
Set out_fsname to the full pathname corresponding to a file included as "included".
virtual bool GetMacroPath(const TString &module, TString &out_dir) const
Determine the path to look for macros (see TDocMacroDirective) for classes from a given module.
virtual bool GetDocDir(const TString &module, TString &doc_dir) const
Determine the module's documentation directory.
void SetModuleDefinition(const TModuleDefinition &md)
Set the module defining object to be used; can also be a user derived object (a la traits).
THtml()
Create a THtml object.
virtual void CreateStyleSheet() const
Write the default ROOT style sheet.
const TString & GetViewCVS() const
DocEntityInfo_t fDocEntityInfo
const char * ShortType(const char *name) const
Get short type name, i.e. with default templates removed.
void SetPathDefinition(const TPathDefinition &pd)
Set the path defining object to be used; can also be a user derived object (a la traits).
virtual TClass * GetClass(const char *name) const
Return pointer to class with name.
const TString & GetInputPath() const
static Bool_t IsNamespace(const TClass *cl)
Check whether cl is a namespace.
void CreateListOfClasses(const char *filter)
Create the list of all known classes.
void SetOutputDir(const char *dir)
Set the directory where the HTML pages shuold be written to.
const TString & GetProductName() const
TVirtualMutex * fMakeClassMutex
void SetInputDir(const char *dir)
Set the directory containing the source files.
virtual bool GetDeclImplFileName(TClass *cl, bool filesys, bool decl, TString &out_name) const
Combined implementation for GetDeclFileName(), GetImplFileName(): Return declaration / implementation...
static void * MakeClassThreaded(void *info)
Entry point of worker threads for multi-threaded MakeAll().
void SetImplFileName(TClass *cl, const char *filename)
Explicitly set a impl file name for TClass cl.
void AddMacroPath(const char *path)
Add path to the directories to be searched for macro files that are to be executed via the TDocMacroD...
void SetDeclFileName(TClass *cl, const char *filename)
Explicitly set a decl file name for TClass cl.
void MakeTree(const char *className, Bool_t force=kFALSE)
Make an inheritance tree.
Int_t fThreadedClassCount
const TModuleDefinition & GetModuleDefinition() const
Return the TModuleDefinition (or derived) object as set by SetModuleDefinition(); create and return a...
TFileDefinition * fFileDef
void CreateHierarchy()
Create the inheritance hierarchy diagram for all classes.
static void LoadAllLibs()
Load all libraries known to ROOT via the rootmap system.
Bool_t HaveDot()
Check whether dot is available in $PATH or in the directory set by SetDotPath()
virtual void CreateAuxiliaryFiles() const
copy CSS, javascript file, etc to the output dir
void SetFileDefinition(const TFileDefinition &fd)
Set the file defining object to be used; can also be a user derived object (a la traits).
void MakeAll(Bool_t force=kFALSE, const char *filter="*", int numthreads=1)
Produce documentation for all the classes specified in the filter (by default "*") To process all cla...
void SetLocalFiles() const
Fill the files available in the file system below fPathInfo.fInputPath.
void GetDerivedClasses(TClass *cl, std::map< TClass *, Int_t > &derived) const
fill derived with all classes inheriting from cl and their inheritance distance to cl
void MakeClass(const char *className, Bool_t force=kFALSE)
Make HTML files for a single class.
virtual ~THtml()
Default destructor.
virtual bool GetDeclFileName(TClass *cl, Bool_t filesys, TString &out_name) const
Return declaration file name; return the full path if filesys is true.
TModuleDefinition * fModuleDef
void Convert(const char *filename, const char *title, const char *dirname="", const char *relpath="../", Int_t includeOutput=kNoOutput, const char *context="")
It converts a single text file to HTML.
void CreateListOfTypes()
Create index of all data types and a page for each typedef-to-class.
const PathInfo_t & GetPathInfo() const
virtual void CreateJavascript() const
Write the default ROOT style sheet.
void SetFoundDot(Bool_t found=kTRUE)
Set whether "dot" (a GraphViz utility) is available.
void SetViewCVS(const char *url)
OutputStyle_t fOutputStyle
virtual const char * GetEtcDir() const
Get the directory containing THtml's auxiliary files ($ROOTSYS/etc/html)
const TString & GetMacroPath() const
static const char * GetDirDelimiter()
virtual void GetHtmlFileName(TClass *classPtr, TString &filename) const
Return real HTML filename.
void MakeIndex(const char *filter="*")
Create the index files for the product, modules, all types, etc.
TClassDocInfo * GetNextClass()
Return the next class to be generated for MakeClassThreaded.
virtual void GetModuleNameForClass(TString &module, TClass *cl) const
Return the module name for a given class.
const TString & GetOutputDir(Bool_t createDir=kTRUE) const
Return the output directory as set by SetOutputDir().
TVirtualMutex * GetMakeClassMutex() const
void HelperDeleted(THelperBase *who)
Inform the THtml object that one of its helper objects was deleted.
TPathDefinition * fPathDef
virtual bool GetImplFileName(TClass *cl, Bool_t filesys, TString &out_name) const
Return implementation file name.
TIter * fThreadedClassIter
const TPathDefinition & GetPathDefinition() const
Return the TModuleDefinition (or derived) object as set by SetModuleDefinition(); create and return a...
const TFileDefinition & GetFileDefinition() const
Return the TFileDefinition (or derived) object as set by SetFileDefinition(); create and return a TFi...
Bool_t CopyFileFromEtcDir(const char *filename) const
Copy a file from $ROOTSYS/etc/html into GetOutputDir()
const char * GetURL(const char *lib=0) const
Get the documentation URL for library lib.
virtual void Add(TObject *obj)
virtual TObject * At(Int_t idx) const
Returns the object at position idx. Returns 0 if idx is out of range.
virtual void AddLast(TObject *obj)
Add object at the end of the list.
virtual void Clear(Option_t *option="")
Remove all objects from the list.
virtual void Sort(Bool_t order=kSortAscending)
Sort linked list.
void SetSelected(Bool_t sel=kTRUE)
void AddClass(TClassDocInfo *cl)
The TNamed class is the base class for all named ROOT classes.
virtual const char * GetName() const
Returns name of object.
Int_t GetEntries() const
Return the number of objects in array (i.e.
Collectable string class.
Mother of all ROOT objects.
virtual const char * GetName() const
Returns name of object.
virtual TObject * Clone(const char *newname="") const
Make a clone of an object using the Streamer facility.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual const char * GetTitle() const
Returns title of object.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Wrapper for PCRE library (Perl Compatible Regular Expressions).
Int_t Match(const TString &s, UInt_t start=0)
Runs a match on s against the regex 'this' was created with.
Int_t Substitute(TString &s, const TString &replace, const TString &mods="", Int_t start=0, Int_t nMatchMax=10)
Substitute replaces the string s by a new string in which matching patterns are replaced by the repla...
static const TString & GetEtcDir()
Get the sysconfig directory in the installation. Static utility function.
static const TString & GetLibDir()
Get the library directory in the installation. Static utility function.
void ToLower()
Change string to lower-case.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
Ssiz_t First(char c) const
Find first occurrence of a character c.
const char * Data() const
TString & ReplaceAll(const TString &s1, const TString &s2)
Ssiz_t Last(char c) const
Find last occurrence of a character c.
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
TString & Remove(Ssiz_t pos)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
virtual UInt_t LoadAllLibraries()
Load all libraries known to ROOT via the rootmap system.
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
virtual void FreeDirectory(void *dirp)
Free a directory.
virtual void * OpenDirectory(const char *name)
Open a directory. Returns 0 if directory does not exist.
virtual int CopyFile(const char *from, const char *to, Bool_t overwrite=kFALSE)
Copy a file.
virtual char * ConcatFileName(const char *dir, const char *name)
Concatenate a directory and a file name. User must delete returned string.
virtual const char * FindFile(const char *search, TString &file, EAccessMode mode=kFileExists)
Find location of file in a search path.
virtual int MakeDirectory(const char *name)
Make a directory.
virtual Int_t Exec(const char *shellcmd)
Execute a command.
virtual int GetSysInfo(SysInfo_t *info) const
Returns static system info, like OS type, CPU type, number of CPUs RAM size, etc into the SysInfo_t s...
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
int GetPathInfo(const char *path, Long_t *id, Long_t *size, Long_t *flags, Long_t *modtime)
Get info about a file: id, size, flags, modification time.
virtual const char * PrependPathName(const char *dir, TString &name)
Concatenate a directory and a file name.
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
virtual const char * GetDirEntry(void *dirp)
Get a directory entry. Returns 0 if no more entries.
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
virtual Bool_t IsAbsoluteFileName(const char *dir)
Return true if dir is an absolute pathname.
virtual void Sleep(UInt_t milliSec)
Sleep milliSec milli seconds.
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
virtual Bool_t ProcessEvents()
Process pending events (GUI, timers, sockets).
virtual const char * GetSoExt() const
Get the shared library extension.
virtual TString GetDirName(const char *pathname)
Return the directory name in pathname.
Long_t Join(void **ret=0)
Join this thread.
Int_t Run(void *arg=0)
Start the thread.
virtual TVirtualMutex * Factory(Bool_t=kFALSE)=0
bool IsStdClass(const char *type)
return true if the class belongs to the std namespace
std::string ShortType(const char *typeDesc, int mode)
Return the absolute type of typeDesc.
static constexpr double s
THashList fShortClassNames
std::map< std::string, TString > fLibURLs
static void output(int code)