       1 #!/usr/bin/perl -w
       2 #
       3 # File: TextFilesToHTML.pl
       4 # Author: Manish Sud <msud@san.rr.com>
       5 #
       6 # Copyright (C) 2018 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("&nbsp");
     351     print $HTMLFileRef SetupHTMLTableRowDataValue("&nbsp");
     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("&nbsp");
     418   print $HTMLFileRef SetupHTMLTableRowDataValue("&nbsp");
     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