MediaWiki Calendar edit

Installation edit

  • Save MWCalendar.php to ./extensions folder.
  • Open LocalSettings.php and append :
require_once("extensions/MWCalendar.php");

Usage edit

Hook edit

  • <MWCalendar ...Arguments... > ...Data... </MWCalendar>

Arguments edit

  • Display: Integer. This will show X number of months. (Default 1)
  • MonthSkip: Integer. Skip X number of months. (Default 1)
  • Year: Integer. Which Year to start with. (Default Current)
  • TitleYear: Boolean. Show year title or not. (Default True)
  • Month: Integer. Which Month to start with. (Default Current)
  • TitleMonth: Boolean. Show month title or not. (Default True)
  • MonthNames: String. Comma delimited values for all 12 months. (Default January,February,March,April,May,June,July,August,September,October,November,December)
  • DaysOfWeek: String. Comma delimited values for all 7 days of the week. (Default Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday)
  • StartDay: Integer. Value between 0 and 6. 0=Sunday..6=Saturday for start of week. (Default 0)
  • Classes: All Strings. Value for given item. (Default Blank)
    • ClassTable: Entire Table
    • ClassTableRow: All Rows
    • ClassTableCell: All Cells
    • ClassTableCellToday: Today's Cell
    • ClassTableDOW: Days of Week row.
    • ClassTableMonth: Month row.
    • ClassTableYear: Year row.
  • Styles: All Strings. Value for given item. (Default Blank)
    • StyleTable: Entire Table
    • StyleTableRow: All Rows
    • StyleTableCell: All Cells
    • StyleTableCellToday: Today's Cell (Default Red Text)
    • StyleTableDOW: Days of Week row.
    • StyleTableMonth: Month row.
    • StyleTableYear: Year row.
  • TableBorder: Integer. Size of border. (Default 1)
  • TableCellSpacing: Integer. Spacing between cells. (Default 0)
  • TableCellPadding: Integer. Spacing within cell. (Default 1)
  • DayUnderline: Boolean. Underline day in calender. (Default true)

Data edit

  • YYYY-MM-DD ::: Data: For One Day
  • YYYY-MM-DD ::: YYYY-MM-DD ::: Data: For Range Of Days
  • %YYYY-MM-DD ::: Data: To omit one day of data.
  • YYYY-MM-DD E xD ::: YYYY-MM-DD ::: Data: Every x days within range.
  • YYYY-MM-DD E xW ::: YYYY-MM-DD ::: Data: Every x week(s) within range.
  • YYYY-MM-DD E xM ::: YYYY-MM-DD ::: Data: Every x month(s) within range.

Examples edit

Examples only show images as the extension is not installed here. The output will be HTML, and linking and data can include html, it just cannot show up here.

Example 1 edit

<MWCalendar Display="1" Month="8" Year="1978">
   1978-08-13:::Eric's Birthday!
</MWCalendar>

 

Example 2 edit

<MWCalendar
  Display="2"
  StyleTable="width:80%;"
  StyleTableCellToday="background:#009;color:#FFF;"
  StyleTableDOW="font-weight:bold;height:50px;"
  StyleTableMonth="background:#C06;color:#FFF;"
  StyleTableCell="height:50px;width:14%;">

Holidays
    2016-06-03 ::: <font color = cadetblue>Sorin</font>
   

</MWCalendar>

 

Example 3 edit

<MWCalendar
  Display="1" Month="7" Year="2007">
2007-07-19 E 2D ::: 2007-07-25 ::: <font color=red>In Oshawa</font>
%2007-07-21 ::: <font color=red>In Oshawa</font>
2007-07-21 ::: Marcia's Wedding
</MWCalendar>

 

MWCalendar.php edit

<?php
$wgExtensionFunctions[] = "MWCalendar";

function MWCalendar() {
	global $wgParser;
	# register the extension with the WikiText parser
	$wgParser->setHook( "MWCalendar", "renderMWCalendar" );
}

# The callback function for converting the input text to HTML output
function renderMWCalendar( $input, $argv ) {
	global $wgAuth;
	$retval = ""; # Default Output
	$proceed = true;
	$development = false;

	if($development)
		$retval .= "<H5 STYLE=\"width:60%;text-align:center;color:#C00;border-top:1px #C00 solid;border-bottom:1px #C00 solid;\">Unstable Version of <MWCalendar> Extension<br>Currently Testing</H5>";

	$argv['display'] = isset($argv['display']) ? $argv['display'] : 1; // Number Of Months
	$argv['month'] = isset($argv['month']) ? $argv['month'] : date('m'); // Default Month
	$argv['year'] = isset($argv['year']) ? $argv['year'] : date('Y'); // Default Year
	$argv['titleyear'] = isset($argv['titleyear']) ? $argv['titleyear'] : true;
	$argv['titlemonth'] = isset($argv['titlemonth']) ? $argv['titlemonth'] : true;
	$argv['monthskip'] = isset($argv['monthskip']) ? $argv['monthskip'] : 1;

	$argv['monthnames'] = isset($argv['monthnames']) ? $argv['monthnames'] : "January,February,March,April,May,June,July,August,September,October,November,December";
	$argv['daysofweek'] = isset($argv['daysofweek']) ? $argv['daysofweek'] : "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday";
	$argv['startday'] = isset($argv['startday']) ? $argv['startday'] : 0; // 0= Sunday .... 6=Saturday

	$argv['classtable'] = isset($argv['classtable']) ? $argv['classtable'] : "";
	$argv['classtablerow'] = isset($argv['classtablerow']) ? $argv['classtablerow'] : "";
	$argv['classtablecell'] = isset($argv['classtablecell']) ? $argv['classtablecell'] : "";
	$argv['classtablecelltoday'] = isset($argv['classtablecelltoday']) ? $argv['classtablecelltoday'] : "";
	$argv['classtabledow'] = isset($argv['classtabledow']) ? $argv['classtabledow'] : "";
	$argv['classtablemonth'] = isset($argv['classtablemonth']) ? $argv['classtablemonth'] : "";
	$argv['classtableyear'] = isset($argv['classtableyear']) ? $argv['classtableyear'] : "";

	$argv['styletable'] = isset($argv['styletable']) ? $argv['styletable'] : "";
	$argv['styletablerow'] = isset($argv['styletablerow']) ? $argv['styletablerow'] : "";
	$argv['styletablecell'] = isset($argv['styletablecell']) ? $argv['styletablecell'] : "";
	$argv['styletablecelltoday'] = isset($argv['styletablecelltoday']) ? $argv['styletablecelltoday'] : "font-weight:bold;text-color:#cc000;";
	$argv['styletabledow'] = isset($argv['styletabledow']) ? $argv['styletabledow'] : "";
	$argv['styletablemonth'] = isset($argv['styletablemonth']) ? $argv['styletablemonth'] : "";
	$argv['styletableyear'] = isset($argv['styletableyear']) ? $argv['styletableyear'] : "";

	$argv['tableborder'] = isset($argv['tableborder']) ? $argv['tableborder'] : 1;
	$argv['tablecellspacing'] = isset($argv['tablecellspacing']) ? $argv['tablecellspacing'] : 0;
	$argv['tablecellpadding'] = isset($argv['tablecellpadding']) ? $argv['tablecellpadding'] : 1;

	$argv['dayunderline'] = isset($argv['dayunderline']) ? $argv['dayunderline'] : true;

/*
******************************************************
Perform Value Checks
******************************************************
*/
	// Check If Value Passed Is Numeric
	if(!is_numeric($argv['display'])) { $retval = "<B>Display</B> is Non-Numeric. Please double-check value.<br><br>display = <I>".$argv['display']."</I>"; $proceed = false; }
	elseif($argv['display']<=0) { $retval = "<B>Display</B> is set below 0. Please double-check value.<br><br>display = <I>".$argv['display']."</I>"; $proceed = false; }
	if(!is_numeric($argv['monthskip'])) { $retval = "<B>Month Skip</B> is Non-Numeric. Please double-check value.<br><br>monthskip = <I>".$argv['monthskip']."</I>"; $proceed = false; }
	elseif($argv['monthskip']<=0) { $retval = "<B>Month Skip</B> is set below 0. Please double-check value.<br><br>monthskip = <I>".$argv['monthskip']."</I>"; $proceed = false; }
	if(!is_numeric($argv['startday'])) { $retval = "<B>Start Day</B> is Non-Numeric. Please double-check value.<br><br>startday = <I>".$argv['startday']."</I>"; $proceed = false; }
	elseif($argv['startday']<0) { $retval = "<B>Start Day</B> is is below 0. Please double-check value.<br><br>startday = <I>".$argv['startday']."</I>"; $proceed = false; }
	if(!is_numeric($argv['year'])) { $retval = "<B>Year</B> is Non-Numeric. Please double-check value.<br><br>year = <I>".$argv['year']."</I>"; $proceed = false; }
	elseif($argv['year']<=0) { $retval = "<B>Year</B> is is below 0. Please double-check value.<br><br>year = <I>".$argv['year']."</I>"; $proceed = false; }
	if(!is_numeric($argv['month'])) { $retval = "<B>Month</B> is Non-Numeric. Please double-check value.<br><br>month = <I>".$argv['month']."</I>"; $proceed = false; }
	elseif($argv['month']==0) { $retval = "<B>Month</B> is set to 0. Please double-check value.<br><br>month = <I>".$argv['month']."</I>"; $proceed = false; }
	elseif($argv['month']<0) {
		// If specified month is in negative, substract from current month and selected year.
		$argv['month'] = date('m',mktime(0,0,0,date('m')+$argv['month'],1,$argv['year']));
	}
	if($proceed) {
		$data = MWCalendar_ConvertData($input);
		$tmpYear = $argv['year'];
		$retval .= "<TABLE CELLSPACING=\"".$argv['tablecellspacing']."\" CELLPADDING=\"".$argv['tablecellpadding']."\" BORDER=\"".$argv['tableborder']."\"".((strlen($argv['classtable'])>0) ? " CLASS=\"".$argv['classtable']."\"" : "")."".((strlen($argv['styletable'])>0) ? " STYLE=\"".$argv['styletable']."\"" : "").">";
		for($x=1; $x <= $argv['display'] ; $x++) {

			// Create Calendar and Assign Default Values
			$cal = new MWCalendar;
			foreach($data as $value) $cal->setIncludeData($value['day'],$value['month'],$value['year'],$value['data']);
			$cal->setHTMLClasses($argv['classtable'],$argv['classtablerow'],$argv['classtablecell'],$argv['classtablecelltoday'],$argv['classtabledow'],$argv['classtableyear'],$argv['classtablemonth']);
			$cal->setHTMLStyles($argv['styletable'],$argv['styletablerow'],$argv['styletablecell'],$argv['styletablecelltoday'],$argv['styletabledow'],$argv['styletableyear'],$argv['styletablemonth']);
			$cal->setDayNames(explode(",",$argv['daysofweek']));
			$cal->setDayUnderline($argv['dayunderline']);
			$cal->setMonthNames(explode(",",$argv['monthnames']));
			$cal->setStartDay($argv['startday']);
			$cal->showMonth = $argv['titlemonth'];
			if($x!=1 || $argv['titleyear']) $cal->showYear = false;
			if($tmpYear!=$argv['year'] && $argv['titleyear']) { $cal->showYear = true; $tmpYear = $argv['year']; }

			// Draw Calendar
			$retval .= $cal->getMonthHTML($argv['month'],$argv['year']);

			// Generate Next Month Values
			$newDate = mktime(0,0,0,$argv['month']+$argv['monthskip'],1,$argv['year']);
			$argv['month'] = date('m',$newDate);
			$argv['year'] = date('Y',$newDate);

			unset($newDate);
			unset($cal);
		}
		$retval .= "<tr ".$argv['classtablerow']." ".$argv['styletablerow'].">\n".
			"<td align='center' valign='top' colspan='7'><A HREF='http://en.wikipedia.org/wiki/User:Eric_Bouliane/MWCalendar'>MWCalendar</A></td>\n".
			"</tr>\n";
		$retval .= "</TABLE>";
	}

	return $retval;
}

function MWCalendar_ConvertData($input) {
// $day,$month,$year,$data
	settype($retval,"Array");
	// Convert Each New Line Into Array
	$lines = explode("\n",$input);
	foreach($lines as $line) {
		$range = false; // Range Variable
		$line = ltrim($line); // Trim Whitespace
		// Verify If First Character Is Numeric
		if( is_numeric( $line[0] )) {
			$data = explode(":::",$line); //Explode Line
			foreach($data as $key=>$value) $data[$key] = trim($value); //Trim WhiteSpace
			if(is_numeric(substr($data[1],0,1)) && isset($data[2])) $range = true;

			//Format Date Variables
			$dataInterval = strtoupper( trim( substr($data[0],11) ) );
			$data[0] = date('Y-m-d',strtotime(substr($data[0],0,10)));
			$data[1] = (sizeof($data)==3) ? date('Y-m-d',strtotime($data[1])) : $data[1];

			// Set Temporary Date Variables
			$date1 = strtotime($data[0]); //Set Date 1
			$date2 = ($range) ? strtotime($data[1]) : strtotime($data[0]); //Set Date 2 with Range If Not Default Date 1
			$calData = ($range) ? $data[2] : $data[1];

			//Loop Date Range
			$interval=0;
			for( $x=$date1 ; $x<=$date2 ; $x=mktime(0,0,0,date('m',$date1),date('d',$date1)+$interval,date('Y',$date1)) ) {
				$retval[] = Array("day"=>date('d',$x),"month"=>date('m',$x),"year"=>date('Y',$x),"data"=>$calData);
				$interval = MWCalendar_SetInterval($interval,$dataInterval);

			}
		}
		// Verify If First Character Is % (To Ommit Range)
		elseif( $line[0] == "%" ) {
			$data = explode(":::",$line);
			foreach($data as $key=>$value) $data[$key]=trim($value); //Trim WhiteSpace
			if(sizeof($data)==2) {
				$data[0] = date('Y-m-d',strtotime(substr($data[0],1))); //Format Date Variables
				foreach($retval as $key=>$value) {
					if($value['year']."-".$value['month']."-".$value['day'] == $data[0] && $value['data']==$data[1])
						unset($retval[$key]);
				}
			}
		}
		unset($range);
	}
	return $retval;
}

function MWCalendar_SetInterval($current, $dataInterval) {
	$newInterval = $current + 1;

	$id = substr($dataInterval,0,1);
	$modifier = substr($dataInterval,-1,1);
	$count = substr($dataInterval, 2, -1);

	if( $id == "E" ) {
		switch( $modifier ) {
			case "M": if(is_numeric($count)) $newInterval = $current + 30 * $count; break;
			case "W": if(is_numeric($count)) $newInterval = $current +  7 * $count; break;
			case "D": if(is_numeric($count)) $newInterval = $current +  1 * $count; break;
		}
	}

	return $newInterval;
}

class MWCalendar {
	#####################################
	# Public Methods
	#####################################
	public function setDayNames($names) { $this->dayNames = $names; }
	public function setHTMLClasses($table="", $table_row="", $table_cell="", $table_cell_today="", $table_dow="", $table_year="", $table_month="") {
		$this->class_table = (strlen($table)>0) ? "class=\"".$table."\"" : "";
		$this->class_table_row = (strlen($table_row)>0) ? "class=\"".$table_row."\"" : "";
		$this->class_table_cell = (strlen($table_cell)>0) ? "class=\"".$table_cell."\"" : "";
		$this->class_table_cell_today = (strlen($table_cell_today)>0) ? "class=\"".$table_cell_today."\"" : "";
		$this->class_table_dow = (strlen($table_dow)>0) ? "class=\"".$table_dow."\"" : "";
		$this->class_table_month = (strlen($table_month)>0) ? "class=\"".$table_month."\"" : "";
		$this->class_table_year = (strlen($table_year)>0) ? "class=\"".$table_year."\"" : "";
	}
	public function setHTMLStyles($table="", $table_row="", $table_cell="", $table_cell_today="", $table_dow="", $table_year="", $table_month="") {
		$this->style_table = (strlen($table)>0) ? "style=\"".$table."\"" : "";
		$this->style_table_row = (strlen($table_row)>0) ? "style=\"".$table_row."\"" : "";
		$this->style_table_cell = (strlen($table_cell)>0) ? "style=\"".$table_cell."\"" : "";
		$this->style_table_cell_today = (strlen($table_cell_today)>0) ? "style=\"".$table_cell_today."\"" : "";
		$this->style_table_dow = (strlen($table_dow)>0) ? "style=\"".$table_dow."\"" : "";
		$this->style_table_month = (strlen($table_month)>0) ? "style=\"".$table_month."\"" : "";
		$this->style_table_year = (strlen($table_year)>0) ? "style=\"".$table_year."\"" : "";
	}
	public function setDayUnderline($value) { $this->dayUnderline = ($value==1) ? true : false; }
	public function setMonthNames($names) { $this->monthNames = $names; }
	public function setStartDay($day) { $this->startDay = $day; }
	public function setStartMonth($month) { $this->startMonth=$month; }
	public function setIncludeData($day,$month,$year,$data) {
		$this->includeData[$this->includeDataCount]['day'] = $day;
		$this->includeData[$this->includeDataCount]['month'] = $month;
		$this->includeData[$this->includeDataCount]['year'] = $year;
		$this->includeData[$this->includeDataCount]['data'] = $data;
		$this->includeDataCount++;
	}

	#####################################
	# Private Methods
	#####################################
	private function getDayNames() { return $this->dayNames; }
	private function getMonthNames() { return $this->monthNames; }
	private function getStartDay() { return $this->startDay; }
	private function getStartMonth() { return $this->startMonth; }
	private function getCurrentMonthView() { $d = getdate(time()); return $this->getMonthView($d["mon"], $d["year"]); }
	private function getMonthView($month, $year) { return $this->getMonthHTML($month, $year); }
	public function Calendar() {
		$this->setStartMonth(date("m"));
	}

	private function getDaysInMonth($month, $year) {
		if ($month < 1 || $month > 12) return 0;
		$d = $this->daysInMonth[$month - 1];
		if ($month == 2) $d = checkdate($month, 29, $year) ? 29 : 28;
		return $d;
	}

	private function adjustDate($month, $year) {
		$a = array();  
		$a[0] = $month;
		$a[1] = $year;
		while ($a[0] > 12) {
			$a[0] -= 12;
			$a[1]++;
		}
		while ($a[0] <= 0) {
			$a[0] += 12;
			$a[1]--;
		}
		return $a;
	}

	public function getMonthHTML($m, $y) {
		$s = "";
		$a = $this->adjustDate($m, $y);
		$month = $a[0];
		$year = $a[1];
		$daysInMonth = $this->getDaysInMonth($month, $year);
		$date = getdate(mktime(12, 0, 0, $month, 1, $year));
		$first = $date["wday"];
		$monthName = $this->monthNames[$month - 1];

#		$s .= "<table ".$this->class_table." ".$this->style_table.">\n";

		if($this->showYear)
			$s .= "<tr ".$this->class_table_row." ".$this->style_table_row.">\n".
				"<th align='center' valign='top' ".$this->class_table_year." ".$this->style_table_year." colspan='7'>".$year."</td>\n".
				"</tr>\n";

		if($this->showMonth)
			$s .= "<tr ".$this->class_table_row." ".$this->style_table_row.">\n".
				"<th align='center' valign='top' ".$this->class_table_month." ".$this->style_table_month." colspan='7'>".$monthName."</td>\n".
				"</tr>\n";

		if($this->showDaysOfWeek)
			$s .= "<tr ".$this->class_table_row." ".$this->style_table_row.">\n".
				"<td align='center' valign='top' ".$this->class_table_dow." ".$this->style_table_dow.">".$this->dayNames[($this->startDay)%7]."</td>\n".
				"<td align='center' valign='top' ".$this->class_table_dow." ".$this->style_table_dow.">".$this->dayNames[($this->startDay+1)%7]."</td>\n".
				"<td align='center' valign='top' ".$this->class_table_dow." ".$this->style_table_dow.">".$this->dayNames[($this->startDay+2)%7]."</td>\n".
				"<td align='center' valign='top' ".$this->class_table_dow." ".$this->style_table_dow.">".$this->dayNames[($this->startDay+3)%7]."</td>\n".
				"<td align='center' valign='top' ".$this->class_table_dow." ".$this->style_table_dow.">".$this->dayNames[($this->startDay+4)%7]."</td>\n".
				"<td align='center' valign='top' ".$this->class_table_dow." ".$this->style_table_dow.">".$this->dayNames[($this->startDay+5)%7]."</td>\n".
				"<td align='center' valign='top' ".$this->class_table_dow." ".$this->style_table_dow.">".$this->dayNames[($this->startDay+6)%7]."</td>\n".
				"</tr>\n";

		// We need to work out what date to start at so that the first appears in the correct column
		$d = $this->startDay + 1 - $first;
		while ($d > 1) { $d -= 7; }

		// Make sure we know when today is, so that we can use a different CSS style
		$today = getdate(time());

		while ($d <= $daysInMonth) {
			$s .= "<tr ".$this->class_table_row." ".$this->style_table_row.">\n";
			for ($i = 0; $i < 7; $i++) {
				$class = ($year == $today["year"] && $month == $today["mon"] && $d == $today["mday"]) ? $this->class_table_cell_today : $this->class_table_cell;
				$style = ($year == $today["year"] && $month == $today["mon"] && $d == $today["mday"]) ? $this->style_table_cell_today : $this->style_table_cell;
				$s .= "<td ".$class." ".$style." valign='top'>";		 
				if ($d > 0 && $d <= $daysInMonth) {
					$s .= "<DIV ALIGN='right'>".(($this->dayUnderline) ? "<U>" : "").$d.(($this->dayUnderline) ? "</U>" : "")."</DIV>";
					if(sizeof($this->includeData)>0) {
						foreach($this->includeData as $dataValue) {
							if($d==$dataValue['day'] && $month==$dataValue['month'] && $year==$dataValue['year']) $s .= "<DIV>".$dataValue['data']."</DIV>";
						}
					}
				} else {
					$s .= "";
				}
				$s .= "</td>\n";
				$d++;
			}
			$s .= "</tr>\n";	 
		}
#		$s .= "</table>\n";
		return $s;  	
	}

	var $startDay = 0;
	var $startMonth;
	var $dayNames = array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
	var $monthNames = array("January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December");
	var $daysInMonth = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	var $showYear = true;
	var $showMonth = true;
	var $showDaysOfWeek = true;
	var $includeData = Array();
	var $includeDataCount = 0;
	var $class_table, $class_table_row, $class_table_cell, $class_table_dow, $class_table_month, $class_table_year, $class_table_cell_today;
	var $style_table, $style_table_row, $style_table_cell, $style_table_dow, $style_table_month, $style_table_year, $style_table_cell_today;
	var $dayUnderline = true;

}

$wgExtensionCredits['parserhook'][] = array(
		'name' => 'MWCalendar',
		'version' => '1.0.7',
		'author' => 'Eric Bouliane (ebouliane@gmail.com)',
		'url' => 'http://www.cosil.ca',
		'description' => 'Mediawiki Calendar Extension'
);

?>