/*****************************************************************************
* Project: RooFit *
* Package: RooFitCore *
* File: $Id: RooHtml.cc,v 1.18 2005/06/20 15:44:53 wverkerke Exp $
* Authors: *
* WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu *
* DK, David Kirkby, UC Irvine, dkirkby@uci.edu *
* *
* Copyright (c) 2000-2005, Regents of the University of California *
* and Stanford University. All rights reserved. *
* *
* Redistribution and use in source and binary forms, *
* with or without modification, are permitted according to the terms *
* listed in LICENSE (http://roofit.sourceforge.net/license.txt) *
*****************************************************************************/
// -- CLASS DESCRIPTION [MISC] --
#include "RooFit.h"
#include "RooHtml.h"
#include "RooHtml.h"
#include "TDatime.h"
#include "TClassTable.h"
#include "TRegexp.h"
#include "TClass.h"
#include "TSystem.h"
#include "TObjString.h"
#include <ctype.h>
#include "Riostream.h"
#include <fstream>
#include <string.h>
#ifndef _WIN32
#include <strings.h>
#endif
#if (__GNUC__==3&&__GNUC_MINOR__==2&&__GNUC_PATCHLEVEL__==3)
char* operator+( streampos&, char* );
#endif
const Int_t kSpaceNum = 1;
const char *formatStr = "%12s %5s %s";
ClassImp(RooHtml)
;
void RooHtml::WriteHtmlHeader(ofstream &out, const char *title, TClass* /*cls*/) {
// Write a custom html header for RooFit class documentation to the specified output stream.
out
<< "<!doctype html public \"-//dtd html 4.0 transitional// en\">" << endl
<< "<html>" << endl
<< "<head>" << endl
<< " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">" << endl
<< " <meta name=\"Author\" content=\"David Kirkby & Wouter Verkerke\">" << endl
<< " <meta name=\"GENERATOR\" content=\"RooHtml Class in ROOT Environment\">" << endl
<< " <title>";
ReplaceSpecialChars(out, title);
out
<< "</title>" << endl
<< " <meta name=\"rating\" content=\"General\">" << endl
<< " <meta name=\"objecttype\" content=\"Manual\">" << endl
<< " <meta name=\"keywords\" content=\"software development, oo, object oriented, "
<< " unix, x11, windows, c++, html, rene brun, fons rademakers, david kirkby, wouter verkerke\">" << endl
<< " <meta name=\"description\" content=\"RooFit - A Toolkit for Physics Data Modeling.\">" << endl
<< "</head>" << endl
<< "<body text=\"#000000\" bgcolor=\"#FFFFFF\" link=\"#0000FF\" vlink=\"#FF0000\" alink=\"#000088\">"
<< endl
<< "<a name=\"TopOfPage\"></a>" << endl;
out
<< "<center><table BORDER=0 CELLSPACING=0 COLS=2 WIDTH=\"100%\" BGCOLOR=\"" << _hfColor << "\" NOSAVE >" << endl
<< " <tr NOSAVE><td NOSAVE><b><i><font color=\"#000000\">" << endl
//-------------------------------------------------
<< " <a href=\"http://roofit.sourceforge.net\"" << endl
<< " title=\"Visit RooFit Home Page\">" << endl
<< " RooFit Toolkit for Data Modeling</a>" << endl
//-------------------------------------------------
<< " </font></i></b></td>" << endl
<< " <td><div align=right><b><i><font color=\"#000000\">" << endl
//-------------------------------------------------
<< " <a href=\"IndexByTopic.html\"" << endl
<< " title=\"Visit List of Classes\">" << endl;
out << getVersion() << " Version</a>" << endl;
//-------------------------------------------------
out
<< " </font></i></b></div></td></tr>" << endl
<< "</table></center>" << endl;
}
void RooHtml::WriteHtmlFooter(ofstream &out, const char * /*dir*/, const char *lastUpdate,
const char * /*author*/, const char * /*copyright*/) {
// Write a custom html footer for RooFit class documentation to the specified output stream.
// lastUpdate will be the CVS tag in case of .rdl and .cc files: clean it up a bit
// Matthew D. Langston <langston@SLAC.Stanford.EDU>
// There is no index function in Windows (nor is there a strings.h).
#ifndef _WIN32
const char *comma= index(lastUpdate,',');
TString update = comma ? comma+1 : lastUpdate;
#else
TString update = lastUpdate;
#endif
if(update.EndsWith(" Exp $")) update.Remove(update.Length()-6,6);
out << "<center><table BORDER=0 CELLSPACING=0 COLS=2 WIDTH=\"100%\" BGCOLOR=\"" << _hfColor << "\" NOSAVE >" << endl
<< "<tr NOSAVE>" << endl
<< "<td>Last CVS Update: " << update << "</td>" << endl
<< "<td NOSAVE align=right><b><a href=\"#TopOfPage\">Top</a></b></td>" << endl
<< "</tr></table></center>" << endl
<< "<center>Copyright © 2000-2005 University of California, Stanford University</center>" << endl
<< "</body>" << endl ;
}
void RooHtml::MakeIndexNew(const char *filter)
{
// WVE modified clone of THtml::MakeIndex that subclasses index files
// based on tag in 'CLASS DESCRIPTION' instead of source file subdirectory
// It makes an index files
// by default makes an index of all classes (if filter="*")
// To generate an index for all classes starting with "XX", do
// html.MakeIndex("XX*");
CreateListOfTypes();
// get total number of classes
Int_t numberOfClasses = gClassTable->Classes();
// allocate memory
const char **classNames = new const char *[numberOfClasses];
char **fileNames = new char *[numberOfClasses];
// start from begining
gClassTable->Init();
// get class names
Int_t len = 0;
Int_t maxLen = 0;
Int_t numberOfImpFiles = 0;
TString reg = filter;
TRegexp re(reg, kTRUE);
Int_t nOK = 0;
for( Int_t i = 0; i < numberOfClasses; i++ ) {
// get class name
const char *cname = gClassTable->Next();
TString s = cname;
if (s.Index(re) == kNPOS) continue;
classNames[nOK] = cname;
len = strlen( classNames[nOK] );
maxLen = maxLen > len ? maxLen : len;
// get class & filename
TClass *classPtr = GetClass( (const char * ) classNames[nOK] );
const char *impname = classPtr->GetImplFileName();
if( impname ) {
fileNames[numberOfImpFiles] = StrDup( impname, 64 );
char *underline = strchr( fileNames[numberOfImpFiles], '_');
if( underline )
strcpy( underline + 1, classNames[nOK] );
else {
// WVE modified to use getClassGroup instead of subdir to determine index file
char* srcdir = getClassGroup(fileNames[numberOfImpFiles]) ;
strcpy( fileNames[nOK], srcdir);
strcat( fileNames[nOK], "_" );
strcat( fileNames[nOK], classNames[nOK] );
}
numberOfImpFiles++;
}
else cout << "WARNING class:" << classNames[i] << " has no implementation file name !" << endl;
nOK++;
}
maxLen += kSpaceNum;
// quick sort
SortNames( classNames, nOK );
SortNames( (const char ** ) fileNames, numberOfImpFiles );
// create an index
CreateIndex( classNames, nOK);
CreateIndexByTopic( fileNames, nOK, maxLen );
// free allocated memory
delete [] classNames;
delete [] fileNames;
}
char* RooHtml::getClassGroup(const char* fileName)
{
// Scan file for 'CLASS DESCRIPTION [<tag>]' sequence
// If found, return <tag>, otherwise return "USER"
// Initialize buffer to default group name
static char buffer[1024] = "" ;
strcpy(buffer,"USER") ;
const char* fullName = gSystem->Which(fSourceDir, fileName, kReadPermission) ;
if (!fullName) {
return buffer ;
}
// Scan file contents
ifstream ifs(fullName) ;
char line[1024] ;
while(ifs.good()) {
ifs.getline(line,sizeof(line),'\n') ;
// Find magic word
char *ptr ;
if ((ptr = strstr(line,"CLASS DESCRIPTION"))) {
char* start = strchr(ptr,'[') ;
if (start) {
// Must have closing bracket to proceed
if (!strchr(start,']')) break ;
// Extract keyword between square brackets
char* group = strtok(start+1,"]") ;
// Group name must be non-empty
if (group && strlen(group)) strcpy(buffer,group) ;
}
break ;
}
}
return buffer ;
}
void RooHtml::addTopic(const char* tag, const char* description)
{
_topicTagList.Add(new TObjString(tag)) ;
_topicDescList.Add(new TObjString(description)) ;
}
void RooHtml::MakeIndexOfTopics()
{
TString idxFileName(fOutputDir) ;
idxFileName.Append("/") ;
idxFileName.Append("IndexByTopic.html") ;
ofstream ofs(idxFileName) ;
WriteHtmlHeader(ofs,"RooFit Index by Topic") ;
TIterator* tagIter = _topicTagList.MakeIterator() ;
TIterator* descIter = _topicDescList.MakeIterator() ;
TObjString* tag ;
TObjString* desc ;
ofs << "<H2>" << endl << "<UL>" << endl ;
while((tag=(TObjString*)tagIter->Next())) {
desc=(TObjString*)descIter->Next() ;
ofs << "<LI> <A HREF=" << tag->String() << "_Index.html>" << desc->String() << "</A>" << endl ;
}
ofs << "</UL>" << endl << "</H2>" << endl ;
TDatime now;
WriteHtmlFooter(ofs,"",now.AsString()) ;
delete tagIter ;
delete descIter ;
}
ROOT page - Class index - Class Hierarchy - Top of the page
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.