File:  [Local Repository] / ConnorCalendar / calendar.pl
Revision 1.11: download - view: text, annotated - select for diffs
Thu Nov 3 12:54:10 2016 UTC (7 years, 6 months ago) by nick
Branches: MAIN
CVS tags: HEAD
Oddly, a CVS version string caused a parsing failure.  I'll eventually move this to Git.

    1: #!/usr/bin/perl -w
    2: 
    3: =begin comment info
    4: +------------------------------------------------------------------------------
    5: |
    6: | See end of script for comments and 'pod2man $NAME | nroff -man' to
    7: | view man page or pod2text $NAME for plain text.
    8: |
    9: |   Nicholas DeClario <nick@demandred.dyndns.org>
   10: |   March 2009
   11: |	$Id: calendar.pl,v 1.11 2016/11/03 12:54:10 nick Exp $
   12: |
   13: +------------------------------------------------------------------------------
   14: =end comment
   15: =cut
   16: BEGIN {
   17:         delete @ENV{ qw(IFS CDPATH ENV BASH_ENV PATH) };
   18:         $ENV{'PATH'} = "/bin:/usr/bin";
   19:       }
   20: 
   21: use strict;
   22: use Getopt::Long;
   23: use Pod::Usage;
   24: use Data::Dumper;
   25: use Calendar::Simple;
   26: use Date::Pcalendar::Year qw( :all );
   27: use Date::Pcalendar::Profiles qw( $Profiles );
   28: 
   29: my $VERSION  = '$Id: calendar.pl,v 1.11 2016/11/03 12:54:10 nick Exp $';
   30: my $DEBUG    = "";
   31: my $URL	     = "http://demandred.dyndns.org/cgi-bin/ConnorCalendar/index.cgi";
   32: my %post_in  = ( );
   33: my %opts     = &fetchOptions( );
   34: my @list     = ( );
   35: my @months   = qw/ January February March April May June July 
   36: 		   August September October November December /;
   37: my %holidays = ( 
   38: 		 "Easter Sunday"	=> 'even',
   39: 		 "Christmas Day"	=> 'even',
   40: 		 "Christmas Eve"	=> 'odd',
   41: 		 "Father's Day"		=> 'all',
   42: 		 "Independence Day"	=> 'even',
   43: 		 "Labor Day"		=> 'even',
   44: 		 "Memorial Day"		=> 'odd',
   45: 		 "New Year's Day"	=> 'odd',
   46: 		 "New Year's Eve"	=> 'odd',
   47: 		 "Thanksgiving Day"	=> 'odd', 
   48: 	       );
   49: 
   50: my %specials = (
   51: 		"11/28"			=> "even",
   52: 		"5/6"			=> "odd",
   53: 		);
   54: ## Change this @weekend to 'qw/ 2011 8 12 /' for original schedule
   55: my @weekend  = qw/ 2011 8 19 /;
   56: my %weekends = &calcWeekends( @weekend );
   57: 
   58: &ReadParse( );
   59: 
   60: my $yr =  sprintf( "%d", $post_in{'cy'} ) || ( ( localtime )[5] + 1900 );
   61: my $YEAR = sprintf( "%d", $yr );
   62: push @list, 'Easter Sunday' if ( $YEAR % 2 == 0 );
   63: 
   64: print "Content-type: text/html\n\n";
   65: print &header( );
   66: print &css( );
   67: my $year_us = Date::Pcalendar::Year->new( $YEAR, $Profiles->{'US-FL'} );
   68: my @hdays = $year_us->labels( );
   69: 
   70: print "<h1><center><a href=\"$URL?cy=" . ( $YEAR - 1 ) .
   71:       "\">&lt;--</a> " .
   72:       "Calendar Days Connor Visits for $YEAR" .
   73:        "<a href=\"$URL?cy=" . ( $YEAR + 1 ) . "\"> --&gt;</a></h1>";
   74: my $row = 0;
   75: print "<table align=center border=0><tr>";
   76: for( my $month = 1; $month <= 12; $month++ )
   77: {
   78: 	if ( $row >= 3 ) 
   79: 	{
   80: 		$row = 0;
   81: 		print "</tr><tr>";
   82: 	}
   83: 	print "<td align=center valign=top>";
   84: 	print "<b>$months[($month - 1)]</b>\n";
   85: 	print "<pre>Su Mo Tu We Th Fr Sa\n";
   86: 	my @CALS = calendar( $month, $YEAR );
   87: 	foreach my $cal ( @CALS ) 
   88: 	{
   89: 		foreach my $day ( @$cal ) 
   90: 		{
   91: 			if( defined $day ) 
   92: 			{
   93: 				my $h_day = ( $year_us->labels( $YEAR, $month, $day ) )[1];
   94: 				if( &IHaveConnor( $h_day ) ) {
   95: 					push @list, $h_day;
   96: 					print sprintf "<font color=red><b>%2d</b> </font>", $day;
   97: 				} elsif ( &isSpecial( $YEAR, $month, $day ) || 
   98:  					  &isWeekend( $YEAR, $month, $day ) ) {
   99: 					print sprintf "<font color=green><b>%2d</b> </font>", $day;
  100: 				} elsif ( &isToday( $YEAR, $month, $day ) ) {
  101: 					print sprintf "<font color=blue><b>%2d</b> </font>", $day;
  102: 				} else {
  103: 					print sprintf "%2d ", $day;
  104: 				}
  105: 			} else {
  106: 				print '   ';
  107: 			}	
  108: 		}
  109: 		print "\n";
  110: 	}
  111: 	print "</pre></td>";
  112: 	$row++;
  113: }
  114: print "</tr></table>";
  115: print "<p class=\"Legend\">Holidays I have Connor are in <font color=red>Red</font>\n</br>";
  116: print "Today is <font color=blue>Blue</font>\n</br>";
  117: print "Weekends and special days I have Connor are in <font color=green>Green</font>\n</p>";
  118: 
  119: 
  120: print "<table width=35% align=center border=0><tr><td>List of Special/Holidays " .
  121:       "I have Connor:<br /><p class=Legend>";
  122: print map { $_ . "<br />\n" } sort @list;
  123: print "</p></td></tr></table>\n";
  124: print "</pre><p class=\"footer\">Version: <font color=green>$VERSION</font><br />";
  125: print "CVS: <a target=\"_new\" href=\"http://demandred.dyndns.org/cgi-bin/cvsweb/ConnorCalendar/\">http://demandred.dyndns.org/cgi-bin/cvsweb/ConnorCalendar/</a>";
  126: print "</center></p>";
  127: 
  128: 
  129: ###############################################################################
  130: ###############################################################################
  131: sub IHaveConnor 
  132: {
  133: 	my $holiday = shift || return 0;
  134: 	my $y = ( $YEAR % 2 ) ? "odd" : "even";
  135: 
  136: 	if ( defined $holidays{$holiday} )
  137: 	{
  138: 		return 1 if ( $holidays{$holiday} eq "all" );
  139: 		return 1 if ( $holidays{$holiday} eq $y );
  140: 	}
  141: 
  142: 	return 0;
  143: }
  144: 
  145: sub isSpecial
  146: {
  147:         my $y = shift || return 0;
  148:         my $m = shift || return 0;
  149:         my $d = shift || return 0;
  150: 	my $yr = ( $YEAR % 2 ) ? "odd" : "even";
  151: 
  152: 	my $ref = "$m/$d";
  153: 	
  154: 	if ( defined $specials{$ref} )
  155: 	{
  156: 		if ( $specials{$ref} eq "all" ||
  157:    		     $specials{$ref} eq $yr ) {
  158: 			push @list, $ref;
  159: 			return 1;
  160: 		}
  161: 	}
  162: 
  163: 	return 0;
  164: }
  165: 
  166: sub isWeekend
  167: {
  168: 	my $y = shift || return 0;
  169:     my $m = shift || return 0;
  170:     my $d = shift || return 0;
  171: 
  172: 	$m--;
  173: 	my $ds = sprintf( "$y/$months[$m]/%02d", $d );
  174: 
  175: 	return 1 if ( defined $weekends{$ds} );
  176: 
  177: 	return 0;
  178: }
  179: 
  180: sub isToday
  181: {
  182: 	my $y = shift || return 0;
  183: 	my $m = shift || return 0;
  184: 	my $d = shift || return 0;
  185: 
  186: 	return 1 if ( $y eq ( ( localtime )[5] + 1900 ) &&
  187: 	     $m eq ( ( localtime )[4] + 1 ) &&
  188: 	     $d eq ( ( localtime )[3] ) );
  189: 	return 0;
  190: }
  191: 
  192: sub calcWeekends 
  193: {
  194: 	my $y = shift;
  195: 	my $m = shift;
  196: 	my $d = shift;
  197: 	my %weekends = ( );
  198: 
  199: 	print "Weekends I have Connor:\n";
  200: 
  201: 	use Calendar;
  202: 	my $date = Calendar->new_from_Gregorian( $m, $d, $y );
  203: 		
  204: 	$weekends{$date->date_string( "%Y/%M/%d" )} = 1;
  205: 	&twoMore( $date );
  206: 	while ( $date->date_string( "%Y" ) <= 2026 ) 
  207: 	{
  208: 		$date += 14;
  209: 		$weekends{$date->date_string( "%Y/%M/%d" )} = 1;
  210: 		&twoMore( $date );
  211: 	}
  212: 
  213: 	return %weekends;
  214: 
  215: 	sub twoMore 
  216: 	{
  217: 		my $td = shift;
  218: 		
  219: 		$td++;
  220: 		$weekends{$td->date_string( "%Y/%M/%d" )} = 1;
  221: 		$td++;
  222: 		$weekends{$td->date_string( "%Y/%M/%d" )} = 1;
  223: 	}
  224: }
  225: 
  226: ###############################################################################
  227: ###############################################################################
  228: sub ReadParse
  229: {
  230:         my $a = $_[0] ? $_[0] : \%post_in;
  231:         my ( $i, $in );
  232:         my @in = ( );
  233: 
  234:         if ( defined $ENV{'SERVER_NAME'} ) {
  235:                 my $SERVER = $ENV{'SERVER_NAME'};
  236:         }
  237: 
  238:         if ( ( defined $ENV{'REQUEST_METHOD'} ) &&
  239:              ($ENV{'REQUEST_METHOD'} eq 'POST') )
  240:         {
  241:                 read(STDIN, $in, $ENV{'CONTENT_LENGTH'});
  242:         }
  243:         else
  244:         {
  245:                 $in = $ENV{'QUERY_STRING'} || "";
  246:         }
  247: 
  248:         @in = split(/\&/, $in);
  249: 
  250:         foreach $i (@in)
  251:         {
  252:                 my ($k, $v) = split(/=/, $i, 2);
  253:                 $k =~ s/\+/ /g; $k =~ s/%(..)/pack("c",hex($1))/ge;
  254:                 $v =~ s/\+/ /g; $v =~ s/%(..)/pack("c",hex($1))/ge;
  255:                 $a->{$k} = defined($a->{$k}) ? $a->{$k}."\0".$v : $v;
  256:         }
  257: 
  258: }
  259: 
  260: ###############################################################################
  261: ##
  262: ## &fetchOptions( );
  263: ##
  264: ##      Grab our command line arguments and toss them in to a hash
  265: ##
  266: ###############################################################################
  267: sub fetchOptions {
  268:         my %opts;
  269: 
  270:         &GetOptions(
  271:                         "help|?"        => \$opts{'help'},
  272:                         "man"           => \$opts{'man'},
  273:                    ) || &pod2usage( );
  274:         &pod2usage( ) if defined $opts{'help'};
  275:         &pod2usage( { -verbose => 2, -input => \*DATA } ) if defined $opts{'man'};
  276: 
  277:         return %opts;
  278: }
  279: 
  280: sub header {
  281: 	return <<EOF;
  282: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  283: 
  284: <html xmlns="http://www.w3.org/1999/xhtml">
  285: <head>
  286: <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  287:     <title>Calendar Days Connor Visits</title>
  288:   </head>
  289: <body bgcolor="#FFFFFF">
  290: EOF
  291: }
  292: 
  293: sub css {
  294: 	return <<EOF;
  295: <style type="text/css">
  296: body {
  297: 
  298: padding-top: 0px;
  299: padding-left: 0px;
  300: padding-right: 0px;
  301: padding-bottom: 0px;
  302: 
  303:  text-align:left;
  304:  margin:0;
  305:  font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif;
  306:  #font-family: Geneva, Arial, Helvetica, sans-serif;
  307:  font-size: 12pt;
  308:  background: #eeeeee;
  309:  color:#000000;
  310: 
  311: 
  312: }
  313: 
  314: .name { 
  315:  color: #191970; 
  316:  font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif;
  317:  #font-family: Verdana, Arial, sans-serif;
  318:  font-size: 18pt; font-weight: bold; line-height: 38pt;
  319:  text-align: center;
  320: }
  321: 
  322: p.Legend {
  323:  color: #000000;
  324:  font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif;
  325:  font-size: 8pt;
  326:  margin: auto;
  327:  width: 300px;
  328:  background-color : transparent;
  329:  border-top: 1px solid #888888;
  330:  border-left: 1px solid #888888;
  331:  border-right: 1px solid #888888;
  332:  border-bottom: 1px solid #888888;
  333:  padding-top: 3px;
  334:  padding-bottom: 3px;
  335:  padding-left: 3px;
  336:  padding-right: 3px;
  337: }
  338: 
  339: h1 { 
  340:  color: #191970; 
  341:  font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif;
  342:  #font-family: Verdana, Arial, sans-serif;
  343:  font-size: 12pt; font-weight: bold; line-height: 15pt;
  344:  background-color : transparent;
  345:  margin-left: 20px;
  346:  margin-right: 20px;
  347:  border-top: 1px solid black;
  348:  border-bottom: 1px solid black;
  349: }
  350: 
  351: 
  352: h2 {
  353:  color: #191970; 
  354:  font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif;
  355:         font-weight: bold;
  356:         font-size: 18px;
  357: }
  358:         
  359: h3 {
  360:  color: #191970; 
  361:  font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif;
  362:         font-weight: bold;
  363:         font-size: 14px;
  364: }
  365: 
  366: 
  367: textarea { width:100%; }
  368: 
  369: .gallery {
  370: padding-top: 80px;
  371: padding-left: 60px;
  372: padding-right: 50px;
  373: line-height: 120%;
  374: background:url('topleft.jpg') no-repeat top left;
  375: }
  376: .browse {
  377: padding-top: 80px;
  378: padding-left: 60px;
  379: padding-right: 50px;
  380: line-height: 120%;
  381: background:url(topleft.jpg) no-repeat top left;
  382: }
  383: .content, .rc {
  384: padding-top: 100px;
  385: padding-left: 80px;
  386: padding-right: 50px;
  387: line-height: 120%;
  388: }
  389: 
  390: 
  391: p.footer {
  392:  color: #000000;
  393:  font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif;
  394:  font-size: 8pt;
  395:  margin: auto;
  396:  width: 500px;
  397:  background-color : transparent;
  398:  border-top: 1px solid #888888;
  399:  padding-top: 3px;
  400:  padding-bottom: 3px;
  401:  padding-left: 3px;
  402:  padding-right: 3px;
  403:  text-align: center;
  404: }
  405: 
  406: 
  407: .header {
  408: float: right;
  409: margin-top: 30px;
  410: margin-right: 50px;
  411: padding: 10px;
  412: padding-top: 10px,10px,10px,10px;
  413: 
  414: }
  415: pre {
  416:     border: #777777 1px dashed;
  417:     padding: 0.5em;
  418:     margin-left: 1em;
  419:     margin-right: 2em;
  420:     white-space: pre;
  421:     background-color: #fbfdff;
  422:     color: black;
  423:     font-size:12px;
  424: }
  425: 
  426: .refer {
  427: 	padding-left: 60px;
  428: 	padding-right: 50px;
  429: 	margin-right: 50px;
  430: 	margin-left: 50px;
  431: 	font-size:80%;
  432: }
  433: 
  434: .gotobar {
  435: 	color: #191970; 
  436: 	font-size:10px;
  437: }
  438: 
  439: .edit bar {
  440: 	color: #949ce5; 
  441: }
  442: 
  443: .contactInfo {
  444: 	font-size:12px;
  445: 	text-align:center;
  446: }
  447: 
  448: .workHeader {
  449: 	text-align:left;
  450: 	font-size:13px;
  451: 	text-decoration:none;
  452: 	font-weight:normal;
  453: }
  454: 
  455: .workHeaderDate {
  456: 	float: right;
  457: }
  458: 
  459: .workHeaderStrong {
  460: 	font-size:15px;
  461: 	text-decoration:none;
  462: 	font-weight:bolder;
  463: }
  464: 
  465: .jobDescription {
  466: 	padding-top:15px;
  467: 	font-size:13px;
  468: }
  469: 
  470: .bulletContent {
  471: 	font-size:13px;
  472: }
  473: 
  474: .leftCol {
  475: 	width:10.2em;
  476: 	position:absolute;
  477: 	top:0;
  478: 	font-size:13px;
  479: 	padding-left:1%;
  480: 	padding-right:1%;
  481: }
  482: 
  483: .rightCol {
  484: 	width:10.2em;
  485: 	position:absolute;
  486: 	top:0;
  487: 	font-size:13px;
  488: 	padding-left:1%;
  489: 	padding-right:1%;
  490: }
  491: 
  492: a:link {color:#082e58;  text-decoration: none; font-weight:bolder;}
  493: a:visited {color:#7795b7; font-weight:normal; text-decoration:none;}
  494: a:hover {color:#949ce5;}
  495: 
  496: 
  497: a.definition:before { content:"[::"; }
  498: a.definition:after { content:"]"; }
  499: a.alias { text-decoration:none; border-bottom: thin dashed; }
  500: a.near:link { color:#093; }
  501: a.near:visited { color:#550; }
  502: a.upload:before { content:"<"; }
  503: a.upload:after { content:">"; }
  504: a.outside:before { content:"["; }
  505: a.outside:after { content:"]"; }
  506: img.logo { float: right; clear: right; border-style:none; }
  507: div.diff { padding-left:5%; padding-right:5%; }
  508: div.old { background-color:#FFFFAF; }
  509: div.new { background-color:#CFFFCF; }
  510: div.message { background-color:#FEE; }
  511: div.journal h1 { font-size:large; }
  512: table.history { border-style:none; }
  513: td.history { border-style:none; }
  514: span.result { font-size:larger; }
  515: span.info { font-size:smaller; font-style:italic; }
  516: div.rss { background-color:#EEF; }
  517: div.sister { float:left; margin-right:1ex; background-color:#FFF; }
  518: div.sister p { margin-top:0; }
  519: div.sister img { border:none; }
  520: div.near { background-color:#EFE; }
  521: div.near p { margin-top:0; }
  522: </style>
  523: EOF
  524: 
  525: }
  526: 
  527: __END__
  528: 
  529: =head1 NAME
  530: 
  531: masterbuild.pl - blurb
  532: 
  533: =head1 SYNOPSIS
  534: 
  535: masterbuild.pl [options]
  536: 
  537:  Options:
  538:         --help,?        Display the basic help menu
  539:         --man,m         Display the detailed man page
  540: 
  541: =head1 DESCRIPTION
  542: 
  543: =head1 HISTORY
  544: 
  545: =head1 AUTHOR
  546: 
  547: Nicholas DeClario <nick@declario.com>
  548: 
  549: =head1 BUGS
  550: 
  551: This is a work in progress.  Please report all bugs to the author.
  552: 
  553: =head1 SEE ALSO
  554: 
  555: =head1 COPYRIGHT
  556: 
  557: =cut

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>