16 #include "TClassEdit.h" 41 typedef std::vector<std::string> Words_t;
42 typedef Words_t::const_iterator SectionStart_t;
46 TSectionInfo(SectionStart_t start,
size_t chars,
size_t size):
47 fStart(start), fChars(chars), fSize(size) {};
49 SectionStart_t fStart;
53 typedef std::list<TSectionInfo> SectionStarts_t;
55 static void Sections_BuildIndex(SectionStarts_t& sectionStarts,
56 SectionStart_t begin, SectionStart_t end,
62 SectionStart_t cursor = begin;
63 if (sectionStarts.empty() || sectionStarts.back().fStart != cursor)
64 sectionStarts.push_back(TSectionInfo(cursor, 1, 0));
66 SectionStarts_t::iterator prevSection = sectionStarts.end();
69 while (cursor != end) {
70 size_t numLeft = end - cursor;
71 size_t assumedNumSections = (numLeft + maxPerSection - 1 ) / maxPerSection;
72 size_t step = ((numLeft + assumedNumSections - 1) / assumedNumSections);
73 if (!step || step >= numLeft)
return;
75 if (cursor == end)
break;
77 SectionStart_t addWhichOne = prevSection->fStart;
79 size_t selectionChar=1;
80 for (; selectionChar <= cursor->length() && addWhichOne == prevSection->fStart;
82 SectionStart_t checkPrev = cursor;
83 while (--checkPrev != prevSection->fStart
84 && !strncasecmp(checkPrev->c_str(), cursor->c_str(), selectionChar)) { }
86 SectionStart_t checkNext = cursor;
87 while (++checkNext != end
88 && !strncasecmp(checkNext->c_str(), cursor->c_str(), selectionChar)) { }
91 if (checkPrev != prevSection->fStart) {
92 if ((cursor - checkPrev) <= (checkNext - cursor))
93 addWhichOne = ++checkPrev;
94 else if (checkNext != end
95 && (
size_t)(checkNext - cursor) < maxPerSection) {
96 addWhichOne = checkNext;
100 if (addWhichOne == prevSection->fStart)
101 addWhichOne = cursor;
104 while (selectionChar <= prevSection->fStart->length()
105 && selectionChar <= addWhichOne->length()
106 && !strncasecmp(prevSection->fStart->c_str(), addWhichOne->c_str(), selectionChar))
109 sectionStarts.push_back(TSectionInfo(addWhichOne, selectionChar, 0));
110 cursor = addWhichOne;
115 static void Sections_SetSize(SectionStarts_t& sectionStarts,
const Words_t &words)
118 for (SectionStarts_t::iterator iSectionStart = sectionStarts.begin();
119 iSectionStart != sectionStarts.end(); ++iSectionStart) {
120 SectionStarts_t::iterator next = iSectionStart;
122 if (next == sectionStarts.end()) {
123 iSectionStart->fSize = (words.end() - iSectionStart->fStart);
126 iSectionStart->fSize = (next->fStart - iSectionStart->fStart);
130 static void Sections_PostMerge(SectionStarts_t& sectionStarts,
const size_t maxPerSection)
133 for (SectionStarts_t::iterator iSectionStart = sectionStarts.begin();
134 iSectionStart != sectionStarts.end();) {
135 SectionStarts_t::iterator iNextSectionStart = iSectionStart;
137 if (iNextSectionStart == sectionStarts.end())
break;
138 if (iNextSectionStart->fSize + iSectionStart->fSize < maxPerSection) {
139 iSectionStart->fSize += iNextSectionStart->fSize;
140 sectionStarts.erase(iNextSectionStart);
141 }
else ++iSectionStart;
145 static void GetIndexChars(
const Words_t& words,
UInt_t numSectionsIn,
146 std::vector<std::string> §ionMarkersOut)
153 const size_t maxPerSection = (words.size() + numSectionsIn - 1)/ numSectionsIn;
154 SectionStarts_t sectionStarts;
155 Sections_BuildIndex(sectionStarts, words.begin(), words.end(), maxPerSection);
156 Sections_SetSize(sectionStarts, words);
157 Sections_PostMerge(sectionStarts, maxPerSection);
160 sectionMarkersOut.clear();
161 sectionMarkersOut.resize(sectionStarts.size());
163 for (SectionStarts_t::iterator iSectionStart = sectionStarts.begin();
164 iSectionStart != sectionStarts.end(); ++iSectionStart)
165 sectionMarkersOut[idx++] =
166 iSectionStart->fStart->substr(0, iSectionStart->fChars);
169 static void GetIndexChars(
const std::list<std::string>& wordsIn,
UInt_t numSectionsIn,
170 std::vector<std::string> §ionMarkersOut)
173 Words_t words(wordsIn.size());
175 for (std::list<std::string>::const_iterator iWord = wordsIn.begin(); iWord != wordsIn.end(); ++iWord)
176 words[idx++] = *iWord;
177 GetIndexChars(words, numSectionsIn, sectionMarkersOut);
200 return (strcasecmp(*((
char **) name1), *((
char **) name2)));
207 static void sort_strlist_stricmp(std::vector<std::string>&
l)
214 posList* carr =
new posList[l.size()];
216 for (
size_t iS = 0, iSE = l.size(); iS < iSE; ++iS) {
218 carr[idx++].str = l[iS].c_str();
221 std::vector<std::string> lsort(l.size());
222 for (
size_t iS = 0, iSE = l.size(); iS < iSE; ++iS) {
223 lsort[iS].swap(l[carr[iS].pos]);
275 if (comment && strlen(comment)) {
299 TString replWithRelPath(
"=\"@!@");
300 line.
ReplaceAll(
"=\"../", replWithRelPath +
"../" + relpath);
301 line.
ReplaceAll(
"=\"./", replWithRelPath + relpath);
312 const char* outfilename,
const char *title,
313 const char *relpath ,
Int_t includeOutput ,
314 const char* context ,
317 TString htmlFilename(outfilename);
318 htmlFilename +=
".html";
320 std::ofstream out(htmlFilename);
323 Error(
"Convert",
"Can't open file '%s' !", htmlFilename.
Data());
330 if (context && context[0])
331 out << context << std::endl;
332 else if (title && title[0])
333 out <<
"<h1 class=\"convert\">" << title <<
"</h1>" << std::endl;
335 Int_t numReuseCanvases = 0;
342 const char* outfile = 0;
344 firstCanvasFileBase +=
"_0.png";
346 Bool_t haveFirstCanvasFile =
false;
348 if (firstCanvasFileBase == outfile) {
349 haveFirstCanvasFile =
true;
356 TString firstCanvasFile = outfilename;
357 firstCanvasFile +=
"_0.png";
368 if (strncmp(outfile, stem, stem.Length()))
370 const char* posext = strrchr(outfile,
'.');
371 if (!posext || strcmp(posext,
".png"))
383 TString idxStr(outfile + stem.Length());
384 idxStr.
Remove(idxStr.Length() - 4);
391 if (maxIdx + 1 != numReuseCanvases)
394 numReuseCanvases = 0;
400 if (numReuseCanvases)
401 Printf(
"Convert: %s (reusing %d saved canvas%s)", htmlFilename.
Data(), numReuseCanvases, (numReuseCanvases > 1 ?
"es" :
""));
405 UInt_t nCanvases = numReuseCanvases;
407 if (!numReuseCanvases) {
411 TPMERegexp reOutFile(baseInFileName +
"_[[:digit:]]+\\.png");
417 const char* outdirE = 0;
419 if (reOutFile.
Match(outdirE)) {
426 gSystem->
Exec(
TString::Format(
"ROOT_HIST=0 root.exe -l -q %s $ROOTSYS/etc/html/saveScriptOutput.C\\(\\\"%s\\\",\\\"%s\\\",%d\\)",
427 gROOT->IsBatch() ?
"-b" :
"",
436 const char* outdirE = 0;
438 if (reOutFile.
Match(outdirE)) {
449 TList* gClientGetListOfWindows = 0;
450 TObject* gClientGetDefaultRoot = 0;
451 std::set<TObject*> previousWindows;
453 gROOT->ProcessLine(
TString::Format(
"*((TList**)0x%lx) = ((TGClient*)0x%lx)->GetListOfWindows();",
455 gROOT->ProcessLine(
TString::Format(
"*((TObject**)0x%lx) = ((TGClient*)0x%lx)->GetDefaultRoot();",
458 TIter iWin(gClientGetListOfWindows);
459 while((win = iWin())) {
463 if (winGetParent == gClientGetDefaultRoot)
464 previousWindows.insert(win);
467 if (
gROOT->GetListOfCanvases()->GetSize())
468 previousWindows.insert(
gROOT->GetListOfCanvases()->Last());
471 std::set<TObject*> timersBefore;
473 while ((timerOld = iTimer()))
474 timersBefore.insert(timerOld);
483 gROOT->ProcessLine(cmd, &err);
492 TIter iWin(gClientGetListOfWindows);
493 while((win = iWin())) {
498 if (winGetParent == gClientGetDefaultRoot)
501 if (winIsMapped && previousWindows.find(win) == previousWindows.end()
502 && win->InheritsFrom(clGMainFrame)) {
504 Bool_t isRootCanvas = win->InheritsFrom(clRootCanvas);
510 if (isRootCanvas && !hasEditor) {
512 gROOT->ProcessLine(
TString::Format(
"*((TVirtualPad**)0x%lx) = ((TRootCanvas*)0x%lx)->Canvas();",
514 if (!pad->HasViewer3D() || pad->GetViewer3D()->InheritsFrom(
"TViewer3DPad")) {
519 (
ULong_t)win, outfilename, nCanvases++));
526 if (!previousWindows.empty())
531 if (last == pad) last = 0;
541 while ((timer = (
TTimer*) iTimerRemove()))
542 if (timersBefore.find(timer) == timersBefore.end())
547 out <<
"<table><tr><td style=\"vertical-align:top;padding-right:2em;\">" << std::endl;
549 out <<
"<div class=\"listing\"><pre class=\"listing\">" << std::endl;
552 parser.
Convert(out, in, relpath, (includeOutput) ,
555 out <<
"</pre></div>" << std::endl;
560 out <<
"</td><td style=\"vertical-align:top;\">" << std::endl;
561 out <<
"<table>" << std::endl;
562 for (
UInt_t i = 0; i < nCanvases; ++i) {
564 out <<
"<tr><td><a href=\"" << pngname <<
"\">" << std::endl
565 <<
"<img src=\"" << pngname <<
"\" id=\"canv" << i <<
"\" alt=\"thumb\" style=\"border:none;width:22em;\" " 566 "onmouseover=\"javascript:canv" << i <<
".style.width='auto';\" />" << std::endl
567 <<
"</a></td></tr>" << std::endl;
569 out <<
"</table>" << std::endl;
570 out <<
"</td></tr></table>" << std::endl;
597 TString sourceFile(sourceName);
599 if (!sourceFile.
Length()) {
600 Error(
"Copy",
"Can't copy file '%s' to '%s' directory - source file name invalid!", sourceName,
607 if (!destName || !*destName)
616 Long_t id, flags, sModtime, dModtime;
621 || sModtime > dModtime)
623 Error(
"Copy",
"Can't copy file '%s' to '%s'!",
624 sourceFile.
Data(), destFile.
Data());
644 TString filename(
"ClassHierarchy.html");
648 std::ofstream out(filename);
651 Error(
"CreateHierarchy",
"Can't open file '%s' !", filename.
Data());
662 out <<
"<h1>Class Hierarchy</h1>" << std::endl;
677 Warning(
"THtml::CreateHierarchy",
"skipping class %s\n", cdi->
GetName());
698 TString filename(
"ClassIndex.html");
702 std::ofstream indexFile(filename.
Data());
704 if (!indexFile.good()) {
705 Error(
"CreateClassIndex",
"Can't open file '%s' !", filename.
Data());
716 indexFile <<
"<h1>Class Index</h1>" << std::endl;
720 std::vector<std::string> indexChars;
722 std::vector<std::string> classNames;
727 if (cdi->IsSelected() && cdi->HaveSource())
728 classNames.push_back(cdi->GetName());
731 if (classNames.size() > 10) {
732 indexFile <<
"<div id=\"indxShortX\"><h4>Jump to</h4>" << std::endl;
734 GetIndexChars(classNames, 50 , indexChars);
735 for (
UInt_t iIdxEntry = 0; iIdxEntry < indexChars.size(); ++iIdxEntry) {
736 indexFile <<
"<a href=\"#idx" << iIdxEntry <<
"\">";
738 indexFile <<
"</a>" << std::endl;
740 indexFile <<
"</div><br />" << std::endl;
744 indexFile <<
"<ul id=\"indx\">" << std::endl;
747 UInt_t currentIndexEntry = 0;
752 if (!cdi->IsSelected() || !cdi->HaveSource())
757 TClass* currentClass =
dynamic_cast<TClass*
>(currentDict);
760 Warning(
"THtml::CreateClassIndex",
"skipping class %s\n", cdi->GetName());
764 indexFile <<
"<li class=\"idxl" << (i++)%2 <<
"\">";
765 if (currentIndexEntry < indexChars.size()
766 && !strncmp(indexChars[currentIndexEntry].c_str(), cdi->GetName(),
767 indexChars[currentIndexEntry].length()))
768 indexFile <<
"<a name=\"idx" << currentIndexEntry++ <<
"\"></a>";
770 TString htmlFile(cdi->GetHtmlFileName());
771 if (htmlFile.Length()) {
772 indexFile <<
"<a href=\"";
773 indexFile << htmlFile;
774 indexFile <<
"\"><span class=\"typename\">";
776 indexFile <<
"</span></a> ";
778 indexFile <<
"<span class=\"typename\">";
780 indexFile <<
"</span> ";
785 indexFile <<
"</li>" << std::endl;
788 indexFile <<
"</ul>" << std::endl;
803 const char* title =
"LibraryDependencies";
807 std::ofstream libDepDotFile(dotfilename +
".dot");
808 libDepDotFile <<
"digraph G {" << std::endl
809 <<
"ratio=compress;" << std::endl
810 <<
"node [fontsize=22,labeldistance=0.1];" << std::endl
811 <<
"edge [len=0.01];" << std::endl
812 <<
"fontsize=22;" << std::endl
813 <<
"size=\"16,16\";" << std::endl
814 <<
"overlap=false;" << std::endl
815 <<
"splines=true;" << std::endl
816 <<
"K=0.1;" << std::endl;
821 std::stringstream sstrCluster;
822 std::stringstream sstrDeps;
827 std::vector<std::string> indexChars;
830 filename.ReplaceAll(
"/",
"_");
831 filename +=
"_Index.html";
833 std::ofstream outputFile(filename.Data());
834 if (!outputFile.good()) {
835 Error(
"CreateModuleIndex",
"Can't open file '%s' !", filename.Data());
840 TString htmltitle(
"Index of ");
843 htmltitle += moduletitle;
848 outputFile <<
"<h2>" << htmltitle <<
"</h2>" << std::endl;
851 if (
GetHtml()->GetModuleDocPath().Length()) {
862 std::list<std::string> classNames;
867 if (!cdi->IsSelected() || !cdi->HaveSource())
869 classNames.push_back(cdi->GetName());
871 if (classNames.size() > 1)
continue;
873 TClass* cdiClass =
dynamic_cast<TClass*
>(cdi->GetClass());
880 if (posDepLibs !=
kNPOS)
900 if (posDepLibs !=
kNPOS) {
902 for(
Ssiz_t pos = posDepLibs + 1; libs[pos]; ++pos) {
903 if (libs[pos] ==
' ') {
904 if (thisLib.
Length() && lib.length()) {
905 size_t posExt = lib.find(
'.');
906 if (posExt != std::string::npos)
914 if (lib.length() && thisLib.
Length()) {
915 size_t posExt = lib.find(
'.');
916 if (posExt != std::string::npos)
927 UInt_t currentIndexEntry = 0;
929 if (!cdi->IsSelected() || !cdi->HaveSource())
934 Error(
"CreateModuleIndex",
"Unknown class '%s' !", cdi->GetName());
939 outputFile <<
"<h2>Class Index</h2>" << std::endl;
941 if (classNames.size() > 10) {
942 outputFile <<
"<div id=\"indxShortX\"><h4>Jump to</h4>" << std::endl;
943 UInt_t numSections = classNames.size() / 10;
944 if (numSections < 10) numSections = 10;
945 if (numSections > 50) numSections = 50;
947 GetIndexChars(classNames, numSections, indexChars);
948 for (
UInt_t iIdxEntry = 0; iIdxEntry < indexChars.size(); ++iIdxEntry) {
949 outputFile <<
"<a href=\"#idx" << iIdxEntry <<
"\">";
951 outputFile <<
"</a>" << std::endl;
953 outputFile <<
"</div><br />" << std::endl;
956 outputFile <<
"<ul id=\"indx\">" << std::endl;
960 outputFile <<
"<li class=\"idxl" << (count++)%2 <<
"\">";
961 if (currentIndexEntry < indexChars.size()
962 && !strncmp(indexChars[currentIndexEntry].c_str(), cdi->GetName(),
963 indexChars[currentIndexEntry].length()))
964 outputFile <<
"<a name=\"idx" << currentIndexEntry++ <<
"\"></a>";
966 TString htmlFile(cdi->GetHtmlFileName());
967 if (htmlFile.Length()) {
968 outputFile <<
"<a href=\"";
969 outputFile << htmlFile;
970 outputFile <<
"\"><span class=\"typename\">";
972 outputFile <<
"</span></a> ";
974 outputFile <<
"<span class=\"typename\">";
976 outputFile <<
"</span> ";
981 outputFile <<
"</li>" << std::endl;
986 outputFile <<
"</ul>" << std::endl;
1010 if (!libinfo->GetName() || !libinfo->GetName()[0])
continue;
1013 for (std::set<std::string>::iterator iDep = deps.begin();
1014 iDep != deps.end(); ) {
1016 for (std::set<std::string>::const_iterator iDep2 = deps.begin();
1017 !already_indirect && iDep2 != deps.end(); ++iDep2) {
1018 if (iDep == iDep2)
continue;
1021 if (!libinfo2)
continue;
1023 already_indirect |= deps2.find(*iDep) != deps2.end();
1025 if (already_indirect) {
1026 std::set<std::string>::iterator iRemove = iDep;
1029 deps.erase(iRemove);
1038 if (!libinfo->GetName() || !libinfo->GetName()[0])
continue;
1040 const std::set<std::string>& modules = libinfo->GetModules();
1041 if (modules.size() > 1) {
1042 sstrCluster <<
"subgraph cluster" << libinfo->GetName() <<
" {" << std::endl
1043 <<
"style=filled;" << std::endl
1044 <<
"color=lightgray;" << std::endl
1046 if (!strcmp(libinfo->GetName(),
"libCore"))
1047 sstrCluster <<
"Everything depends on ";
1048 sstrCluster << libinfo->GetName() <<
"\";" << std::endl;
1050 for (std::set<std::string>::const_iterator iModule = modules.begin();
1051 iModule != modules.end(); ++iModule) {
1055 sstrCluster <<
"\"" << *iModule <<
"\" [style=filled,color=white,URL=\"" 1056 << modURL <<
"_Index.html\"];" << std::endl;
1058 sstrCluster << std::endl
1059 <<
"}" << std::endl;
1062 TString modURL(*modules.begin());
1065 sstrCluster <<
"\"" << *modules.begin()
1066 <<
"\" [label=\"" << libinfo->GetName()
1067 <<
"\",style=filled,color=lightgray,shape=box,URL=\"" 1068 << modURL <<
"_Index.html\"];" << std::endl;
1078 const std::string& mod = *(modules.begin());
1079 const std::set<std::string>& deps = libinfo->GetDependencies();
1080 for (std::set<std::string>::const_iterator iDep = deps.begin();
1081 iDep != deps.end(); ++iDep) {
1085 if (!depLibInfo || depLibInfo->
GetModules().empty())
1088 const std::string& moddep = *(depLibInfo->
GetModules().begin());
1089 sstrDeps <<
"\"" << mod <<
"\" -> \"" << moddep <<
"\";" << std::endl;
1092 sstrDeps <<
"\"" << mod <<
"\" -> \"CONT\" [style=invis];" << std::endl;
1095 libDepDotFile << sstrCluster.str() << std::endl
1097 libDepDotFile <<
"}" << std::endl;
1098 libDepDotFile.close();
1100 std::ofstream out(dotfilename +
".html");
1102 Error(
"CreateModuleIndex",
"Can't open file '%s.html' !",
1103 dotfilename.
Data());
1113 out <<
"<h1>Library Dependencies</h1>" << std::endl;
1117 out <<
"<img alt=\"Library Dependencies\" class=\"classcharts\" usemap=\"#Map" << title <<
"\" src=\"" << title <<
".png\"/>" << std::endl;
1131 TString outFile(
"index.html");
1133 std::ofstream out(outFile);
1136 Error(
"CreateProductIndex",
"Can't open file '%s' !", outFile.
Data());
1149 if (
GetHtml()->GetPathDefinition().GetDocDir(
"", prodDoc))
1154 out <<
"<h2>Chapters</h2>" << std::endl
1155 <<
"<h3><a href=\"./ClassIndex.html\">Class Index</a></h3>" << std::endl
1156 <<
"<p>A complete list of all classes defined in " <<
GetHtml()->
GetProductName() <<
"</p>" << std::endl
1157 <<
"<h3><a href=\"./ClassHierarchy.html\">Class Hierarchy</a></h3>" << std::endl
1158 <<
"<p>A hierarchy graph of all classes, showing each class's base and derived classes</p>" << std::endl
1159 <<
"<h3><a href=\"./ListOfTypes.html\">Type Index</a></h3>" << std::endl
1160 <<
"<p>A complete list of all types</p>" << std::endl
1161 <<
"<h3><a href=\"./LibraryDependencies.html\">Library Dependency</a></h3>" << std::endl
1162 <<
"<p>A diagram showing all of " <<
GetHtml()->
GetProductName() <<
"'s libraries and their dependencies</p>" << std::endl;
1181 while ((dt = (
TDataType*) iTypedefs())) {
1183 Info(
"CreateClassTypeDefs",
"Creating typedef %s to class %s",
1184 dt->GetName(), cdi->
GetName());
1186 TString filename(dt->GetName());
1191 filename +=
".html";
1194 std::ofstream outfile(filename);
1196 if (!outfile.good()) {
1197 Error(
"CreateClassTypeDefs",
"Can't open file '%s' !", filename.Data());
1203 outfile <<
"<a name=\"TopOfPage\"></a>" << std::endl;
1205 TString dtName(dt->GetName());
1219 char* libDup=
StrDup(lib);
1220 char* libDupSpace=strchr(libDup,
' ');
1221 if (libDupSpace) *libDupSpace = 0;
1222 char* libDupEnd=libDup+strlen(libDup);
1223 while (libDupEnd!=libDup)
1224 if (*(--libDupEnd)==
'.') {
1231 outfile <<
"<script type=\"text/javascript\">WriteFollowPageBox('" 1232 << sTitle <<
"','" << sLib <<
"','" << sInclude <<
"');</script>" << std::endl;
1240 outfile <<
"<div class=\"dropshadow\"><div class=\"withshadow\">";
1241 outfile <<
"<h1>" << sTitle <<
"</h1>" << std::endl
1242 <<
"<div class=\"classdescr\">" << std::endl;
1244 outfile << dtName <<
" is a typedef to ";
1247 outfile << std::endl
1248 <<
"</div>" << std::endl
1249 <<
"</div></div><div style=\"clear:both;\"></div>" << std::endl;
1252 outfile << std::endl <<
"<div id=\"datamembers\">" << std::endl
1253 <<
"<table class=\"data\" cellspacing=\"0\">" << std::endl;
1254 outfile <<
"<tr class=\"data";
1255 outfile <<
"\"><td class=\"datatype\">typedef ";
1257 outfile <<
"</td><td class=\"dataname\">";
1259 if (dt->GetTitle() && dt->GetTitle()[0]) {
1260 outfile <<
"</td><td class=\"datadesc\">";
1262 }
else outfile <<
"</td><td>";
1263 outfile <<
"</td></tr>" << std::endl
1264 <<
"</table></div>" << std::endl;
1279 TString outFile(
"ListOfTypes.html");
1281 std::ofstream typesList(outFile);
1283 if (!typesList.good()) {
1284 Error(
"CreateTypeIndex",
"Can't open file '%s' !", outFile.
Data());
1292 typesList <<
"<h2> List of data types </h2>" << std::endl;
1294 typesList <<
"<dl><dd>" << std::endl;
1297 std::vector<std::string> typeNames(
gROOT->GetListOfTypes()->GetSize());
1304 while ((type = (
TDataType *) nextType()))
1307 && !( strchr(type->
GetName(),
'<') && strchr(type->
GetName(),
'>'))
1309 typeNames[tnIdx++] = type->
GetName();
1310 typeNames.resize(tnIdx);
1313 sort_strlist_stricmp(typeNames);
1315 std::vector<std::string> indexChars;
1316 if (typeNames.size() > 10) {
1317 typesList <<
"<div id=\"indxShortX\"><h4>Jump to</h4>" << std::endl;
1319 GetIndexChars(typeNames, 10 , indexChars);
1320 for (
UInt_t iIdxEntry = 0; iIdxEntry < indexChars.size(); ++iIdxEntry) {
1321 typesList <<
"<a href=\"#idx" << iIdxEntry <<
"\">";
1323 typesList <<
"</a>" << std::endl;
1325 typesList <<
"</div><br />" << std::endl;
1328 typesList <<
"<ul id=\"indx\">" << std::endl;
1331 UInt_t currentIndexEntry = 0;
1333 for (std::vector<std::string>::iterator iTypeName = typeNames.begin();
1334 iTypeName != typeNames.end(); ++iTypeName) {
1336 typesList <<
"<li class=\"idxl" << idx%2 <<
"\">";
1337 if (currentIndexEntry < indexChars.size()
1338 && !strncmp(indexChars[currentIndexEntry].c_str(), iTypeName->c_str(),
1339 indexChars[currentIndexEntry].length()))
1340 typesList <<
"<a name=\"idx" << currentIndexEntry++ <<
"\"></a>" << std::endl;
1341 typesList <<
"<a name=\"";
1343 typesList <<
"\"><span class=\"typename\">";
1345 typesList <<
"</span></a> ";
1347 typesList <<
"</li>" << std::endl;
1350 typesList <<
"</ul>" << std::endl;
1375 str.
Insert(pos,
"<span class=\"comment\">");
1380 str.
Insert(pos,
"<span class=\"string\">");
1383 str.
Insert(pos,
"<span class=\"keyword\">");
1386 str.
Insert(pos,
"<span class=\"cpp\">");
1389 str.
Insert(pos,
"<pre>");
1392 Error(
"DecorateEntityBegin",
"Unhandled / invalid entity type %d!", (
Int_t)type);
1415 str.
Insert(pos,
"</span>");
1420 str.
Insert(pos,
"</span>");
1423 str.
Insert(pos,
"</span>");
1426 str.
Insert(pos,
"</span>");
1429 str.
Insert(pos,
"</pre>");
1432 Error(
"DecorateEntityBegin",
"Unhandled / invalid entity type %d!", (
Int_t)type);
1457 while (original.
Tokenize(author, pos,
",")) {
1466 if (cLink !=
kNPOS) {
1470 if(endLink ==
kNPOS)
1471 endLink = author.
Length();
1472 authors +=
"<a href=\"";
1473 authors += author(cLink + 1, endLink - (cLink + 1));
1475 authors += author(0, cLink);
1477 if (endLink != author.
Length())
1478 authors += author(endLink + 1, author.
Length());
1480 authors +=
"<a href=\"";
1487 while (author.
Tokenize(namePart, posNamePart,
" ")) {
1491 if (isdigit(namePart[0]))
continue;
1495 authors += namePart;
1532 Long_t id, flags, iModtime, dModtime;
1535 if (iModtime < dModtime) {
1537 sourceFile = declFile;
1543 filename = classname;
1547 filename +=
".cxx.html";
1549 filename +=
".h.html";
1564 filename = classname;
1565 filename +=
"_Tree.pdf";
1576 Long_t id, flags, iModtime, dModtime;
1579 if (iModtime < dModtime) {
1581 sourceFile = declFile;
1585 filename = classname;
1588 filename +=
".html";
1593 Error(
"IsModified",
"Unknown file type !");
1600 Long_t id, flags, sModtime, dModtime;
1604 return (sModtime > dModtime);
1622 if (posTemplate !=
kNPOS) {
1625 TString templateArgs = encScope(posTemplate, encScope.
Length());
1633 if (posName !=
kNPOS) {
1635 while (numDblColumn > 1) {
1640 posName = encScope.
Last(
':');
1641 if (posName ==
kNPOS)
1648 if (name.
Length() > 240) {
1658 if (posDot !=
kNPOS)
1661 name =
name(0, namelen) + hash + ext;
1664 const char* replaceWhat =
":<> ,~=";
1666 if (strchr(replaceWhat, name[i]))
1678 const char* outdir,
const char* linkdir)
1683 if (!dirHandle)
return;
1685 const char* entry = 0;
1686 std::list<std::string> files;
1699 std::ifstream in(filename);
1707 std::ifstream in(filename);
1711 out << line << std::endl;
1714 files.push_back(filename.
Data());
1716 files.push_back(filename.
Data());
1719 std::stringstream furtherReading;
1721 for (std::list<std::string>::const_iterator iFile = files.begin();
1722 iFile != files.end(); ++iFile) {
1723 TString filename(iFile->c_str());
1727 Error(
"CreateModuleIndex",
"Cannot create output directory %s", outdir);
1736 Error(
"CreateModuleIndex",
"Cannot copy file %s to %s",
1737 filename.Data(), outfile.Data());
1746 outfile.Remove(outfile.Length()-3, 3);
1748 std::ifstream inFurther(filename);
1749 std::ofstream outFurther(outfile);
1750 if (inFurther && outFurther) {
1751 outFurther <<
"<pre>";
1754 outFurther <<
"</pre>";
1761 furtherReading <<
"<a class=\"linkeddoc\" href=\"" << linkdir <<
"/" << showname <<
"\">";
1762 showname.
Remove(showname.Length() - 5, 5);
1765 furtherReading <<
"</a> " << std::endl;
1769 if (furtherReading.str().length())
1770 out <<
"<h3>Further Reading</h3><div id=\"furtherreading\">" << std::endl
1771 << furtherReading.str() <<
"</div><h3>List of Classes</h3>" << std::endl;
1794 if (comment && !strcmp(comment, entity->
GetName()))
1824 mangledName = scope->
GetName();
1826 link += mangledName;
1830 mangledName = entity->
GetName();
1832 link += mangledName;
1839 description += scope->
GetName();
1840 description +=
"::";
1842 description += entity->
GetName();
1843 comment = description.
Data();
1846 if (comment && !strcmp(comment, entity->
GetName()))
1874 bool isClassTypedef = entity->
GetType() == -1;
1877 isClassTypedef = isClassTypedef && (entity->
Property() & 7);
1878 if (isClassTypedef) {
1883 link = mangledEntity +
".html";
1885 link =
"ListOfTypes.html#";
1886 link += mangledEntity;
1889 if (comment && !strcmp(comment, entity->
GetName()))
1919 link += mangledName;
1922 mangledName = entity->
GetName();
1924 link += mangledName;
1927 if (!comment && entity->
GetClass()) {
1930 while ((mCand = (
TMethod*)iMeth()))
1931 if (!strcmp(mCand->GetName(), entity->
GetName())) {
1932 if (description.
Length()) {
1933 description +=
" or overloads";
1936 description = mCand->GetPrototype();
1938 comment = description.
Data();
1941 if (comment && !strcmp(comment, entity->
GetName()))
1954 return !reference ||
1955 strncmp(reference,
"http", 4) ||
1956 (strncmp(reference + 4,
"://", 3) && strncmp(reference + 4,
"s://", 4));
1977 case '<':
return "<";
1978 case '&':
return "&";
1979 case '>':
return ">";
1995 const char c = text[pos];
1998 text.
Replace(pos, 1, replaced);
1999 pos += strlen(replaced) - 1;
2013 while (pos < text.
Length())
2027 while (
string && *
string) {
2048 case kNeato: runDot =
"neato";
break;
2049 case kFdp: runDot =
"fdp";
break;
2050 case kCirco: runDot =
"circo";
break;
2051 default: runDot =
"dot";
2055 runDot +=
" -q1 -Tpng -o";
2059 runDot +=
"-Tcmap -o";
2067 Info(
"RunDot",
"Running: %s", runDot.
Data());
2069 if (
gDebug < 4 && !retDot)
2072 if (!retDot && outMap) {
2073 std::ifstream inmap(
Form(
"%s.map", filename));
2075 std::getline(inmap, line);
2076 if (inmap && !inmap.eof()) {
2078 <<
"\" id=\"Map" <<
gSystem->
BaseName(filename) <<
"\">" << std::endl;
2079 while (inmap && !inmap.eof()) {
2080 if (line.compare(0, 6,
"<area ") == 0) {
2081 size_t posEndTag = line.find(
'>');
2082 if (posEndTag != std::string::npos)
2083 line.replace(posEndTag, 1,
"/>");
2085 *outMap << line << std::endl;
2086 std::getline(inmap, line);
2088 *outMap <<
"</map>" << std::endl;
2096 Error(
"RunDot",
"Error running %s!", runDot.
Data());
2111 const char* dir ,
TClass *cls ,
2114 std::ifstream addHeaderFile(header);
2116 if (!addHeaderFile.good()) {
2117 Warning(
"THtml::WriteHtmlHeader",
2118 "Can't open html header file %s\n", header);
2132 while (!addHeaderFile.eof()) {
2134 line.ReadLine(addHeaderFile,
kFALSE);
2135 if (addHeaderFile.eof())
2141 line.Index(
"%CLASS%") !=
kNPOS ||
2142 line.Index(
"%INCFILE%") !=
kNPOS ||
2143 line.Index(
"%SRCFILE%") !=
kNPOS))
2159 out << txt << std::endl;
2191 const char* dir ,
TClass *cls)
2194 TString noSpecialCharTitle(title);
2199 Bool_t bothHeaders = lenUserHeader > 0 && userHeader[lenUserHeader - 1] ==
'+';
2200 if (lenUserHeader == 0 || bothHeaders) {
2201 TString header(
"header.html");
2206 if (lenUserHeader != 0) {
2208 userHeader.Remove(lenUserHeader - 1);
2219 const char* lastUpdate,
const char* author,
2220 const char* copyright,
const char* footer)
2222 static const char* templateSITags[
TDocParser::kNumSourceInfos] = {
"%UPDATE%",
"%AUTHOR%",
"%COPYRIGHT%",
"%CHANGED%",
"%GENERATED%"};
2229 if (!lastUpdate || !lastUpdate[0]) {
2234 std::ifstream addFooterFile(footer);
2236 if (!addFooterFile.good()) {
2237 Warning(
"THtml::WriteHtmlFooter",
2238 "Can't open html footer file %s\n", footer);
2243 while (!addFooterFile.eof()) {
2246 if (addFooterFile.eof())
2254 if (siPos !=
kNPOS) {
2255 if (siValues[siTag] && siValues[siTag][0])
2256 line.
Replace(siPos, strlen(templateSITags[siTag]), siValues[siTag]);
2262 out << line << std::endl;
2289 const char *lastUpdate,
const char *author,
2290 const char *copyright)
2296 if (userFooter.
Length() != 0) {
2304 TString footer(
"footer.html");
2316 out <<
"<div id=\"indxModules\"><h4>Modules</h4>" << std::endl;
2322 if (!module->GetName() || strchr(module->GetName(),
'/'))
2324 if (module->IsSelected()) {
2327 out <<
"<a href=\"" <<
name <<
"_Index.html\">" 2328 <<
name <<
"</a>" << std::endl;
2331 out<<
"</div><br />" << std::endl;
2343 out <<
"<div id=\"linenums\">";
2344 for (
Long_t i = 0; i < nLines; ++i) {
2346 out <<
"<div class=\"ln\"> <span class=\"lnfile\">" << infileBase
2347 <<
":</span><a name=\"" << i + 1 <<
"\" href=\"#" << i + 1
2348 <<
"\" class=\"ln\">" << i + 1 <<
"</a></div>";
2350 out <<
"</div>" << std::endl;
2362 out <<
"<div id=\"indxModules\"><h4>" << superName <<
" Modules</h4>" << std::endl;
2368 if (module->IsSelected()) {
2374 if (posSlash !=
kNPOS)
2375 name.Remove(0, posSlash + 1);
2376 out <<
"<a href=\"" << link <<
"_Index.html\">" <<
name <<
"</a>" << std::endl;
2379 out<<
"</div><br />" << std::endl;
2396 if (searchCmd.
Length()) {
2397 TUrl url(searchCmd);
2399 if (serverName.Length()) {
2400 serverName.
Prepend(
" title=\"");
2401 serverName +=
"\" ";
2404 out <<
"<script type=\"text/javascript\">" << std::endl
2405 <<
"function onSearch() {" << std::endl
2406 <<
"var s='" << searchCmd <<
"';" << std::endl
2407 <<
"var ref=String(document.location.href).replace(/https?:\\/\\//,'').replace(/\\/[^\\/]*$/,'').replace(/\\//g,'%2F');" << std::endl
2408 <<
"window.location.href=s.replace(/%u/ig,ref).replace(/%s/ig,escape(document.searchform.t.value));" << std::endl
2409 <<
"return false;}" << std::endl
2410 <<
"</script>" << std::endl
2411 <<
"<form id=\"searchform\" name=\"searchform\" onsubmit=\"return onSearch()\" action=\"javascript:onSearch();\" method=\"post\">" << std::endl
2412 <<
"<input name=\"t\" size=\"30\" value=\"Search documentation...\" onfocus=\"if (document.searchform.t.value=='Search documentation...') document.searchform.t.value='';\"></input>" << std::endl
2413 <<
"<a id=\"searchlink\" " << serverName <<
" href=\"javascript:onSearch();\" onclick=\"return onSearch()\">Search</a></form>" << std::endl;
2414 }
else if (searchEngine.
Length())
2416 out <<
"<a class=\"descrheadentry\" href=\"" << searchEngine
2417 <<
"\">Search the Class Reference Guide</a>" << std::endl;
2426 out <<
"<div class=\"location\">" << std::endl;
2428 out <<
"<a class=\"locationlevel\" href=\"index.html\">" << productName <<
"</a>" << std::endl;
2436 while (modulename.Tokenize(modulePart, pos,
"/")) {
2437 if (pos ==
kNPOS && !classname)
2440 if (modulePath.
Length()) modulePath +=
"_";
2441 modulePath += modulePart;
2442 out <<
" » <a class=\"locationlevel\" href=\"./" << modulePath <<
"_Index.html\">" << modulePart <<
"</a>" << std::endl;
2447 if (classname) entityName = classname;
2449 entityName = module->
GetName();
2451 if (posSlash !=
kNPOS)
2452 entityName.
Remove(0, posSlash + 1);
2455 if (entityName.
Length()) {
2456 out <<
" » <a class=\"locationlevel\" href=\"#TopOfPage\">";
2458 out <<
"</a>" << std::endl;
2460 out <<
"</div>" << std::endl;
2472 out <<
"<div id=\"toplinks\">" << std::endl;
2474 out <<
"<div class=\"descrhead\"><div class=\"descrheadcontent\">" << std::endl
2475 <<
"<span class=\"descrtitle\">Quick Links:</span>" << std::endl;
2482 }
else if (!strcmp(productName,
"ROOT")) {
2485 if (userHomePage && *userHomePage)
2486 out <<
"<a class=\"descrheadentry\" href=\"" << userHomePage <<
"\">" << productName <<
"</a>" << std::endl;
2487 out <<
"<a class=\"descrheadentry\" href=\"http://root.cern.ch\">ROOT Homepage</a>" << std::endl
2488 <<
"<a class=\"descrheadentry\" href=\"./ClassIndex.html\">Class Index</a>" << std::endl
2489 <<
"<a class=\"descrheadentry\" href=\"./ClassHierarchy.html\">Class Hierarchy</a></div>" << std::endl;
2491 out <<
"</div>" << std::endl;
2494 out <<
"</div>" << std::endl;
A zero length substring is legal.
Short_t GetImplFileLine() const
const TString & GetCharset() const
virtual const char * BaseName(const char *pathname)
Base name of a file name. Base name of /user/root is root.
virtual 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.
virtual bool GetDocDir(const TString &module, TString &doc_dir) const
Determine the module's documentation directory.
virtual Bool_t ProcessEvents()
Process pending events (GUI, timers, sockets).
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
void WriteLineNumbers(std::ostream &out, Long_t nLines, const TString &infileBase) const
Create a div containing the line numbers (for a source listing) 1 to nLines.
virtual bool GetImplFileName(TClass *cl, Bool_t filesys, TString &out_name) const
Return implementation file name.
virtual void CreateProductIndex()
Fetch documentation from THtml::GetProductDocDir() and put it into the product index page...
Bool_t HaveDot()
Check whether dot is available in $PATH or in the directory set by SetDotPath()
virtual void CreateTypeIndex()
Create index of all data types.
void CreateClassHierarchy(std::ostream &out, const char *docFileName)
Create the hierarchical class list part for the current class's base classes.
const char * GetFullTypeName() const
Get full type description of data member, e,g.: "class TDirectory*".
All ROOT classes may have RTTI (run time type identification) support added.
This class represents a WWW compatible URL.
TString & ReplaceAll(const TString &s1, const TString &s2)
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.
std::istream & ReadLine(std::istream &str, Bool_t skipWhite=kTRUE)
Read a line from stream upto newline skipping any whitespace.
void AddDependency(const std::string &lib)
const TString & GetDotDir() const
Bool_t IsSelected() const
void ToUpper()
Change string to upper case.
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
const TString & GetProductName() const
const char * GetSharedLibs()
Get the list of shared libraries containing the code for class cls.
Bool_t cd(const char *path)
virtual void CreateModuleIndex()
Create the class index for each module, picking up documentation from the module's TModuleDocInfo::Ge...
virtual Bool_t ReferenceIsRelative(const char *reference) const
Check whether reference is a relative reference, and can (or should) be prependen by relative paths...
virtual const char * DirName(const char *pathname)
Return the directory name in pathname.
virtual TTimer * RemoveTimer(TTimer *t)
Remove timer from list of system timers.
void ProcessDocInDir(std::ostream &out, const char *indir, const char *outdir, const char *linkdir)
Write links to files indir/*.txt, indir/*.html (non-recursive) to out.
Bool_t CopyHtmlFile(const char *sourceName, const char *destName="")
Copy file to HTML directory.
std::set< std::string > & GetDependencies()
TString & Prepend(const char *cs)
virtual TSeqCollection * GetListOfTimers() const
void WriteModuleLinks(std::ostream &out)
Create a div containing links to all topmost modules.
TString & Insert(Ssiz_t pos, const char *s)
const char * GetCounter() const
virtual void DecorateEntityBegin(TString &str, Ssiz_t &pos, TDocParser::EParseContext type)
Add some colors etc to a source entity, contained in str.
Bool_t R_ISREG(Int_t mode)
virtual int mkdir(const char *name, Bool_t recursive=kFALSE)
Make a file system directory.
const TList * GetListOfClasses() const
virtual TObject * FindObject(const char *name) const
Find an object in this list using its name.
TString & Replace(Ssiz_t pos, Ssiz_t n, const char *s)
virtual void Sort(Bool_t order=kSortAscending)
Sort linked list.
virtual void SaveAs(const char *filename="", Option_t *option="") const =0
Save this object in the file specified by filename.
virtual void DecorateEntityEnd(TString &str, Ssiz_t &pos, TDocParser::EParseContext type)
Add some colors etc to a source entity, contained in str.
const char * GetHost() const
virtual const char * GetDirEntry(void *dirp)
Get a directory entry. Returns 0 if no more entries.
virtual int Unlink(const char *name)
Unlink, i.e. remove, a file.
Bool_t HaveSource() const
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString...
virtual const char * GetEtcDir() const
Get the directory containing THtml's auxiliary files ($ROOTSYS/etc/html)
std::set< std::string > & GetModules()
virtual void CreateAuxiliaryFiles() const
copy CSS, javascript file, etc to the output dir
TList * GetLibraryDependencies()
virtual void CreateHierarchy()
Create a hierarchical class list The algorithm descends from the base classes and branches into all d...
static int CaseInsensitiveSort(const void *name1, const void *name2)
Friend function for sorting strings, case insensitive.
Long_t GetLineNumber() const
void Convert(std::ostream &out, std::istream &in, const char *relpath, Bool_t isCode, Bool_t interpretDirectives)
Parse text file "in", add links etc, and write output to "out".
const TString & GetFooter() const
virtual const char * PrependPathName(const char *dir, TString &name)
Concatenate a directory and a file name.
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
Return true if string ends with the specified string.
std::vector< std::vector< double > > Data
Ssiz_t First(char c) const
Find first occurrence of a character c.
void WriteHtmlFooter(std::ostream &out, const char *dir, const char *lastUpdate, const char *author, const char *copyright, const char *footer)
Write HTML footer.
const TString & GetHeader() const
void WriteLocation(std::ostream &out, TModuleDocInfo *module, const char *classname=0)
make a link to the description
TVirtualPad is an abstract base class for the Pad and Canvas classes.
virtual void GetModuleNameForClass(TString &module, TClass *cl) const
Return the module name for a given class.
TDictionary * GetClass() const
virtual void AdjustSourcePath(TString &line, const char *relpath="../")
adjust the path of links for source files, which are in src/, but need to point to relpath (usually "...
const TString & GetSearchEngine() const
TList & GetListOfTypedefs()
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 void ReferenceEntity(TSubString &str, TClass *entity, const char *comment=0)
Create a reference to a class documentation page.
virtual const char * GetName() const
Returns name of object.
R__EXTERN TSystem * gSystem
Basic data type descriptor (datatype information is obtained from CINT).
virtual const char * ReplaceSpecialChars(char c)
Replace ampersand, less-than and greater-than character, writing to out.
This class defines an abstract interface that must be implemented by all classes that contain diction...
static void AnchorFromLine(const TString &line, TString &anchor)
Create an anchor from the given line, by hashing it and convertig the hash into a custom base64 strin...
virtual void NameSpace2FileName(TString &name)
Replace "::" in name by "__" Replace "<", ">", " ", ",", "~", "=" in name by "_" Replace "A::X<A::Y>"...
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
static void update(gsl_integration_workspace *workspace, double a1, double b1, double area1, double error1, double a2, double b2, double area2, double error2)
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Long_t Property() const
Get property description word. For meaning of bits see EProperty.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void CreateClassTypeDefs()
Create a forwarding page for each typedef pointing to a class.
char * Form(const char *fmt,...)
const char * ShortType(const char *name) const
Get short type name, i.e. with default templates removed.
TSubString Strip(EStripType s=kTrailing, char c=' ') const
Return a substring of self stripped at beginning and/or end.
Handles synchronous and a-synchronous timer events.
const TString & GetOutputDir(Bool_t createDir=kTRUE) const
Return the output directory as set by SetOutputDir().
The ROOT global object gROOT contains a list of all defined classes.
virtual Int_t Exec(const char *shellcmd)
Execute a command.
virtual bool GetDeclFileName(TClass *cl, Bool_t filesys, TString &out_name) const
Return declaration file name; return the full path if filesys is true.
virtual void WriteSearch(std::ostream &out)
Write a search link or a search box, based on THtml::GetSearchStemURL() and THtml::GetSearchEngine()...
virtual void FreeDirectory(void *dirp)
Free a directory.
void WriteHtmlHeader(std::ostream &out, const char *titleNoSpecial, const char *dir, TClass *cls, const char *header)
Write HTML header.
virtual Bool_t IsModified(TClass *classPtr, EFileType type)
Check if file is modified.
const char * GetHtmlFileName() const
char * StrDup(const char *str)
Duplicate the string str.
virtual void FixupAuthorSourceInfo(TString &authors)
Special author treatment; called when TDocParser::fSourceInfo[kInfoAuthor] is set.
TString & Remove(Ssiz_t pos)
const char * GetCounterFormat() const
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
virtual Bool_t IsEmpty() const
void Convert(std::istream &in, const char *infilename, const char *outfilename, const char *title, const char *relpath="../", Int_t includeOutput=0, const char *context="", TGClient *gclient=0)
Convert a text file into a html file.
void AddLink(TSubString &str, TString &link, const char *comment)
Add a link around str, with title comment.
Ssiz_t Last(char c) const
Find last occurrence of a character c.
virtual void DecorateKeywords(std::ostream &out, const char *text)
Expand keywords in text, writing to out.
const char * AsString() const
Return the date & time as a string (ctime() format).
#define R__LOCKGUARD(mutex)
void AddModule(const std::string &module)
virtual void CreateClassIndex()
Create index of all classes.
virtual void GetHtmlFileName(TClass *classPtr, TString &filename) const
Return real HTML filename.
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.
const TString & GetHomepage() const
void SetFoundDot(Bool_t found=kTRUE)
Set whether "dot" (a GraphViz utility) is available.
Int_t Match(const TString &s, UInt_t start=0)
Runs a match on s against the regex 'this' was created with.
Mother of all ROOT objects.
void WriteTopLinks(std::ostream &out, TModuleDocInfo *module, const char *classname=0, Bool_t withLocation=kTRUE)
Write the first part of the links shown ontop of each doc page; one <div> has to be closed by caller ...
const char * GetFullTypeName() const
Get full type description of typedef, e,g.: "class TDirectory*".
virtual void Add(TObject *obj)
Bool_t RunDot(const char *filename, std::ostream *outMap=0, EGraphvizTool gvwhat=kDot)
Run filename".dot", creating filename".png", and - if outMap is !=0, filename".map", which gets then included literally into outMap.
Wrapper for PCRE library (Perl Compatible Regular Expressions).
Each ROOT class (see TClass) has a linked list of methods.
const TString & GetSearchStemURL() const
TClass * GetClass() const
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.
Int_t CountChar(Int_t c) const
Return number of times character c occurs in the string.
Int_t Atoi() const
Return integer value of string.
const TList * GetListOfModules() const
virtual Int_t GetSize() const
const TPathDefinition & GetPathDefinition() const
Return the TModuleDefinition (or derived) object as set by SetModuleDefinition(); create and return a...
TClass * GetClass() const
TList * GetListOfMethods(Bool_t load=kTRUE)
Return list containing the TMethods of a class.
const TString & GetXwho() const
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual const char * GetTitle() const
Returns title of object.
This class stores the date and time with a precision of one second in an unsigned 32 bit word (950130...
const char * Data() const