Personal tools


Extension:NukeDPL.php

From OrganicDesign

Jump to: navigation, search
<?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'))
				.'&nbsp;'.$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);
		}
	}
}