0024269: Content of occt documentation should be formated
[occt.git] / dox / occdoc.tcl
1 # -----------------------------------------------------------------------
2 #  Script name: CompileDocs.tcl
3 #  This script compiles OCCT documents from *.md files to HTML pages
4 #  Author: omy
5 # -----------------------------------------------------------------------
6
7 # Generates Doxygen configuration file for Overview documentation
8 proc OverviewDoc_MakeDoxyfile {casDir outDir tagFileDir {doxyFileName} {generatorMode ""} DocFilesList verboseMode} {
9
10     if {$verboseMode == "YES"} {
11         puts "INFO: Doxygen is now generating Doxyfile..."
12     }
13
14     set doxyFile [open $doxyFileName "w"]
15     set casroot  $casDir
16     set inputDir $casDir/dox
17
18     # Common configs
19     puts $doxyFile "DOXYFILE_ENCODING      = UTF-8"
20     puts $doxyFile "PROJECT_NAME           = \"Open CASCADE Technology\""
21     puts $doxyFile "PROJECT_NUMBER         = 6.6.0"
22     puts $doxyFile "PROJECT_BRIEF          = "
23     puts $doxyFile "PROJECT_LOGO           = $inputDir/resources/occt_logo.png"
24
25     puts $doxyFile "OUTPUT_DIRECTORY       = $outDir"
26     puts $doxyFile "CREATE_SUBDIRS         = NO"
27     puts $doxyFile "OUTPUT_LANGUAGE        = English"
28     puts $doxyFile "ABBREVIATE_BRIEF       = \"The \$name class\" \
29                                              \"The \$name widget\" \
30                                              \"The \$name file\" \
31                                              is \
32                                              provides \
33                                              specifies \
34                                              contains \
35                                              represents \
36                                              a \
37                                              an \
38                                              the"
39
40     puts $doxyFile "FULL_PATH_NAMES        = YES"
41     puts $doxyFile "INHERIT_DOCS           = YES"
42     puts $doxyFile "TAB_SIZE               = 4"
43     puts $doxyFile "MARKDOWN_SUPPORT       = YES"
44     puts $doxyFile "EXTRACT_ALL            = YES"
45     puts $doxyFile "CASE_SENSE_NAMES       = NO"
46     puts $doxyFile "INLINE_INFO            = YES"
47     puts $doxyFile "SORT_MEMBER_DOCS       = YES"
48     puts $doxyFile "WARNINGS               = YES"
49     puts $doxyFile "WARN_IF_UNDOCUMENTED   = YES"
50     puts $doxyFile "WARN_IF_DOC_ERROR      = YES"
51     puts $doxyFile "WARN_NO_PARAMDOC       = NO"
52     puts $doxyFile "WARN_FORMAT            = \"\$file:\$line: \$text\""
53     puts $doxyFile "INPUT_ENCODING         = UTF-8"
54     puts $doxyFile "FILE_PATTERNS          = *.md *.dox "
55     puts $doxyFile "RECURSIVE              = YES"
56     puts $doxyFile "SOURCE_BROWSER         = NO"
57     puts $doxyFile "INLINE_SOURCES         = YES"
58     puts $doxyFile "COLS_IN_ALPHA_INDEX    = 5"
59     
60     # Generation options
61     puts $doxyFile "GENERATE_DOCSET        = NO"
62     puts $doxyFile "GENERATE_HTMLHELP      = NO"
63     puts $doxyFile "GENERATE_CHI           = NO"
64     puts $doxyFile "GENERATE_QHP           = NO"
65     puts $doxyFile "GENERATE_ECLIPSEHELP   = NO"
66     puts $doxyFile "GENERATE_RTF           = NO"
67     puts $doxyFile "GENERATE_MAN           = NO"
68     puts $doxyFile "GENERATE_XML           = NO"
69     puts $doxyFile "GENERATE_DOCBOOK       = NO"
70     puts $doxyFile "GENERATE_AUTOGEN_DEF   = NO"
71     puts $doxyFile "GENERATE_PERLMOD       = NO"
72
73     set PARAM_INPUT "INPUT                  = "
74     set PARAM_IMAGEPATH "IMAGE_PATH         = $inputDir/resources/ "
75
76     foreach docFile $DocFilesList {
77         set NEW_IMG_PATH [file normalize [file dirname "$inputDir/$docFile"]]
78         if { [string compare $NEW_IMG_PATH $casroot] != 0 } {
79           if {[file isdirectory "$NEW_IMG_PATH/images"]} {
80             append PARAM_IMAGEPATH " " "$NEW_IMG_PATH/images"
81           }
82         }
83         append PARAM_INPUT " " $inputDir/$docFile
84     }
85     puts $doxyFile $PARAM_INPUT
86     puts $doxyFile $PARAM_IMAGEPATH
87     
88     if { $generatorMode == "PDF_ONLY"} {
89         set PARAM_LATEX_EF "LATEX_EXTRA_FILES      ="
90         foreach docFile $DocFilesList {
91             set NEW_LEF_PATH [file normalize [file dirname "$inputDir/$docFile"]]
92             if { [string compare $NEW_LEF_PATH $casroot] != 0 } {
93                 append PARAM_LATEX_EF " " "$NEW_LEF_PATH/images"
94             }
95         }
96         puts $doxyFile $PARAM_LATEX_EF
97     }
98
99     if { $generatorMode == "HTML_ONLY"} {
100         # Set a reference to a TAGFILE
101         if { $tagFileDir != "" } {
102             if {[file exists $tagFileDir/OCCT.tag] == 1} {
103                 set tagPath [OverviewDoc_GetRelPath $tagFileDir $outDir/html]
104                 puts $doxyFile "TAGFILES               = $tagFileDir/OCCT.tag=$tagPath/html"
105             }
106         }
107
108         # HTML Output
109         puts $doxyFile "GENERATE_LATEX         = NO"
110         puts $doxyFile "GENERATE_HTML          = YES"
111         puts $doxyFile "HTML_COLORSTYLE_HUE    = 220"
112         puts $doxyFile "HTML_COLORSTYLE_SAT    = 100"
113         puts $doxyFile "HTML_COLORSTYLE_GAMMA  = 80"
114         puts $doxyFile "HTML_TIMESTAMP         = YES"
115         puts $doxyFile "HTML_DYNAMIC_SECTIONS  = YES"
116         puts $doxyFile "HTML_INDEX_NUM_ENTRIES = 100"
117         puts $doxyFile "DISABLE_INDEX          = YES"
118         puts $doxyFile "GENERATE_TREEVIEW      = YES"
119         puts $doxyFile "ENUM_VALUES_PER_LINE   = 8"
120         puts $doxyFile "TREEVIEW_WIDTH         = 250"
121         puts $doxyFile "EXTERNAL_PAGES         = NO"
122         puts $doxyFile "SEARCHENGINE           = YES"
123         puts $doxyFile "SERVER_BASED_SEARCH    = NO"
124         puts $doxyFile "EXTERNAL_SEARCH        = NO"
125         puts $doxyFile "SEARCHDATA_FILE        = searchdata.xml"
126         puts $doxyFile "SKIP_FUNCTION_MACROS   = YES"
127         # Formula options
128         puts $doxyFile "FORMULA_FONTSIZE       = 12"
129         puts $doxyFile "FORMULA_TRANSPARENT    = YES"
130         puts $doxyFile "USE_MATHJAX            = YES"
131         puts $doxyFile "MATHJAX_FORMAT         = HTML-CSS"
132         puts $doxyFile "MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest"
133         
134     } elseif { $generatorMode == "PDF_ONLY"} {
135         
136         puts $doxyFile "GENERATE_HTML          = NO"
137         puts $doxyFile "DISABLE_INDEX          = YES"
138         puts $doxyFile "GENERATE_TREEVIEW      = NO"
139         puts $doxyFile "PREDEFINED             = PDF_ONLY"
140         puts $doxyFile "GENERATE_LATEX         = YES"
141         puts $doxyFile "COMPACT_LATEX          = YES"
142         puts $doxyFile "PDF_HYPERLINKS         = YES"
143         puts $doxyFile "USE_PDFLATEX           = YES"
144         puts $doxyFile "LATEX_BATCHMODE        = YES"
145         puts $doxyFile "LATEX_OUTPUT           = latex"
146         puts $doxyFile "LATEX_CMD_NAME         = latex"
147         puts $doxyFile "MAKEINDEX_CMD_NAME     = makeindex"
148     }
149
150     close $doxyFile 
151 }
152
153 # Returns the relative path between two directories
154 proc OverviewDoc_GetRelPath {targetFile currentpath} {
155   set cc [file split [file normalize $currentpath]]
156   set tt [file split [file normalize $targetFile]]
157   
158   if {![string equal [lindex $cc 0] [lindex $tt 0]]} {
159       # not on *n*x then
160       return -code error "$targetFile not on same volume as $currentpath"
161   }
162   while {[string equal [lindex $cc 0] [lindex $tt 0]] && [llength $cc] > 0} {
163       # discard matching components from the front
164       set cc [lreplace $cc 0 0]
165       set tt [lreplace $tt 0 0]
166   }
167   set prefix ""
168   if {[llength $cc] == 0} {
169       # just the file name, so targetFile is lower down (or in same place)
170       set prefix "."
171   }
172   # step up the tree
173   for {set i 0} {$i < [llength $cc]} {incr i} {
174       append prefix " .."
175   }
176   # stick it all together (the eval is to flatten the targetFile list)
177   return [eval file join $prefix $tt]
178 }
179
180 # Prints Help message
181 proc OverviewDoc_PrintHelpMessage {} {
182     puts "\nUsage : occdoc \[-h\] \[-html\] \[-pdf\] \[-m=<list of files>\] \[-l=<document name>\] \[-v\]"
183     puts ""
184     puts " Options are : "
185     puts "    -html                : To generate HTML files"
186     puts "                           (cannot be used with -pdf)"
187     puts "    -pdf                 : To generate PDF files"
188     puts "                           (cannot be used with -html)"
189     puts "    -m=<modules_list>    : Specifies list of documents to generate."
190     puts "                           If it is not specified, all files, "
191     puts "                           mentioned in FILES.txt are processed."
192     puts "    -l=<document_name>   : Specifies the document caption "
193     puts "                           for a single document"
194     puts "    -h                   : Prints help message"
195     puts "    -v                   : Specifies the Verbose mode"
196     puts "                           (info on all script actions is shown)"
197 }
198
199 # Parses command line arguments
200 proc OverviewDoc_ParseArguments {arguments} {
201     global args_names
202     global args_values
203     set args_names {}
204     array set args_values {}
205
206     foreach arg $arguments {
207         if {[regexp {^(-)[a-z]+$} $arg] == 1} {
208             set name [string range $arg 1 [string length $arg]-1]
209             lappend args_names $name
210             set args_values($name) "NULL"
211             continue
212         } elseif {[regexp {^(-)[a-z]+=.+$} $arg] == 1} {
213             set equal_symbol_position [string first "=" $arg]
214             set name [string range $arg 1 $equal_symbol_position-1]
215             lappend args_names $name
216             set value [string range $arg $equal_symbol_position+1 [string length $arguments]-1]
217             
218             # To parse a list of values for -m parameter
219             if { [string first "," $value] != -1 } {
220                 set value [split $value ","];
221             }
222             set args_values($name) $value
223         } else {
224             puts "Error in argument $arg"
225             return 1
226         }
227     }
228     return 0
229 }
230
231 # Loads a list of docfiles from file FILES.txt
232 proc OverviewDoc_LoadFilesList {} {
233
234     set INPUTDIR [file normalize [file dirname [info script]]]
235     
236     global available_docfiles
237     set available_docfiles {}
238
239     # Read data from file
240     if { [file exists "$INPUTDIR/FILES.txt"] == 1 } {
241         set FILE [open "$INPUTDIR/FILES.txt" r]
242         while {1} {
243             set line [gets $FILE]
244             if {$line != ""} {
245               lappend available_docfiles $line
246             }
247
248             if {[eof $FILE]} {
249                 close $FILE
250                 break
251             }
252         }
253     } else {
254         return -1
255     }
256     return 0
257 }
258
259 # Writes new tex file for conversion from tex to pdf for a specific doc
260 proc OverviewDoc_MakeRefmanTex {fileName latexDir docLabel verboseMode} {
261
262     if {$verboseMode == "YES"} {
263         puts "INFO: Making refman.tex file for $fileName"
264     }
265     set DOCNAME "$latexDir/refman.tex"
266     if {[file exists $DOCNAME] == 1} {
267         file delete -force $DOCNAME
268     }
269     set texfile [open $DOCNAME w]
270
271     puts $texfile "\\batchmode"
272     puts $texfile "\\nonstopmode"
273     puts $texfile "\\documentclass\[oneside\]{article}"
274     puts $texfile "\n% Packages required by doxygen"
275     puts $texfile "\\usepackage{calc}"
276     puts $texfile "\\usepackage{doxygen}"
277     puts $texfile "\\usepackage{graphicx}"
278     puts $texfile "\\usepackage\[utf8\]{inputenc}"
279     puts $texfile "\\usepackage{makeidx}"
280     puts $texfile "\\usepackage{multicol}"
281     puts $texfile "\\usepackage{multirow}"
282     puts $texfile "\\usepackage{textcomp}"
283     puts $texfile "\\usepackage{amsmath}"
284     puts $texfile "\\usepackage\[table\]{xcolor}"
285     puts $texfile "\\usepackage{indentfirst}"
286     puts $texfile ""
287     puts $texfile "% Font selection"
288     puts $texfile "\\usepackage\[T1\]{fontenc}"
289     puts $texfile "\\usepackage{mathptmx}"
290     puts $texfile "\\usepackage\[scaled=.90\]{helvet}"
291     puts $texfile "\\usepackage{courier}"
292     puts $texfile "\\usepackage{amssymb}"
293     puts $texfile "\\usepackage{sectsty}"
294     puts $texfile "\\renewcommand{\\familydefault}{\\sfdefault}"
295     puts $texfile "\\allsectionsfont{%"
296     puts $texfile "  \\fontseries{bc}\\selectfont%"
297     puts $texfile "  \\color{darkgray}%"
298     puts $texfile "}"
299     puts $texfile "\\renewcommand{\\DoxyLabelFont}{%"
300     puts $texfile "  \\fontseries{bc}\\selectfont%"
301     puts $texfile "  \\color{darkgray}%"
302     puts $texfile "}"
303     puts $texfile ""
304     puts $texfile "% Page & text layout"
305     puts $texfile "\\usepackage{geometry}"
306     puts $texfile "\\geometry{%"
307     puts $texfile "  a4paper,%"
308     puts $texfile "  top=2.5cm,%"
309     puts $texfile "  bottom=2.5cm,%"
310     puts $texfile "  left=2.5cm,%"
311     puts $texfile "  right=2.5cm%"
312     puts $texfile "}"
313     puts $texfile "\\tolerance=750"
314     puts $texfile "\\hfuzz=15pt"
315     puts $texfile "\\hbadness=750"
316     puts $texfile "\\setlength{\\emergencystretch}{15pt}"
317     puts $texfile "\\setlength{\\parindent}{0.75cm}"
318     puts $texfile "\\setlength{\\parskip}{0.2cm}"
319     puts $texfile "\\makeatletter"
320     puts $texfile "\\renewcommand{\\paragraph}{%"
321     puts $texfile "  \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{%"
322     puts $texfile "\\normalfont\\normalsize\\bfseries\\SS@parafont%"
323     puts $texfile "  }%"
324     puts $texfile "}"
325     puts $texfile "\\renewcommand{\\subparagraph}{%"
326     puts $texfile "  \\@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{%"
327     puts $texfile "\\normalfont\\normalsize\\bfseries\\SS@subparafont%"
328     puts $texfile "  }%"
329     puts $texfile "}"
330     puts $texfile "\\makeatother"
331     puts $texfile ""
332     puts $texfile "% Headers & footers"
333     puts $texfile "\\usepackage{fancyhdr}"
334     puts $texfile "\\pagestyle{fancyplain}"
335     puts $texfile "\\fancyhead\[LE\]{\\fancyplain{}{\\bfseries\\thepage}}"
336     puts $texfile "\\fancyhead\[CE\]{\\fancyplain{}{}}"
337     puts $texfile "\\fancyhead\[RE\]{\\fancyplain{}{\\bfseries\\leftmark}}"
338     puts $texfile "\\fancyhead\[LO\]{\\fancyplain{}{\\bfseries\\rightmark}}"
339     puts $texfile "\\fancyhead\[CO\]{\\fancyplain{}{}}"
340     puts $texfile "\\fancyhead\[RO\]{\\fancyplain{}{\\bfseries\\thepage}}"
341     puts $texfile "\\fancyfoot\[LE\]{\\fancyplain{}{}}"
342     puts $texfile "\\fancyfoot\[CE\]{\\fancyplain{}{}}"
343     puts $texfile "\\fancyfoot\[RE\]{\\fancyplain{}{\\bfseries\\scriptsize (c) Open CASCADE Technology 2001\-2013}}"
344     puts $texfile "\\fancyfoot\[LO\]{\\fancyplain{}{\\bfseries\\scriptsize (c) Open CASCADE Technology 2001\-2013}}"
345     puts $texfile "\\fancyfoot\[CO\]{\\fancyplain{}{}}"
346     puts $texfile "\\fancyfoot\[RO\]{\\fancyplain{}{}}"
347     puts $texfile "\\renewcommand{\\footrulewidth}{0.4pt}"
348     puts $texfile "\\renewcommand{\\sectionmark}\[1\]{%"
349     puts $texfile "  \\markright{\\thesection\\ #1}%"
350     puts $texfile "}"
351     puts $texfile ""
352     puts $texfile "% Indices & bibliography"
353     puts $texfile "\\usepackage{natbib}"
354     puts $texfile "\\usepackage\[titles\]{tocloft}"
355     puts $texfile "\\renewcommand{\\cftsecleader}{\\cftdotfill{\\cftdotsep}}"
356     puts $texfile "\\setcounter{tocdepth}{3}"
357     puts $texfile "\\setcounter{secnumdepth}{5}"
358     puts $texfile "\\makeindex"
359     puts $texfile ""
360     puts $texfile "% Hyperlinks (required, but should be loaded last)"
361     puts $texfile "\\usepackage{ifpdf}"
362     puts $texfile "\\ifpdf"
363     puts $texfile "  \\usepackage\[pdftex,pagebackref=true\]{hyperref}"
364     puts $texfile "\\else"
365     puts $texfile "  \\usepackage\[ps2pdf,pagebackref=true\]{hyperref}"
366     puts $texfile "\\fi"
367     puts $texfile "\\hypersetup{%"
368     puts $texfile "  colorlinks=true,%"
369     puts $texfile "  linkcolor=black,%"
370     puts $texfile "  citecolor=black,%"
371     puts $texfile "  urlcolor=blue,%"
372     puts $texfile "  unicode%"
373     puts $texfile "}"
374     puts $texfile ""
375     puts $texfile "% Custom commands"
376     puts $texfile "\\newcommand{\\clearemptydoublepage}{%"
377     puts $texfile "  \\newpage{\\pagestyle{empty}\\cleardoublepage}%"
378     puts $texfile "}"
379     puts $texfile "\n"
380     puts $texfile "%===== C O N T E N T S =====\n"
381 #    puts $texfile "\\DeclareUnicodeCharacter{00A0}{ }"
382     puts $texfile "\\begin{document}"
383     puts $texfile ""
384     puts $texfile "% Titlepage & ToC"
385     puts $texfile "\\hypersetup{pageanchor=false}"
386     puts $texfile "\\pagenumbering{roman}"
387     puts $texfile "\\begin{titlepage}"
388     puts $texfile "\\vspace*{7cm}"
389     puts $texfile "\\begin{center}%"
390     puts $texfile "\\includegraphics\[width=0.75\\textwidth, height=0.2\\textheight\]{overview_occttransparent.png}\\\\\\\\"
391     puts $texfile "{\\Large Open C\\-A\\-S\\-C\\-A\\-D\\-E Technology \\\\\[1ex\]\\Large 6.\\-6.\\-0 }\\\\"
392     puts $texfile "\\vspace*{1cm}"
393     puts $texfile "{\\Large $docLabel}\\\\"
394     puts $texfile "\\vspace*{1cm}"
395     puts $texfile "{\\large Generated by Doxygen 1.8.4}\\\\"
396     puts $texfile "\\vspace*{0.5cm}"
397     puts $texfile "{\\small \\today}\\"
398     puts $texfile "\\end{center}"
399     puts $texfile "\\end{titlepage}"
400     puts $texfile "\\clearpage"
401     puts $texfile "\\pagenumbering{roman}"
402     puts $texfile "\\tableofcontents"
403     puts $texfile "\\newpage"
404     puts $texfile "\\pagenumbering{arabic}"
405     puts $texfile "\\hypersetup{pageanchor=true}"
406     puts $texfile ""
407     puts $texfile "\\hypertarget{$fileName}{}"
408     puts $texfile "\\input{$fileName}"
409     puts $texfile ""
410     puts $texfile "% Index"
411     puts $texfile "\\newpage"
412     puts $texfile "\\phantomsection"
413     puts $texfile "\\addcontentsline{toc}{part}{Index}"
414     puts $texfile "\\printindex\n"
415     puts $texfile "\\end{document}"
416
417     close $texfile
418 }
419
420 # Postprocesses generated TeX files
421 proc OverviewDoc_ProcessTex {{texFiles {}} {latexDir} verboseMode} {
422
423     foreach TEX $texFiles {
424         if {$verboseMode == "YES"} {
425             puts "INFO: Preprocessing file $TEX"
426         }
427
428          if {![file exists $TEX]} {
429           puts "file $TEX doesn't exist"
430           return
431         }
432
433         set IN_F  [open "$TEX" r]
434         set TMPFILENAME "$latexDir/temp.tex"
435
436         set OUT_F [open $TMPFILENAME w]
437         
438         while {1} {
439             set line [gets $IN_F]
440             if { [string first "\\includegraphics" $line] != -1 } {
441                 # Center images in TeX files
442                 set line "\\begin{center}\n $line\n\\end{center}"
443             } elseif { [string first "\\subsection" $line] != -1 } {
444                 # Replace \subsection with \section tag
445                 regsub -all "\\\\subsection" $line "\\\\section" line
446             } elseif { [string first "\\subsubsection" $line] != -1 } {
447                 # Replace \subsubsection with \subsection tag
448                 regsub -all "\\\\subsubsection" $line "\\\\subsection" line
449             } elseif { [string first "\\paragraph" $line] != -1 } {
450                 # Replace \paragraph with \subsubsection tag
451                 regsub -all "\\\\paragraph" $line "\\\\subsubsection" line
452             }
453             puts $OUT_F $line
454             
455             if {[eof $IN_F]} {
456                 close $IN_F
457                 close $OUT_F
458                 break
459             }
460         }
461         file delete -force $TEX
462         file rename $TMPFILENAME $TEX
463     }
464 }
465
466 # Main procedure for documents compilation
467 proc OverviewDoc_Main { {docfiles {}} generatorMode docLabel verboseMode} {
468
469     set INDIR      [file normalize [file dirname [info script]]]
470     set CASROOT    [file normalize [file dirname "$INDIR/../../"]]
471     set OUTDIR     $CASROOT/doc
472     set PDFDIR     $OUTDIR/overview/pdf
473     set HTMLDIR    $OUTDIR/overview/html
474     set LATEXDIR   $OUTDIR/overview/latex
475     set TAGFILEDIR $OUTDIR/refman
476     set DOXYFILE   $OUTDIR/OCCT.cfg
477
478     # Create or clean the output folders
479     if {[file exists $OUTDIR] == 0} {
480         file mkdir $OUTDIR
481     } 
482     if {[file exists $HTMLDIR] == 0} {
483         file mkdir $HTMLDIR
484     }
485     if {[file exists $LATEXDIR] == 0} {
486         file mkdir $LATEXDIR
487     }
488     if {[file exists $PDFDIR] == 0} {
489         file mkdir $PDFDIR
490     }
491
492     # Run tools to compile documents
493     puts ""
494     puts " [clock format [clock seconds] -format {%Y.%m.%d %H:%M}] Generation process started..."
495     puts ""
496     puts " Please, wait while Doxygen finishes it\'s work"
497     OverviewDoc_MakeDoxyfile $CASROOT "$OUTDIR/overview" $TAGFILEDIR $DOXYFILE $generatorMode $docfiles $verboseMode
498
499     # Run doxygen tool
500     if { $generatorMode == "HTML_ONLY"} {
501         puts " [clock format [clock seconds] -format {%Y.%m.%d %H:%M}] Doxygen is now generating HTML files...\n"
502     }
503     set RESULT [catch {exec doxygen $DOXYFILE > $OUTDIR/doxygen_out.log} DOX_ERROR] 
504     if {$RESULT != 0} {
505         if {[llength [split $DOX_ERROR "\n"]] > 1} {
506             if {$verboseMode == "YES"} {
507                 puts "INFO: See Doxygen messages in $OUTDIR/doxygen_warnings_and_errors.log"
508             }
509             set DOX_ERROR_FILE [open "$OUTDIR/doxygen_warnings_and_errors.log" "w"]
510             puts $DOX_ERROR_FILE $DOX_ERROR
511             close $DOX_ERROR_FILE
512         } else {
513             puts $DOX_ERROR
514         }
515     }
516     # Close the Doxygen application
517     after 300
518
519     # Start PDF generation routine
520     if { $generatorMode == "PDF_ONLY" } {
521         puts ""
522         puts " [clock format [clock seconds] -format {%Y.%m.%d %H:%M}] Doxygen is now generating PDF files...\n"
523
524         set OS $::tcl_platform(platform)
525         if { $OS == "unix" } {
526             set PREFIX ".sh"
527         } elseif { $OS == "windows" } {
528             set PREFIX ".bat"
529         }
530
531         # Prepare a list of TeX files, generated by Doxygen
532         puts "go to $LATEXDIR"
533         cd $LATEXDIR
534         
535         set TEXFILES [glob $LATEXDIR -type f -directory $LATEXDIR -tails "*.tex" ]
536         set REFMAN_IDX [lsearch $TEXFILES "refman.tex"]
537         set TEXFILES [lreplace $TEXFILES $REFMAN_IDX $REFMAN_IDX]
538
539
540         set IDX [lsearch $TEXFILES "$LATEXDIR"]
541         while { $IDX != -1} {
542             set TEXFILES [lreplace $TEXFILES $IDX $IDX]
543             set IDX [lsearch $TEXFILES "$LATEXDIR"]
544         }
545
546         puts "Preprocess generated TeX files"
547         OverviewDoc_ProcessTex $TEXFILES $LATEXDIR $verboseMode
548
549         puts "Generate PDF files from"
550         foreach TEX $TEXFILES {
551             # Rewrite existing REFMAN.tex file...
552             set TEX [string range $TEX 0 [ expr "[string length $TEX] - 5"]]
553             OverviewDoc_MakeRefmanTex $TEX $LATEXDIR $docLabel $verboseMode
554             
555             if {$verboseMode == "YES"} {
556                 puts "INFO: Generating PDF file from $TEX"
557             }
558             # ...and use it to generate PDF from TeX...
559             puts "execute $LATEXDIR/make$PREFIX"
560             set RESULT [catch {eval exec [auto_execok $LATEXDIR/make$PREFIX] > "$OUTDIR/pdflatex_out.log"} LaTeX_ERROR]
561             if {$RESULT != 0} {
562                 if {[llength [split $LaTeX_ERROR "\n"]] > 1} {
563                     set LaTeX_ERROR_FILE [open "$OUTDIR/pdflatex_warnings_and_errors.log" "w"]
564                     puts $LaTeX_ERROR_FILE $LaTeX_ERROR
565                     close $LaTeX_ERROR_FILE
566                 } else {
567                     puts $DOX_ERROR
568                 }
569             }
570
571             # ...and place it to the specific folder
572             if { [file exists $PDFDIR/$TEX.pdf] == 1 } {
573                 file delete -force $PDFDIR/$TEX.pdf
574             }
575             
576             if {![file exists "$LATEXDIR/refman.pdf"]} {
577               puts "file $LATEXDIR/refman.pdf doesn't exist"
578               return
579             }
580             
581             file rename $LATEXDIR/refman.pdf "$PDFDIR/$TEX.pdf"
582         }
583         if {$verboseMode == "YES"} {
584             puts "INFO: See LaTeX messages in $OUTDIR/pdflatex_warnings_and_errors.log"
585         }
586     }
587
588     cd $INDIR
589     puts " [clock format [clock seconds] -format {%Y.%m.%d %H:%M}] Generation process finished..."
590     puts ""
591     puts "--------------------------------------------------------------------"
592     if { $generatorMode == "HTML_ONLY" } {
593         puts " You can look at generated HTML pages by opening: "
594         set RESFILE $OUTDIR/overview/html/index.html
595         puts " $RESFILE"
596     }
597     if { $generatorMode == "PDF_ONLY" } {
598         puts " You can look at generated PDF files in: "
599         puts " $OUTDIR/overview/pdf folder"
600     }
601     puts ""
602     puts " Copyright \u00a9 Open CASCADE Technology 2001-2013"
603     puts "--------------------------------------------------------------------\n"
604 }
605
606 # A command for User Documentation compilation
607 proc occdoc {args} {
608     # Programm options
609     set GEN_HTML  "NO"
610     set GEN_PDF   "NO"
611     set DOCFILES  {}
612     set DOCLABEL  "Default OCCT Document"
613     set VERB_MODE "NO"
614     set GEN_MODE  "DEFAULT"
615     global available_docfiles
616     global args_names
617     global args_values
618
619     # Load list of docfiles
620     if { [OverviewDoc_LoadFilesList] != 0 } {
621         puts "ERROR: File FILES.txt was not found"
622         return
623     }
624
625     # Parse CL arguments
626     if {[OverviewDoc_ParseArguments $args] == 1} {
627         return
628     }
629     if {$args_names == {}} {
630         set GEN_HTML "YES"
631         set VERB_MODE "YES"
632     } else {
633         foreach arg_n $args_names {
634             if {$arg_n == "h"} {
635               OverviewDoc_PrintHelpMessage
636               return
637             } elseif {$arg_n == "html"} {
638                 set GEN_HTML "YES"
639             } elseif {$arg_n == "pdf"} {
640                 set GEN_PDF "YES"
641             } elseif {$arg_n == "v"} {
642                 set VERB_MODE "YES"
643             } elseif {$arg_n == "m"} {
644                 if {$args_values(m) != "NULL"} {
645                     set DOCFILES $args_values(m)
646                 } else {
647                     puts "Error in argument m"
648                     return
649                 }
650                 # Check if all chosen docfiles are correct
651                 foreach docfile $DOCFILES {
652                     if { [lsearch $available_docfiles $docfile] == -1 } {
653                         puts "File \"$docfile\" is not presented in the list of available docfiles"
654                         puts "Please, specify the correct docfile name"
655                         return
656                     } else {
657                         puts "File $docfile is presented in FILES.TXT"
658                     }
659                 }
660             } elseif {$arg_n == "l"} {
661                 if { [llength $DOCFILES] <= 1 } {
662                     if {$args_values(l) != "NULL"} {
663                         set DOCLABEL $args_values(l)
664                     } else {
665                         puts "Error in argument l"
666                         return
667                     }
668                 }
669             } else {
670                 puts "\nWrong argument: $arg_n"
671                 OverviewDoc_PrintHelpMessage
672                 return
673             }
674         }
675     }
676
677     # Specify generation mode
678     if {$GEN_HTML == "YES" && $GEN_PDF == "NO"} {
679         set GEN_MODE "HTML_ONLY"
680     } elseif {$GEN_PDF == "YES"} {
681         set GEN_MODE "PDF_ONLY"
682     }
683     # Check if -v is the only option
684     if {$GEN_MODE == "DEFAULT"} {
685         if { $VERB_MODE == "YES" } {
686             puts "\nArgument -v can't be used without -pdf or -html argument"
687             OverviewDoc_PrintHelpMessage
688         }
689         return
690     }
691     
692     # Specify verbose mode
693     if { $GEN_PDF != "YES" && [llength $DOCFILES] > 1 } {
694         set DOCLABEL ""
695     }
696     
697     # If we don't specify list for docfiles with -m argument,
698     # we assume that we have to generate all docfiles
699     if { [llength $DOCFILES] == 0 } {
700         set DOCFILES $available_docfiles
701     }
702
703     # Start main activities
704     OverviewDoc_Main $DOCFILES $GEN_MODE $DOCLABEL $VERB_MODE
705 }