82 void FilterTutorial();
85 string ImagesList(
string&);
87 void ExecuteCommand(
string);
88 void ReplaceAll(
string&,
const string&,
const string&);
89 string StringFormat(
const string fmt_str, ...);
90 bool EndsWith(
string const &,
string const &);
91 bool BeginsWith(
const string&,
const string&);
119 int main(
int argc,
char *argv[])
126 gImageSource =
false;
130 gOutputName =
"stdout.dat";
133 if (EndsWith(gFileName,
".cxx")) gSource =
true;
134 if (EndsWith(gFileName,
".h")) gHeader =
true;
135 if (EndsWith(gFileName,
".py")) gPython =
true;
139 int last = gFileName.rfind(
"/");
140 gCwd = gFileName.substr(0,last);
143 gOutDir = getenv(
"DOXYGEN_OUTPUT_DIRECTORY");
144 ReplaceAll(gOutDir,
"\"",
"");
147 gSourceDir = getenv(
"DOXYGEN_SOURCE_DIRECTORY");
148 ReplaceAll(gSourceDir,
"\"",
"");
151 f = fopen(gFileName.c_str(),
"r");
153 if (gFileName.find(
"tutorials") != string::npos) FilterTutorial();
167 while (fgets(gLine,255,f)) {
169 printf(
"%s",gLineString.c_str());
178 while (fgets(gLine,255,f)) {
181 if (gInMacro && gLineString.find(
"End_Macro") != string::npos) {
182 gImageSource =
false;
188 ExecuteCommand(StringFormat(
"root -l -b -q \"makeimage.C(\\\"%s\\\",\\\"%s\\\",\\\"%s\\\",true,false)\""
189 , StringFormat(
"%s_%3.3d.C", gClassName.c_str(), gMacroID).c_str()
190 , StringFormat(
"%s_%3.3d.%s", gClassName.c_str(), gImageID, gImageType.c_str()).c_str()
192 ExecuteCommand(StringFormat(
"rm %s_%3.3d.C", gClassName.c_str(), gMacroID));
195 FILE *f = fopen(
"ImagesSizes.dat",
"r");
196 fscanf(f,
"%d", &ImageSize);
198 remove(
"ImagesSizes.dat");
199 ReplaceAll(gImageWidth,
"IMAGESIZE",StringFormat(
"%d",ImageSize));
200 ReplaceAll(gLineString,
"End_Macro", StringFormat(
"\\image html pict1_%s_%3.3d.%s %s", gClassName.c_str(), gImageID, gImageType.c_str(), gImageWidth.c_str()));
201 ReplaceAll(gLineString,
"///",
"");
205 if (spos) gLineString = gLineString.substr(spos);
207 if (EndsWith(gLineString,
".C\n") || (gLineString.find(
".C(") != string::npos)) {
212 m = fopen(StringFormat(
"%s_%3.3d.C", gClassName.c_str(), gMacroID).c_str(),
"w");
213 if (
m) fprintf(
m,
"%s",gLineString.c_str());
214 if (BeginsWith(gLineString,
"{")) {
216 ReplaceAll(gLineString,
"{"
217 , StringFormat(
"\\include %s_%3.3d.C"
227 if (
m) fprintf(
m,
"%s",gLineString.c_str());
228 if (BeginsWith(gLineString,
"}")) {
229 ReplaceAll(gLineString,
"}",
"");
237 if (gLineString.find(
"Begin_Macro") != string::npos &&
238 gLineString.find(
"End_Macro") == string::npos) {
239 if (BeginsWith(gLineString,
"///")) {
240 spos = gLineString.find_first_not_of(
' ', 3);
242 if (gLineString.find(
"source") != string::npos) gImageSource =
true;
243 if (gLineString.find(
"png") != string::npos) {
245 }
else if (gLineString.find(
"svg") != string::npos) {
251 int wpos1 = gLineString.find(
"\"width=");
252 if (wpos1 != string::npos) {
253 int wpos2 = gLineString.find_first_of(
"\"", wpos1+1);
254 gImageWidth = gLineString.substr(wpos1+1, wpos2-wpos1-1);
256 gImageWidth =
"width=IMAGESIZE";
263 size_t l = gLineString.length();
266 size_t e = gLineString.find(
'\n',
b);
267 if (e != string::npos) e++;
268 if (spos) printf(
"%-*s%s", (
int)spos,
"///",
269 gLineString.substr(
b, e -
b).c_str());
270 else printf(
"%s", gLineString.substr(
b, e -
b).c_str());
279 while (fgets(gLine,255,f)) {
281 printf(
"%s",gLineString.c_str());
289 void FilterTutorial()
294 int showTutSource = 0;
298 int i1 = gFileName.rfind(
'/')+1;
301 i2 = gFileName.rfind(
'y');
303 i2 = gFileName.rfind(
'C');
305 gMacroName = gFileName.substr(i1,i2-i1+1);
306 gImageName = StringFormat(
"%s.%s", gMacroName.c_str(), gImageType.c_str());
307 gOutputName = StringFormat(
"%s.out", gMacroName.c_str());
310 while (fgets(gLine,255,f)) {
314 if (gLineString.find(
"\\macro_image") != string::npos) {
315 bool nobatch = (gLineString.find(
"(nobatch)") != string::npos);
316 ReplaceAll(gLineString,
"(nobatch)",
"");
319 ExecuteCommand(StringFormat(
"./makeimage.py %s %s %s 0 1 0",
320 gFileName.c_str(), gImageName.c_str(), gOutDir.c_str()));
322 ExecuteCommand(StringFormat(
"./makeimage.py %s %s %s 0 1 1",
323 gFileName.c_str(), gImageName.c_str(), gOutDir.c_str()));
327 ExecuteCommand(StringFormat(
"root -l -q \"makeimage.C(\\\"%s\\\",\\\"%s\\\",\\\"%s\\\",false,false)\"",
328 gFileName.c_str(), gImageName.c_str(), gOutDir.c_str()));
330 ExecuteCommand(StringFormat(
"root -l -b -q \"makeimage.C(\\\"%s\\\",\\\"%s\\\",\\\"%s\\\",false,false)\"",
331 gFileName.c_str(), gImageName.c_str(), gOutDir.c_str()));
334 ReplaceAll(gLineString,
"\\macro_image", ImagesList(gImageName));
335 remove(gOutputName.c_str());
339 if (gLineString.find(
"\\macro_code") != string::npos) {
341 m = fopen(StringFormat(
"%s/macros/%s",gOutDir.c_str(),gMacroName.c_str()).c_str(),
"w");
342 ReplaceAll(gLineString,
"\\macro_code", StringFormat(
"\\include %s",gMacroName.c_str()));
346 if (gLineString.find(
"\\notebook") != string::npos) {
347 ExecuteCommand(StringFormat(
"python converttonotebook.py %s %s/notebooks/",
348 gFileName.c_str(), gOutDir.c_str()));
354 gLineString =
"/// ";
356 gLineString += StringFormat(
"\\htmlonly <a href=\"http://nbviewer.jupyter.org/url/root.cern.ch/doc/master/notebooks/%s.nbconvert.ipynb\" target=\"_blank\"><img src= notebook.gif alt=\"View in nbviewer\" style=\"height:1em\" ></a> <a href=\"https://cern.ch/swanserver/cgi-bin/go?projurl=https://root.cern.ch/doc/master/notebooks/%s.nbconvert.ipynb\" target=\"_blank\"><img src=\"http://swanserver.web.cern.ch/swanserver/images/badge_swan_white_150.png\" alt=\"Open in SWAN\" style=\"height:1em\" ></a> \\endhtmlonly \n", gMacroName.c_str() , gMacroName.c_str());
360 if (gLineString.find(
"\\macro_output") != string::npos) {
361 if (!gPython) ExecuteCommand(StringFormat(
"root -l -b -q %s", gFileName.c_str()).c_str());
362 else ExecuteCommand(StringFormat(
"python %s", gFileName.c_str()).c_str());
363 rename(gOutputName.c_str(), StringFormat(
"%s/macros/%s",gOutDir.c_str(), gOutputName.c_str()).c_str());
364 ReplaceAll(gLineString,
"\\macro_output", StringFormat(
"\\include %s",gOutputName.c_str()));
368 if (gLineString.find(
"\\author") != string::npos) {
369 if (gPython) printf(
"%s",StringFormat(
"%s \n## \\cond \n",gLineString.c_str()).c_str());
370 else printf(
"%s",StringFormat(
"%s \n/// \\cond \n",gLineString.c_str()).c_str());
371 if (showTutSource == 1) showTutSource = 2;
374 printf(
"%s",gLineString.c_str());
375 if (
m && showTutSource == 2) fprintf(
m,
"%s",gLineString.c_str());
380 if (gPython) printf(
"## \\endcond \n");
381 else printf(
"/// \\endcond \n");
399 i1 = gFileName.find_last_of(
"/")+1;
400 i2 = gFileName.find(
".h")-1;
401 gClassName = gFileName.substr(i1,i2-i1+1);
406 i1 = gFileName.find_last_of(
"/")+1;
407 i2 = gFileName.find(
".cxx")-1;
408 gClassName = gFileName.substr(i1,i2-i1+1);
420 gImageName = StringFormat(
"%s_%3.3d.%s", gClassName.c_str(), gImageID, gImageType.c_str());
423 if (gLineString.find(
"../../..") != string::npos) {
424 ReplaceAll(gLineString,
"../../..", gSourceDir.c_str());
426 gLineString.insert(0, StringFormat(
"%s/../doc/macros/",gCwd.c_str()));
428 int i1 = gLineString.rfind(
'/')+1;
429 int i2 = gLineString.rfind(
'C');
430 gMacroName = gLineString.substr(i1,i2-i1+1);
433 gLineString.insert(0, StringFormat(
"root -l -b -q \"makeimage.C(\\\""));
434 size_t l = gLineString.length();
435 gLineString.replace(
l-1,1,StringFormat(
"\\\",\\\"%s\\\",\\\"%s\\\",true,false)\"", gImageName.c_str(), gOutDir.c_str()));
438 ExecuteCommand(gLineString);
441 if (gImageSource) gLineString = StringFormat(
"\\include %s\n", gMacroName.c_str());
442 else gLineString =
"";
448 void ExecuteCommand(
string command)
450 int o = dup(fileno(stdout));
451 freopen(gOutputName.c_str(),
"a",stdout);
452 system(command.c_str());
453 dup2(
o,fileno(stdout));
463 FILE *f = fopen(
"NumberOfImages.dat",
"r");
464 fscanf(f,
"%d", &ImageNum);
466 remove(
"NumberOfImages.dat");
473 void ReplaceAll(
string& str,
const string& from,
const string& to) {
474 if (from.empty())
return;
476 wsRet.reserve(str.length());
477 size_t start_pos = 0, pos;
478 while ((pos = str.find(from, start_pos)) != string::npos) {
479 wsRet += str.substr(start_pos, pos - start_pos);
481 pos += from.length();
484 wsRet += str.substr(start_pos);
491 string StringFormat(
const string fmt_str, ...) {
492 int final_n,
n = ((int)fmt_str.size()) * 2;
494 unique_ptr<char[]> formatted;
497 formatted.reset(
new char[
n]);
498 strcpy(&formatted[0], fmt_str.c_str());
499 va_start(ap, fmt_str);
500 final_n = vsnprintf(&formatted[0],
n, fmt_str.c_str(), ap);
502 if (final_n < 0 || final_n >=
n)
n += abs(final_n -
n + 1);
505 return string(formatted.get());
511 string ImagesList(
string&
name) {
513 int N = NumberOfImages();
519 FILE *f = fopen(
"ImagesSizes.dat",
"r");
521 for (
int i = 1; i <= N; i++){
522 fscanf(f,
"%d", &ImageSize);
523 if (i>1)
sprintf(&val[len],
" \n/// \\image html pict%d_%s width=%d",i,
name.c_str(),ImageSize);
524 else sprintf(&val[len],
"\\image html pict%d_%s width=%d",i,
name.c_str(),ImageSize);
525 len = (int)strlen(val);
529 remove(
"ImagesSizes.dat");
537 bool EndsWith(
string const &fullString,
string const &ending) {
538 if (fullString.length() >= ending.length()) {
539 return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending));
548 bool BeginsWith(
const string& haystack,
const string& needle) {
549 return needle.length() <= haystack.length() && equal(needle.begin(), needle.end(), haystack.begin());
sprintf(tag,"wave_%s", data_label)