# ----------------------------------------------------------------------- # Script name: CompileDocs.tcl # This script compiles OCCT documents from *.md files to HTML pages # Author: omy # ----------------------------------------------------------------------- # get OCCT version from file Standard_Version.hxx (if available) proc OverviewDoc_DetectCasVersion {theCasRoot} { set occt_ver 6.7.0 set occt_ver_add "" if { [file exist $theCasRoot/src/Standard/Standard_Version.hxx] } { set fh [open $theCasRoot/src/Standard/Standard_Version.hxx] set fh_loaded [read $fh] close $fh regexp {[^/]\s*#\s*define\s+OCC_VERSION_COMPLETE\s+\"([^\s]*)\"} $fh_loaded dummy occt_ver regexp {[^/]\s*#\s*define\s+OCC_VERSION_DEVELOPMENT\s+\"([^\s]*)\"} $fh_loaded dummy occt_ver_add if { "$occt_ver_add" != "" } { set occt_ver ${occt_ver}.$occt_ver_add } } return $occt_ver } # Generates Doxygen configuration file for Overview documentation proc OverviewDoc_MakeDoxyfile {casDir outDir tagFileDir {doxyFileName} {generatorMode ""} DocFilesList verboseMode searchMode hhcPath mathjaxLocation} { set doxyFile [open $doxyFileName "w"] set casroot $casDir set inputDir $casDir/dox # Common configs puts $doxyFile "DOXYFILE_ENCODING = UTF-8" puts $doxyFile "PROJECT_NAME = \"Open CASCADE Technology\"" puts $doxyFile "PROJECT_NUMBER = [OverviewDoc_DetectCasVersion $casDir]" puts $doxyFile "PROJECT_BRIEF = " puts $doxyFile "PROJECT_LOGO = $inputDir/resources/occ_logo.png" puts $doxyFile "OUTPUT_DIRECTORY = $outDir" puts $doxyFile "CREATE_SUBDIRS = NO" puts $doxyFile "OUTPUT_LANGUAGE = English" puts $doxyFile "ABBREVIATE_BRIEF = \"The \$name class\" \ \"The \$name widget\" \ \"The \$name file\" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the" puts $doxyFile "FULL_PATH_NAMES = YES" puts $doxyFile "INHERIT_DOCS = YES" puts $doxyFile "TAB_SIZE = 4" puts $doxyFile "MARKDOWN_SUPPORT = YES" puts $doxyFile "EXTRACT_ALL = YES" puts $doxyFile "CASE_SENSE_NAMES = NO" puts $doxyFile "INLINE_INFO = YES" puts $doxyFile "SORT_MEMBER_DOCS = YES" puts $doxyFile "WARNINGS = YES" puts $doxyFile "WARN_IF_UNDOCUMENTED = YES" puts $doxyFile "WARN_IF_DOC_ERROR = YES" puts $doxyFile "WARN_NO_PARAMDOC = NO" puts $doxyFile "WARN_FORMAT = \"\$file:\$line: \$text\"" puts $doxyFile "INPUT_ENCODING = UTF-8" puts $doxyFile "FILE_PATTERNS = *.md *.dox " puts $doxyFile "RECURSIVE = YES" puts $doxyFile "SOURCE_BROWSER = NO" puts $doxyFile "INLINE_SOURCES = YES" puts $doxyFile "COLS_IN_ALPHA_INDEX = 5" # Generation options puts $doxyFile "GENERATE_DOCSET = NO" puts $doxyFile "GENERATE_CHI = NO" puts $doxyFile "GENERATE_QHP = NO" puts $doxyFile "GENERATE_ECLIPSEHELP = NO" puts $doxyFile "GENERATE_RTF = NO" puts $doxyFile "GENERATE_MAN = NO" puts $doxyFile "GENERATE_XML = NO" puts $doxyFile "GENERATE_DOCBOOK = NO" puts $doxyFile "GENERATE_AUTOGEN_DEF = NO" puts $doxyFile "GENERATE_PERLMOD = NO" # Keep doxygen comments within code blocks puts $doxyFile "STRIP_CODE_COMMENTS = NO" # Define alias for inserting images to both HRML and PDF at once puts $doxyFile "ALIASES += figure\{1\}=\"\\image html \\1 \\n \\image latex \\1\"" puts $doxyFile "ALIASES += figure\{2\}=\"\\image html \\1 \\2 \\n \\image latex \\1 \\2\"" set PARAM_INPUT "INPUT =" set PARAM_IMAGEPATH "IMAGE_PATH = $inputDir/resources/ " foreach docFile $DocFilesList { set NEW_IMG_PATH [file normalize [file dirname "$inputDir/$docFile"]] if { [string compare $NEW_IMG_PATH $casroot] != 0 } { if {[file isdirectory "$NEW_IMG_PATH/images"]} { append PARAM_IMAGEPATH " $NEW_IMG_PATH/images" } } append PARAM_INPUT " " $inputDir/$docFile } puts $doxyFile $PARAM_INPUT puts $doxyFile $PARAM_IMAGEPATH if { $generatorMode == "HTML_ONLY"} { # Set a reference to a TAGFILE if { $tagFileDir != "" } { if {[file exists $tagFileDir/OCCT.tag] == 1} { set tagPath [OverviewDoc_GetRelPath $tagFileDir $outDir/html] puts $doxyFile "TAGFILES = $tagFileDir/OCCT.tag=$tagPath/html" } } # HTML Output puts $doxyFile "GENERATE_LATEX = NO" puts $doxyFile "GENERATE_HTMLHELP = NO" puts $doxyFile "GENERATE_HTML = YES" puts $doxyFile "HTML_COLORSTYLE_HUE = 220" puts $doxyFile "HTML_COLORSTYLE_SAT = 100" puts $doxyFile "HTML_COLORSTYLE_GAMMA = 80" puts $doxyFile "HTML_TIMESTAMP = YES" puts $doxyFile "HTML_DYNAMIC_SECTIONS = YES" puts $doxyFile "HTML_INDEX_NUM_ENTRIES = 100" puts $doxyFile "DISABLE_INDEX = YES" puts $doxyFile "GENERATE_TREEVIEW = YES" puts $doxyFile "ENUM_VALUES_PER_LINE = 8" puts $doxyFile "TREEVIEW_WIDTH = 250" puts $doxyFile "EXTERNAL_PAGES = NO" # HTML Search engine options if { [string tolower $searchMode] == "none" } { puts $doxyFile "SEARCHENGINE = NO" puts $doxyFile "SERVER_BASED_SEARCH = NO" puts $doxyFile "EXTERNAL_SEARCH = NO" } else { puts $doxyFile "SEARCHENGINE = YES" if { [string tolower $searchMode] == "local" } { puts $doxyFile "SERVER_BASED_SEARCH = NO" puts $doxyFile "EXTERNAL_SEARCH = NO" } elseif { [string tolower $searchMode] == "server" } { puts $doxyFile "SERVER_BASED_SEARCH = YES" puts $doxyFile "EXTERNAL_SEARCH = NO" } elseif { [string tolower $searchMode] == "external" } { puts $doxyFile "SERVER_BASED_SEARCH = YES" puts $doxyFile "EXTERNAL_SEARCH = YES" } else { puts "ERROR: Wrong search engine type" close $doxyFile return } } puts $doxyFile "SEARCHDATA_FILE = searchdata.xml" puts $doxyFile "SKIP_FUNCTION_MACROS = YES" # Formula options puts $doxyFile "FORMULA_FONTSIZE = 12" puts $doxyFile "FORMULA_TRANSPARENT = YES" puts $doxyFile "USE_MATHJAX = YES" puts $doxyFile "MATHJAX_FORMAT = HTML-CSS" puts $doxyFile "MATHJAX_RELPATH = ${mathjaxLocation}" } elseif { $generatorMode == "CHM_ONLY"} { puts $doxyFile "GENERATE_HTMLHELP = YES" puts $doxyFile "CHM_FILE = ../../overview.chm" puts $doxyFile "HHC_LOCATION = \"$hhcPath\"" puts $doxyFile "DISABLE_INDEX = YES" # Formula options puts $doxyFile "FORMULA_FONTSIZE = 12" puts $doxyFile "FORMULA_TRANSPARENT = YES" puts $doxyFile "USE_MATHJAX = YES" puts $doxyFile "MATHJAX_FORMAT = HTML-CSS" puts $doxyFile "MATHJAX_RELPATH = ${mathjaxLocation}" } elseif { $generatorMode == "PDF_ONLY"} { puts $doxyFile "GENERATE_HTMLHELP = NO" puts $doxyFile "GENERATE_HTML = NO" puts $doxyFile "DISABLE_INDEX = YES" puts $doxyFile "GENERATE_TREEVIEW = NO" puts $doxyFile "PREDEFINED = PDF_ONLY" puts $doxyFile "GENERATE_LATEX = YES" puts $doxyFile "COMPACT_LATEX = YES" puts $doxyFile "PDF_HYPERLINKS = YES" puts $doxyFile "USE_PDFLATEX = YES" puts $doxyFile "LATEX_BATCHMODE = YES" puts $doxyFile "LATEX_OUTPUT = latex" puts $doxyFile "LATEX_CMD_NAME = latex" puts $doxyFile "MAKEINDEX_CMD_NAME = makeindex" } close $doxyFile } # Returns the relative path between two directories proc OverviewDoc_GetRelPath {targetFile currentpath} { set cc [file split [file normalize $currentpath]] set tt [file split [file normalize $targetFile]] if {![string equal [lindex $cc 0] [lindex $tt 0]]} { # not on *n*x then return -code error "$targetFile not on same volume as $currentpath" } while {[string equal [lindex $cc 0] [lindex $tt 0]] && [llength $cc] > 0} { # discard matching components from the front set cc [lreplace $cc 0 0] set tt [lreplace $tt 0 0] } set prefix "" if {[llength $cc] == 0} { # just the file name, so targetFile is lower down (or in same place) set prefix "." } # step up the tree for {set i 0} {$i < [llength $cc]} {incr i} { append prefix " .." } # stick it all together (the eval is to flatten the targetFile list) return [eval file join $prefix $tt] } # Prints Help message proc OverviewDoc_PrintHelpMessage {} { puts "\nUsage : occdoc \[-h\] \[-html\] \[-pdf\] \[-m=\] \[-l=\] \[-v\] \[-s\]" puts "" puts " Options are : " puts " -html : To generate HTML files" puts " (cannot be used with -pdf or -chm)" puts " -pdf : To generate PDF files" puts " (cannot be used with -html or chm)" puts " -chm : To generate CHM files" puts " (cannot be used with -html or pdf)" puts " -hhc : To define path to hhc - chm generator" puts " : is used with just -chm option" puts " -m= : Specifies list of documents to generate." puts " If it is not specified, all files " puts " mentioned in FILES.txt are processed." puts " -l= : Specifies the document caption " puts " for a single document" puts " -h : Prints help message" puts " -v : Specifies the Verbose mode" puts " (info on all script actions is shown)" puts " -s= : Specifies the Search mode of HTML documents." puts " Can be: none | local | server | external" puts " : Can be used only with -html option" puts " -mathjax= : To use local or alternative copy of MathJax" } # Parses command line arguments proc OverviewDoc_ParseArguments {arguments} { global args_names global args_values set args_names {} array set args_values {} foreach arg $arguments { if {[regexp {^(-)[a-z]+$} $arg] == 1} { set name [string range $arg 1 [string length $arg]-1] lappend args_names $name set args_values($name) "NULL" continue } elseif {[regexp {^(-)[a-z]+=.+$} $arg] == 1} { set equal_symbol_position [string first "=" $arg] set name [string range $arg 1 $equal_symbol_position-1] lappend args_names $name set value [string range $arg $equal_symbol_position+1 [string length $arguments]-1] # To parse a list of values for -m parameter if { [string first "," $value] != -1 } { set value [split $value ","]; } set args_values($name) $value } else { puts "Error in argument $arg" return 1 } } return 0 } # Loads a list of docfiles from file FILES.txt proc OverviewDoc_LoadFilesList {} { set INPUTDIR [file normalize [file dirname [info script]]] global available_docfiles set available_docfiles {} # Read data from file if { [file exists "$INPUTDIR/FILES.txt"] == 1 } { set FILE [open "$INPUTDIR/FILES.txt" r] while {1} { set line [string trim [gets $FILE]] # trim possible comments starting with '#' set line [regsub {\#.*} $line {}] if {$line != ""} { lappend available_docfiles $line } if {[eof $FILE]} { close $FILE break } } } else { return -1 } return 0 } # Writes new tex file for conversion from tex to pdf for a specific doc proc OverviewDoc_MakeRefmanTex {fileName latexDir docLabel verboseMode} { if {$verboseMode == "YES"} { puts "INFO: Making refman.tex file for $fileName" } set DOCNAME "$latexDir/refman.tex" if {[file exists $DOCNAME] == 1} { file delete -force $DOCNAME } set year [clock format [clock seconds] -format {%Y}] set texfile [open $DOCNAME w] puts $texfile "\\batchmode" puts $texfile "\\nonstopmode" puts $texfile "\\documentclass\[oneside\]{article}" puts $texfile "\n% Packages required by doxygen" puts $texfile "\\usepackage{calc}" puts $texfile "\\usepackage{doxygen}" puts $texfile "\\usepackage{graphicx}" puts $texfile "\\usepackage\[utf8\]{inputenc}" puts $texfile "\\usepackage{makeidx}" puts $texfile "\\usepackage{multicol}" puts $texfile "\\usepackage{multirow}" puts $texfile "\\usepackage{textcomp}" puts $texfile "\\usepackage{amsmath}" puts $texfile "\\usepackage\[table\]{xcolor}" puts $texfile "\\usepackage{indentfirst}" puts $texfile "" puts $texfile "% Font selection" puts $texfile "\\usepackage\[T1\]{fontenc}" puts $texfile "\\usepackage{mathptmx}" puts $texfile "\\usepackage\[scaled=.90\]{helvet}" puts $texfile "\\usepackage{courier}" puts $texfile "\\usepackage{amssymb}" puts $texfile "\\usepackage{sectsty}" puts $texfile "\\renewcommand{\\familydefault}{\\sfdefault}" puts $texfile "\\allsectionsfont{%" puts $texfile " \\fontseries{bc}\\selectfont%" puts $texfile " \\color{darkgray}%" puts $texfile "}" puts $texfile "\\renewcommand{\\DoxyLabelFont}{%" puts $texfile " \\fontseries{bc}\\selectfont%" puts $texfile " \\color{darkgray}%" puts $texfile "}" puts $texfile "" puts $texfile "% Page & text layout" puts $texfile "\\usepackage{geometry}" puts $texfile "\\geometry{%" puts $texfile " a4paper,%" puts $texfile " top=2.5cm,%" puts $texfile " bottom=2.5cm,%" puts $texfile " left=2.5cm,%" puts $texfile " right=2.5cm%" puts $texfile "}" puts $texfile "\\tolerance=750" puts $texfile "\\hfuzz=15pt" puts $texfile "\\hbadness=750" puts $texfile "\\setlength{\\emergencystretch}{15pt}" puts $texfile "\\setlength{\\parindent}{0cm}";#0.75cm puts $texfile "\\setlength{\\parskip}{0.2cm}"; #0.2 puts $texfile "\\makeatletter" puts $texfile "\\renewcommand{\\paragraph}{%" puts $texfile " \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{%" puts $texfile "\\normalfont\\normalsize\\bfseries\\SS@parafont%" puts $texfile " }%" puts $texfile "}" puts $texfile "\\renewcommand{\\subparagraph}{%" puts $texfile " \\@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{%" puts $texfile "\\normalfont\\normalsize\\bfseries\\SS@subparafont%" puts $texfile " }%" puts $texfile "}" puts $texfile "\\makeatother" puts $texfile "" puts $texfile "% Headers & footers" puts $texfile "\\usepackage{fancyhdr}" puts $texfile "\\pagestyle{fancyplain}" puts $texfile "\\fancyhead\[LE\]{\\fancyplain{}{\\bfseries\\thepage}}" puts $texfile "\\fancyhead\[CE\]{\\fancyplain{}{}}" puts $texfile "\\fancyhead\[RE\]{\\fancyplain{}{\\bfseries\\leftmark}}" puts $texfile "\\fancyhead\[LO\]{\\fancyplain{}{\\bfseries\\rightmark}}" puts $texfile "\\fancyhead\[CO\]{\\fancyplain{}{}}" puts $texfile "\\fancyhead\[RO\]{\\fancyplain{}{\\bfseries\\thepage}}" puts $texfile "\\fancyfoot\[LE\]{\\fancyplain{}{}}" puts $texfile "\\fancyfoot\[CE\]{\\fancyplain{}{}}" puts $texfile "\\fancyfoot\[RE\]{\\fancyplain{}{\\bfseries\\scriptsize Copyright (c) Open CASCADE $year}}" puts $texfile "\\fancyfoot\[LO\]{\\fancyplain{}{\\bfseries\\scriptsize Copyright (c) Open CASCADE $year}}" puts $texfile "\\fancyfoot\[CO\]{\\fancyplain{}{}}" puts $texfile "\\fancyfoot\[RO\]{\\fancyplain{}{}}" puts $texfile "\\renewcommand{\\footrulewidth}{0.4pt}" puts $texfile "\\renewcommand{\\sectionmark}\[1\]{%" puts $texfile " \\markright{\\thesection\\ #1}%" puts $texfile "}" puts $texfile "" puts $texfile "% Indices & bibliography" puts $texfile "\\usepackage{natbib}" puts $texfile "\\usepackage\[titles\]{tocloft}" puts $texfile "\\renewcommand{\\cftsecleader}{\\cftdotfill{\\cftdotsep}}" puts $texfile "\\setcounter{tocdepth}{3}" puts $texfile "\\setcounter{secnumdepth}{5}" puts $texfile "\\makeindex" puts $texfile "" puts $texfile "% Hyperlinks (required, but should be loaded last)" puts $texfile "\\usepackage{ifpdf}" puts $texfile "\\ifpdf" puts $texfile " \\usepackage\[pdftex,pagebackref=true\]{hyperref}" puts $texfile "\\else" puts $texfile " \\usepackage\[ps2pdf,pagebackref=true\]{hyperref}" puts $texfile "\\fi" puts $texfile "\\hypersetup{%" puts $texfile " colorlinks=true,%" puts $texfile " linkcolor=black,%" puts $texfile " citecolor=black,%" puts $texfile " urlcolor=blue,%" puts $texfile " unicode%" puts $texfile "}" puts $texfile "" puts $texfile "% Custom commands" puts $texfile "\\newcommand{\\clearemptydoublepage}{%" puts $texfile " \\newpage{\\pagestyle{empty}\\cleardoublepage}%" puts $texfile "}" puts $texfile "\n" puts $texfile "%===== C O N T E N T S =====\n" puts $texfile "\\begin{document}" puts $texfile "" puts $texfile "% Titlepage & ToC" puts $texfile "\\hypersetup{pageanchor=false}" puts $texfile "\\pagenumbering{roman}" puts $texfile "\\begin{titlepage}" puts $texfile "\\vspace*{7cm}" puts $texfile "\\begin{center}%" puts $texfile "\\includegraphics\[width=0.75\\textwidth, height=0.2\\textheight\]{../../../dox/resources/occt_logo.png}\\\\"; #\\\\\\\\ puts $texfile "{\\Large Open C\\-A\\-S\\-C\\-A\\-D\\-E Technology \\\\\[1ex\]\\Large [OverviewDoc_DetectCasVersion $latexDir/../../../] }\\\\" puts $texfile "\\vspace*{1cm}" puts $texfile "{\\Large $docLabel}\\\\" puts $texfile "\\vspace*{1cm}" # puts $texfile "{\\large Generated by Doxygen 1.8.4}\\\\" puts $texfile "\\vspace*{0.5cm}" puts $texfile "{\\small \\today}\\" puts $texfile "\\end{center}" puts $texfile "\\end{titlepage}" puts $texfile "\\clearpage" puts $texfile "\\pagenumbering{roman}" puts $texfile "\\tableofcontents" puts $texfile "\\newpage" puts $texfile "\\pagenumbering{arabic}" puts $texfile "\\hypersetup{pageanchor=true}" puts $texfile "" puts $texfile "\\let\\stdsection\\section" puts $texfile " \\renewcommand\\section{\\pagebreak\\stdsection}" puts $texfile "\\hypertarget{$fileName}{}" puts $texfile "\\input{$fileName}" puts $texfile "" puts $texfile "% Index" puts $texfile "\\newpage" puts $texfile "\\phantomsection" puts $texfile "\\addcontentsline{toc}{part}{Index}" puts $texfile "\\printindex\n" puts $texfile "\\end{document}" close $texfile } # Postprocesses generated TeX files proc OverviewDoc_ProcessTex {{texFiles {}} {latexDir} verboseMode} { foreach TEX $texFiles { if {$verboseMode == "YES"} { puts "INFO: Preprocessing file $TEX" } if {![file exists $TEX]} { puts "file $TEX doesn't exist" return } set IN_F [open "$TEX" r] set TMPFILENAME "$latexDir/temp.tex" set OUT_F [open $TMPFILENAME w] while {1} { set line [gets $IN_F] if { [string first "\\includegraphics" $line] != -1 } { # replace svg extension by pdf set line [regsub {[.]svg} $line ".pdf"] # Center images in TeX files set line "\\begin{center}\n $line\n\\end{center}" } elseif { [string first "\\subsection" $line] != -1 } { # Replace \subsection with \section tag regsub -all "\\\\subsection" $line "\\\\section" line } elseif { [string first "\\subsubsection" $line] != -1 } { # Replace \subsubsection with \subsection tag regsub -all "\\\\subsubsection" $line "\\\\subsection" line } elseif { [string first "\\paragraph" $line] != -1 } { # Replace \paragraph with \subsubsection tag regsub -all "\\\\paragraph" $line "\\\\subsubsection" line } puts $OUT_F $line if {[eof $IN_F]} { close $IN_F close $OUT_F break } } file delete -force $TEX file rename $TMPFILENAME $TEX } } # Convert SVG files to PDF format to allow including them to PDF # (requires InkScape to be in PATH) proc OverviewDoc_ProcessSvg {latexDir verboseMode} { foreach file [glob -nocomplain $latexDir/*.svg] { if {$verboseMode == "YES"} { puts "INFO: Converting file $file" } set pdffile "[file rootname $file].pdf" if { [catch {exec inkscape -z -D --file=$file --export-pdf=$pdffile} res] } { puts "Error: $res" puts "Conversion failed; check that Inkscape is in PATH!" puts "SVG images will be lost in PDF documents" return } } } # Main procedure for documents compilation proc OverviewDoc_Main { {docfiles {}} generatorMode docLabel verboseMode searchMode hhcPath mathjaxLocation} { set INDIR [file normalize [file dirname [info script]]] set CASROOT [file normalize [file dirname "$INDIR/../../"]] set OUTDIR $CASROOT/doc set PDFDIR $OUTDIR/overview/pdf set HTMLDIR $OUTDIR/overview/html set LATEXDIR $OUTDIR/overview/latex set TAGFILEDIR $OUTDIR/refman set DOXYFILE $OUTDIR/OCCT.cfg # Create or clean the output folders if {[file exists $OUTDIR] == 0} { file mkdir $OUTDIR } if {[file exists $HTMLDIR] == 0} { file mkdir $HTMLDIR } if {[file exists $PDFDIR] == 0} { file mkdir $PDFDIR } if {[file exists $LATEXDIR]} { #file delete {*}[glob -nocomplain $LATEXDIR/*.*] file delete -force $LATEXDIR } file mkdir $LATEXDIR # is MathJax HLink? set mathjax_relative_location $mathjaxLocation if { [file isdirectory "$mathjaxLocation"] == 1 } { if { $generatorMode == "HTML_ONLY"} { # related path set mathjax_relative_location [relativePath $HTMLDIR $mathjaxLocation] } elseif { $generatorMode == "CHM_ONLY"} { # absolute path set mathjax_relative_location [file normalize $mathjaxLocation] } } # Run tools to compile documents puts "[clock format [clock seconds] -format {%Y-%m-%d %H:%M}] Generating Doxyfile..." OverviewDoc_MakeDoxyfile $CASROOT "$OUTDIR/overview" $TAGFILEDIR $DOXYFILE $generatorMode $docfiles $verboseMode $searchMode $hhcPath $mathjax_relative_location # Run doxygen tool set starttimestamp [clock format [clock seconds] -format {%Y-%m-%d %H:%M}] if { $generatorMode == "HTML_ONLY"} { puts "$starttimestamp Generating HTML files..." } elseif { $generatorMode == "CHM_ONLY" } { puts "$starttimestamp Generating CHM file..." } set RESULT [catch {exec doxygen $DOXYFILE > $OUTDIR/doxygen_out.log} DOX_ERROR] if {$RESULT != 0} { if {[llength [split $DOX_ERROR "\n"]] > 1} { if {$verboseMode == "YES"} { puts "Error running Doxygen; see log in\n$OUTDIR/doxygen_warnings_and_errors.log" } set DOX_ERROR_FILE [open "$OUTDIR/doxygen_warnings_and_errors.log" "w"] puts $DOX_ERROR_FILE $DOX_ERROR close $DOX_ERROR_FILE } else { puts $DOX_ERROR } } # Close the Doxygen application after 300 # Start PDF generation routine if { $generatorMode == "PDF_ONLY" } { puts "[clock format [clock seconds] -format {%Y-%m-%d %H:%M}] Generating PDF files..." set OS $::tcl_platform(platform) if { $OS == "unix" } { set PREFIX ".sh" } elseif { $OS == "windows" } { set PREFIX ".bat" } # Prepare a list of TeX files, generated by Doxygen cd $LATEXDIR set TEXFILES [glob $LATEXDIR -type f -directory $LATEXDIR -tails "*.tex" ] set REFMAN_IDX [lsearch $TEXFILES "refman.tex"] set TEXFILES [lreplace $TEXFILES $REFMAN_IDX $REFMAN_IDX] set IDX [lsearch $TEXFILES "$LATEXDIR"] while { $IDX != -1} { set TEXFILES [lreplace $TEXFILES $IDX $IDX] set IDX [lsearch $TEXFILES "$LATEXDIR"] } if {$verboseMode == "YES"} { puts "Preprocessing generated TeX files..." } OverviewDoc_ProcessTex $TEXFILES $LATEXDIR $verboseMode if {$verboseMode == "YES"} { puts "Converting SVG images to PNG format..." } OverviewDoc_ProcessSvg $LATEXDIR $verboseMode if {$verboseMode == "YES"} { puts "Generating PDF files from TeX files..." } foreach TEX $TEXFILES { # Rewrite existing REFMAN.tex file... set TEX [string range $TEX 0 [ expr "[string length $TEX] - 5"]] OverviewDoc_MakeRefmanTex $TEX $LATEXDIR $docLabel $verboseMode if {$verboseMode == "YES"} { puts "INFO: Generating PDF file from $TEX" # ...and use it to generate PDF from TeX... puts "Executing $LATEXDIR/make$PREFIX..." } set RESULT [catch {eval exec [auto_execok $LATEXDIR/make$PREFIX] > "$OUTDIR/pdflatex_out.log"} LaTeX_ERROR] if {$RESULT != 0} { if {[llength [split $LaTeX_ERROR "\n"]] > 1} { if {$verboseMode == "YES"} { puts "Errors running Latex; see log in \n$OUTDIR/pdflatex_warnings_and_errors.log" } set LaTeX_ERROR_FILE [open "$OUTDIR/pdflatex_warnings_and_errors.log" "w"] puts $LaTeX_ERROR_FILE $LaTeX_ERROR close $LaTeX_ERROR_FILE } else { puts $DOX_ERROR } } # ...and place it to the specific folder if { [file exists $PDFDIR/$TEX.pdf] == 1 } { file delete -force $PDFDIR/$TEX.pdf } if {![file exists "$LATEXDIR/refman.pdf"]} { puts "Error: Latex failed to create $LATEXDIR/refman.pdf" return } file rename $LATEXDIR/refman.pdf "$PDFDIR/$TEX.pdf" } } cd $INDIR puts "[clock format [clock seconds] -format {%Y-%m-%d %H:%M}] Generation completed" if { $generatorMode == "HTML_ONLY" } { puts "View generated HTML documentation by opening:" puts "$OUTDIR/overview/html/index.html" } if { $generatorMode == "PDF_ONLY" } { puts "PDF files are generated in folder:" puts "$OUTDIR/overview/pdf" } } proc relativePath {thePathFrom thePathTo} { if { [file isdirectory "$thePathFrom"] == 0 } { return "" } set aPathFrom [file normalize "$thePathFrom"] set aPathTo [file normalize "$thePathTo"] set aCutedPathFrom "${aPathFrom}/dummy" set aRelatedDeepPath "" while { "$aCutedPathFrom" != [file normalize "$aCutedPathFrom/.."] } { set aCutedPathFrom [file normalize "$aCutedPathFrom/.."] # does aPathTo contain aCutedPathFrom? regsub -all $aCutedPathFrom $aPathTo "" aPathFromAfterCut if { "$aPathFromAfterCut" != "$aPathTo" } { # if so if { "$aCutedPathFrom" == "$aPathFrom" } { # just go higher, for example, ./somefolder/someotherfolder set aPathTo ".${aPathTo}" } elseif { "$aCutedPathFrom" == "$aPathTo" } { # remove the last "/" set aRelatedDeepPath [string replace $aRelatedDeepPath end end ""] } regsub -all $aCutedPathFrom $aPathTo $aRelatedDeepPath aPathToAfterCut regsub -all "//" $aPathToAfterCut "/" aPathToAfterCut return $aPathToAfterCut } set aRelatedDeepPath "$aRelatedDeepPath../" } return $thePathTo } # A command for User Documentation compilation proc occdoc {args} { # Programm options set GEN_MODE "HTML_ONLY" set DOCFILES {} set DOCLABEL "Default OCCT Document" set VERB_MODE "NO" set SEARCH_MODE "none" set hhcPath "" set mathjax_location "http://cdn.mathjax.org/mathjax/latest" set mathjax_js_name "MathJax.js" global available_docfiles global tcl_platform global args_names global args_values global env # Load list of docfiles if { [OverviewDoc_LoadFilesList] != 0 } { puts "ERROR: File FILES.txt was not found" return } # Parse CL arguments if {[OverviewDoc_ParseArguments $args] == 1} { return } foreach arg_n $args_names { if {$arg_n == "h"} { OverviewDoc_PrintHelpMessage return } elseif {$arg_n == "html"} { set GEN_MODE "HTML_ONLY" } elseif {$arg_n == "chm"} { set GEN_MODE "CHM_ONLY" if {"$tcl_platform(platform)" == "windows" && [lsearch $args_names hhc] == -1} { if { [info exist env(ProgramFiles\(x86\))] } { set hhcPath "$env(ProgramFiles\(x86\))\\HTML Help Workshop\\hhc.exe" puts "Info: hhc found: $hhcPath" } elseif { [info exist env(ProgramFiles)] } { set hhcPath "$env(ProgramFiles)\\HTML Help Workshop\\hhc.exe" puts "Info: hhc found: $hhcPath" } if { ! [file exists $hhcPath] } { puts "Error: HTML Help Compiler is not found in standard location [file dirname $hhcPath]; use option -hhc" return } } } elseif {$arg_n == "hhc"} { global tcl_platform if { $tcl_platform(platform) != "windows" } { continue } if {$args_values(hhc) != "NULL"} { set hhcPath $args_values(hhc) if { [file isdirectory $hhcPath] } { set hhcPath [file join ${hhcPath} hhc.exe] } if { ! [file exists $hhcPath] } { puts "Error: HTML Help Compiler is not found in $hhcPath" return } } else { puts "Error in argument hhc" return } } elseif {$arg_n == "pdf"} { set GEN_MODE "PDF_ONLY" } elseif {$arg_n == "v"} { set VERB_MODE "YES" } elseif {$arg_n == "m"} { if {$args_values(m) != "NULL"} { set DOCFILES $args_values(m) } else { puts "Error in argument m" return } # Check if all chosen docfiles are correct foreach docfile $DOCFILES { if { [lsearch $available_docfiles $docfile] == -1 } { puts "File \"$docfile\" is not presented in the list of available docfiles" puts "Please, specify the correct docfile name" return } else { puts "File $docfile is presented in FILES.TXT" } } } elseif {$arg_n == "l"} { if { [llength $DOCFILES] <= 1 } { if {$args_values(l) != "NULL"} { set DOCLABEL $args_values(l) } else { puts "Error in argument l" return } } } elseif {$arg_n == "s"} { if {$args_values(s) != "NULL"} { set SEARCH_MODE $args_values(s) } else { puts "Error in argument s" return } } elseif {$arg_n == "mathjax"} { if {![info exists args_values(pdf)]} { set possible_mathjax_loc $args_values(mathjax) if {[file exist [file join $possible_mathjax_loc $mathjax_js_name]]} { set mathjax_location $args_values(mathjax) puts "$mathjax_location" } else { puts "Warning: $mathjax_js_name isn't found in $possible_mathjax_loc." puts " MathJax will be used from $mathjax_location" } } else { puts "Info: MathJax is not used with pdf and will be ignored" } } else { puts "\nWrong argument: $arg_n" OverviewDoc_PrintHelpMessage return } } # Specify verbose mode if { $GEN_MODE != "PDF_ONLY" && [llength $DOCFILES] > 1 } { set DOCLABEL "" } # If we don't specify list for docfiles with -m argument, # we assume that we have to generate all docfiles if { [llength $DOCFILES] == 0 } { set DOCFILES $available_docfiles } # Start main activities OverviewDoc_Main $DOCFILES $GEN_MODE $DOCLABEL $VERB_MODE $SEARCH_MODE $hhcPath $mathjax_location }