diff options
Diffstat (limited to 'SemanticMediaWiki/includes/RecurringEvents.php')
-rw-r--r-- | SemanticMediaWiki/includes/RecurringEvents.php | 372 |
1 files changed, 0 insertions, 372 deletions
diff --git a/SemanticMediaWiki/includes/RecurringEvents.php b/SemanticMediaWiki/includes/RecurringEvents.php deleted file mode 100644 index 464365d1..00000000 --- a/SemanticMediaWiki/includes/RecurringEvents.php +++ /dev/null @@ -1,372 +0,0 @@ -<?php - -namespace SMW; - -use Message; - -use SMWDITime; -use SMWTimeValue; - -/** - * Class returns recurring events - * - * @see http://semantic-mediawiki.org/wiki/Help:Recurring_events - * - * @since 1.9 - * - * @file - * @ingroup SMW - * - * @author Yaron Koren - * @author Jeroen De Dauw - * @author mwjames - */ - -/** - * This class determines recurring events based on invoked parameters - * - * @ingroup SMW - */ -class RecurringEvents { - - /** - * Represents Settings object - * @var Settings - */ - protected $settings; - - /** - * Defines the property used - * var $property - */ - protected $property = null; - - /** - * Defines the dates - * var $dates - */ - protected $dates = array(); - - /** - * Defines remaining / unused parameters - * var $parameters - */ - protected $parameters = array(); - - /** - * Defines errors - * var $errors - */ - protected $errors = array(); - - /** - * Constructor - * - * @since 1.9 - * - * @param array $parameters - * @param Settings $settings - */ - public function __construct( array $parameters, Settings $settings ) { - $this->settings = $settings; - $this->parse( $parameters ); - } - - /** - * Returns property used - * - * @since 1.9 - * - * @return string - */ - public function getProperty() { - return $this->property; - } - - /** - * Returns dates - * - * @since 1.9 - * - * @return array - */ - public function getDates() { - return $this->dates; - } - - /** - * Returns unused parameters - * - * @since 1.9 - * - * @return array - */ - public function getParameters() { - return $this->parameters; - } - - /** - * Returns errors - * - * @since 1.9 - * - * @return array - */ - public function getErrors() { - return $this->errors; - } - - /** - * Set error - * - * @since 1.9 - * - * @return mixed - */ - protected function setError( $error ) { - $this->errors = array_merge( $error, $this->errors ); - } - - /** - * Returns the "Julian day" value from an object of type - * SMWTimeValue. - */ - public function getJulianDay( $dateDataValue ) { - if ( is_null( $dateDataValue ) ) { - return null; - } - $dateDataItem = $dateDataValue->getDataItem(); - // This might have returned an 'SMWDIError' object. - if ( $dateDataItem instanceof SMWDITime ) { - return $dateDataItem->getJD(); - } - return null; - } - - /** - * Parse parameters and set internal properties - * - * @since 1.9 - * - * @param $params - */ - protected function parse( $parameters ) { - // Initialize variables. - $all_date_strings = array(); - $unused_params = array(); - $property_name = $start_date = $end_date = $unit = $period = $week_num = null; - $included_dates = array(); - $excluded_dates = array(); - $excluded_dates_jd = array(); - - // Parse parameters and assign values - foreach ( $parameters as $name => $values ) { - - foreach ( $values as $value ) { - switch( $name ) { - case 'property': - $this->property = $value; - break; - case 'start': - $start_date = DataValueFactory::getInstance()->newTypeIDValue( '_dat', $value ); - break; - case 'end': - $end_date = DataValueFactory::getInstance()->newTypeIDValue( '_dat', $value ); - break; - case 'limit': - // Override default limit with query specific limit - $this->settings->set( 'smwgDefaultNumRecurringEvents', (int)$value ); - break; - case 'unit': - $unit = $value; - break; - case 'period': - $period = (int)$value; - break; - case 'week number': - $week_num = (int)$value; - break; - case 'include': - // This is for compatibility only otherwise we break - // to much at once. Instead of writing include=...;... - // it should be include=...;...|+sep=; because the - // ParameterParser class is conditioned to split those - // parameter accordingly - if ( strpos( $value, ';' ) ){ - $included_dates = explode( ';', $value ); - } else { - $included_dates[] = $value; - } - break; - case 'exclude': - // Some as above - if ( strpos( $value, ';' ) ){ - $excluded_dates = explode( ';', $value ); - } else { - $excluded_dates[] = $value; - } - break; - default: - $this->parameters[$name][] = $value; - } - } - } - - if ( $start_date === null ) { - $this->errors[] = new Message( 'smw-events-start-date-missing' ); - return; - } else if ( !( $start_date->getDataItem() instanceof SMWDITime ) ) { - $this->setError( $start_date->getErrors() ); - return; - } - - // Check property - if ( is_null( $this->property ) ) { - $this->errors[] = new Message( 'smw-events-property-missing' ); - return; - } - - // Exclude dates - foreach ( $excluded_dates as $date_str ) { - $excluded_dates_jd[] = $this->getJulianDay( - DataValueFactory::getInstance()->newTypeIDValue( '_dat', $date_str ) - ); - } - - // If the period is null, or outside of normal bounds, set it to 1. - if ( is_null( $period ) || $period < 1 || $period > 500 ) { - $period = 1; - } - - // Handle 'week number', but only if it's of unit 'month'. - if ( $unit == 'month' && ! is_null( $week_num ) ) { - $unit = 'dayofweekinmonth'; - - if ( $week_num < -4 || $week_num > 5 || $week_num == 0 ) { - $week_num = null; - } - } - - if ( $unit == 'dayofweekinmonth' && is_null( $week_num ) ) { - $week_num = ceil( $start_date->getDay() / 7 ); - } - - // Get the Julian day value for both the start and end date. - $end_date_jd = $this->getJulianDay( $end_date ); - - $cur_date = $start_date; - $cur_date_jd = $this->getJulianDay( $cur_date ); - $i = 0; - - do { - $i++; - $exclude_date = ( in_array( $cur_date_jd, $excluded_dates_jd ) ); - - if ( !$exclude_date ) { - $all_date_strings[] = $cur_date->getLongWikiText(); - } - - // Now get the next date. - // Handling is different depending on whether it's - // month/year or week/day since the latter is a set - // number of days while the former isn't. - if ( $unit === 'year' || $unit == 'month' ) { - $cur_year = $cur_date->getYear(); - $cur_month = $cur_date->getMonth(); - $cur_day = $start_date->getDay(); - $cur_time = $cur_date->getTimeString(); - - if ( $unit == 'year' ) { - $cur_year += $period; - $display_month = $cur_month; - } else { // $unit === 'month' - $cur_month += $period; - $cur_year += (int)( ( $cur_month - 1 ) / 12 ); - $cur_month %= 12; - $display_month = ( $cur_month == 0 ) ? 12 : $cur_month; - } - - // If the date is February 29, and this isn't - // a leap year, change it to February 28. - if ( $cur_month == 2 && $cur_day == 29 ) { - if ( !date( 'L', strtotime( "$cur_year-1-1" ) ) ) { - $cur_day = 28; - } - } - - $date_str = "$cur_year-$display_month-$cur_day $cur_time"; - $cur_date = DataValueFactory::getInstance()->newTypeIDValue( '_dat', $date_str ); - $all_date_strings = array_merge( $all_date_strings, $included_dates); - $cur_date_jd = $cur_date->getDataItem()->getJD(); - } elseif ( $unit == 'dayofweekinmonth' ) { - // e.g., "3rd Monday of every month" - $prev_month = $cur_date->getMonth(); - $prev_year = $cur_date->getYear(); - - $new_month = ( $prev_month + $period ) % 12; - if ( $new_month == 0 ) $new_month = 12; - - $new_year = $prev_year + floor( ( $prev_month + $period - 1 ) / 12 ); - $cur_date_jd += ( 28 * $period ) - 7; - - // We're sometime before the actual date now - - // keep incrementing by a week, until we get there. - do { - $cur_date_jd += 7; - $cur_date = $this->getJulianDayTimeValue( $cur_date_jd ); - $right_month = ( $cur_date->getMonth() == $new_month ); - - if ( $week_num < 0 ) { - $next_week_jd = $cur_date_jd; - - do { - $next_week_jd += 7; - $next_week_date = $this->getJulianDayTimeValue( $next_week_jd ); - $right_week = ( $next_week_date->getMonth() != $new_month ) || ( $next_week_date->getYear() != $new_year ); - } while ( !$right_week ); - - $cur_date_jd = $next_week_jd + ( 7 * $week_num ); - $cur_date = $this->getJulianDayTimeValue( $cur_date_jd ); - } else { - $cur_week_num = ceil( $cur_date->getDay() / 7 ); - $right_week = ( $cur_week_num == $week_num ); - - if ( $week_num == 5 && ( $cur_date->getMonth() % 12 == ( $new_month + 1 ) % 12 ) ) { - $cur_date_jd -= 7; - $cur_date = $this->getJulianDayTimeValue( $cur_date_jd ); - $right_month = $right_week = true; - } - } - } while ( !$right_month || !$right_week); - } else { // $unit == 'day' or 'week' - // Assume 'day' if it's none of the above. - $cur_date_jd += ( $unit === 'week' ) ? 7 * $period : $period; - $cur_date = $this->getJulianDayTimeValue( $cur_date_jd ); - } - - // should we stop? - if ( is_null( $end_date ) ) { - $reached_end_date = $i > $this->settings->get( 'smwgDefaultNumRecurringEvents' ); - } else { - $reached_end_date = ( $cur_date_jd > $end_date_jd ) || ( $i > $this->settings->get( 'smwgMaxNumRecurringEvents' ) ); - } - } while ( !$reached_end_date ); - - // Handle the 'include' dates as well. - $all_date_strings = array_filter( array_merge( $all_date_strings, $included_dates ) ); - - // Set dates - $this->dates = $all_date_strings; - } - - /** - * Helper function - creates an object of type SMWTimeValue based - * on a "Julian day" integer - */ - protected function getJulianDayTimeValue( $jd ) { - $timeDataItem = SMWDITime::newFromJD( $jd, SMWDITime::CM_GREGORIAN, SMWDITime::PREC_YMDT ); - $timeValue = new SMWTimeValue( '_dat' ); - $timeValue->setDataItem( $timeDataItem ); - return $timeValue; - } -} |