#!/usr/bin/perl -w =begin comment info +------------------------------------------------------------------------------ | | See end of script for comments and 'pod2man $NAME | nroff -man' to | view man page or pod2text $NAME for plain text. | | Nicholas DeClario | March 2009 | $Id: calendar.pl,v 1.13 2018/10/30 13:53:00 nick Exp $ | +------------------------------------------------------------------------------ =end comment =cut BEGIN { delete @ENV{ qw(IFS CDPATH ENV BASH_ENV PATH) }; $ENV{'PATH'} = "/bin:/usr/bin"; } use strict; use Getopt::Long; use Pod::Usage; use Data::Dumper; use Calendar::Simple; use Date::Pcalendar::Year qw( :all ); use Date::Pcalendar::Profiles qw( $Profiles ); my $VERSION = '$Id: calendar.pl,v 1.13 2018/10/30 13:53:00 nick Exp $'; my $DEBUG = ""; my $URL = "http://demandred.dyndns.org/cgi-bin/ConnorCalendar/index.cgi"; my %post_in = ( ); my %opts = &fetchOptions( ); my @list = ( ); my @months = qw/ January February March April May June July August September October November December /; my %holidays = ( "Easter Sunday" => 'even', "Christmas Day" => 'even', "Christmas Eve" => 'odd', "Father's Day" => 'all', "Independence Day" => 'even', "Labor Day" => 'even', "Memorial Day" => 'odd', "New Year's Day" => 'odd', "New Year's Eve" => 'odd', "Thanksgiving Day" => 'odd', ); my %specials = ( "11/28" => "even", "5/6" => "odd", ); print "Content-type: text/html\n\n"; print &header( ); ## Change this @weekend to 'qw/ 2011 8 12 /' for original schedule my @weekend = qw/ 2011 8 19 /; my %weekends = &calcWeekends( @weekend ); &ReadParse( ); my $yr = sprintf( "%d", $post_in{'cy'} || ( localtime )[5] + 1900 ); my $YEAR = sprintf( "%d", $yr ); push @list, 'Easter Sunday' if ( $YEAR % 2 == 0 ); print &css( ); my $year_us = Date::Pcalendar::Year->new( $YEAR, $Profiles->{'US-FL'} ); my @hdays = $year_us->labels( ); print "

<-- " . "Calendar Days Connor Visits for $YEAR" . " -->

"; my $row = 0; print ""; for( my $month = 1; $month <= 12; $month++ ) { if ( $row >= 3 ) { $row = 0; print ""; } print ""; $row++; } print "
"; print "$months[($month - 1)]\n"; print "
Su Mo Tu We Th Fr Sa\n";
	my @CALS = calendar( $month, $YEAR );
	foreach my $cal ( @CALS ) 
	{
		foreach my $day ( @$cal ) 
		{
			if( defined $day ) 
			{
				my $h_day = ( $year_us->labels( $YEAR, $month, $day ) )[1];
				if( &IHaveConnor( $h_day ) ) {
					push @list, $h_day;
					print sprintf "%2d ", $day;
				} elsif ( &isSpecial( $YEAR, $month, $day ) || 
 					  &isWeekend( $YEAR, $month, $day ) ) {
					print sprintf "%2d ", $day;
				} elsif ( &isToday( $YEAR, $month, $day ) ) {
					print sprintf "%2d ", $day;
				} else {
					print sprintf "%2d ", $day;
				}
			} else {
				print '   ';
			}	
		}
		print "\n";
	}
	print "
"; print "

Holidays Connor visits are in Red\n
"; print "Today is Blue\n
"; print "Weekends and special days Connor visits are in Green\n

"; print "
List of Special/Holidays " . "Connor Visits:

"; print map { $_ . "
\n" } sort @list; print "

\n"; print "

Version: $VERSION
"; print "CVS: http://demandred.dyndns.org/cgi-bin/cvsweb/ConnorCalendar/"; print "

"; ############################################################################### ############################################################################### sub IHaveConnor { my $holiday = shift || return 0; my $y = ( $YEAR % 2 ) ? "odd" : "even"; if ( defined $holidays{$holiday} ) { return 1 if ( $holidays{$holiday} eq "all" ); return 1 if ( $holidays{$holiday} eq $y ); } return 0; } sub isSpecial { my $y = shift || return 0; my $m = shift || return 0; my $d = shift || return 0; my $yr = ( $YEAR % 2 ) ? "odd" : "even"; my $ref = "$m/$d"; if ( defined $specials{$ref} ) { if ( $specials{$ref} eq "all" || $specials{$ref} eq $yr ) { push @list, $ref; return 1; } } return 0; } sub isWeekend { my $y = shift || return 0; my $m = shift || return 0; my $d = shift || return 0; $m--; my $ds = sprintf( "$y/$months[$m]/%02d", $d ); return 1 if ( defined $weekends{$ds} ); return 0; } sub isToday { my $y = shift || return 0; my $m = shift || return 0; my $d = shift || return 0; return 1 if ( $y eq ( ( localtime )[5] + 1900 ) && $m eq ( ( localtime )[4] + 1 ) && $d eq ( ( localtime )[3] ) ); return 0; } sub calcWeekends { my $y = shift; my $m = shift; my $d = shift; my %weekends = ( ); print "Weekends Connor Visits:\n"; use Calendar; my $date = Calendar->new_from_Gregorian( $m, $d, $y ); $weekends{$date->date_string( "%Y/%M/%d" )} = 1; &twoMore( $date ); while ( $date->date_string( "%Y" ) <= 2026 ) { $date += 14; $weekends{$date->date_string( "%Y/%M/%d" )} = 1; &twoMore( $date ); } return %weekends; sub twoMore { my $td = shift; $td++; $weekends{$td->date_string( "%Y/%M/%d" )} = 1; $td++; $weekends{$td->date_string( "%Y/%M/%d" )} = 1; } } ############################################################################### ############################################################################### sub ReadParse { my $a = $_[0] ? $_[0] : \%post_in; my ( $i, $in ); my @in = ( ); if ( defined $ENV{'SERVER_NAME'} ) { my $SERVER = $ENV{'SERVER_NAME'}; } if ( ( defined $ENV{'REQUEST_METHOD'} ) && ($ENV{'REQUEST_METHOD'} eq 'POST') ) { read(STDIN, $in, $ENV{'CONTENT_LENGTH'}); } else { $in = $ENV{'QUERY_STRING'} || ""; } @in = split(/\&/, $in); foreach $i (@in) { my ($k, $v) = split(/=/, $i, 2); $k =~ s/\+/ /g; $k =~ s/%(..)/pack("c",hex($1))/ge; $v =~ s/\+/ /g; $v =~ s/%(..)/pack("c",hex($1))/ge; $a->{$k} = defined($a->{$k}) ? $a->{$k}."\0".$v : $v; } } ############################################################################### ## ## &fetchOptions( ); ## ## Grab our command line arguments and toss them in to a hash ## ############################################################################### sub fetchOptions { my %opts; &GetOptions( "help|?" => \$opts{'help'}, "man" => \$opts{'man'}, ) || &pod2usage( ); &pod2usage( ) if defined $opts{'help'}; &pod2usage( { -verbose => 2, -input => \*DATA } ) if defined $opts{'man'}; return %opts; } sub header { return < Calendar Days Connor Visits EOF } sub css { return < body { padding-top: 0px; padding-left: 0px; padding-right: 0px; padding-bottom: 0px; text-align:left; margin:0; font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; #font-family: Geneva, Arial, Helvetica, sans-serif; font-size: 12pt; background: #eeeeee; color:#000000; } .name { color: #191970; font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; #font-family: Verdana, Arial, sans-serif; font-size: 18pt; font-weight: bold; line-height: 38pt; text-align: center; } p.Legend { color: #000000; font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 8pt; margin: auto; width: 300px; background-color : transparent; border-top: 1px solid #888888; border-left: 1px solid #888888; border-right: 1px solid #888888; border-bottom: 1px solid #888888; padding-top: 3px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; } h1 { color: #191970; font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; #font-family: Verdana, Arial, sans-serif; font-size: 12pt; font-weight: bold; line-height: 15pt; background-color : transparent; margin-left: 20px; margin-right: 20px; border-top: 1px solid black; border-bottom: 1px solid black; } h2 { color: #191970; font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-weight: bold; font-size: 18px; } h3 { color: #191970; font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-weight: bold; font-size: 14px; } textarea { width:100%; } .gallery { padding-top: 80px; padding-left: 60px; padding-right: 50px; line-height: 120%; background:url('topleft.jpg') no-repeat top left; } .browse { padding-top: 80px; padding-left: 60px; padding-right: 50px; line-height: 120%; background:url(topleft.jpg) no-repeat top left; } .content, .rc { padding-top: 100px; padding-left: 80px; padding-right: 50px; line-height: 120%; } p.footer { color: #000000; font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, sans-serif; font-size: 8pt; margin: auto; width: 500px; background-color : transparent; border-top: 1px solid #888888; padding-top: 3px; padding-bottom: 3px; padding-left: 3px; padding-right: 3px; text-align: center; } .header { float: right; margin-top: 30px; margin-right: 50px; padding: 10px; padding-top: 10px,10px,10px,10px; } pre { border: #777777 1px dashed; padding: 0.5em; margin-left: 1em; margin-right: 2em; white-space: pre; background-color: #fbfdff; color: black; font-size:12px; } .refer { padding-left: 60px; padding-right: 50px; margin-right: 50px; margin-left: 50px; font-size:80%; } .gotobar { color: #191970; font-size:10px; } .edit bar { color: #949ce5; } .contactInfo { font-size:12px; text-align:center; } .workHeader { text-align:left; font-size:13px; text-decoration:none; font-weight:normal; } .workHeaderDate { float: right; } .workHeaderStrong { font-size:15px; text-decoration:none; font-weight:bolder; } .jobDescription { padding-top:15px; font-size:13px; } .bulletContent { font-size:13px; } .leftCol { width:10.2em; position:absolute; top:0; font-size:13px; padding-left:1%; padding-right:1%; } .rightCol { width:10.2em; position:absolute; top:0; font-size:13px; padding-left:1%; padding-right:1%; } a:link {color:#082e58; text-decoration: none; font-weight:bolder;} a:visited {color:#7795b7; font-weight:normal; text-decoration:none;} a:hover {color:#949ce5;} a.definition:before { content:"[::"; } a.definition:after { content:"]"; } a.alias { text-decoration:none; border-bottom: thin dashed; } a.near:link { color:#093; } a.near:visited { color:#550; } a.upload:before { content:"<"; } a.upload:after { content:">"; } a.outside:before { content:"["; } a.outside:after { content:"]"; } img.logo { float: right; clear: right; border-style:none; } div.diff { padding-left:5%; padding-right:5%; } div.old { background-color:#FFFFAF; } div.new { background-color:#CFFFCF; } div.message { background-color:#FEE; } div.journal h1 { font-size:large; } table.history { border-style:none; } td.history { border-style:none; } span.result { font-size:larger; } span.info { font-size:smaller; font-style:italic; } div.rss { background-color:#EEF; } div.sister { float:left; margin-right:1ex; background-color:#FFF; } div.sister p { margin-top:0; } div.sister img { border:none; } div.near { background-color:#EFE; } div.near p { margin-top:0; } EOF } __END__ =head1 NAME masterbuild.pl - blurb =head1 SYNOPSIS masterbuild.pl [options] Options: --help,? Display the basic help menu --man,m Display the detailed man page =head1 DESCRIPTION =head1 HISTORY =head1 AUTHOR Nicholas DeClario =head1 BUGS This is a work in progress. Please report all bugs to the author. =head1 SEE ALSO =head1 COPYRIGHT =cut