Add Interwiki extension to core.
authorX! <soxred93@users.mediawiki.org>
Sat, 27 Dec 2008 05:00:33 +0000 (05:00 +0000)
committerX! <soxred93@users.mediawiki.org>
Sat, 27 Dec 2008 05:00:33 +0000 (05:00 +0000)
includes/AutoLoader.php
includes/DefaultSettings.php
includes/SpecialPage.php
includes/specials/SpecialInterwiki.php [new file with mode: 0644]
languages/messages/MessagesEn.php
maintenance/language/messages.inc

index ce1912e..0860002 100644 (file)
@@ -480,6 +480,7 @@ $wgAutoloadLocalClasses = array(
        'SpecialAllpages' => 'includes/specials/SpecialAllpages.php',
        'SpecialBookSources' => 'includes/specials/SpecialBooksources.php',
        'SpecialImport' => 'includes/specials/SpecialImport.php',
+       'SpecialInterwiki' => 'includes/specials/SpecialInterwiki.php',
        'SpecialListGroupRights' => 'includes/specials/SpecialListgrouprights.php',
        'SpecialMostlinkedtemplates' => 'includes/specials/SpecialMostlinkedtemplates.php',
        'SpecialPrefixindex' => 'includes/specials/SpecialPrefixindex.php',
index efe1b2f..17cf854 100644 (file)
@@ -1210,6 +1210,7 @@ $wgGroupPermissions['sysop']['editinterface']    = true;
 $wgGroupPermissions['sysop']['editusercssjs']    = true;
 $wgGroupPermissions['sysop']['import']           = true;
 $wgGroupPermissions['sysop']['importupload']     = true;
+$wgGroupPermissions['sysop']['interwiki']        = true;
 $wgGroupPermissions['sysop']['move']             = true;
 $wgGroupPermissions['sysop']['move-subpages']    = true;
 $wgGroupPermissions['sysop']['move-rootuserpages'] = true;
@@ -2791,6 +2792,7 @@ $wgLogTypes = array( '',
        'upload',
        'move',
        'import',
+       'interwiki',
        'patrol',
        'merge',
        'suppress',
@@ -2845,6 +2847,7 @@ $wgLogNames = array(
        'upload'  => 'uploadlogpage',
        'move'    => 'movelogpage',
        'import'  => 'importlogpage',
+       'interwiki' => 'interwikilogpage',
        'patrol'  => 'patrol-log-page',
        'merge'   => 'mergelog',
        'suppress' => 'suppressionlog',
@@ -2865,6 +2868,7 @@ $wgLogHeaders = array(
        'upload'  => 'uploadlogpagetext',
        'move'    => 'movelogpagetext',
        'import'  => 'importlogpagetext',
+       'interwiki' => 'interwikilogpagetext',
        'patrol'  => 'patrol-log-header',
        'merge'   => 'mergelogpagetext',
        'suppress' => 'suppressionlogtext',
@@ -2896,6 +2900,10 @@ $wgLogActions = array(
        'move/move_redir'   => '1movedto2_redir',
        'import/upload'     => 'import-logentry-upload',
        'import/interwiki'  => 'import-logentry-interwiki',
+       'interwiki/interwiki' => 'interwiki_logentry',
+       'interwiki/iw_add' => 'interwiki_log_added',
+       'interwiki/iw_delete' => 'interwiki_log_deleted',
+       'interwiki/iw_edit' => 'interwiki_log_edited',
        'merge/merge'       => 'pagemerge-logentry',
        'suppress/revision' => 'revdelete-logentry',
        'suppress/file'     => 'revdelete-logentry',
@@ -3014,6 +3022,7 @@ $wgSpecialPageGroups = array(
        'Specialpages'              => 'other',
        'Blockme'                   => 'other',
        'Booksources'               => 'other',
+       'Interwiki'                 => 'other',
 );
 
 /**
index 812ad53..ef0dd8a 100644 (file)
@@ -147,6 +147,7 @@ class SpecialPage
                'Blockip'                   => array( 'SpecialPage', 'Blockip', 'block' ),
                'Undelete'                  => array( 'SpecialPage', 'Undelete', 'deletedhistory' ),
                'Import'                    => 'SpecialImport',
+               'Interwiki'                 => array( 'SpecialPage', 'Interwiki' ),
                'Lockdb'                    => array( 'SpecialPage', 'Lockdb', 'siteadmin' ),
                'Unlockdb'                  => array( 'SpecialPage', 'Unlockdb', 'siteadmin' ),
                'Userrights'                => 'UserrightsPage',
diff --git a/includes/specials/SpecialInterwiki.php b/includes/specials/SpecialInterwiki.php
new file mode 100644 (file)
index 0000000..36ebbca
--- /dev/null
@@ -0,0 +1,263 @@
+<?php
+
+/**
+ * Constructor
+ */
+function wfSpecialInterwiki( $par ) {
+       global $wgRequest;
+
+       $form = new SpecialInterwiki( $wgRequest, $par );
+       $form->execute();
+}
+
+/**
+ * implements Special:Interwiki
+ * @ingroup SpecialPage
+ */
+class SpecialInterwiki extends SpecialPage {
+       
+       function __construct() {
+               parent::__construct( 'Interwiki' );
+       }
+
+       
+       function execute( $par = null ) {
+               global $wgRequest, $wgOut, $wgUser;
+
+               $admin = $wgUser->isAllowed( 'interwiki' );
+
+               $this->setHeaders();
+               if( $admin ){
+                       $wgOut->setPagetitle( wfMsg( 'interwiki' ) );
+               } else {
+                       $wgOut->setPagetitle( wfMsg( 'interwiki-title-norights' ) );
+               }
+               $action = $wgRequest->getVal( 'action', $par );
+
+               // checking
+               $selfTitle = $this->getTitle();
+
+               // Protect administrative actions against malicious requests
+               $safePost = $wgRequest->wasPosted() &&
+                       $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) );
+
+               switch( $action ){
+               case "delete":
+                       if( !$admin ){
+                               $wgOut->permissionRequired('interwiki');
+                               return;
+                       }
+
+                       $prefix = $wgRequest->getVal( 'prefix' );
+                       $encPrefix = htmlspecialchars( $prefix );
+                       $actionUrl = $selfTitle->escapeLocalURL( "action=submit" );
+                       $button = wfMsgHtml( 'delete' );
+                       $topmessage = wfMsgHtml( 'interwiki_delquestion', $encPrefix );
+                       $deletingmessage = wfMsgHtml( 'interwiki_deleting', $encPrefix );
+                       $reasonmessage = wfMsgHtml( 'deletecomment' );
+                       $defaultreason = wfMsgForContent( 'interwiki_defaultreason' );
+                       $token = htmlspecialchars( $wgUser->editToken() );
+
+                       $wgOut->addHTML(
+                               "<fieldset>
+                               <legend>$topmessage</legend>
+                               <form id=\"delete\" method=\"post\" action=\"{$actionUrl}\">
+                               <table><tr>
+                               <td>$deletingmessage</td>
+                               </tr><tr>
+                               <td>$reasonmessage &nbsp; <input tabindex='1' type='text' name=\"reason\" maxlength='200' size='60' value='$defaultreason' /></td>
+                               </tr><tr><td>
+                               <input type='submit' name='delete' id=\"interwikideletebutton\" value='{$button}' />
+                               <input type='hidden' name='prefix' value='{$encPrefix}' />
+                               <input type='hidden' name='do' value='delete' />
+                               <input type='hidden' name='wpEditToken' value='{$token}' />
+                               </td></tr></table>
+                               </form>
+                               </fieldset>\n"
+                       );
+                       break;
+               case "edit" :
+               case "add" :
+                       if( !$admin ){
+                               $wgOut->permissionRequired( 'interwiki' );
+                               return;
+                       }
+                       if( $action == "edit" ){
+                               $prefix = $wgRequest->getVal( 'prefix' );
+                               $dbr = wfGetDB( DB_SLAVE );
+                               $row = $dbr->selectRow( 'interwiki', '*', array( 'iw_prefix' => $prefix ) );
+                               if( !$row ){
+                                       $wgOut->wrapWikiMsg( '<div class="errorbox">$1</div>', array( 'interwiki_editerror', $prefix ) );
+                                       return;
+                               }
+                               $prefix = htmlspecialchars( $row->iw_prefix );
+                               $defaulturl = htmlspecialchars( $row->iw_url );
+                               $trans = $row->iw_trans ? " checked='checked'" : '' ;
+                               $local = $row->iw_local ? " checked='checked'" : '';
+                               $old = "<input type='hidden' name='prefix' value='" . htmlspecialchars( $row->iw_prefix ) . "' />";
+                               $topmessage = wfMsgHtml( 'interwiki_edittext' );
+                               $intromessage = wfMsgHtml( 'interwiki_editintro' );
+                               $button = wfMsgHtml( 'edit' );
+                       } else {
+                               $prefix = "<input tabindex='1' type='text' name='prefix' maxlength='20' size='20' />";
+                               $local = '';
+                               $trans = '';
+                               $old = '';
+                               $defaulturl = wfMsgHtml( 'interwiki_defaulturl' );
+                               $topmessage = wfMsgHtml( 'interwiki_addtext' );
+                               $intromessage = wfMsgHtml( 'interwiki_addintro' );
+                               $button = wfMsgHtml( 'interwiki_addbutton' );
+                       }
+
+                       $actionUrl = $selfTitle->escapeLocalURL( 'action=submit' );
+                       $prefixmessage = wfMsgHtml( 'interwiki_prefix' );
+                       $localmessage = wfMsgHtml( 'interwiki_local' );
+                       $transmessage = wfMsgHtml( 'interwiki_trans' );
+                       $reasonmessage = wfMsgHtml( 'interwiki_reasonfield' );
+                       $urlmessage = wfMsgHtml( 'interwiki_url' );
+                       $token = htmlspecialchars( $wgUser->editToken() );
+                       $defaultreason = htmlspecialchars( wfMsgForContent( 'interwiki_defaultreason' ) );
+
+                       $wgOut->addHTML(
+                               "<fieldset>
+                               <legend>$topmessage</legend>
+                               $intromessage
+                               <form id='{$action}' method='post' action='{$actionUrl}'>
+                               <table id='interwikitable-{$action}'><tr>
+                               <td>$prefixmessage</td>
+                               <td>$prefix</td>
+                               </tr><tr>
+                               <td>$localmessage</td>
+                               <td><input type='checkbox' id='local' name='local' {$local}/></td>
+                               </tr><tr>
+                               <td>$transmessage</td>
+                               <td><input type='checkbox' id='trans' name='trans' {$trans}/></td>
+                               </tr><tr>
+                               <td>$urlmessage</td>
+                               <td><input tabindex='1' type='text' name='theurl' maxlength='200' size='60' value='$defaulturl' /></td>
+                               </tr><tr>
+                               <td>$reasonmessage</td>
+                               <td><input tabindex='1' type='text' name='reason' maxlength='200' size='60' value='$defaultreason' /></td>
+                               </tr></table>
+                               <input type='submit' name='{$action}'  id='interwiki{$action}button' value='{$button}' />
+                               <input type='hidden' name='do' value='{$action}' />
+                               $old
+                               <input type='hidden' name='wpEditToken' value='{$token}' />
+                               </form>
+                               </fieldset>\n"
+                       );
+                       break;
+               case "submit":
+                       if( !$admin ){
+                               $wgOut->permissionRequired('interwiki');
+                               return;
+                       }
+                       if( !$safePost ){
+                               $wgOut->addWikiText( wfMsg('sessionfailure') );
+                               return;
+                       }
+
+                       $prefix = $wgRequest->getVal('prefix');
+                       $reason = $wgRequest->getText('reason');
+                       $do = $wgRequest->getVal('do');
+                       $dbw = wfGetDB( DB_MASTER );
+                       switch( $do ){
+                       case "delete":
+                               $dbw->delete( 'interwiki', array( 'iw_prefix' => $prefix ), __METHOD__ );
+
+                               if ($dbw->affectedRows() == 0) {
+                                       $wgOut->addWikiText( '<span class="error">' . wfMsg( 'interwiki_delfailed', $prefix ) . '</span>' );
+                               } else {
+                                       $wgOut->addWikiText( wfMsg( 'interwiki_deleted', $prefix ));
+                                       $wgOut->returnToMain( false, $selfTitle );
+                                       $log = new LogPage( 'interwiki' );
+                                       $log->addEntry( 'iw_delete', $selfTitle, $reason, array( $prefix ) );
+                               }
+                               break;
+                       case "edit":
+                       case "add":
+                               $theurl = $wgRequest->getVal('theurl');
+                               $local = $wgRequest->getCheck('local') ? 1 : 0;
+                               $trans = $wgRequest->getCheck('trans') ? 1 : 0;
+                               $data = array( 'iw_prefix' => $prefix, 'iw_url'    => $theurl,
+                                       'iw_local'  => $local, 'iw_trans'  => $trans );
+
+                               if( $do == 'add' ){
+                                       $dbw->insert( 'interwiki', $data, __METHOD__, 'IGNORE' );
+                               } else {
+                                       $dbw->update( 'interwiki', $data, array( 'iw_prefix' => $prefix ), __METHOD__, 'IGNORE' );
+                               }
+
+                               if( $dbw->affectedRows() == 0 ) {
+                                       $wgOut->addWikiText( '<span class="error">' . wfMsg( "interwiki_{$do}failed", $prefix ) . '</span>' );
+                               } else {
+                                       $wgOut->addWikiText( wfMsg( "interwiki_{$do}ed", $prefix ));
+                                       $wgOut->returnToMain( false, $selfTitle );
+                                       $log = new LogPage( 'interwiki' );
+                                       $log->addEntry( 'iw_'.$do, $selfTitle, $reason, array( $prefix, $theurl, $trans, $local ) );
+                               }
+                               break;
+                       }
+                       break;
+               default:
+                       $prefixmessage = wfMsgHtml( 'interwiki_prefix' );
+                       $urlmessage = wfMsgHtml( 'interwiki_url' );
+                       $localmessage = wfMsgHtml( 'interwiki_local' );
+                       $transmessage = wfMsgHtml( 'interwiki_trans' );
+
+                       $wgOut->addWikiText( wfMsg( 'interwiki_intro', '[http://www.mediawiki.org/wiki/Interwiki_table MediaWiki.org]' ) );
+
+                       if ($admin) {
+                               $skin = $wgUser->getSkin();
+                               $addtext = wfMsgHtml( 'interwiki_addtext' );
+                               $addlink = $skin->makeLinkObj( $selfTitle, $addtext, 'action=add' );
+                               $wgOut->addHTML( '<ul>' . '<li>' . $addlink . '</li>' . '</ul>' );
+                       }
+
+                       $out = "
+                       <br />
+                       <table width='100%' border='2' id='interwikitable'>
+                       <tr id='interwikitable-header'><th>$prefixmessage</th> <th>$urlmessage</th> <th>$localmessage</th> <th>$transmessage</th>";
+                       if( $admin ) {
+                               $deletemessage = wfMsgHtml( 'delete' );
+                               $editmessage = wfMsgHtml( 'edit' );
+                               $out .= "<th>$editmessage</th>";
+                       }
+
+                       $out .= "</tr>\n";
+
+                       $dbr = wfGetDB( DB_SLAVE );
+                       $res = $dbr->select( 'interwiki', '*' );
+                       $numrows = $dbr->numRows( $res );
+                       if ($numrows == 0) {
+                               $errormessage = wfMsgHtml('interwiki_error');
+                               $out .= "<br /><div class=\"error\">$errormessage</div><br />";
+                       }
+                       while( $s = $dbr->fetchObject( $res ) ) {
+                               $prefix = htmlspecialchars( $s->iw_prefix );
+                               $url = htmlspecialchars( $s->iw_url );
+                               $trans = htmlspecialchars( $s->iw_trans );
+                               $local = htmlspecialchars( $s->iw_local );
+                               $out .= "<tr id='interwikitable-row'>
+                                       <td id='interwikitable-prefix'>$prefix</td>
+                                       <td id='interwikitable-url'>$url</td>
+                                       <td id='interwikitable-local'>$local</td>
+                                       <td id='interwikitable-trans'>$trans</td>";
+                               if( $admin ) {
+                                       $out .= '<td id="interwikitable-modify">';
+                                       $out .= $skin->makeLinkObj( $selfTitle, $editmessage,
+                                               'action=edit&prefix=' . urlencode( $s->iw_prefix ) );
+                                       $out .= ', ';
+                                       $out .= $skin->makeLinkObj( $selfTitle, $deletemessage,
+                                               'action=delete&prefix=' . urlencode( $s->iw_prefix ) );
+                                       $out .= '</td>';
+                               }
+
+                               $out .= "\n</tr>\n";
+                       }
+                       $dbr->freeResult( $res );
+                       $out .= "</table><br />";
+                       $wgOut->addHTML($out);
+               }
+       }
+}
index 08900d6..8449b70 100644 (file)
@@ -430,6 +430,7 @@ $specialPageAliases = array(
        'Blankpage'                 => array( 'BlankPage' ),
        'LinkSearch'                => array( 'LinkSearch' ),
        'DeletedContributions'      => array( 'DeletedContributions' ),
+       'Interwiki'                 => array( 'Interwiki' ),
 );
 
 /**
@@ -2187,6 +2188,45 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:DeletedContributions
 'deletedcontributions' => 'Deleted user contributions',
 
+# Special:Interwiki
+'interwiki'                => 'View and edit interwiki data',
+'interwiki-title-norights' => 'View interwiki data',
+'interwiki-desc'           => 'Adds a [[Special:Interwiki|special page]] to view and edit the interwiki table',
+'interwiki_reasonfield'    => 'Reason',
+'interwiki_intro'          => 'See $1 for more information about the interwiki table.
+There is a [[Special:Log/interwiki|log of changes]] to the interwiki table.',
+'interwiki_prefix'         => 'Prefix',
+'interwiki_url'            => 'URL',
+'interwiki_local'          => 'Local', 
+'interwiki_trans'          => 'Trans',
+'interwiki_error'          => 'Error: The interwiki table is empty, or something else went wrong.',
+'interwiki_delquestion'    => 'Deleting "$1"',
+'interwiki_deleting'       => 'You are deleting prefix "$1".',
+'interwiki_deleted'        => 'Prefix "$1" was successfully removed from the interwiki table.',
+'interwiki_delfailed'      => 'Prefix "$1" could not be removed from the interwiki table.',
+'interwiki_addtext'        => 'Add an interwiki prefix',
+'interwiki_addintro'       => 'You are adding a new interwiki prefix.
+Remember that it cannot contain spaces ( ), colons (:), ampersands (&), or equal signs (=).',
+'interwiki_addbutton'      => 'Add',
+'interwiki_added'          => 'Prefix "$1" was successfully added to the interwiki table.',
+'interwiki_addfailed'      => 'Prefix "$1" could not be added to the interwiki table.
+Possibly it already exists in the interwiki table.',
+'interwiki_defaulturl'     => 'http://www.example.com/$1',
+'interwiki_edittext'       => 'Editing an interwiki prefix',
+'interwiki_editintro'      => 'You are editing an interwiki prefix.
+Remember that this can break existing links.',
+'interwiki_edited'         => 'Prefix "$1" was successfully modified in the interwiki table.',
+'interwiki_editerror'      => 'Prefix "$1" can not be modified in the interwiki table.
+Possibly it does not exist.',
+'interwikilogpage'         => 'Interwiki table log',
+'interwiki_log_added'      => 'added prefix "$2" ($3) (trans: $4) (local: $5) to the interwiki table',
+'interwiki_log_edited'     => 'modified prefix "$2" : ($3) (trans: $4) (local: $5) in the interwiki table',
+'interwiki_log_deleted'    => 'removed prefix "$2" from the interwiki table',
+'interwikilogpagetext'     => 'This is a log of changes to the [[Special:Interwiki|interwiki table]].',
+'interwiki_defaultreason'  => 'no reason given',
+'interwiki_logentry'       => '', # do not translate this message
+'right-interwiki'          => 'Edit interwiki data',
+
 # Special:LinkSearch
 'linksearch'       => 'Search web links',
 'linksearch-pat'   => 'Search pattern:',
index f0f7586..f57729b 100644 (file)
@@ -1465,6 +1465,9 @@ $wgMessageStructure = array(
        'deletedcontribs' => array(
                'deletedcontributions',
        ),
+       'interwiki' => array(
+               'interwiki',
+       ),
        'linksearch' => array(
                'linksearch',
                'linksearch-pat',
@@ -2948,6 +2951,7 @@ XHTML id names.",
        'allpages'            => 'Special:AllPages',
        'categories'          => 'Special:Categories',
        'deletedcontribs'     => 'Special:DeletedContributions',
+       'deletedcontribs'     => 'Special:Interwiki',
        'linksearch'          => 'Special:LinkSearch',
        'listusers'           => 'Special:ListUsers',
        'newuserlog'          => 'Special:Log/newusers',