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