File:  [Local Repository] / ConnorCalendar / calendar.pl
Revision 1.5: download - view: text, annotated - select for diffs
Wed May 29 02:53:46 2013 UTC (10 years, 11 months ago) by nick
Branches: MAIN
CVS tags: HEAD
Fixed a type in 'November' preventing weekends from showing up.  Also copied an old style sheet and inserted in as a starting point for making things prettier.

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

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