<?php
/*
File: $Id$
This script generates a LaTeX include file that contains macros specifying
the date ranges for every week of the three main teaching periods through
the year (i.e., summer school, first semester, second semester). Simply set
the configuration as outlined below and run the script, saving the output
in a suitable location (ideally only once for all papers, perhaps in
$ALL_PAPERS_ROOT?).
*/
// LaTeX macro names can't include numbers, so we have to convert them to words.
include( "Numbers/Words.php" );
/*
Teaching period configuration. It's easily extensible to a new teaching
period simply by adding a new specification for that period. The key should
be valid as a LaTeX macro name (i.e., no spaces, no digits, no punctuation).
The components of each period specification are:
start_date: The date of the first day of the first week of the period.
num_weeks: The total number of weeks in the period, /including/ any
breaks (e.g., 13 teaching weeks plus 1 week mid-semester
break = 14 weeks).
break_week: The week number that the break (if any) falls in, relative
to num_weeks, so if the break week falls after the sixth
teaching week, then set this to 7. The numbering of teaching
weeks will skip the break week regardless. If there is no
break in the period, then set this to a number larger than
num_weeks.
Note that this currently only supports a single, one week
break per period. Generalising the configuration to
multiple/longer breaks probably isn't that difficult if
needed (a list of week numbers instead of a single value
should cater for all cases). Setting up the LaTeX macros
and teaching week numbering could be tricky, though.
*/
$periods = array(
'SummerSchool' => array(
'start_date' => new DateTime( "2012-01-09" ),
'num_weeks' => 6,
'break_week' => 9999,
),
"SemesterOne" => array(
'start_date' => new DateTime( "2012-02-27" ),
'num_weeks' => 14,
'break_week' => 7,
),
"SemesterTwo" => array(
'start_date' => new DateTime( "2012-07-09" ),
'num_weeks' => 14,
'break_week' => 8,
),
);
// A couple of handy date intervals: four days to the end of the current week,
// and seven days to the start of next week.
$plus_four_days = new DateInterval( 'P4D' );
$plus_seven_days = new DateInterval( 'P7D' );
$numwords = new Numbers_Words();
foreach ( $periods as $period_name => $period_data )
{
$week_start = clone( $period_data['start_date'] );
for ( $week = 1; $week <= $period_data['num_weeks']; $week++ )
{
$week_end = clone( $week_start );
$week_end->add( $plus_four_days );
// If the week start and end dates are in the same month, we only
// need to output the month name once.
$same_month = $week_start->format( 'n' ) == $week_end->format( 'n' );
// Handle break weeks.
if ( $week == $period_data['break_week'] )
{
printf( "\\newcommand{\\%sMidSemesterBreak}{%s--%s}\n",
$period_name,
( $same_month ) ? $week_start->format( 'j' ) : $week_start->format( 'j M' ),
$week_end->format( 'j M' )
);
} // if break week
else
{
// If we've passed the break week, then we need to subtract one from
// the week count to get the correct teaching week number.
$week_number = ( $week > $period_data['break_week'] ) ? $week - 1 : $week;
if( $same_month )
{
printf( "\\newcommand{\\%sWeek%s}{%s--%s \\\\ %s}\n",
$period_name,
ucfirst( $numwords->toWords( $week_number ) ),
$week_start->format( 'j' ),
$week_end->format( 'j' ),
$week_end->format( 'M' )
);
} // if same month
else
{
printf( "\\newcommand{\\%sWeek%s}{%s \\\\ --%s}\n",
$period_name,
ucfirst( $numwords->toWords( $week_number ) ),
$week_start->format( 'j M' ),
$week_end->format( 'j M' )
);
} // else different months
} // else normal teaching week
$week_start->add( $plus_seven_days );
} // for each week
} // foreach teaching period
?>