From OrganicDesign
<?php
/**
* NukeDPL extension - Mass delete by DPL query
*
* See http://www.mediawiki.org/wiki/Extension:NukeDPL for installation and usage details
*
* @package MediaWiki
* @subpackage Extensions
* @author Aran Dunkley [http://www.organicdesign.co.nz/nad User:Nad]
* @copyright © 2007 Aran Dunkley
* @licence GNU General Public Licence 2.0 or later
*/
if(!defined('MEDIAWIKI')) die('Not a valid entry point.');
define('NUKEDPL_VERSION', '1.1.2, 2007-06-06');
$wgGroupPermissions['sysop']['nuke'] = true;
$wgAvailableRights[] = 'nuke';
$wgExtensionFunctions[] = 'wfSetupNukeDPL';
$wgExtensionCredits['specialpage'][] = array(
'name' => 'Special:NukeDPL',
'author' => '[http://www.organicdesign.co.nz/nad User:Nad]',
'description' => 'Mass delete by DPL query',
'url' => 'http://www.mediawiki.org/wiki/Extension:NukeDPL',
'version' => NUKEDPL_VERSION
);
function wfSetupNukeDPL() {
global $wgMessageCache;
$wgMessageCache->addMessages(array(
'nukedpl' => 'Mass delete by DPL query',
'nuke-nopages' => "No pages to delete using DPL-query: <tt>$1</tt>",
'nuke-list' => "The following pages were selected by DPL-query: <tt>$1</tt> hit the button to delete them.",
'nuke-defaultreason' => "Mass removal of pages selected by DPL-query: ($1)",
));
# Add the specialpage to the environment
SpecialPage::addPage(new SpecialNukeDPL());
}
/**
* Define a new class based on the SpecialPage class
*/
require_once("$IP/includes/SpecialPage.php");
class SpecialNukeDPL extends SpecialPage {
# Constructor
function SpecialNukeDPL() {
SpecialPage::SpecialPage('NukeDPL','nuke');
}
# Override SpecialPage::execute($param = '')
function execute($param) {
global $wgRequest;
$target = $wgRequest->getText( 'target', $par );
$this->setHeaders();
$form = new NukeDPLForm( $target, $wgRequest );
$form->run();
}
}
class NukeDPLForm {
function NukeDPLForm($target,$request) {
global $wgUser;
$this->mTarget = $target;
$this->mReason = $request->getText('wpReason',wfMsgForContent('nuke-defaultreason',$target));
$this->mPosted = $request->wasPosted() && $wgUser->matchEditToken($request->getVal('wpEditToken'));
if ($this->mPosted) $this->mPages = $request->getArray('pages');
}
function run() {
if ($this->mPosted && $this->mPages) return $this->doDelete($this->mPages,$this->mReason);
if ($this->mTarget != '') $this->listForm($this->mTarget,$this->mReason);
else $this->promptForm();
}
function promptForm() {
global $wgUser, $wgOut;
$sk =& $wgUser->getSkin();
$nuke = Title::makeTitle(NS_SPECIAL,'NukeDPL');
$submit = wfElement('input',array('type' => 'submit', 'value' => 'View candidate list'));
$wgOut->addWikiText("This tool allows for mass deletions of pages selected by a DPL query.<br>");
$wgOut->addWikiText("Enter a query below to generate a list of titles to delete.");
$wgOut->addWikiText("*Titles can be individually removed before deleting.");
$wgOut->addWikiText("*Remember, article titles are case-sensitive.");
$wgOut->addWikiText("*Queries shouldn't be surrounded by any DPL tags or braces.");
$wgOut->addHTML(wfElement('form', array('action' => $nuke->getLocalURL('action=submit'),'method' => 'post'),null)
.'<textarea name="target" cols=25 rows=10></textarea>' . "\n$submit\n");
$wgOut->addHTML("</form>");
}
function listForm($query,$reason) {
global $wgUser,$wgOut,$wgLang;
$pages = $this->getPages($query);
if (count($pages) == 0) {
$wgOut->addWikiText(wfMsg('nuke-nopages',$query));
return $this->promptForm();
}
$wgOut->addWikiText(wfMsg('nuke-list',$query));
$nuke = Title::makeTitle(NS_SPECIAL,'NukeDPL');
$submit = wfElement('input',array('type' => 'submit', 'value' => 'Nuke!'));
$wgOut->addHTML(
wfElement('form',array('action' => $nuke->getLocalURL('action=delete'),'method' => 'post'),null)
."\n<div>".wfMsgHtml('deletecomment').': '
.wfElement('input',array('name' => 'wpReason','value' => $reason,'size' => 60))."</div>\n$submit"
.wfElement('input',array('type' => 'hidden','name' => 'wpEditToken','value' => $wgUser->editToken()))."\n<ul>\n"
);
$sk =& $wgUser->getSkin();
foreach ($pages as $title) {
$wgOut->addHTML('<li>'
.wfElement('input',array('type' => 'checkbox','name' => "pages[]",'value' => $title,'checked' => 'checked'))
.' '.$sk->makeKnownLinkObj(Title::newFromText($title))."</li>\n"
);
}
$wgOut->addHTML("</ul>\n$submit</form>");
}
function getPages($query) {
global $wgTitle,$wgParser,$wgUser;
$fname = 'NukeDPLForm::getNewPages';
$query = trim($query)."\nmode=userformat\nlistseparators=,\\n$$$%PAGE%$$$,,\n";
$opt = ParserOptions::newFromUser($wgUser);
$out = $wgParser->parse("<dpl>$query</dpl>",$wgTitle,$opt,false,true);
preg_match_all('|^\\${3}(.+?)\\${3}|m',$out->getText(),$matches);
return $matches[1];
}
function doDelete($pages,$reason) {
foreach($pages as $page) {
$title = Title::newFromUrl($page);
$article = new Article($title);
$article->doDelete($reason);
}
}
}