File:  [Local Repository] / ConnorCalendar / calendar.pl
Revision 1.7: download - view: text, annotated - select for diffs
Thu May 30 14:38:50 2013 UTC (10 years, 11 months ago) by nick
Branches: MAIN
CVS tags: HEAD
Formatted everything to fit on one page.  Easter Sunday is missing from the Calendar module so I just marked if I have him on Easter or not.  It's not marked on the calendar itself though.

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

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