The famous MediaWiki project (of Wikipedia fame) is a very flexible tool, and like all good tools, people find uses for it the original designers didn't intend. Many people use Wikis as their personal pages, or as a quick, cheap substitute for a CMS. At my work, I maintain a knowledge base using it. Often, people refer to the pages for outstanding work and announcements. Often, I find it necessary to show notifications about planned work or systems status during a specific period of time only.
In CMS terms, this is known as an embargo. This extension adds an embargo feature to Mediawiki. It provides an <embargo>
tag that shows its contents:
- After a certain date (and, optionally, time), and
- Before another date (and, optionally, time) has passed.
Either of these criteria may be skipped to display content only before a given date, or forever after a given date.
Usage
Remember that ‘embargo’ denotes hiding, not showing. In this context, ‘embargo after’ means ‘don't show after’, and ‘embargo before’ means ‘don't show before’.
<embargo before="2009-04-01" after="2009-04-02">
Insert Diabolical April Fools Prank Here.
</embargo>
To display a seasonal message:
<embargo before="2009-12-01" after="2009-12-31">
'Tis the season, etc.
</embargo>
To let people know about an upcoming event until the day of the event:
<embargo after="2009-07-31">
Yearly systems maintenance coming up! Check your email for details!
</embargo>
Displaying a new message after the event:
<embargo before="2009-08-01">
Yearly systems maintenance complete!
</embargo>
The date format in attributes before
and after
follows the rather flexible format of PHP's strtotime function. In addition to dates, you may specify times using the ISO-like YYYY-MM-DD HH:MM
format. You may enter US dates in MM-DD-YYYY
, but consult the PHP documentation for other options. Don't use relative dates (next
Thursday
or now + 2 months
): these are interpreted with respect to the time the page is shown, not the time it was last edited!
You can use any wikitext whatsoever inside the <embargo>...</embargo>
tags.
Installation
Paste the source code into extensions/Embargo/Embargo.php
under your MediaWiki installation. Then, load up your LocalSettings.php
file and append these two lines:
// Embargo
include_once("$IP/extensions/Embargo/Embargo.php");
Source Code
<?php
// Embargo MediaWiki Extension.
// Embargoes content outside of certain time/date ranges.
// Copyright (C) 2007, Alexios Chouchoulas.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
$EmbargoVersion = '0.1';
// Credits
$wgExtensionCredits ['parserhook'][] =
array(
'name' => 'Embargo',
'version' => $EmbargoVersion,
'author' => 'Alexios Chouchoulas',
'url' => 'http://www.bedroomlan.org/projects/extension-embargo',
'description' => 'Allows embargo of content outside
of certain time/date ranges.'
);
// Extension initialization
$wgExtensionFunctions[] = "fnEmbargoExtension";
// Registers the extension with the WikiText parser.
function fnEmbargoExtension()
{
// Register messages
global $wgMessageCache, $wgPropertyTableMessages;
foreach ($wgPropertyTableMessages as $sLang => $aMsgs) {
$wgMessageCache->addMessages ($aMsgs, $sLang);
}
// Register the extension with the WikiText parser
global $wgParser;
$wgParser->setHook ('embargo', 'fnEmbargoTag');
}
// Parse a date/time specification.
function fnEmbargoParseDate ($d)
{
return strtotime ($d);
}
// Processes the 'embargo' tag.
function fnEmbargoTag($input, $params, &$parser)
{
$t = time();
$t0 = $t - 1;
$t1 = $t + 1;
$retval = '';
if (isset ($params ['before'])) {
$before = $params ['before'];
if ($before === FALSE) {
$retval .= "**BEFORE attribute could not be parsed. **";
} else {
$t0 = fnEmbargoParseDate ($before);
}
}
if (isset ($params ['after'])) {
$after = $params ['after'];
if ($before === FALSE) {
$retval .= "**AFTER attribute could not be parsed. **";
} else {
$t1 = fnEmbargoParseDate ($after);
}
}
if (($t0 <= $t) && ($t < $t1)) {
$retval .= $input;
}
return $parser->internalParse ($retval);
}
// End of file.