1 #!/usr/bin/perl -w 2 # 3 # $RCSfile: TextFilesToHTML.pl,v $ 4 # $Date: 2015/02/28 20:46:21 $ 5 # $Revision: 1.41 $ 6 # 7 # Author: Manish Sud <msud@san.rr.com> 8 # 9 # Copyright (C) 2015 Manish Sud. All rights reserved. 10 # 11 # This file is part of MayaChemTools. 12 # 13 # MayaChemTools is free software; you can redistribute it and/or modify it under 14 # the terms of the GNU Lesser General Public License as published by the Free 15 # Software Foundation; either version 3 of the License, or (at your option) any 16 # later version. 17 # 18 # MayaChemTools is distributed in the hope that it will be useful, but without 19 # any warranty; without even the implied warranty of merchantability of fitness 20 # for a particular purpose. See the GNU Lesser General Public License for more 21 # details. 22 # 23 # You should have received a copy of the GNU Lesser General Public License 24 # along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or 25 # write to the Free Software Foundation Inc., 59 Temple Place, Suite 330, 26 # Boston, MA, 02111-1307, USA. 27 # 28 29 use strict; 30 use FindBin; use lib "$FindBin::Bin/../lib"; 31 use Getopt::Long; 32 use File::Basename; 33 use Text::ParseWords; 34 use Benchmark; 35 use FileUtil; 36 use TextUtil; 37 use HTMLUtil; 38 39 my($ScriptName, %Options, $StartTime, $EndTime, $TotalTime); 40 41 # Autoflush STDOUT 42 $| = 1; 43 44 # Starting message... 45 $ScriptName = basename($0); 46 print "\n$ScriptName: Starting...\n\n"; 47 $StartTime = new Benchmark; 48 49 # Get the options and setup script... 50 SetupScriptUsage(); 51 if ($Options{help} || @ARGV < 1) { 52 die GetUsageFromPod("$FindBin::Bin/$ScriptName"); 53 } 54 55 my(@TextFilesList); 56 @TextFilesList = ExpandFileNames(\@ARGV, "csv tsv"); 57 58 print "Processing options...\n"; 59 my(%OptionsInfo); 60 ProcessOptions(); 61 62 print "Checking input text file(s)...\n"; 63 my(%TextFilesInfo); 64 RetrieveTextFilesInfo(); 65 SetupCoulmnsTablesAndMiscInfo(); 66 67 # Generate output files... 68 my($FileIndex); 69 if (@TextFilesList > 1) { 70 print "\nProcessing text files...\n"; 71 } 72 for $FileIndex (0 .. $#TextFilesList) { 73 if ($TextFilesInfo{FileOkay}[$FileIndex]) { 74 print "\nProcessing file $TextFilesList[$FileIndex]...\n"; 75 GenerateHTMLTable($FileIndex); 76 } 77 } 78 print "\n$ScriptName:Done...\n\n"; 79 80 $EndTime = new Benchmark; 81 $TotalTime = timediff ($EndTime, $StartTime); 82 print "Total time: ", timestr($TotalTime), "\n"; 83 84 ############################################################################### 85 86 # Generate HTML table(s)... 87 sub GenerateHTMLTable { 88 my($Index) = @_; 89 90 if ($TextFilesInfo{MultipleHTMLTables}[$Index]) { 91 GenerateMultipleHTMLTable($Index); 92 } 93 else { 94 GenerateOneHTMLTable($Index); 95 } 96 } 97 98 # Generate one table... 99 sub GenerateOneHTMLTable { 100 my($Index) = @_; 101 my($TextFile, $TopHTMLDir, $HTMLFile, $Line, $StartRowNum, $EndRowNum, $CSSFile, $CSSFilePath, $CSSRef); 102 103 $HTMLFile = $TextFilesInfo{HTMLRoot}[$Index] . ".html"; 104 $TextFile = $TextFilesList[$Index]; 105 106 # Setup data directories... 107 ($TopHTMLDir) = SetupDataDirs($Index); 108 109 # Setup stylesheet file... 110 $CSSRef = ""; 111 if ($Options{stylesheet} =~ /^new$/i) { 112 $CSSFile = $TextFilesInfo{HTMLRoot}[$Index] . ".css"; $CSSRef = ".\/" . "$CSSFile"; 113 $CSSFilePath = "$TopHTMLDir" . "\/" . $CSSFile; 114 GenerateStyleSheetFile($CSSFilePath); 115 } 116 elsif ($Options{stylesheet} =~ /^old$/i) { 117 $CSSRef = $Options{stylesheetname}; 118 } 119 # Set HTML file location... 120 $HTMLFile = "$TopHTMLDir" . "\/" . $HTMLFile; 121 122 print "Generating HTML file $HTMLFile...\n"; 123 open HTMLFILE, ">$HTMLFile" or die "Error: Can't open $HTMLFile: $! \n"; 124 open TEXTFILE, "$TextFile" or die "Error: Can't open $TextFile: $! \n"; 125 126 # Write out HTML page header... 127 print HTMLFILE SetupHTMLPageHeader($TextFilesInfo{HTMLTitle}[$Index], $CSSRef); 128 if ($OptionsInfo{TitleDisplay}) { 129 print HTMLFILE SetupHTMLPageTitle($TextFilesInfo{HTMLTitle}[$Index]); 130 } 131 else { 132 print HTMLFILE SetupHTMLEmptyLines(1); 133 } 134 135 # Start the table... 136 print HTMLFILE SetupHTMLAlignmentBegin("center"); 137 print HTMLFILE SetupHTMLTableHeader($OptionsInfo{TableBorder}, $OptionsInfo{TableCellPadding}, $OptionsInfo{TableCellSpacing}); 138 139 WriteColLabels($Index, \*TEXTFILE, \*HTMLFILE); 140 141 # Skip the labels and write out all the other rows... 142 $Line = <TEXTFILE>; 143 $StartRowNum = 1; 144 $EndRowNum = $TextFilesInfo{LineCount}[$Index]; 145 WriteRowValues($Index, $StartRowNum, $EndRowNum, \*TEXTFILE, \*HTMLFILE); 146 147 # Finish up the table... 148 print HTMLFILE SetupHTMLTableEnd(); 149 print HTMLFILE SetupHTMLAlignmentEnd("center"); 150 151 # Write out HTML page end... 152 print HTMLFILE SetupHTMLPageEnd($OptionsInfo{Footer}); 153 154 close HTMLFILE; 155 close TEXTFILE; 156 } 157 158 # Generate multiple tables... 159 sub GenerateMultipleHTMLTable { 160 my($Index) = @_; 161 my($TopHTMLDir, $SubHTMLDir, $TextFile, $HTMLFile, $TableNum, $TableCount, $TableIndex, $TableStartLineNum, $TableEndLineNum, $Line, $InSubHTMLDir, $PrintMsg, $CSSFile, $CSSFilePath, $CSSRef, $NewStyleSheet); 162 163 # Open text file and skip over label line... 164 $TextFile = $TextFilesList[$Index]; 165 open TEXTFILE, "$TextFile" or die "Error: Can't open $TextFile: $! \n"; 166 $Line = <TEXTFILE>; 167 168 # Set up data directories to hold various html files... 169 ($TopHTMLDir, $SubHTMLDir) = SetupDataDirs($Index); 170 171 # Create stylesheet file... 172 $CSSRef = ""; 173 $NewStyleSheet = 0; 174 if ($Options{stylesheet} =~ /^new$/i) { 175 $NewStyleSheet = 1; 176 $CSSFile = $TextFilesInfo{HTMLRoot}[$Index] . ".css"; 177 $CSSFilePath = "$TopHTMLDir" . "\/" . $CSSFile; 178 GenerateStyleSheetFile($CSSFilePath); 179 } 180 elsif ($Options{stylesheet} =~ /^old$/i) { 181 $CSSRef = $Options{stylesheetname}; 182 } 183 184 $PrintMsg = 1; 185 # Generate HTML files for all the tables... 186 $TableCount = $TextFilesInfo{TableCount}[$Index]; 187 for $TableNum (1 .. $TableCount) { 188 $TableIndex = $TableNum - 1; 189 $HTMLFile = ${$TextFilesInfo{TableHTMLFiles}[$Index]}[$TableIndex]; 190 $TableStartLineNum = ${$TextFilesInfo{TableStartLineNum}[$Index]}[$TableIndex]; 191 $TableEndLineNum = ${$TextFilesInfo{TableEndLineNum}[$Index]}[$TableIndex]; 192 193 # Setup file name... 194 if ($TableNum == 1) { 195 $HTMLFile = "$TopHTMLDir" . "\/" . $HTMLFile; 196 print "Generating HTML file $HTMLFile...\n"; 197 } 198 else { 199 $HTMLFile = "$SubHTMLDir" . "\/" . $HTMLFile; 200 if ($PrintMsg) { 201 $PrintMsg = 0; 202 if ($TableCount == 2) { 203 print "Generating HTML file $HTMLFile...\n"; 204 } 205 else { 206 print "Generating ", ($TableCount - 1), " other HTML files: $SubHTMLDir\/$TextFilesInfo{HTMLRoot}[$Index]\*.html...\n"; 207 } 208 } 209 } 210 # Setup stylesheet reference... 211 if ($NewStyleSheet) { 212 $CSSRef = ($TableNum == 1) ? ".\/" : "..\/"; 213 $CSSRef .= $CSSFile; 214 } 215 216 open HTMLFILE, ">$HTMLFile" or die "Error: Can't open $HTMLFile: $! \n"; 217 # Write out HTML page header... 218 print HTMLFILE SetupHTMLPageHeader($TextFilesInfo{HTMLTitle}[$Index], $CSSRef); 219 220 # Set up the navigation links for this table... 221 if ($OptionsInfo{NavLinksAtTop}) { 222 WriteNavigationLinks($Index, $TableNum, \*HTMLFILE); 223 } 224 # Setup page title... 225 if ($OptionsInfo{TitleDisplay}) { 226 print HTMLFILE SetupHTMLPageTitle($TextFilesInfo{HTMLTitle}[$Index]); 227 } 228 else { 229 print HTMLFILE SetupHTMLEmptyLines(1); 230 } 231 232 # Start the table... 233 print HTMLFILE SetupHTMLAlignmentBegin("center"); 234 print HTMLFILE SetupHTMLTableHeader($OptionsInfo{TableBorder}, $OptionsInfo{TableCellPadding}, $OptionsInfo{TableCellSpacing}); 235 236 WriteColLabels($Index, \*TEXTFILE, \*HTMLFILE); 237 238 # Write out appropriate row data for this table... 239 WriteRowValues($Index, $TableStartLineNum, $TableEndLineNum, \*TEXTFILE, \*HTMLFILE); 240 241 # Finish up the table... 242 print HTMLFILE SetupHTMLTableEnd(); 243 print HTMLFILE SetupHTMLAlignmentEnd("center"); 244 245 # Set up the navigation links for this table... 246 if ($OptionsInfo{NavLinksAtBottom}) { 247 print HTMLFILE SetupHTMLEmptyLines(1); 248 WriteNavigationLinks($Index, $TableNum, \*HTMLFILE); 249 } 250 251 # Write out HTML page end... 252 print HTMLFILE SetupHTMLPageEnd($OptionsInfo{Footer}); 253 close HTMLFILE; 254 } 255 close TEXTFILE; 256 257 } 258 259 # Create stylesheet file... 260 sub GenerateStyleSheetFile { 261 my($CSSFile) = @_; 262 print "Generating stylesheet file $CSSFile...\n"; 263 open CSSFILE, ">$CSSFile" or die "Error: Can't open $CSSFile: $! \n"; 264 print CSSFILE SetupHTMLStyleSheetTags(); 265 close CSSFILE; 266 } 267 268 # Write out table header using column labels... 269 sub WriteColLabels { 270 my($Index, $TextFileRef, $HTMLFileRef) = @_; 271 my(@ColLabels, $Label); 272 273 print $HTMLFileRef $TextFilesInfo{TableRowHeaderTags}; 274 275 @ColLabels = @{$TextFilesInfo{ColLabels}[$Index]}; 276 for $Label (@ColLabels) { 277 print $HTMLFileRef SetupHTMLTableRowHeaderValue($Label); 278 } 279 print $HTMLFileRef $TextFilesInfo{RowEndTags}; 280 } 281 282 #Write out the rows value... 283 sub WriteRowValues { 284 my($Index, $StartRowNum, $EndRowNum, $TextFileRef, $HTMLFileRef) = @_; 285 my($ColNum, $BackgroundColor, $FontColor, $LineCount, $Line, @RowValues, $Value, $InDelim, $LastColNum); 286 287 $InDelim = $TextFilesInfo{InDelim}[$Index]; 288 $LastColNum = @{$TextFilesInfo{ColLabels}[$Index]} - 1; 289 290 for $LineCount ($StartRowNum .. $EndRowNum) { 291 $Line = GetTextLine($TextFileRef); 292 293 if ($OptionsInfo{ShadeRowsStatus}) { 294 print $HTMLFileRef ($LineCount % 2) ? $TextFilesInfo{BgFilledOddRowHeaderTags} : $TextFilesInfo{BgFilledEvenRowHeaderTags}; 295 } 296 else { 297 print $HTMLFileRef $TextFilesInfo{RowHeaderTags}; 298 } 299 @RowValues = quotewords($InDelim, 0, $Line); 300 for $ColNum (0 .. $LastColNum) { 301 $Value = ($ColNum <= $#RowValues) ? $RowValues[$ColNum] : ""; 302 $BackgroundColor = ""; $FontColor = ""; 303 if ($OptionsInfo{HighlightStatus}) { 304 if (exists($TextFilesInfo{HightlightColNumMap}[$Index]{$ColNum})) { 305 ($BackgroundColor, $FontColor) = GetValueHighlightColors($Index, $ColNum, $Value); 306 } 307 } 308 print $HTMLFileRef SetupHTMLTableRowDataValue($Value, $BackgroundColor, $FontColor); 309 } 310 print $HTMLFileRef $TextFilesInfo{RowEndTags}; 311 } 312 } 313 314 # Setup navigation link information for each table. 315 # 316 # All table sets besides first and last have these links: FirstTable, Previous, Current-1,Current,Current+1, Next, and LastTable 317 # First set: Current, Next, and LastTable 318 # Last set: FirstTable, Previous and Current. 319 # 320 sub WriteNavigationLinks { 321 my($Index, $CurTableNum, $HTMLFileRef) = @_; 322 my($TableNum, $StartTableNum, $EndTableNum, $TableIndex, $BorderWidth, $CellPadding, $CellSpacing,$HTMLFile, $HTMLRefFile, $RelativeFileDir, $HTMLRefValue, $FirstTableNum, $FirstTableIndex, $LastTableNum, $LastTableIndex, $TableStartLineNum, $TableEndLineNum, $LastLineNum, $BGColor, $LinksOffSet); 323 324 $LinksOffSet = 10; 325 326 $FirstTableNum = 1; $FirstTableIndex = $FirstTableNum - 1; 327 $LastTableNum = $TextFilesInfo{TableCount}[$Index]; $LastTableIndex = $LastTableNum - 1; 328 $LastLineNum = ${$TextFilesInfo{TableEndLineNum}[$Index]}[$LastTableIndex]; 329 330 # Figure out which links to display for a particular table... 331 $StartTableNum = $CurTableNum - $LinksOffSet + 1; 332 $StartTableNum = ($StartTableNum < $FirstTableNum) ? $FirstTableNum : $StartTableNum; 333 if ($CurTableNum < $LinksOffSet) { 334 $EndTableNum = $LinksOffSet; 335 } 336 else { 337 $EndTableNum = $CurTableNum + $LinksOffSet - 1; 338 } 339 $EndTableNum = ($EndTableNum > $LastTableNum) ? $LastTableNum : $EndTableNum; 340 341 my($InactiveLinkNumColor, $InactiveLinkFontBold) = ("#8e2323", "1"); 342 my($LinkTextColor, $LinkBGColor, $LinkFontBold) = ("", "", "1"); 343 344 # Start link table... 345 $BorderWidth = 0; $CellPadding = 2; $CellSpacing = 2; 346 print $HTMLFileRef SetupHTMLAlignmentBegin("center"); 347 print $HTMLFileRef SetupHTMLDivBegin("tablenav"); 348 print $HTMLFileRef SetupHTMLTableHeader($BorderWidth, $CellPadding, $CellSpacing); 349 print $HTMLFileRef $TextFilesInfo{RowHeaderTags}; 350 351 if ($OptionsInfo{NavLinksTableInfo} && $OptionsInfo{NavLinksLineInfo}) { 352 print $HTMLFileRef SetupHTMLTableRowDataValue("Showing table $CurTableNum of $LastTableNum"); 353 print $HTMLFileRef SetupHTMLTableRowDataValue(" "); 354 print $HTMLFileRef SetupHTMLTableRowDataValue(" "); 355 } 356 357 print $HTMLFileRef SetupHTMLTableRowDataValue("Tables: "); 358 # Setup a link to first table... 359 if ($StartTableNum != $FirstTableNum) { 360 $HTMLFile = ${$TextFilesInfo{TableHTMLFiles}[$Index]}[$FirstTableIndex]; 361 $HTMLRefFile = GetRelativeFileDir($CurTableNum, $FirstTableNum, $FirstTableNum) . $HTMLFile; 362 $TableStartLineNum = ${$TextFilesInfo{TableStartLineNum}[$Index]}[$FirstTableIndex]; 363 $TableEndLineNum = ${$TextFilesInfo{TableEndLineNum}[$Index]}[$FirstTableIndex]; 364 $HTMLRefValue = SetupHTMLHRef("First", $HTMLRefFile, "First Table Containing Lines $TableStartLineNum To $TableEndLineNum"); 365 print $HTMLFileRef SetupHTMLTableRowDataValue($HTMLRefValue, $LinkBGColor, $LinkTextColor, $LinkFontBold); 366 } 367 368 # Setup link to previous table... 369 if ($CurTableNum != $FirstTableNum) { 370 my($PreviousTableNum, $PreviousTableIndex); 371 $PreviousTableNum = $CurTableNum - 1; $PreviousTableIndex = $PreviousTableNum - 1; 372 $HTMLFile = ${$TextFilesInfo{TableHTMLFiles}[$Index]}[$PreviousTableIndex]; 373 $HTMLRefFile = GetRelativeFileDir($CurTableNum, $PreviousTableNum, $FirstTableNum) . $HTMLFile; 374 $TableStartLineNum = ${$TextFilesInfo{TableStartLineNum}[$Index]}[$PreviousTableIndex]; 375 $TableEndLineNum = ${$TextFilesInfo{TableEndLineNum}[$Index]}[$PreviousTableIndex]; 376 $HTMLRefValue = SetupHTMLHRef("Previous", $HTMLRefFile, "Previous Table Containing Lines $TableStartLineNum To $TableEndLineNum"); 377 print $HTMLFileRef SetupHTMLTableRowDataValue($HTMLRefValue, $LinkBGColor, $LinkTextColor, $LinkFontBold); 378 } 379 380 for $TableNum ($StartTableNum .. $EndTableNum) { 381 $TableIndex = $TableNum - 1; 382 $HTMLFile = ${$TextFilesInfo{TableHTMLFiles}[$Index]}[$TableIndex]; 383 if ($TableNum == $CurTableNum) { 384 print $HTMLFileRef SetupHTMLTableRowDataValue($TableNum, $LinkBGColor, $InactiveLinkNumColor, $InactiveLinkFontBold); 385 } 386 else { 387 # Setup the link... 388 my($RefTitle); 389 $TableStartLineNum = ${$TextFilesInfo{TableStartLineNum}[$Index]}[$TableIndex]; 390 $TableEndLineNum = ${$TextFilesInfo{TableEndLineNum}[$Index]}[$TableIndex]; 391 $RefTitle = AddNumberSuffix($TableNum) . " Table Containing Lines $TableStartLineNum To $TableEndLineNum"; 392 $HTMLRefFile = GetRelativeFileDir($CurTableNum, $TableNum, $FirstTableNum) . $HTMLFile; 393 $HTMLRefValue = SetupHTMLHRef($TableNum, $HTMLRefFile, $RefTitle); 394 print $HTMLFileRef SetupHTMLTableRowDataValue($HTMLRefValue); 395 } 396 } 397 398 # Setup link to next table... 399 if ($CurTableNum != $LastTableNum) { 400 my($NextTableNum, $NextTableIndex); 401 $NextTableNum = $CurTableNum + 1; $NextTableIndex = $NextTableNum - 1; 402 $HTMLFile = ${$TextFilesInfo{TableHTMLFiles}[$Index]}[$NextTableIndex]; 403 $HTMLRefFile = GetRelativeFileDir($CurTableNum, $NextTableNum, $FirstTableNum) . $HTMLFile; 404 $TableStartLineNum = ${$TextFilesInfo{TableStartLineNum}[$Index]}[$NextTableIndex]; 405 $TableEndLineNum = ${$TextFilesInfo{TableEndLineNum}[$Index]}[$NextTableIndex]; 406 $HTMLRefValue = SetupHTMLHRef("Next", $HTMLRefFile, "Next Table Containing Lines $TableStartLineNum To $TableEndLineNum"); 407 print $HTMLFileRef SetupHTMLTableRowDataValue($HTMLRefValue, $LinkBGColor, $LinkTextColor, $LinkFontBold); 408 } 409 410 # Setup link to last table... 411 if ($EndTableNum != $LastTableNum) { 412 $HTMLFile = ${$TextFilesInfo{TableHTMLFiles}[$Index]}[$LastTableIndex]; 413 $HTMLRefFile = GetRelativeFileDir($CurTableNum, $LastTableNum, $FirstTableNum) . $HTMLFile; 414 $TableStartLineNum = ${$TextFilesInfo{TableStartLineNum}[$Index]}[$LastTableIndex]; 415 $TableEndLineNum = ${$TextFilesInfo{TableEndLineNum}[$Index]}[$LastTableIndex]; 416 $HTMLRefValue = SetupHTMLHRef("Last", $HTMLRefFile, "Last Table Containing Lines $TableStartLineNum To $TableEndLineNum"); 417 print $HTMLFileRef SetupHTMLTableRowDataValue($HTMLRefValue, $LinkBGColor, $LinkTextColor, $LinkFontBold); 418 } 419 # Setup current table info text.... 420 print $HTMLFileRef SetupHTMLTableRowDataValue(" "); 421 print $HTMLFileRef SetupHTMLTableRowDataValue(" "); 422 $TableStartLineNum = ${$TextFilesInfo{TableStartLineNum}[$Index]}[$CurTableNum - 1]; 423 $TableEndLineNum = ${$TextFilesInfo{TableEndLineNum}[$Index]}[$CurTableNum - 1]; 424 if ($OptionsInfo{NavLinksLineInfo}) { 425 print $HTMLFileRef SetupHTMLTableRowDataValue("Showing lines $TableStartLineNum to $TableEndLineNum of $LastLineNum"); 426 } 427 else { 428 print $HTMLFileRef SetupHTMLTableRowDataValue("Showing table $CurTableNum of $LastTableNum"); 429 } 430 431 print $HTMLFileRef $TextFilesInfo{RowEndTags}; 432 # End link table... 433 print $HTMLFileRef SetupHTMLTableEnd(); 434 print $HTMLFileRef SetupHTMLDivEnd(); 435 print $HTMLFileRef SetupHTMLAlignmentEnd("center"); 436 } 437 438 # Generate relative directory path... 439 sub GetRelativeFileDir { 440 my($FromTableNum, $ToTableNum, $FirstTableNum) = @_; 441 my($RelativeFileDir) = ""; 442 443 if ($FromTableNum == $FirstTableNum) { 444 $RelativeFileDir = ($ToTableNum == $FirstTableNum) ? ".\/" : ".\/html\/"; 445 } 446 else { 447 $RelativeFileDir = ($ToTableNum == $FirstTableNum) ? "..\/" : ".\/"; 448 } 449 return $RelativeFileDir; 450 } 451 452 # Based on hightlight stype, return appropriate colors for background or text... 453 sub GetValueHighlightColors { 454 my($FileIndex, $ColNum, $Value) = @_; 455 my($DataType, $Criterion, $CriterionValue, $BgColor, $FontColor, $ValueOk, $Nothing); 456 457 $BgColor = ""; $FontColor = ""; 458 $DataType = ${$TextFilesInfo{HightlightDataMap}[$FileIndex]{$ColNum}}[0]; 459 $Criterion = ${$TextFilesInfo{HightlightDataMap}[$FileIndex]{$ColNum}}[1]; 460 $CriterionValue = ${$TextFilesInfo{HightlightDataMap}[$FileIndex]{$ColNum}}[2]; 461 462 $ValueOk = 0; 463 if ($DataType =~ /^numeric$/i) { 464 NUMSWITCH: { 465 if ($Criterion =~ /^ge$/i) { $ValueOk = ($Value >= $CriterionValue) ? 1 : 0; last NUMSWITCH; } 466 if ($Criterion =~ /^le$/i) { $ValueOk = ($Value <= $CriterionValue) ? 1 : 0; last NUMSWITCH; } 467 if ($Criterion =~ /^eq$/i) { $ValueOk = ($Value == $CriterionValue) ? 1 : 0; last NUMSWITCH; } 468 $Nothing = 1; 469 } 470 } 471 else { 472 TEXTSWITCH: { 473 if ($Criterion =~ /^ge$/i) { $ValueOk = ($Value ge $CriterionValue) ? 1 : 0; last TEXTSWITCH; } 474 if ($Criterion =~ /^le$/i) { $ValueOk = ($Value le $CriterionValue) ? 1 : 0; last TEXTSWITCH; } 475 if ($Criterion =~ /^eq$/i) { $ValueOk = ($Value eq $CriterionValue) ? 1 : 0; last TEXTSWITCH; } 476 $Nothing = 1; 477 } 478 } 479 $BgColor = $ValueOk ? $OptionsInfo{ValueOkColor} : $OptionsInfo{ValueNotOkColor}; 480 if ($Options{highlightstyle} =~ /^text$/i) { 481 $BgColor = ""; 482 $FontColor = $ValueOk ? $OptionsInfo{ValueOkColor} : $OptionsInfo{ValueNotOkColor}; 483 } 484 return ($BgColor, $FontColor); 485 } 486 487 # Setup columns, tables and other information... 488 sub SetupCoulmnsTablesAndMiscInfo { 489 SetupColumnsToHighlightInfo(); 490 SetupMultipleTablesInfo(); 491 SetupHTMLTagsInfo(); 492 } 493 494 # Setup columns to highlight information... 495 sub SetupColumnsToHighlightInfo { 496 my($ColID, $DataType, $Criterion, $Value, $Index, $ColNum, $ColLabel, $ColIndex); 497 498 @{$TextFilesInfo{HightlightColNumMap}} = (); 499 @{$TextFilesInfo{HightlightDataMap}} = (); 500 501 for $Index (0 .. $#TextFilesList) { 502 %{$TextFilesInfo{HightlightColNumMap}[$Index]} = (); 503 %{$TextFilesInfo{HightlightDataMap}[$Index]} = (); 504 if ($TextFilesInfo{FileOkay}[$Index]) { 505 SPECIFIEDCOLS: for $ColIndex (0 .. $#{$OptionsInfo{SpecifiedColIds}}) { 506 $ColID = $OptionsInfo{SpecifiedColIds}[$ColIndex]; 507 $DataType = $OptionsInfo{SpecifiedColDataTypes}[$ColIndex]; 508 $Criterion = $OptionsInfo{SpecifiedColCriteria}[$ColIndex]; 509 $Value = $OptionsInfo{SpecifiedColValues}[$ColIndex]; 510 if (!$OptionsInfo{HighlightStatus}) { 511 next SPECIFIEDCOLS; 512 } 513 if ($Options{highlightby} =~ /^colnum$/i) { 514 $ColNum = $ColID; 515 if ($ColNum > 0 && $ColNum <= $TextFilesInfo{ColCount}[$Index]) { 516 $ColNum -= 1; 517 } 518 else { 519 warn "Warning: Ignoring column number, $ColID, specifed in quartet, \"$ColID,$DataType,$Criterion,$Value\", using \"--highlight\" option for $TextFilesList[$Index]: it doesn't exists \n"; 520 next SPECIFIEDCOLS; 521 } 522 } 523 else { 524 $ColLabel = $ColID; 525 if (exists($TextFilesInfo{ColLabelToNumMap}[$Index]{$ColLabel})) { 526 $ColNum = $TextFilesInfo{ColLabelToNumMap}[$Index]{$ColLabel}; 527 } else { 528 warn "Warning: Ignoring column label, $ColID, specifed in quartet, \"$ColID,$DataType,$Criterion,$Value\", using \"--highlight\" option for $TextFilesList[$Index]: it doesn't exists \n"; 529 next SPECIFIEDCOLS; 530 } 531 } 532 $TextFilesInfo{HightlightColNumMap}[$Index]{$ColNum} = $ColNum; 533 @{$TextFilesInfo{HightlightDataMap}[$Index]{$ColNum}} =(); 534 push @{$TextFilesInfo{HightlightDataMap}[$Index]{$ColNum}}, ($DataType, $Criterion, $Value); 535 } 536 } 537 } 538 } 539 540 # Setup navigation link information for multiple tables... 541 sub SetupMultipleTablesInfo { 542 my($Index, $LinesPerTable); 543 544 $LinesPerTable = $Options{numrows}; 545 @{$TextFilesInfo{TableCount}} = (); 546 @{$TextFilesInfo{TableHTMLFiles}} = (); 547 @{$TextFilesInfo{TableStartLineNum}} = (); 548 @{$TextFilesInfo{TableEndLineNum}} = (); 549 550 for $Index (0 .. $#TextFilesList) { 551 $TextFilesInfo{TableCount}[$Index] = 1; 552 @{$TextFilesInfo{TableHTMLFiles}[$Index]} = (); 553 @{$TextFilesInfo{TableStartLineNum}[$Index]} = (); 554 @{$TextFilesInfo{TableEndLineNum}[$Index]} = (); 555 556 if ($TextFilesInfo{FileOkay}[$Index]) { 557 if ($TextFilesInfo{MultipleHTMLTables}[$Index]) { 558 my($TableIndex, $TotalLines, $TableCount, $TableStartLineNum, $TableEndLineNum, $Name); 559 560 $TotalLines = $TextFilesInfo{LineCount}[$Index]; 561 $TableCount = ($TotalLines % $LinesPerTable) ? (int($TotalLines/$LinesPerTable) + 1) : ($TotalLines/$LinesPerTable); 562 $TextFilesInfo{TableCount}[$Index] = $TableCount; 563 for $TableIndex (1 .. $TableCount) { 564 $TableStartLineNum = ($TableIndex - 1) * $LinesPerTable + 1; 565 $TableEndLineNum = ($TableIndex == $TableCount) ? $TotalLines : ($TableIndex * $LinesPerTable); 566 push @{$TextFilesInfo{TableStartLineNum}[$Index]}, $TableStartLineNum; 567 push @{$TextFilesInfo{TableEndLineNum}[$Index]}, $TableEndLineNum; 568 569 # Setup HTML file names for all the tables... 570 $Name = "Lines" . "$TableStartLineNum" . "To" . "$TableEndLineNum"; 571 if ($TableIndex == 1) { 572 $Name = ""; 573 } 574 $Name = $TextFilesInfo{HTMLRoot}[$Index] . $Name . ".html"; 575 push @{$TextFilesInfo{TableHTMLFiles}[$Index]}, $Name; 576 } 577 #print "$TextFilesList[$Index]: $TableCount - @{$TextFilesInfo{TableStartLineNum}[$Index]} - @{$TextFilesInfo{TableEndLineNum}[$Index]} - @{$TextFilesInfo{TableHTMLFiles}[$Index]}\n"; 578 } 579 } 580 } 581 } 582 583 # Setup HTML tags information... 584 sub SetupHTMLTagsInfo { 585 # Setup row tags... 586 $TextFilesInfo{RowHeaderTags} = ""; 587 $TextFilesInfo{RowEndTags} = ""; 588 $TextFilesInfo{BgFilledOddRowHeaderTags} = ""; 589 $TextFilesInfo{BgFilledEvenRowHeaderTags} = ""; 590 $TextFilesInfo{TableRowHeaderTags} = ""; 591 592 $TextFilesInfo{RowHeaderTags} = SetupHTMLTableRowHeader($OptionsInfo{RowHAlignment}, "", $OptionsInfo{RowVAlignment}); 593 $TextFilesInfo{RowEndTags} = SetupHTMLTableRowEnd(); 594 595 if ($OptionsInfo{ShadeRowsStatus}) { 596 $TextFilesInfo{BgFilledOddRowHeaderTags} = SetupHTMLTableRowHeader($OptionsInfo{RowHAlignment}, $OptionsInfo{OddRowsShadeColor}, $OptionsInfo{RowVAlignment}); 597 $TextFilesInfo{BgFilledEvenRowHeaderTags} = SetupHTMLTableRowHeader($OptionsInfo{RowHAlignment}, $OptionsInfo{EvenRowsShadeColor}, $OptionsInfo{RowVAlignment}); 598 } 599 600 $TextFilesInfo{TableRowHeaderTags} = SetupHTMLTableRowHeader($OptionsInfo{TableHeaderRowHAlignment}, $OptionsInfo{TableHeaderRowColor}, $OptionsInfo{TableHeaderRowVAlignment}); 601 602 } 603 604 #Make sure appropriate mode specific option values are specified... 605 sub ProcessOptions { 606 607 %OptionsInfo = (); 608 609 $OptionsInfo{RowHAlignment} = "left"; $OptionsInfo{RowVAlignment} = "middle"; 610 if (exists($Options{align})) { 611 my (@AlignValues) = split ",", $Options{align}; 612 if (@AlignValues == 2) { 613 $OptionsInfo{RowHAlignment} = $AlignValues[0]; 614 $OptionsInfo{RowVAlignment} = $AlignValues[1]; 615 } 616 elsif (@AlignValues == 1) { 617 $OptionsInfo{RowHAlignment} = $AlignValues[0]; 618 } 619 else { 620 die "Error: Invalid number of values, ", scalar(@AlignValues) , ", specified by \"-a --align\" option.\nIt must contain only one or two value.\n"; 621 } 622 if ($OptionsInfo{RowHAlignment} !~ /^(left|center|right)$/i) { 623 die "Error: The horizontal alignment value specified, $Options{align}, for option \"-a --align\" is not valid. Allowed values: left, center, or right\n"; 624 } 625 if ($OptionsInfo{RowVAlignment} !~ /^(top|middle|bottom)$/i) { 626 die "Error: The horizontal alignment value specified, $Options{align}, for option \"-a --align\" is not valid. Allowed values: top, middle, or bottom\n"; 627 } 628 } 629 630 $OptionsInfo{TableHeaderRowHAlignment} = "center"; $OptionsInfo{TableHeaderRowVAlignment} = "middle"; 631 if (exists($Options{headeralign})) { 632 my (@AlignValues) = split ",", $Options{headeralign}; 633 if (@AlignValues == 2) { 634 $OptionsInfo{TableHeaderRowHAlignment} = $AlignValues[0]; 635 $OptionsInfo{TableHeaderRowVAlignment} = $AlignValues[1]; 636 } 637 elsif (@AlignValues == 1) { 638 $OptionsInfo{TableHeaderRowHAlignment} = $AlignValues[0]; 639 } 640 else { 641 die "Error: Invalid number of values, ", scalar(@AlignValues) , ", specified by \"--headeralign\" option.\nIt must contain only one or two value.\n"; 642 } 643 if ($OptionsInfo{TableHeaderRowHAlignment} !~ /^(left|center|right)$/i) { 644 die "Error: The horizontal alignment value specified, $Options{headeralign}, for option \"--headeralign\" is not valid. Allowed values: left, center, or right\n"; 645 } 646 if ($OptionsInfo{TableHeaderRowVAlignment} !~ /^(top|middle|bottom)$/i) { 647 die "Error: The horizontal alignment value specified, $Options{headeralign}, for option \"-a --headeralign\" is not valid. Allowed values: top, middle, or bottom\n"; 648 } 649 } 650 651 $OptionsInfo{TitleDisplay} = ($Options{titledisplay} =~ /^yes$/i) ? 1 : 0; 652 653 if (exists($Options{border})) { 654 $OptionsInfo{TableBorder} = $Options{border}; 655 } 656 else { 657 $OptionsInfo{TableBorder} = ($Options{mode} =~ /^(plain|highlight)$/i) ? 1 : 0; 658 } 659 $OptionsInfo{TableCellPadding} = $Options{cellpadding}; 660 $OptionsInfo{TableCellSpacing} = $Options{cellspacing}; 661 $OptionsInfo{Footer} = $Options{footer} ? $Options{footer} : ""; 662 663 if ($Options{headercolor}) { 664 $OptionsInfo{TableHeaderRowColor} = $Options{headercolor}; 665 } 666 else { 667 $OptionsInfo{TableHeaderRowColor} = ($Options{mode} =~ /^plain$/i) ? "" : "#ccccff"; 668 } 669 670 $OptionsInfo{NavLinksAtBottom} = 1; $OptionsInfo{NavLinksAtTop} = 0; 671 if ($Options{displaylinks} =~ /^(both|top)$/i) { 672 $OptionsInfo{NavLinksAtTop} = 1; 673 } 674 $OptionsInfo{NavLinksTableInfo} = 1; $OptionsInfo{NavLinksLineInfo} = 0; 675 if ($Options{displaylinksinfo} =~ /^both$/i) { 676 $OptionsInfo{NavLinksLineInfo} = 1; 677 $OptionsInfo{NavLinksTableInfo} = 1; 678 } 679 elsif ($Options{displaylinksinfo} =~ /^line$/i) { 680 $OptionsInfo{NavLinksLineInfo} = 1; 681 $OptionsInfo{NavLinksTableInfo} = 0; 682 } 683 684 if ($Options{stylesheet} =~ /^old$/i ) { 685 if (!$Options{stylesheetname}) { 686 die "Error: No stylesheet name specified using \"--stylesheetname\" option: It is required for \"old\" value of \"-s --stylesheet\" option. \n"; 687 } 688 } 689 690 my(@ColorValues); 691 $OptionsInfo{OddRowsShadeColor} = ""; $OptionsInfo{EvenRowsShadeColor} = ""; $OptionsInfo{ShadeRowsStatus} = 0; 692 if ($Options{mode} =~ /^(shade|shadedhighlight)$/i) { 693 $OptionsInfo{OddRowsShadeColor} = "#ffffff"; 694 $OptionsInfo{EvenRowsShadeColor} = "#e0e0eb"; 695 $OptionsInfo{ShadeRowsStatus} = 1; 696 if ($Options{shadecolor}) { 697 # Make sure only two value are specified... 698 @ColorValues = split ",", $Options{shadecolor}; 699 if (@ColorValues == 2) { 700 $OptionsInfo{OddRowsShadeColor} = $ColorValues[0]; 701 $OptionsInfo{EvenRowsShadeColor} = $ColorValues[1]; 702 } 703 else { 704 die "Error: Invalid number of values, ", scalar(@ColorValues) , ", specified by \"--shadecolor\" option.\nIt must contain only two values.\n"; 705 } 706 } 707 } 708 $OptionsInfo{ValueOkColor} = ""; $OptionsInfo{ValueNotOkColor} = ""; $OptionsInfo{HighlightStatus} = 0; 709 if ($Options{mode} =~ /^(highlight|shadedhighlight)$/i) { 710 my($HighlightMode, $HighlightBy); 711 $HighlightMode = $Options{mode}; $HighlightBy = $Options{highlightby}; 712 713 $OptionsInfo{HighlightStatus} = 1; 714 $OptionsInfo{ValueOkColor} = "#0fff0f"; 715 $OptionsInfo{ValueNotOkColor} = "#ff0f0f"; 716 if ($Options{highlightstyle} =~ /^text$/i) { 717 $OptionsInfo{ValueOkColor} = "#0fbb0f"; 718 $OptionsInfo{ValueNotOkColor} = "#ff0f0f"; 719 } 720 if ($Options{highlightcolor}) { 721 # Make sure two values are specified... 722 @ColorValues = split ",", $Options{highlightcolor}; 723 if (@ColorValues == 2) { 724 $OptionsInfo{ValueOkColor} = $ColorValues[0]; 725 $OptionsInfo{ValueNotOkColor} = $ColorValues[1]; 726 } 727 else { 728 die "Error: Invalid number of values, ", scalar(@ColorValues), ", specified by \"--highlightcolor\" option.\nIt must contain only two value for $HighlightMode value specified using \"-m --mode\" option.\n"; 729 } 730 } 731 if (!$Options{highlight}) { 732 die "Error: Specify columns to be highlighted using \"--hightlight\" option\n"; 733 } 734 # Retrieve quartet values from "hightlight" option... 735 my(@HighlightValueQuartets); 736 737 @HighlightValueQuartets = (); 738 @HighlightValueQuartets = split ",", $Options{highlight}; 739 if ((@HighlightValueQuartets % 4)) { 740 die "Error: Quartets not found in values specified using \"--highlight\" option for $HighlightMode \"-m --mode\"\n"; 741 } 742 # Process quartets... 743 my($Index, $Col, $DataType, $Criterion, $Value); 744 745 @{$OptionsInfo{SpecifiedColIds}} = (); 746 @{$OptionsInfo{SpecifiedColDataTypes}} = (); 747 @{$OptionsInfo{SpecifiedColCriteria}} = (); 748 @{$OptionsInfo{SpecifiedColValues}} = (); 749 for ($Index = 0; $Index < @HighlightValueQuartets; $Index = $Index + 4) { 750 $Col = $HighlightValueQuartets[$Index]; 751 $DataType = $HighlightValueQuartets[$Index + 1]; 752 $Criterion = $HighlightValueQuartets[$Index + 2]; 753 $Value = $HighlightValueQuartets[$Index + 3]; 754 if ($Options{highlightby} =~ /^colnum$/i ) { 755 if (!IsPositiveInteger($Col)) { 756 die "Error: Invalid column id, $Col, specified in quartet, \"$Col,$DataType,$Criterion,$Value\", using \"--hightlight\" option: It must be an integer value > 0 for $HighlightMode \"-m --mode\" and $HighlightBy \"--highlightby\" option values.\n"; 757 } 758 } 759 if ($DataType !~ /^(numeric|text)$/i) { 760 die "Error: Invalid column data type, $DataType, specified in quartet, \"$Col,$DataType,$Criterion,$Value\", using \"--hightlight\" option: Valid values: numeric or text\n"; 761 } 762 if ($Criterion !~ /^(eq|le|ge)$/i) { 763 die "Error: Invalid criterion value, $Criterion, specified in quartet, \"$Col,$DataType,$Criterion,$Value\", using \"--hightlight\" option: Valid values: le, ge, or eq\n"; 764 } 765 if ($DataType =~ /^numeric$/i) { 766 if (!IsFloat($Value)) { 767 die "Error: Invalid criterion value, $Value, specified in quartet, \"$Col,$DataType,$Criterion,$Value\", using \"--hightlight\" option: numeric value required for numeric data type\n"; 768 } 769 } 770 push @{$OptionsInfo{SpecifiedColIds}}, $Col; 771 push @{$OptionsInfo{SpecifiedColDataTypes}}, $DataType; 772 push @{$OptionsInfo{SpecifiedColCriteria}}, $Criterion; 773 push @{$OptionsInfo{SpecifiedColValues}}, $Value; 774 } 775 } 776 } 777 778 # Retrieve information about input text files... 779 sub RetrieveTextFilesInfo { 780 my($LineCount, $TextFile, $FileDir, $FileName, $HTMLFile, $CSSFile, $HTMLRoot, $HTMLTitle, $FileExt, $Index, $ColIndex, $ColNum, $ColLabel, $LinesCount, $InDelim, $Line, @LineWords, @ColLabels, $TopHTMLDir); 781 782 %TextFilesInfo = (); 783 784 @{$TextFilesInfo{FileOkay}} = (); 785 @{$TextFilesInfo{ColCount}} = (); 786 @{$TextFilesInfo{ColLabels}} = (); 787 @{$TextFilesInfo{ColLabelToNumMap}} = (); 788 @{$TextFilesInfo{LineCount}} = (); 789 @{$TextFilesInfo{InDelim}} = (); 790 791 @{$TextFilesInfo{HTMLRoot}} = (); 792 @{$TextFilesInfo{HTMLTitle}} = (); 793 @{$TextFilesInfo{MultipleHTMLTables}} = (); 794 795 @{$TextFilesInfo{TopHTMLDir}} = (); 796 @{$TextFilesInfo{SubHTMLDir}} = (); 797 798 FILELIST: for $Index (0 .. $#TextFilesList) { 799 $TextFile = $TextFilesList[$Index]; 800 801 $TextFilesInfo{FileOkay}[$Index] = 0; 802 $TextFilesInfo{ColCount}[$Index] = 0; 803 $TextFilesInfo{LineCount}[$Index] = 0; 804 $TextFilesInfo{InDelim}[$Index] = ""; 805 $TextFilesInfo{HTMLRoot}[$Index] = ""; 806 $TextFilesInfo{HTMLTitle}[$Index] = ""; 807 $TextFilesInfo{MultipleHTMLTables}[$Index] = 0; 808 809 @{$TextFilesInfo{ColLabels}[$Index]} = (); 810 %{$TextFilesInfo{ColLabelToNumMap}[$Index]} = (); 811 812 if (!(-e $TextFile)) { 813 warn "Warning: Ignoring file $TextFile: It doesn't exist\n"; 814 next FILELIST; 815 } 816 if (!CheckFileType($TextFile, "csv tsv")) { 817 warn "Warning: Ignoring file $TextFile: It's not a csv or tsv file\n"; 818 next FILELIST; 819 } 820 ($FileDir, $FileName, $FileExt) = ParseFileName($TextFile); 821 if ($FileExt =~ /^tsv$/i) { 822 $InDelim = "\t"; 823 } 824 else { 825 $InDelim = "\,"; 826 if ($Options{indelim} !~ /^(comma|semicolon)$/i) { 827 warn "Warning: Ignoring file $TextFile: The value specified, $Options{indelim}, for option \"--indelim\" is not valid for csv files\n"; 828 next FILELIST; 829 } 830 if ($Options{indelim} =~ /^semicolon$/i) { 831 $InDelim = "\;"; 832 } 833 } 834 835 if (!open TEXTFILE, "$TextFile") { 836 warn "Warning: Ignoring file $TextFile: Couldn't open it: $! \n"; 837 next FILELIST; 838 } 839 840 $Line = GetTextLine(\*TEXTFILE); 841 @ColLabels = quotewords($InDelim, 0, $Line); 842 $LineCount = 0; 843 while (<TEXTFILE>) { 844 $LineCount++; 845 } 846 close TEXTFILE; 847 848 $FileDir = ""; $FileName = ""; $FileExt = ""; 849 ($FileDir, $FileName, $FileExt) = ParseFileName($TextFile); 850 $HTMLRoot = $FileName; 851 if ($Options{root} && (@TextFilesList == 1)) { 852 my ($RootFileDir, $RootFileName, $RootFileExt) = ParseFileName($Options{root}); 853 if ($RootFileName && $RootFileExt) { 854 $HTMLRoot = $RootFileName; 855 } 856 else { 857 $HTMLRoot = $Options{root}; 858 } 859 } 860 $HTMLTitle = $HTMLRoot; 861 if ($Options{title} && (@TextFilesList == 1)) { 862 $HTMLTitle = $Options{title}; 863 } 864 $HTMLFile = lc($HTMLRoot) . "-html"; 865 if (!$Options{overwrite}) { 866 if (-d $HTMLFile) { 867 warn "Warning: Ignoring file $TextFile: The directory $HTMLFile already exists\n"; 868 next FILELIST; 869 } 870 } 871 872 $TextFilesInfo{FileOkay}[$Index] = 1; 873 $TextFilesInfo{InDelim}[$Index] = $InDelim; 874 $TextFilesInfo{HTMLRoot}[$Index] = "$HTMLRoot"; 875 $TextFilesInfo{HTMLTitle}[$Index] = "$HTMLTitle"; 876 877 $TextFilesInfo{ColCount}[$Index] = @ColLabels; 878 push @{$TextFilesInfo{ColLabels}[$Index]}, @ColLabels; 879 for $ColNum (0 .. $#ColLabels) { 880 $ColLabel = $ColLabels[$ColNum]; 881 $TextFilesInfo{ColLabelToNumMap}[$Index]{$ColLabel} = $ColNum; 882 } 883 $TextFilesInfo{LineCount}[$Index] = $LineCount; 884 885 if ($Options{numrows} == 0 || $LineCount <= $Options{numrows}) { 886 $TextFilesInfo{MultipleHTMLTables}[$Index] = 0; 887 } 888 else { 889 $TextFilesInfo{MultipleHTMLTables}[$Index] = 1; 890 } 891 # Setup HTML data directories paths... 892 $TopHTMLDir = lc($TextFilesInfo{HTMLRoot}[$Index]) . "-html"; 893 $TextFilesInfo{TopHTMLDir}[$Index] = "$TopHTMLDir"; 894 $TextFilesInfo{SubHTMLDir}[$Index] = "$TopHTMLDir\/html"; 895 } 896 } 897 898 # Setup various data directories to hold HTML and other related files... 899 sub SetupDataDirs { 900 my($Index) = @_; 901 my($TopHTMLDir, $SubHTMLDir, $CreateTopHTMLDir, $CreateSubHTMLDir); 902 903 $TopHTMLDir = $TextFilesInfo{TopHTMLDir}[$Index]; 904 $SubHTMLDir = $TextFilesInfo{SubHTMLDir}[$Index]; 905 906 # Clean up existing directories... 907 if (-d $TopHTMLDir) { 908 unlink "<$TopHTMLDir/*.html>"; 909 unlink "<$TopHTMLDir/*.css>"; 910 } 911 if (-d $SubHTMLDir) { 912 unlink "<$SubHTMLDir/*.html>"; 913 } 914 # What directories need to be created... 915 $CreateTopHTMLDir = (-d $TopHTMLDir) ? 0 : 1; 916 917 $CreateSubHTMLDir = 0; 918 if ($TextFilesInfo{MultipleHTMLTables}[$Index]) { 919 $CreateSubHTMLDir = (-d $SubHTMLDir) ? 0 : 1; 920 } 921 922 # Create appropriate directories... 923 if ($CreateTopHTMLDir) { 924 mkdir $TopHTMLDir or die "Couldn't mkdir $TopHTMLDir: $! \n"; 925 } 926 if ($CreateSubHTMLDir) { 927 mkdir $SubHTMLDir or die "Error: Couldn't mkdir $SubHTMLDir: $! \n"; 928 } 929 else { 930 unlink <$SubHTMLDir/*.html>; 931 } 932 return ($TopHTMLDir, $SubHTMLDir); 933 } 934 935 # Setup script usage and retrieve command line arguments specified using various options... 936 sub SetupScriptUsage { 937 938 # Retrieve all the options... 939 %Options = (); 940 $Options{indelim} = "comma"; 941 $Options{numrows} = 50; 942 943 $Options{mode} = "shade"; 944 $Options{highlightby} = "colnum"; 945 $Options{highlightstyle} = "background"; 946 947 $Options{cellpadding} = 2; 948 $Options{cellspacing} = 1; 949 950 $Options{displaylinks} = "both"; 951 $Options{displaylinksinfo} = "both"; 952 $Options{stylesheet} = "new"; 953 954 $Options{titledisplay} = "yes"; 955 956 if (!GetOptions(\%Options, "align|a=s", "border|b=i", "cellpadding=i", "cellspacing=i", "color|c=s", "footer=s", "displaylinks|d=s", "displaylinksinfo=s", "help|h", "headeralign=s", "headercolor=s", "highlight=s", "highlightby=s", "highlightcolor=s", "highlightstyle=s", "indelim=s", "mode|m=s", "numrows|n=i", "overwrite|o", "root|r=s", "shadecolor=s", "stylesheet=s", "stylesheetname=s", "title|t=s", "titledisplay=s", "workingdir|w=s")) { 957 die "\nTo get a list of valid options and their values, use \"$ScriptName -h\" or\n\"perl -S $ScriptName -h\" command and try again...\n"; 958 } 959 960 if ($Options{workingdir}) { 961 if (! -d $Options{workingdir}) { 962 die "Error: The value specified, $Options{workingdir}, for option \"-w --workingdir\" is not a directory name.\n"; 963 } 964 chdir $Options{workingdir} or die "Error: Couldn't chdir $Options{workingdir}: $! \n"; 965 } 966 if ($Options{displaylinks} !~ /^(top|bottom|both)$/i) { 967 die "Error: The value specified, $Options{displaylinks}, for option \"-d --displaylinks\" is not valid. Allowed values: top, bottom, or both\n"; 968 } 969 if ($Options{displaylinksinfo} !~ /^(line|table|both)$/i) { 970 die "Error: The value specified, $Options{displaylinksinfo}, for option \"--displaylinksinfo\" is not valid. Allowed values: line, table, or both\n"; 971 } 972 if ($Options{indelim} !~ /^(comma|semicolon)$/i) { 973 die "Error: The value specified, $Options{indelim}, for option \"--indelim\" is not valid. Allowed values: comma or semicolon\n"; 974 } 975 if ($Options{highlightby} !~ /^(colnum|collabel)$/i) { 976 die "Error: The value specified, $Options{highlightby}, for option \"--highlightby\" is not valid. Allowed values: colnum or collabel\n"; 977 } 978 if ($Options{highlightstyle} !~ /^(background|text)$/i) { 979 die "Error: The value specified, $Options{highlightstyle}, for option \"--highlightstyle\" is not valid. Allowed values: background or text\n"; 980 } 981 if ($Options{mode} !~ /^(plain|shade|highlight|shadedhighlight)$/i) { 982 die "Error: The value specified, $Options{mode}, for option \"-m --mode\" is not valid. Allowed values: plain, shade, hightlight, or shadedhighlight\n"; 983 } 984 if ($Options{stylesheet} !~ /^(old|new|none)$/i) { 985 die "Error: The value specified, $Options{stylesheet}, for option \"-s --stylesheet\" is not valid. Allowed values: old, new, or none\n"; 986 } 987 if ($Options{numrows} < 0) { 988 die "Error: The value specified, $Options{numrows}, for option \"-n --numrows\" is not valid. Allowed values: >= 0 \n"; 989 } 990 if ($Options{titledisplay} !~ /^(yes|no)$/i) { 991 die "Error: The value specified, $Options{titledisplay}, for option \"--titledisplay\" is not valid. Allowed values: yes or no\n"; 992 } 993 if (exists($Options{border})) { 994 if ($Options{border} < 0) { 995 die "Error: The value specified, $Options{border}, for option \"--border\" is not valid. Allowed values: >= 0 \n"; 996 } 997 } 998 if ($Options{cellpadding} < 0) { 999 die "Error: The value specified, $Options{cellpadding}, for option \"--cellpadding\" is not valid. Allowed values: >= 0 \n"; 1000 } 1001 if ($Options{cellspacing} < 0) { 1002 die "Error: The value specified, $Options{cellspacing}, for option \"--cellspacing\" is not valid. Allowed values: >= 0 \n"; 1003 } 1004 } 1005