comparison bin/TextFilesToHTML.pl @ 0:4816e4a8ae95 draft default tip

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 09:23:18 -0500
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4816e4a8ae95
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("&nbsp");
354 print $HTMLFileRef SetupHTMLTableRowDataValue("&nbsp");
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("&nbsp");
421 print $HTMLFileRef SetupHTMLTableRowDataValue("&nbsp");
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
1006 __END__
1007
1008 =head1 NAME
1009
1010 TextFilesToHTML.pl - Generate HTML table file(s) from TextFile(s)
1011
1012 =head1 SYNOPSIS
1013
1014 TextFilesToHTML.pl ... TextFile(s)...
1015
1016 TextFilesToHTML.pl [B<-a, --align> left | center | right,[top | middle | bottom]] [B<-b, --border> borderwidth] [B<--cellpadding> padding]
1017 [B<--cellspacing> spacing] [B<--footer> string] [B<-d, --displaylinks> top | bottom | both]
1018 [B<--displaylinksinfo> line | table | both] [B<-h, --help>]
1019 [B<--headeralign> left | center | right,[top | middle | bottom]] [B<--headercolor> "#RRGGBB"]
1020 [B<--highlight> "fieldlabel,datatype,criterion,value,[fieldlabel,datatype,criterion,value,]..."]
1021 [B<--highlightby> colnum | collabel] [B<--highlightcolor> "#RRGGBB,#RRGGBB"]
1022 [B<--highlightstyle> text | background] [B<--indelim> comma | semicolon] [B<-m, --mode> plain | shade | highlight | shadedhighlight]
1023 [B<-n, --numrows> number] [B<-o, --overwrite>] [B<-r, --root> rootname]
1024 [B<--stylesheet> old | new | none] [B<--stylesheetname> filename] [B< --shadecolor> "#RRGGBB,#RRGGBB"]
1025 [B<-t, --title> string] [B<--titledisplay> yes | no] [B<-w, --workingdir> dirname] TextFile(s)...
1026
1027 =head1 DESCRIPTION
1028
1029 Generate HTML file(s) from I<TextFile(s)>. The HTML file(s) contain data tables and appropriate
1030 navigational links to view other tables. These files can be generated for local viewing or
1031 deployment on a web server. A variety of options are provided to control style and
1032 appearence of tables.
1033
1034 Multiple I<TextFile(s)> names are separated by spaces. The valid file extensions are I<.csv> and
1035 I<.tsv> for comma/semicolon and tab delimited text files respectively. All other file names
1036 are ignored. All the text files in a current directory can be specified by I<*.csv>,
1037 I<*.tsv>, or the current directory name. The B<--indelim> option determines the
1038 format of I<TextFile(s)>. Any file which doesn't correspond to the format indicated
1039 by B<--indelim> option is ignored.
1040
1041 =head1 OPTIONS
1042
1043 =over 4
1044
1045 =item B<-a, --align> I<left | center | right,[top | middle | bottom]>
1046
1047 Horizontal and vertical alignment for table rows except for header row which is specified
1048 using B<--headeralign> option. Possible horizontal alignment values: I<left, center, or right>.
1049 Possible vertical alignment values: I<top, middle, or bottom>.
1050
1051 Default values: I<left,middle>
1052
1053 =item B<-b, --border> I<borderwidth>
1054
1055 Table border width. Default value: 1 for I<plain> and I<highlight> mode; 0 for I<shade>
1056 and I<shadedhightlight> mode. Zero indicates no border.
1057
1058 =item B<--cellpadding> I<padding>
1059
1060 Table cell padding. Default value: I<2>.
1061
1062 =item B<--cellspacing> I<spacing>
1063
1064 Table cell spacing. Default value: I<1>.
1065
1066 =item B<--footer> I<string>
1067
1068 Text string to be included at bottom of each HTML file. Default: none.
1069
1070 =item B<-d, --displaylinks> I<top | bottom | both>
1071
1072 Specify where to display navigation links in each HTML file for accessing all other HTML
1073 files. Possible values: I<top, bottom, or both>. Default value: I<both>. This option is
1074 only valid during multiple HTML files generation for an input file.
1075
1076 =item B<--displaylinksinfo> I<line | table | both>
1077
1078 Control display of additional information along with navigational links: Showing line
1079 n of m is displyed for line and showing table n of m for table. Possible values: I<line
1080 | table | both>. Default: I<both>. This option is only valid during multiple HTML files generation.
1081
1082 =item B<-h, --help>
1083
1084 Print this help message
1085
1086 =item B<--headeralign> I<left | center | right,[top | middle | bottom]>
1087
1088 Horizontal and vertical alignment for table header rows. Possible horizontal alignment
1089 values: I<left, center, or right>. Possible vertical alignment values: I<top, middle, or bottom>.
1090
1091 Default values: I<center,middle>
1092
1093 =item B<--headercolor> I<"#RRGGBB">
1094
1095 Color used to fill background of table header row containing column labels
1096 represented as a hexadecimal string. None for B<-m, --mode> option value
1097 of I<plain> and I<#ccccff>, light blue, for others.
1098
1099 =item B<--highlight> I<"fieldlabel,datatype,criterion,value,[fieldlabel,datatype,criterion,value,]...">
1100
1101 This value is mode specific. It specifies how to highlight various column values
1102 for each text file. Same set of quartets values are applied to all I<TextFile(s)>.
1103
1104 For I<highlightbycolnum> mode, input text format contains these quartets:
1105 I<colnum,datatype,criterion,value,...>. Possible datatype values: I<numeric or text>.
1106 Possible criterion values: I<le, ge, or eq>. Examples: "1,numeric,le,450>" or
1107 "2,numeric,ge,150,6,numeric,le,10".
1108
1109 For I<highlightbycollabel> mode, input text format contains these quartets:
1110 I<collabel,datatype,criterion,value,...>.
1111
1112 =item B<--highlightby> I<colnum | collabel>
1113
1114 This value is mode specific. It indicates how columns to be highlighted are specified
1115 using B<--hightlight> option. Possible values: I<colnum or collabel>. Default value: I<colnum>.
1116
1117 =item B<--highlightcolor> I<"#RRGGBB,#RRGGBB">
1118
1119 Colors used to highlight column values during I<highlight> and I<shadedhightlight>
1120 mode represented as hexadecimal strings.
1121
1122 For B<--highlighstyle> option values of I<text> and I<background>, these colors represent
1123 text or background colors respectively. For a specific column, first color string is used for
1124 values which meet criterion indicated by B<--highlight> option; the second color is used
1125 for rest of the values.
1126
1127 Default values for I<background> B<--highlightstyle>: I<#0fff0f,#ff0f0f>. And default values for
1128 I<text> B<--highlightstyle>: I<#0fbb0f,#ff0f0f>. Hexadecimal strings for both B<--highlightstyle>
1129 colors correspond to I<reddish> and I<greenish>.
1130
1131 =item B<--highlightstyle> I<text | background>
1132
1133 This value is mode specific. It indicates highlight style used to differentiate column
1134 values which pass a specified criterion from others. Possible values: I<text or
1135 background>. Default: I<background>.
1136
1137 =item B<--indelim> I<comma | semicolon>
1138
1139 Input delimiter for CSV I<TextFile(s)>. Possible values: I<comma or semicolon>.
1140 Default value: I<comma>. For TSV files, this option is ignored and I<tab> is used as a
1141 delimiter.
1142
1143 =item B<-m, --mode> I<plain | shade | highlight | shadedhighlight>
1144
1145 Specify how to generate HTML table(s): plain tables with line borders, background of
1146 alternate rows filled with a specified color, column values hightlighted using a specified
1147 criteria, or combination of previous two styles.
1148
1149 Possible values: I<plain, shade, highlight, or shadedhighlight>. Default: I<shade>.
1150
1151 =item B<-n, --numrows> I<number>
1152
1153 Maximum number of rows per table. Default value: I<100>. Use 0 to put all rows into
1154 one table. For I<TextFile(s)> with more than maximum number of specified rows,
1155 multiple HTML tables, with appropriate navigation links, are created.
1156
1157 =item B<-o, --overwrite>
1158
1159 Overwrite existing files.
1160
1161 =item B<-r, --root> I<rootname>
1162
1163 New file or directory name is generated using the root: <root>.html or <root>-html.
1164 Default new file name: <InitialTextFileName>.html. Default directory name:
1165 <InitialTextFileName>-html.
1166
1167 For I<TextFile(s)> with more than maximum number of rows specified per table,
1168 this directory tree is generated using <Name> where <Name> corresponds to <root>
1169 or <InitialTextFileName>:Top dir - <Name>-html; Sub dirs - html and mols. <Top dir> contains
1170 <Name>.html and <Name>.css files and <sub dir> html conatins various
1171 <Name>Lines<Start>To<End>.html files; <sub dir> mols is created as needed and contains
1172
1173 This option is ignored for multiple input files.
1174
1175 =item B<--stylesheet> I<old | new | none>
1176
1177 Controls usage of stylesheet for newly generated HTML file(s). Possible values: I<old,
1178 new, or none>. Default value: I<new>.
1179
1180 Stylesheet file contains various properties which control apperance of HTML pages:
1181 type, size, and color of fonts; background color; and so on.
1182
1183 For I<old> value, an existing stylesheet file specified by B<--stylesheetname> option is
1184 used for each HTML file; no new stylesheet file is created. This option is quite handy
1185 for deploying HTML file(s) on a web server: assuming you specify a valid stylesheet
1186 file location relative to your WWWRoot, a reference to this stylesheet is added to each
1187 HTML file. For local deployment of HTML file(s), a complete path to a local stylesheet
1188 is fine as well.
1189
1190 For I<create> value, a new stylesheet is created and reference to this local stylesheet
1191 is added to each HTML file. Use option B<--stylesheetname> to specify name.
1192
1193 For I<none> value, stylesheet usage is completely ignored.
1194
1195 =item B<--stylesheetname> I<filename>
1196
1197 Stylesheet file name to be used in conjunction with B<-s --stylesheet> option. It is only
1198 valid for I<old> value of B<-s --stylesheet> option. Specify a valid stylesheet file location
1199 relative to your WWWRoot and a reference to this stylesheet is added to each HTML
1200 file. Example: "/stylesheets/MyStyleSheet.css". Or a complete path name to a local
1201 stylesheet file.
1202
1203 For I<create> value of B<-s --stylesheet> option, a new stylesheet file is created using
1204 B<-r --root> option. And value of B<--stylesheetname> is simply ignored.
1205
1206 =item B< --shadecolor> I<"#RRGGBB,#RRGGBB">
1207
1208 Colors used to fill background of rows during I<shade> and I<shadedhightlight> mode
1209 represented as a pair of hexadecimal string; the first and second color values
1210 are used for odd and even number rows respectively.
1211
1212 Default value: I<"#ffffff,#e0e9eb"> - it's white and very light blue for odd and even number rows.
1213
1214 =item B<-t, --title> I<string>
1215
1216 Title for HTML table(s). Default value: <TextFileName>. For multiple input files,
1217 B<-r --root> option is used to generate appropriate titles.
1218
1219 =item B<--titledisplay> I<yes | no>
1220
1221 Display title for HTML table(s). Possible values: I<yes or no>. Default value: I<yes>.
1222
1223 =item B<-w, --workingdir> I<dirname>
1224
1225 Location of working directory. Default: current directory.
1226
1227 =back
1228
1229 =head1 EXAMPLES
1230
1231 To generate HTML tables with rows background filled with white and greyish colors and
1232 navigation links on top and botton of each page, type:
1233
1234 % TextFilesToHTML.pl -o Sample1.csv
1235
1236 To generate HTML tables with rows background filled with golden and greyish colors,
1237 navigation links on top and botton of each page, 10 rows in each table, greyish header
1238 row color, and cell spacing of 1, type:
1239
1240 % TextFilesToHTML.pl -o -n 10 --headeralign "center" --headercolor
1241 "#a1a1a1" --shadecolor "#ddd700,#d1d1d1" --cellspacing 1
1242 Sample1.csv
1243
1244 To generate plain HTML tables with 10 rows in each table and navigation links only at
1245 the bottom, type:
1246
1247 % TextFilesToHTML.pl -o -n 10 --displaylinks bottom -m plain
1248 Sample1.csv
1249
1250 To highlight values in column 3 using specified highlight criteria and fill in default background
1251 colors, type:
1252
1253 % TextFilesToHTML.pl -n 10 --highlight "3,numeric,le,450"
1254 --highlightby colnum --highlightstyle background -m
1255 shadedhighlight -o Sample1.csv
1256
1257 To highlight values in column MolWeight using specified highlight criteria, color the text using
1258 default colors, and add a footer message in every page, type:
1259
1260 % TextFilesToHTML.pl -n 4 --highlight "MolWeight,numeric,le,500"
1261 --highlightby collabel --highlightstyle text -m shadedhighlight -o
1262 --footer "Copyright (C) MayaChemTools" --cellspacing 1 Sample1.csv
1263
1264 =head1 AUTHOR
1265
1266 Manish Sud <msud@san.rr.com>
1267
1268 =head1 SEE ALSO
1269
1270 JoinTextFiles.pl, MergeTextFilesWithSD.pl, ModifyTextFilesFormat.pl, SplitTextFiles.pl, SortTextFiles.pl
1271
1272 =head1 COPYRIGHT
1273
1274 Copyright (C) 2015 Manish Sud. All rights reserved.
1275
1276 This file is part of MayaChemTools.
1277
1278 MayaChemTools is free software; you can redistribute it and/or modify it under
1279 the terms of the GNU Lesser General Public License as published by the Free
1280 Software Foundation; either version 3 of the License, or (at your option)
1281 any later version.
1282
1283 =cut