• Alexios
  • mediawiki
  • php

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.

This is an ancient extension and probably won't work on modern version of MediaWiki.

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.phpfile 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.