File:  [Local Repository] / ConnorCalendar / calendar.pl
Revision 1.14: download - view: text, annotated - select for diffs
Fri Nov 13 18:07:40 2020 UTC (4 years, 1 month ago) by nick
Branches: MAIN
CVS tags: HEAD
Added school calendar days for 2020/2021 school year.

#!/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 <nick@demandred.dyndns.org>
|   March 2009
|	$Id: calendar.pl,v 1.14 2020/11/13 18:07:40 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.14 2020/11/13 18:07:40 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",
		);

my @school_days = (
        "2020/11/27",
        "2020/12/24",
        "2020/12/25",
        "2020/12/28",
        "2020/12/29",
        "2020/12/30",
        "2020/12/31",
        "2021/01/01",
        "2021/01/18",
        "2021/02/15",
        "2021/03/29",
        "2021/03/30",
        "2021/03/31",
        "2021/04/01",
        "2021/04/02",
        "2021/04/05",
        "2021/05/31",
        "2021/06/01"
    );

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 "<h1><center><a href=\"$URL?cy=" . ( $YEAR - 1 ) .
      "\">&lt;--</a> " .
      "Calendar Days Connor Visits for $YEAR" .
       "<a href=\"$URL?cy=" . ( $YEAR + 1 ) . "\"> --&gt;</a></h1>";
my $row = 0;
print "<table align=center border=0><tr>";
for( my $month = 1; $month <= 12; $month++ )
{
	if ( $row >= 3 ) 
	{
		$row = 0;
		print "</tr><tr>";
	}
	print "<td align=center valign=top>";
	print "<b>$months[($month - 1)]</b>\n";
	print "<pre>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 "<font color=red><b>%2d</b> </font>", $day;
				} elsif ( &isSpecial( $YEAR, $month, $day ) || 
 					  &isWeekend( $YEAR, $month, $day ) ) {
					print sprintf "<font color=green><b>%2d</b> </font>", $day;
				} elsif ( &isToday( $YEAR, $month, $day ) ) {
					print sprintf "<font color=blue><b>%2d</b> </font>", $day;
                } elsif ( &isSchoolClosed( $YEAR, $month, $day ) ) {
					print sprintf "<font color=orange><b>%2d</b> </font>", $day;
				} else {
					print sprintf "%2d ", $day;
				}
			} else {
				print '   ';
			}	
		}
		print "\n";
	}
	print "</pre></td>";
	$row++;
}
print "</tr></table>";
print "<p class=\"Legend\">Holidays Connor visits are in <font color=red>Red</font>\n</br>";
print "Today is <font color=blue>Blue</font>\n</br>";
print "Days off from school are <font color=orange>Orange</font>\n<br><b> Last Day of School 06/23/2021</b>\n</br>\n";
print "Weekends and special days Connor visits are in <font color=green>Green</font>\n</p>";


print "<table width=35% align=center border=0><tr><td>List of Special/Holidays " .
      "Connor Visits:<br /><p class=Legend>";
print map { $_ . "<br />\n" } sort @list;
print "</p></td></tr></table>\n";
print "</pre><p class=\"footer\">Version: <font color=green>$VERSION</font><br />";
print "CVS: <a target=\"_new\" href=\"http://demandred.dyndns.org/cgi-bin/cvsweb/ConnorCalendar/\">http://demandred.dyndns.org/cgi-bin/cvsweb/ConnorCalendar/</a>";
print "</center></p>";


###############################################################################
###############################################################################
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 isSchoolClosed
{
    my $y = shift || return 0;
    my $m = shift || return 0;
    my $d = shift || return 0;

    my $date_str = sprintf( "$y/%02d/%02d", $m, $d );

    foreach my $sd ( @school_days ) {
      return 1 if $date_str =~ m/$sd/;
    }

    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 <<EOF;
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <title>Calendar Days Connor Visits</title>
  </head>
<body bgcolor="#FFFFFF">
EOF
}

sub css {
	return <<EOF;
<style type="text/css">
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; }
</style>
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 <nick@declario.com>

=head1 BUGS

This is a work in progress.  Please report all bugs to the author.

=head1 SEE ALSO

=head1 COPYRIGHT

=cut

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