13 #include "RConfigure.h"
43 class THtmlThreadInfo {
45 THtmlThreadInfo(
THtml* html,
bool force): fHtml(html), fForce(force) {}
46 Bool_t GetForce()
const {
return fForce;}
47 THtml* GetHtml()
const {
return fHtml;}
74 if (fHtml && html && html != fHtml) {
75 Error(
"SetOwner()",
"Object already owned by an THtml instance!");
76 fHtml->HelperDeleted(
this);
106 out_modulename =
"USER";
107 if (!cl)
return false;
117 TString inputdir = GetOwner()->GetInputPath();
136 while (out_modulename[0] ==
'.')
137 out_modulename.
Remove(0, 1);
139 while (out_modulename[0] ==
'/')
140 out_modulename.
Remove(0, 1);
141 while (out_modulename.
EndsWith(
"/"))
144 if (!out_modulename[0])
145 out_modulename = trailingInclude;
147 if (!out_modulename[0])
148 out_modulename = trailingInclude;
158 pos = out_modulename.
Index(
"/inc/");
160 out_modulename.
Remove(pos);
163 while (out_modulename.
EndsWith(
"/"))
167 if (out_modulename ==
"MATH/GENVECTOR")
168 out_modulename =
"MATHCORE";
169 else if (out_modulename ==
"MATH/MATRIX")
170 out_modulename =
"SMATRIX";
171 else if (!out_modulename.
Length()) {
172 const char* cname= cl->
GetName();
173 if (strstr(cname,
"::SMatrix<") || strstr(cname,
"::SVector<"))
174 out_modulename =
"SMATRIX";
175 else if (strstr(cname,
"::TArrayProxy<") || strstr(cname,
"::TClaArrayProxy<")
176 || strstr(cname,
"::TImpProxy<") || strstr(cname,
"::TClaImpProxy<"))
177 out_modulename =
"TREEPLAYER";
185 out_modulename.
Remove(0,3);
186 pos = out_modulename.
Index(
'.');
190 if (!out_modulename.
Length()) {
191 out_modulename =
"USER";
207 THtml* owner = GetOwner();
240 while (clname.
Tokenize(token, from,
"::") ) {
264 return GetFileName(cl,
true, out_filename, out_fsys, fse);
281 return GetFileName(cl,
false, out_filename, out_fsys, fse);
290 static const char* delim[] = {
"/",
"\\\\"};
291 for (
int i = 0; i < 2; ++i) {
292 const char*
d = delim[i];
318 filename = filesysname;
319 if (!filename.
EndsWith(filesysname)) {
326 if (fse) *fse = fsentry;
353 NormalizePath(clfile);
355 out_filename = clfile;
362 if (clfile ==
"include/TMathBase.h") {
363 clfile =
"math/mathcore/inc/TMath.h";
364 out_filename = clfile;
373 longestMatch = inclDir.
Length();
375 if (longestMatch !=
kNPOS) {
376 clfile.
Remove(0, longestMatch);
380 GetOwner()->GetPathDefinition().GetFileNameFromInclude(asincl, clfile);
381 out_filename = clfile;
384 filesysname = MatchFileSysName(out_filename, fse);
385 if (filesysname[0]) {
386 clfile = out_filename;
392 int templateLevel = 0;
395 for (; start >= 0 && (templateLevel || filesysname[
start] !=
':'); --
start) {
396 if (filesysname[start] ==
'>')
398 else if (filesysname[start] ==
'<') {
404 filesysname = filesysname(start + 1, end - start - 1);
408 filesysname +=
".cxx";
409 out_filename = filesysname;
410 filesysname = MatchFileSysName(out_filename, fse);
411 if (filesysname[0]) {
412 clfile = out_filename;
416 if (!decl && !clfile.
Length()) {
421 if (
GetFileName(cl,
true, filesysname, declSysFileName)) {
425 filesysname.
Remove(posExt);
426 filesysname +=
".cxx";
427 out_filename = filesysname;
428 filesysname = MatchFileSysName(out_filename, fse);
429 if (filesysname[0]) {
430 clfile = out_filename;
435 if (clfile.
Length() && !decl) {
441 static const char* vetoClasses[] = {
"math/mathcore/",
"math/mathmore/",
"math/genvector/",
442 "math/minuit2/",
"math/smatrix/"};
443 for (
unsigned int i = 0; i <
sizeof(vetoClasses) /
sizeof(
char*); ++i) {
444 if (clfile.
Contains(vetoClasses[i])) {
447 if (strcmp(cl->
GetName(),
"TComplex")
448 && strcmp(cl->
GetName(),
"TMath")
449 && strncmp(cl->
GetName(),
"TKDTree", 7)
450 && strcmp(cl->
GetName(),
"TVirtualFitter")
451 && strncmp(cl->
GetName(),
"TRandom", 7)) {
469 SplitClassIntoDirFile(out_filename, possiblePath, possibleFileName);
472 if (possibleFileName.
Length()) {
474 possibleFileName +=
".h";
476 possibleFileName +=
".cxx";
478 if (possiblePath.
Length())
481 possiblePath +=
"inc/";
483 possiblePath +=
"src/";
484 out_filename = possiblePath +
"/" + possibleFileName;
490 if (possiblePath.
Length())
491 ExpandSearchPath(possiblePath);
492 else possiblePath=
".";
496 NormalizePath(out_fsys);
515 if (!GetDocDir(module, moduledoc))
524 while (macropath.
Tokenize(macrodirpart, pos,
":")) {
525 out_dir += moduledoc +
"/" + macrodirpart +
":";
545 doc_dir =
"$ROOTSYS";
551 doc_dir += module +
"/";
552 doc_dir += GetOwner()->GetPathInfo().fDocPath;
574 if (!cl || !GetOwner())
return false;
581 bool includePathMatches =
false;
587 if (out_dir[0] ==
'/' || out_dir[0] ==
'\\')
589 includePathMatches =
true;
592 if (!includePathMatches) {
601 if (posInc ==
kNPOS)
return true;
602 hdr.
Remove(0, posInc + 5);
606 return (out_dir.
Length());
622 if (!included)
return false;
624 out_fsname = included;
627 const TList* bucket = GetOwner()->GetLocalFiles()->
GetEntries().GetListForObject(incBase);
628 if (!bucket)
return false;
631 TObjArray* arrSubDirs = alldir.Tokenize(
"/");
632 TIter iEntry(bucket);
635 if (incBase != entry->
GetName())
continue;
638 for (
int i = arrSubDirs->GetEntries() - 1; parent && i >= 0; --i) {
640 if (!subdir.
Length() || subdir ==
".")
642 if (subdir == parent->
GetName())
663 if (
gDebug > 0 || GetLevel() < 2)
664 Info(
"Recurse",
"scanning %s...", path);
668 const char* direntry = 0;
670 if (!direntry[0] || direntry[0] ==
'.' ||
regexp.Match(direntry))
continue;
671 TString entryPath(dir + direntry);
688 subdir->Recurse(db, entryPath);
690 int delen = strlen(direntry);
692 if (strcmp(direntry + delen - 4,
".cxx")
693 && strcmp(direntry + delen - 2,
".h"))
716 Warning(
"Fill",
"Cannot read InputPath \"%s\"!", dir.
Data());
724 Warning(
"Fill",
"InputPath \"%s\" already present as \"%s\"!", dir.
Data(), prevroot->
GetName());
733 root->Recurse(
this, dir);
735 Warning(
"Fill",
"Cannot read InputPath \"%s\"!", dir.
Data());
998 // This is the description block. //
1002 <p>The environment variable Root.Html.Description
1003 (see: <a href="http://root.cern.ch/root/html/TEnv.html">TEnv</a>) contains
1004 the delimiter string (default value: <tt>//_________________</tt>). It means
1005 that you can also write your class description block like this:</p>
1007 //_____________________________________________________________
1008 // A description of the class starts with the line above, and
1009 // will take place here !
1012 <p>Note that <b><i>everything</i></b> until the first non-commented line is considered
1013 as a valid class description block.</p>
1015 <h4><a name="syntax:classidx">III.2 Class index</a></h4>
1017 <p>All classes to be documented will have an entry in the ClassIndex.html,
1018 showing their name with a link to their documentation page and a miniature
1019 description. This discription for e.g. the class MyClass has to be given
1020 in MyClass's header as a comment right after ClassDef(MyClass, n).</p>
1022 <h4><a name="syntax:meth">III.3 Method documentation</a></h4>
1023 <p>A member function description block starts immediately after '{'
1024 and looks like this:</p>
1026 void TWorld::HelloWorldFunc(string *text)
1028 // This is an example of description for the
1029 // TWorld member function
1031 helloWorld.Print( text );
1034 Like in a class description block, <b><i>everything</i></b> until the first
1035 non-commented line is considered as a valid member function
1038 If the rootrc variable <tt>Root.Html.DescriptionStyle</tt> is set to
1039 <tt>Doc++</tt> THtml will also look for method documentation in front of
1040 the function implementation. This feature is not recommended; source code
1041 making use of this does not comply to the ROOT documentation standards, which
1042 means future versions of THtml might not support it anymore.
1044 <h4><a name="syntax:datamem">III.4 Data member documentation</a></h4>
1046 <p>Data members are documented by putting a C++ comment behind their
1047 declaration in the header file, e.g.</p>
1049 int fIAmADataMember; // this is a data member
1053 <h3><a name="directive">IV. Documentation directives</a></h3>
1054 <em>NOTE that THtml does not yet support nested directives
1055 (i.e. latex inside html etc)!</em>
1057 <h4><a name="directive:html">IV.1 <tt>BEGIN<!-- -->_HTML</tt> <tt>END<!-- -->_HTML</tt>: include 'raw' HTML</a></h4>
1059 <p>You can insert pure html code into your documentation comments. During the
1060 generation of the documentation, this code will be inserted as is
1061 into the html file.</p>
1062 <p>Pure html code must be surrounded by the keywords
1063 <tt>BEGIN<!-- -->_HTML</tt> and <tt>END<!-- -->_HTML</tt>, where the
1065 An example of pure html code is this class description you are reading right now.
1067 <a href="http://root.cern.ch/root/html/TDocHtmlDirective.html">TDocHtmlDirective</a>
1068 object to process this directive.</p>
1070 <h4><a name="directive:macro">IV.2 <tt>BEGIN<!-- -->_MACRO</tt> <tt>END<!-- -->_MACRO</tt>: include a picture generated by a macro</a></h4>
1072 <p>THtml can create images from scripts. You can either call an external
1073 script by surrounding it by "begin_macro"/"end_macro", or include an unnamed
1074 macro within these keywords. The macro should return a pointer to an object;
1075 this object will then be saved as a GIF file.</p>
1076 <p>Objects deriving from
1077 <a href="http://root.cern.ch/root/html/TGObject.html">TGObject</a> (GUI elements)
1078 will need to run in graphics mode (non-batch). You must specify this as a parameter:
1079 "Begin_macro(GUI)...".
1080 To create a second tab that displays the source of the macro you can specify
1081 the argument "Begin_macro(source)...".
1082 Of course you can combine them,
1083 e.g. as "Begin_macro(source,gui)...".
1085 <a href="http://root.cern.ch/root/html/TDocMacroDirective.html">TDocMacroDirective</a>
1086 object to process this directive.</p>
1087 <p>This is an example:</p> END_HTML
1090 TCanvas* macro_example_canvas = new TCanvas("macro_example_canvas", "", 150, 150);
1091 macro_example_canvas->SetBorderSize(0);
1092 macro_example_canvas->SetFillStyle(1001);
1093 macro_example_canvas->SetFillColor(kWhite);
1094 macro_example_canvas->cd();
1095 TArc* macro_example_arc = new TArc(0.5,0.32,0.11,180,360);
1096 macro_example_arc->Draw();
1097 TEllipse* macro_example_ellipsis = new TEllipse(0.42,0.58,0.014,0.014,0,360,0);
1098 macro_example_ellipsis->SetFillStyle(0);
1099 macro_example_ellipsis->Draw();
1100 macro_example_ellipsis = new TEllipse(0.58,0.58,0.014,0.014,0,360,0);
1101 macro_example_ellipsis->SetFillStyle(0);
1102 macro_example_ellipsis->Draw();
1103 macro_example_ellipsis = new TEllipse(0.50,0.48,0.22,0.32,0,360,0);
1104 macro_example_ellipsis->SetFillStyle(0);
1105 macro_example_ellipsis->Draw();
1106 TLine* macro_example_line = new TLine(0.48,0.53,0.52,0.41);
1107 macro_example_line->Draw();
1108 return macro_example_canvas;
1113 <h4><a name="directive:latex">IV.3 <tt>BEGIN<!-- -->_LATEX</tt> <tt>END<!-- -->_LATEX</tt>: include a latex picture</a></h4>
1115 <p>You can specify <a href="http://root.cern.ch/root/html/TLatex.html">TLatex</a>
1116 style text and let THtml convert it into an image by surrounding it by "Begin_Latex", "End_Latex".
1117 You can have multiple lines, and e.g. align each line at the '=' sign by passing
1118 the argument <tt>separator='='</tt>. You can also specify how to align these parts;
1119 if you want the part left of the separator to be right aligned, and the right part
1120 to be left aligned, you could specify <tt>align='rl'</tt>.
1121 THtml uses a <a href="http://root.cern.ch/root/html/TDocLatexDirective.html">TDocLatexDirective</a>
1122 object to process the directive.
1123 This is an example output with arguments <tt>separator='=', align='rl'</tt>:</p>
1124 END_HTML BEGIN_LATEX(separator='=', align='rl')#kappa(x)^{2}=sin(x)^{x}
1125 x=#chi^{2} END_LATEX
1129 <h3><a name="index">V. Product and module index</a></h3>
1131 <p><a href="#THtml:MakeIndex">THtml::MakeIndex()</a> will generate index files for classes
1132 and types, all modules, and the product which you can set by
1133 <a href="#THtml:SetProductName">THtml::SetProductName()</a>.
1134 THtml will make use of external documentation in the module and product index,
1135 either by linking it or by including it.
1136 The files for modules are searched based on the source file directory of the
1137 module's classes.</p>
1139 <p>A filename starting with "index." will be included in the index page;
1140 all other files will be linked.
1141 Only files ending on <tt>.html</tt> or <tt>.txt</tt> will be taken into account;
1142 the text files will first be run through
1143 <a href="#THtml:Convert">THtml::Convert()</a>.
1144 You can see an example <a href="http://root.cern.ch/root/html/HIST_Index.html">here</a>;
1145 the part between "Index of HIST classes" and "Jump to" is created by parsing
1146 the module's doc directory.</p>
1148 <h3><a name="aux">VI. Auxiliary files: style sheet, JavaScript, help page</a></h3>
1150 <p>The documentation pages share a common set of javascript and CSS files. They
1151 are generated automatically when running <a href="#THtml:MakeAll">MakeAll()</a>;
1152 they can be generated on
1153 demand by calling <a href="#THtml:CreateAuxiliaryFiles">CreateAuxiliaryFiles()</a>.</p>
1156 <h3><a name="charts">VII. Class Charts</a></h3>
1157 THtml can generate a number of graphical representations for a class, which
1158 are displayed as a tabbed set of imaged ontop of the class description.
1159 It can show the inheritance, inherited and hidden members, directly and
1160 indirectly included files, and library dependencies.
1162 These graphs are generated using the <a href="http://www.graphviz.org/">Graphviz</a>
1163 package. You can install it from <a href="http://www.graphviz.org">http://www.graphviz.org</a>.
1164 You can either put it into your $PATH, or tell THtml where to find it by calling
1165 <a href="#THtml:SetDotDir">SetDotDir()</a>.
1168 <h3><a name="confvar">VIII. Configuration variables</a></h3>
1170 <p>Here is a list of all configuration variables that are known to THtml.
1171 You can set them in your .rootrc file, see
1172 <a href="http://root.cern.ch/root/html/TEnv.html">TEnv</a>.</p>
1175 Root.Html.OutputDir (default: htmldoc)
1176 Root.Html.SourceDir (default: .:src/:include/)
1177 Root.Html.Author (default: // Author:) - start tag for authors
1178 Root.Html.LastUpdate (default: // @(#)) - start tag for last update
1179 Root.Html.Copyright (default: * Copyright) - start tag for copyright notice
1180 Root.Html.Description (default: //____________________ ) - start tag for class descr
1181 Root.Html.HomePage (default: ) - URL to the user defined home page
1182 Root.Html.Header (default: ) - location of user defined header
1183 Root.Html.Footer (default: ) - location of user defined footer
1184 Root.Html.Root (default: ) - URL of Root's class documentation
1185 Root.Html.SearchEngine (default: ) - link to the search engine
1186 Root.Html.Search (defualt: ) - link to search by replacing "%s" with user input
1187 Root.Html.ViewCVS (default: ) - URL of ViewCVS base
1188 Root.Html.XWho (default: http://consult.cern.ch/xwho/people?) - URL of CERN's xWho
1189 Root.Html.Charset (default: ISO-8859-1) - HTML character set
1192 <h3><a name="how">IX. Behind the scene</a></h3>
1194 <p>Internally, THtml is just an API class that sets up the list of known
1195 classes, and forwards API invocations to the "work horses".
1196 <a href="http://root.cern.ch/root/html/TDocOutput.html">TDocOutput</a>
1197 generates the output by letting a
1198 <a href="http://root.cern.ch/root/html/TDocParser.html">TDocParser</a>
1199 object parse the sources, which in turn invokes objects deriving from
1200 <a href="http://root.cern.ch/root/html/TDocDirective.html">TDocDirective</a>
1201 to process directives.</p>
1245 gROOT->GetListOfSpecials()->Add(gHtml);
1258 if (gHtml ==
this) {
1259 gROOT->GetListOfSpecials()->Remove(gHtml);
1276 const char pathDelimiter =
1359 if (getenv(
"ROOTSYS"))
1401 if (lib && strlen(lib)) {
1402 std::map<std::string, TString>::const_iterator iUrl =
fLinkInfo.
fLibURLs.find(lib);
1420 Info(
"HaveDot",
"Checking for Graphviz (dot)...");
1426 Info(
"HaveDot",
"Running: %s", runDot.Data());
1443 for (
int i = 0; who && i < 3; ++i)
1444 if (who == helpers[i])
1445 helpers[i] = who = 0;
1473 const char *dirname ,
const char *relpath ,
1474 Int_t includeOutput ,
1475 const char* context )
1494 char *cRealFilename =
1497 if (!cRealFilename) {
1498 Error(
"Convert",
"Can't find file '%s' !", filename);
1502 TString realFilename(cRealFilename);
1503 delete[] cRealFilename;
1507 std::ifstream sourceFile;
1508 sourceFile.open(realFilename, std::ios::in);
1510 if (!sourceFile.good()) {
1511 Error(
"Convert",
"Can't open file '%s' !", realFilename.Data());
1517 "Directory '%s' doesn't exist, or it's write protected !", dir);
1527 if (includeOutput && !fGClient)
1528 Warning(
"Convert",
"Output requested but cannot initialize graphics: GUI and GL windows not be available");
1529 output.Convert(sourceFile, realFilename, tmp1, title, relpath, includeOutput, context, fGClient);
1542 module =
"(UNKNOWN)";
1560 Info(
"CreateListOfClasses",
"Initializing - this might take a while...");
1572 if (filter && (!filter[0] || !strcmp(filter,
"*")))
1577 bool skipROOTClasses =
false;
1578 std::set<std::string> rootLibs;
1579 TList classesDeclFileNotFound;
1580 TList classesImplFileNotFound;
1583 for (
Int_t i = -1; i < totalNumberOfClasses; i++) {
1586 const char *cname = 0;
1587 if (i < 0) cname =
"TObject";
1590 if (i >= 0 && !strcmp(cname,
"TObject")) {
1596 if (strstr(cname,
"__gnu_cxx::"))
continue;
1598 if (!strcmp(cname,
"timespec"))
continue;
1603 if (!classPtr)
continue;
1605 std::string shortName(
ShortType(cname));
1606 cname = shortName.c_str();
1609 Bool_t matchesSelection = re.Match(s);
1617 TFileSysEntry* fse = 0;
1633 skipROOTClasses =
true;
1634 Info(
"CreateListOfClasses",
"Cannot find header file for TObject at %s given the input path %s.",
1636 Info(
"CreateListOfClasses",
"Assuming documentation is not for ROOT classes, or you need to pass "
1637 "the proper directory to THtml::SetInputDir() so I can find %s.", classPtr->
GetDeclFileName());
1662 if (skipROOTClasses) {
1665 size_t posSpace = lib.find(
' ');
1666 if (posSpace != std::string::npos)
1667 lib.erase(posSpace);
1668 if (rootLibs.find(lib) == rootLibs.end()) {
1670 TString rootlibdir = ROOTLIBDIR;
1676 if (sLib.Index(
'.') == -1) {
1684 classesDeclFileNotFound.
AddLast(classPtr);
1685 else rootLibs.insert(lib);
1689 static const char* rootClassesToIgnore[] =
1690 {
"ColorStruct_t",
"CpuInfo_t",
"Event_t",
"FileStat_t",
"GCValues_t",
"MemInfo_t",
1691 "PictureAttributes_t",
"Point_t",
"ProcInfo_t",
"ROOT",
"ROOT::Fit",
1692 "Rectangle_t",
"RedirectHandle_t",
"Segment_t",
"SetWindowAttributes_t",
1693 "SysInfo_t",
"TCint",
"UserGroup_t",
"WindowAttributes_t",
"timespec", 0};
1694 static const char* rootClassStemsToIgnore[] =
1695 {
"ROOT::Math",
"TKDTree",
"TMatrixT",
"TParameter",
"vector", 0 };
1696 static size_t rootClassStemsToIgnoreLen[] = {0, 0, 0, 0, 0};
1697 static std::set<std::string> setRootClassesToIgnore;
1698 if (setRootClassesToIgnore.empty()) {
1699 for (
int ii = 0; rootClassesToIgnore[
ii]; ++
ii)
1700 setRootClassesToIgnore.insert(rootClassesToIgnore[
ii]);
1701 for (
int ii = 0; rootClassStemsToIgnore[
ii]; ++
ii)
1702 rootClassStemsToIgnoreLen[ii] = strlen(rootClassStemsToIgnore[ii]);
1705 if (setRootClassesToIgnore.find(cname) == setRootClassesToIgnore.end()) {
1706 bool matched =
false;
1707 for (
int ii = 0; !matched && rootClassStemsToIgnore[
ii]; ++
ii)
1708 matched = !strncmp(cname, rootClassStemsToIgnore[ii], rootClassStemsToIgnoreLen[ii]);
1710 classesDeclFileNotFound.
AddLast(classPtr);
1719 classesDeclFileNotFound.
AddLast(classPtr);
1730 classesImplFileNotFound.
AddLast(classPtr);
1733 if (!htmlfilename.
Length())
1737 cdi =
new TClassDocInfo(classPtr, htmlfilename, hdrFS, srcFS, hdr, src);
1751 if (!modulename.
Length() || modulename ==
"USER")
1760 if (parentModuleName.Length() && parentModuleName !=
".") {
1766 while (parentModuleName.Tokenize(token, pos,
"/")) {
1767 if (!token.
Length() || token ==
".")
continue;
1769 super->SetSelected(moduleSelected);
1790 Info(
"CreateListOfClasses",
"Adding class %s, module %s (%sselected)",
1797 bool cannotFind =
false;
1798 if (!classesDeclFileNotFound.
IsEmpty()) {
1799 Warning(
"CreateListOfClasses",
1800 "Cannot find the header for the following classes [reason]:");
1801 TIter iClassesDeclFileNotFound(&classesDeclFileNotFound);
1803 while ((iClass = (
TClass*)iClassesDeclFileNotFound())) {
1808 Warning(
"CreateListOfClasses",
" %s [header file is unknown]", iClass->
GetName());
1813 Warning(
"CreateListOfClasses",
1814 "Cannot find the source file for the following classes [reason]:");
1815 TIter iClassesDeclFileNotFound(&classesImplFileNotFound);
1817 while ((iClass = (
TClass*)iClassesDeclFileNotFound())) {
1822 Info(
"CreateListOfClasses",
" %s [source file is unknown, add \"ClassImpl(%s)\" to source file if it exists]",
1827 Warning(
"CreateListOfClasses",
"THtml cannot find all headers and sources. ");
1828 Warning(
"CreateListOfClasses",
1829 "You might need to adjust the input path (currently %s) by calling THtml::SetInputDir()",
1837 while ((dt = (
TDataType*) iTypedef())) {
1838 if (dt->GetType() != -1)
continue;
1843 Info(
"CreateListOfClasses",
"Adding typedef %s to class %s",
1844 dt->GetName(), cdi->
GetName());
1846 bool inNamespace =
true;
1847 TString surroundingNamespace(dt->GetName());
1848 Ssiz_t posTemplate = surroundingNamespace.
Last(
'>');
1849 inNamespace = inNamespace && (posTemplate ==
kNPOS);
1851 Ssiz_t posColumn = surroundingNamespace.Last(
':');
1852 if (posColumn !=
kNPOS) {
1853 surroundingNamespace.Remove(posColumn - 1);
1855 inNamespace = inNamespace && (!clSurrounding ||
IsNamespace(clSurrounding));
1859 TString htmlfilename(dt->GetName());
1860 output.NameSpace2FileName(htmlfilename);
1861 htmlfilename +=
".html";
1886 Warning(
"CreateListOfClasses",
"Product not set. You should call gHtml->SetProduct(\"MyProductName\");");
1888 if (
GetViewCVS().Contains(
"http://root.cern.ch/"))
1899 Info(
"CreateListOfClasses",
"Initializing - DONE.");
1909 output.CreateTypeIndex();
1910 output.CreateClassTypeDefs();
1927 Warning(
"CopyFileFromEtcDir",
"Could not copy %s to %s", inFile.Data(), outFile.Data());
1940 output.CreateHierarchy();
1971 if (!candidate)
continue;
1974 TClass* currentBaseOfCandidate = candidate;
1975 while (currentBaseOfCandidate != cl) {
1977 if (!bases)
continue;
1984 currentBaseOfCandidate = clBase;
1988 derived[candidate] = level;
2005 if (!classPtr)
return;
2017 const char *colon = strchr(cFilename,
':');
2020 libName =
TString(cFilename, colon - cFilename);
2030 if (posSpace !=
kNPOS)
2031 libname.Remove(posSpace, libname.Length());
2034 libnameBase.
Remove(0, 3);
2038 if (libnameBase.
Length())
2039 libName = libnameBase;
2042 filename = cFilename;
2044 if (!filename.
Length() ||
2046 htmlFileName =
GetURL(libName);
2048 htmlFileName =
"./";
2050 if (htmlFileName.
Length()) {
2051 filename = htmlFileName;
2054 output.NameSpace2FileName(className);
2056 filename = className;
2058 filename +=
".html";
2059 }
else filename.
Remove(0);
2080 if(!name1 || !name1[0])
return 0;
2082 if (strstr(name1,
"ROOT::")==name1) {
2084 if (!strncmp(name1 + 6,
"Math", 4)) ret =
kFALSE;
2085 if (!strncmp(name1 + 6,
"Reflex", 6)) ret =
kFALSE;
2086 if (!strncmp(name1 + 6,
"Cintex", 6)) ret =
kFALSE;
2134 bool determine = (!cdi);
2136 if (!determine) determine |= decl && !filesys && !cdi->
GetDeclFileName()[0];
2138 if (!determine) determine |= !decl && !filesys && !cdi->
GetImplFileName()[0];
2163 if (filesys) out_name = sysname;
2164 else out_name =
name;
2188 Long_t sId, sFlags, sModtime;
2192 if (st || !(sFlags & 2)) {
2194 Error(
"GetOutputDir",
"output directory %s is an existing file",
2217 if (!mapfile || !mapfile->
GetTable())
return;
2219 std::set<std::string> loadedlibs;
2220 std::set<std::string> failedlibs;
2224 while ((rec = (
TEnvRec*) iEnvRec())) {
2230 if (failedlibs.find(lib.
Data()) != failedlibs.end()) {
2242 if (loadedlibs.find(lib.
Data()) == loadedlibs.end()) {
2245 loadedlibs.insert(lib.
Data());
2266 if (numthreads == 1) {
2279 if (numthreads == -1) {
2282 numthreads = sysinfo.
fCpus;
2288 THtmlThreadInfo hti(
this, force);
2297 while (--numthreads >= 0) {
2300 threads.
Add(thread);
2303 TIter iThread(&threads);
2307 while (wait && (thread = (
TThread*) iThread()))
2314 while ((thread = (
TThread*) iThread()))
2335 Error(
"MakeClass",
"Unknown class '%s'!", className);
2357 if (!currentClass) {
2360 Error(
"MakeClass",
"Class '%s' is known, but I cannot find its TClass object!", cdi->
GetName());
2364 if (htmlFile.Length()
2365 && (htmlFile.BeginsWith(
"http://")
2366 || htmlFile.BeginsWith(
"https://")
2371 if (htmlFile.Length()) {
2374 cdo.MakeTree(force);
2377 what +=
" (sources not found)";
2390 const THtmlThreadInfo* hti = (
const THtmlThreadInfo*)info;
2393 while ((classinfo = hti->GetHtml()->GetNextClass()))
2394 hti->GetHtml()->MakeClass(classinfo, hti->GetForce());
2411 output.CreateTypeIndex();
2412 output.CreateClassTypeDefs();
2413 output.CreateModuleIndex();
2414 output.CreateClassIndex();
2415 output.CreateProductIndex();
2418 output.CreateHierarchy();
2435 Error(
"MakeTree",
"Unknown class '%s' !", className);
2440 cdo.MakeTree(force);
2558 const char* tmplt = strchr(name,
'<');
2559 if (!tmplt)
return name;
2560 tmplt = strrchr(tmplt,
':');
2561 if (tmplt > name && tmplt[-1] ==
':') {
2564 TString namesp(name, tmplt - name - 1);
TPathDefinition * fPathDef
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
virtual Int_t GetEntries() const
Bool_t IsSelected() const
const char * GetName() const
Returns name of object.
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
static Bool_t IsNamespace(const TClass *cl)
Check whether cl is a namespace.
void MakeIndex(const char *filter="*")
Create the index files for the product, modules, all types, etc.
Ssiz_t Last(char c) const
Find last occurrence of a character c.
TModuleDocInfo * GetModule() const
void Add(ULong64_t hash, Long64_t key, Long64_t value)
Add an (key,value) pair to the table. The key should be unique.
void SetSelected(Bool_t sel=kTRUE)
virtual Bool_t IsAbsoluteFileName(const char *dir)
Return true if dir is an absolute pathname.
void SetLocalFiles() const
Fill the files available in the file system below fPathInfo.fInputPath.
TList * GetListOfBases()
Return list containing the TBaseClass(es) of a class.
static void * MakeClassThreaded(void *info)
Entry point of worker threads for multi-threaded MakeAll().
virtual Bool_t ProcessEvents()
Process pending events (GUI, timers, sockets).
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 TVirtualMutex * Factory(Bool_t=kFALSE)=0
Bool_t CopyFileFromEtcDir(const char *filename) const
Copy a file from $ROOTSYS/etc/html into GetOutputDir()
Int_t fThreadedClassCount
Bool_t HaveDot()
Check whether dot is available in $PATH or in the directory set by SetDotPath()
TFileSysDir * GetParent() const
Collectable string class.
virtual void CreateAuxiliaryFiles() const
copy CSS, javascript file, etc to the output dir
R__EXTERN TClassTable * gClassTable
TObject * FindObject(const char *name) const
Find object using its name.
TString & ReplaceAll(const TString &s1, const TString &s2)
TClass * GetClassPointer(Bool_t load=kTRUE)
Get pointer to the base class TClass.
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.
const PathInfo_t & GetPathInfo() const
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
void SetViewCVS(const char *url)
static const char * GetDirDelimiter()
virtual void GetFullName(TString &fullname, Bool_t asIncluded) const
void AddClass(TClassDocInfo *cl)
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
TFileDefinition * fFileDef
virtual int MakeDirectory(const char *name)
Make a directory.
void SetOwner(THtml *html)
Set the THtml object owning this object; if it's already set to a different THtml object than issue a...
static void LoadAllLibs()
Load all libraries known to ROOT via the rootmap system.
Long_t Property() const
Set TObject::fBits and fStreamerType to cache information about the class.
const char * GetValue() const
static const char * filename()
const char * GetSharedLibs()
Get the list of shared libraries containing the code for class cls.
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
virtual ~THtml()
Default destructor.
The TEnv class reads config files, by default named .rootrc.
const TPathDefinition & GetPathDefinition() const
Return the TModuleDefinition (or derived) object as set by SetModuleDefinition(); create and return a...
void ToLower()
Change string to lower-case.
TIter * fThreadedClassIter
const TString & GetInputPath() const
Int_t GetMaxLevel() const
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 const char * DirName(const char *pathname)
Return the directory name in pathname.
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...
virtual char * Which(const char *search, const char *file, EAccessMode mode=kFileExists)
Find location of file in a search path.
ClassImp(THtml) THtml
Create a THtml object.
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...
virtual bool GetFileName(const TClass *cl, bool decl, TString &out_filename, TString &out_fsys, TFileSysEntry **fse=0) const
Common implementation for GetDeclFileName(), GetImplFileName()
void MakeTree(const char *className, Bool_t force=kFALSE)
Make an inheritance tree.
const char * ShortType(const char *name) const
Get short type name, i.e. with default templates removed.
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 GetDeclImplFileName(TClass *cl, bool filesys, bool decl, TString &out_name) const
Combined implementation for GetDeclFileName(), GetImplFileName(): Return declaration / implementation...
virtual const char * GetName() const
Returns name of object.
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
void SetDeclFileName(TClass *cl, const char *filename)
Explicitly set a decl file name for TClass cl.
virtual TObject * At(Int_t idx) const
Returns the object at position idx. Returns 0 if idx is out of range.
void SetOutputDir(const char *dir)
Set the directory where the HTML pages shuold be written to.
virtual bool GetDocDir(const TString &module, TString &doc_dir) const
Determine the module's documentation directory.
virtual void AddLast(TObject *obj)
Add object at the end of the list.
virtual const char * FindFile(const char *search, TString &file, EAccessMode mode=kFileExists)
Find location of file in a search path.
virtual void Sort(Bool_t order=kSortAscending)
Sort linked list.
const char * Data() const
void SetImplFileName(TClass *cl, const char *filename)
Explicitly set a impl file name for TClass cl.
void MakeClass(const char *className, Bool_t force=kFALSE)
Make HTML files for a single class.
virtual const char * GetDirEntry(void *dirp)
Get a directory entry. Returns 0 if no more entries.
virtual TObject * Clone(const char *newname="") const
Make a clone of an object using the Streamer facility.
const TFileDefinition & GetFileDefinition() const
Return the TFileDefinition (or derived) object as set by SetFileDefinition(); create and return a TFi...
virtual void GetModuleNameForClass(TString &module, TClass *cl) const
Return the module name for a given class.
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString...
TDictionary * GetClass() const
virtual void Sleep(UInt_t milliSec)
Sleep milliSec milli seconds.
const char * GetDeclFileName() const
The TNamed class is the base class for all named ROOT classes.
virtual Bool_t IsEmpty() const
void CreateListOfClasses(const char *filter)
Create the list of all known classes.
virtual void CreateJavascript() const
Write the default ROOT style sheet.
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 const char * PrependPathName(const char *dir, TString &name)
Concatenate a directory and a file name.
std::vector< std::vector< double > > Data
const char * GetImplFileName() const
const char * GetDeclFileSysName() const
void HelperDeleted(THelperBase *who)
Inform the THtml object that one of its helper objects was deleted.
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 void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual bool GetDeclFileName(const TClass *cl, TString &out_filename, TString &out_fsys, TFileSysEntry **fse=0) const
Determine cl's declaration file name.
Int_t Run(void *arg=0)
Start the thread.
const char * GetURL(const char *lib=0) const
Get the documentation URL for library lib.
THashTable & GetEntries()
R__EXTERN TVirtualMutex * gGlobalMutex
DocEntityInfo_t fDocEntityInfo
virtual const char * GetSoExt() const
Get the shared library extension.
R__EXTERN const char * gProgName
TList & GetListOfTypedefs()
void Clear(Option_t *option="")
Remove all objects from the list.
Long64_t GetValue(ULong64_t hash, Long64_t key)
Return the value belonging to specified key and hash value.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
R__EXTERN TSystem * gSystem
TPaveLabel title(3, 27.1, 15, 28.7,"ROOT Environment and Tools")
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 ...
Basic data type descriptor (datatype information is obtained from CINT).
std::map< std::string, TString > fLibURLs
virtual Int_t GetValue(const char *name, Int_t dflt)
Returns the integer value for a resource.
ClassInfo_t * GetClassInfo() const
virtual void CreateStyleSheet() const
Write the default ROOT style sheet.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
virtual const char * GetName() const
Returns name of object.
The ROOT global object gROOT contains a list of all defined classes.
Long_t Join(void **ret=0)
Join this thread.
virtual Int_t Exec(const char *shellcmd)
Execute a command.
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.
const TModuleDefinition & GetModuleDefinition() const
Return the TModuleDefinition (or derived) object as set by SetModuleDefinition(); create and return a...
virtual bool GetFileNameFromInclude(const char *included, TString &out_fsname) const
Set out_fsname to the full pathname corresponding to a file included as "included".
void NormalizePath(TString &path) const
Remove "/./" and collapse "/subdir/../" to "/".
void ExpandSearchPath(TString &path) const
Create all permutations of path and THtml's input path: path being PP/ and THtml's input being ...
THashList * GetTable() const
TVirtualMutex * GetMakeClassMutex() const
bool IsStdClass(const char *type)
return true if the class belongs to the std namespace
void SetFileDefinition(const TFileDefinition &fd)
Set the file defining object to be used; can also be a user derived object (a la traits).
virtual void FreeDirectory(void *dirp)
Free a directory.
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
Each class (see TClass) has a linked list of its base class(es).
void SetImplFileName(const char *name)
TString & Remove(Ssiz_t pos)
virtual bool GetDeclFileName(TClass *cl, Bool_t filesys, TString &out_name) const
Return declaration file name; return the full path if filesys is true.
void Class2Html(Bool_t force=kFALSE)
Create HTML files for a single class.
void CreateListOfTypes()
Create index of all data types and a page for each typedef-to-class.
virtual Int_t GetSize() const
static char * Next()
Returns next class from sorted class table.
const TString & GetMacroPath() const
virtual TClass * GetClass(const char *name) const
*-*-*-*-*Return pointer to class with name*-*-*-*-*-*-*-*-*-*-*-*-* *-* =============================...
virtual const char * GetName() const
Returns name of object.
void CreateHierarchy()
Create the inheritance hierarchy diagram for all classes.
virtual ~THelperBase()
Helper's destructor.
TVirtualMutex * fMakeClassMutex
void SetSelected(Bool_t sel=kTRUE)
void Add(TObject *obj)
Add object to the hash table.
#define R__LOCKGUARD(mutex)
void SetImplFileSysName(const char *fsname)
TModuleDefinition * fModuleDef
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 void Clear(Option_t *option="")
Remove all objects from the list.
virtual const char * GetEtcDir() const
Get the directory containing THtml's auxiliary files ($ROOTSYS/etc/html)
void SetPathDefinition(const TPathDefinition &pd)
Set the path defining object to be used; can also be a user derived object (a la traits).
void SetFoundDot(Bool_t found=kTRUE)
Set whether "dot" (a GraphViz utility) is available.
const TString & GetProductName() const
const char * GetImplFileName() const
Mother of all ROOT objects.
const TString & GetViewCVS() const
const char * GetDeclFileName() const
Bool_t R_ISDIR(Int_t mode)
void SetHtmlFileName(const char *name)
void Fill()
Recursively fill entries by parsing the path specified in GetName(); can be a THtml::GetDirDelimiter(...
void SetInputDir(const char *dir)
Set the directory containing the source files.
virtual void Add(TObject *obj)
Wrapper for PCRE library (Perl Compatible Regular Expressions).
R__EXTERN const char * gRootDir
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
void SetDeclFileSysName(const char *fsname)
std::string ShortType(const char *typeDesc, int mode)
Return the absolute type of typeDesc.
const char * GetHtmlFileName() const
void Recurse(TFileSysDB *db, const char *path)
Recursively fill entries by parsing the contents of path.
const TString & GetIgnore() const
const TString & GetOutputDir(Bool_t createDir=kTRUE) const
Return the output directory as set by SetOutputDir().
virtual int CopyFile(const char *from, const char *to, Bool_t overwrite=kFALSE)
Copy a file.
virtual void * OpenDirectory(const char *name)
Open a directory. Returns 0 if directory does not exist.
OutputStyle_t fOutputStyle
THashList fShortClassNames
void SetModuleDefinition(const TModuleDefinition &md)
Set the module defining object to be used; can also be a user derived object (a la traits)...
Bool_t InheritsFrom(const char *cl) const
Return kTRUE if this class inherits from a class with name "classname".
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
static void output(int code)
virtual const char * GetTitle() const
Returns title of object.
virtual bool GetImplFileName(TClass *cl, Bool_t filesys, TString &out_name) const
Return implementation file name.
const char * GetImplFileSysName() const
virtual char * ConcatFileName(const char *dir, const char *name)
Concatenate a directory and a file name. User must delete returned string.
void AddMacroPath(const char *path)
that the directive is run on.
Bool_t HaveSource() const
virtual bool GetImplFileName(const TClass *cl, TString &out_filename, TString &out_fsys, TFileSysEntry **fse=0) const
Determine cl's implementation file name.
Ssiz_t First(char c) const
Find first occurrence of a character c.
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...
void SetDeclFileName(const char *name)
virtual void GetHtmlFileName(TClass *classPtr, TString &filename) const
Return real HTML filename.
TClassDocInfo * GetNextClass()
Return the next class to be generated for MakeClassThreaded.
void SetModule(TModuleDocInfo *module)
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.