Difference between revisions of "Extension:NukeDPL.php"

From Organic Design wiki
(function getPages - Bug 1: first idem of the dpl list is not included - Solution: removed the begin-of-line token (^) from RegEx. See [http://www.mediawiki.org/wiki/Extension_talk:NukeDPL here])
(function getPages - Bug 2: sometimes a single space (0x20) in the dpl result is replaced by a non-break space (0xA0), rendering an invalid link - Solution: replace   by '_')
Line 170: Line 170:
 
$out = $wgParser->parse("<dpl>$query</dpl>",$wgTitle,$opt,false,true);
 
$out = $wgParser->parse("<dpl>$query</dpl>",$wgTitle,$opt,false,true);
 
preg_match_all('|\\${3}(.+?)\\${3}|m',$out->getText(),$matches);
 
preg_match_all('|\\${3}(.+?)\\${3}|m',$out->getText(),$matches);
return $matches[1];
+
return str_replace('&nbsp;','_',$matches[1]);
 
}
 
}
  

Revision as of 04:56, 16 February 2009

<?php /**

* NukeDPL extension - Mass delete by DPL query
* 
Info.svg These are the MediaWiki extensions we're using and/or developing. Please refer to the information on the mediawiki.org wiki for installation and usage details. Extensions here which have no corresponding mediawiki article are either not ready for use or have been superseded. You can also browse our extension code in our local Subversion repository or our GitHub mirror.

Template:Php

* See http://www.mediawiki.org/wiki/Extension:NukeDPL for installation and usage details
*
* @package MediaWiki
* @subpackage Extensions
* @author Aran Dunkley 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.3, 2008-07-13');

$wgGroupPermissions['sysop']['nuke'] = true; $wgAvailableRights[] = 'nuke'; $wgExtensionFunctions[] = 'wfSetupNukeDPL';

  1. Text to be added into textbox by default

$wgNukeDPLDefaultText = ' distinct = true | false ignorecase = true | false title = Article nottitle = Article titlematch = %fragment% nottitlematch = %fragment% titleregexp = ^.+$ nottitleregexp = ^.+$ category = Category1 | Category2 notcategory = Category1 | Category2 categorymatch = %fragment% notcategorymatch = %fragment% categoryregexp = ^.+$ notcategoryregexp = ^.+$ namespace = Namespace1 | Namespace2 notnamespace = Namespace1 | Namespace2 linksfrom = Foo | Bar notlinksfrom = Foo | Bar linksto = Foo|Bar notlinksto = Foo|Bar imageused = Foo.jpg imagecontainer = Article1 | Article2 uses = Template1 | Template2 notuses = Template1 | Template2 redirects = exclude | include| only createdby = User notcreatedby = User modifiedby = User notmodifiedby = User lastmodifiedby = User notlastmodifiedby = User ';

$wgExtensionCredits['specialpage'][] = array( 'name' => 'Special:NukeDPL', 'author' => '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: $1", 'nuke-list' => "The following pages were selected by DPL-query: $1 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', $param ); $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, $wgNukeDPLDefaultText;

$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.
"); $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->addWikiText("*For information about the parameter meanings, see the DPL Manual."); $wgOut->addHTML(wfElement('form', array('action' => $nuke->getLocalURL('action=submit'), 'method' => 'post'),null) ."<textarea name=\"target\" cols=\"25\" rows=\"30\">$wgNukeDPLDefaultText</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

".wfMsgHtml('deletecomment').': ' .wfElement('input',array('name' => 'wpReason','value' => $reason,'size' => 60))."

\n$submit" .wfElement('input',array('type' => 'hidden','name' => 'wpEditToken','value' => $wgUser->editToken()))."\n

    \n" ); $sk =& $wgUser->getSkin(); foreach ($pages as $title) { $wgOut->addHTML('
  • ' .wfElement('input',array('type' => 'checkbox','name' => "pages[]",'value' => $title,'checked' => 'checked')) .' '.$sk->makeKnownLinkObj(Title::newFromText($title))."
  • \n"

    ); }

    $wgOut->addHTML("

\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("

Extension:DynamicPageList (DPL), version 3.3.3: Warning: No parameter option supplied for '$query'. (Missing '=')


Extension:DynamicPageList (DPL), version 3.3.3: Error: No selection criteria found! You must use at least one of the following parameters: category, namespace, titlematch, linksto, uses, createdby, modifiedby, lastmodifiedby, or their 'not' variants


Extension:DynamicPageList (DPL), version 3.3.3: Warning: No results.

",$wgTitle,$opt,false,true);

preg_match_all('|\\${3}(.+?)\\${3}|m',$out->getText(),$matches); return str_replace(' ','_',$matches[1]); }

function doDelete($pages,$reason) { foreach($pages as $page) { $title = Title::newFromUrl($page); $article = new Article($title); $article->doDelete($reason); } } }