User:Eric Bouliane/MWCalendar

From Wikipedia, the free encyclopedia

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'
);

?>