https://www.mediawiki.org/wiki/Special:Code/MediaWiki/111849

Revision: 111849
Author:   robin
Date:     2012-02-19 01:07:16 +0000 (Sun, 19 Feb 2012)
Log Message:
-----------
Add a special page to search for a wiki by selecting a project and inputting a 
language name or code. It accepts language names in English, the user interface 
language and in the language itself. It goes directly to the subdomain if it 
exists, and otherwise to the incubator test wiki.

Modified Paths:
--------------
    trunk/extensions/WikimediaIncubator/WikimediaIncubator.alias.php
    trunk/extensions/WikimediaIncubator/WikimediaIncubator.i18n.php
    trunk/extensions/WikimediaIncubator/WikimediaIncubator.php

Added Paths:
-----------
    trunk/extensions/WikimediaIncubator/SpecialSearchWiki.php

Added: trunk/extensions/WikimediaIncubator/SpecialSearchWiki.php
===================================================================
--- trunk/extensions/WikimediaIncubator/SpecialSearchWiki.php                   
        (rev 0)
+++ trunk/extensions/WikimediaIncubator/SpecialSearchWiki.php   2012-02-19 
01:07:16 UTC (rev 111849)
@@ -0,0 +1,142 @@
+<?php
+
+class SpecialSearchWiki extends IncludableSpecialPage {
+       public function __construct() {
+               parent::__construct( 'SearchWiki' );
+       }
+
+       function getDescription() {
+               return wfMessage( 'wminc-searchwiki' )->plain();
+       }
+
+       /**
+        * Show the special page
+        * @param $subpage Mixed: parameter passed to the page or null
+        */
+       public function execute( $subpage ) {
+               global $wmincProjects, $wmincSisterProjects, $wgScript;
+
+               $this->setHeaders();
+
+               # Array of projects
+               $this->mProjects = array_merge( $wmincProjects, 
$wmincSisterProjects );
+
+               # Queries
+               if( $subpage ) {
+                       $subpage = explode( '/', $subpage );
+               }
+               $projectQuery = $this->getRequest()->getText( 'searchproject', 
isset( $subpage[0] ) ? $subpage[0] : '' );
+               $languageQuery = $this->getRequest()->getText( 
'searchlanguage', isset( $subpage[1] ) ? $subpage[1] : '' );
+
+               # Show form
+               $this->getOutput()->addHTML(
+                       Xml::fieldset( wfMessage( 'wminc-searchwiki' )->plain(),
+                       Html::rawElement( 'form', array( 'method' => 'get', 
'action' => $wgScript, 'id' => 'wminc-searchwiki-form' ),
+                               Html::hidden( 'title', 
SpecialPage::getTitleFor( 'SearchWiki' ) ) .
+                               '<p>' . Xml::label( wfMessage( 
'wminc-searchwiki-selectproject' )->text(), 'wminc-searchproject' ) .
+                                       ' ' . $this->makeProjectSelector( 
$projectQuery ) . '</p>' .
+                               '<p>' . Xml::inputLabel( wfMessage( 
'wminc-searchwiki-inputlanguage' )->text(), 'searchlanguage',
+                               'wminc-searchlanguage', 30, $languageQuery ) . 
' ' .
+                               Xml::submitButton( wfMessage( 
'wminc-searchwiki-go' )->text() ) . '</p>'
+                       ) )
+               );
+
+               # Search
+               if ( $projectQuery || $languageQuery ) {
+                       $this->mNamesUserLang = 
Language::getTranslatedLanguageNames( $this->getLanguage()->getCode() );
+                       $this->mEnglishNames = 
Language::getTranslatedLanguageNames( 'en' );
+                       $this->mNativeNames = Language::getLanguageNames( false 
);
+                       $this->doSearch( $projectQuery, $languageQuery );
+               }
+       }
+
+       /**
+        * Make a <select> box with projects (Wikipedia, Wiktionary, ...)
+        * @param $selected
+        * @return string
+        */
+       protected function makeProjectSelector( $selected ) {
+               $select = new XmlSelect( 'searchproject', 
'wminc-searchproject', $selected );
+               $select->addOptions( array_flip( $this->mProjects ) );
+               return $select->getHTML();
+       }
+
+       protected function doSearch( $projectQuery, $languageQuery ) {
+               ## Match project ##
+               if( isset( $this->mProjects[$projectQuery] ) ) {
+                       $matchProject = $projectQuery; # searched with a 
project code (select box)
+               } elseif( $projectCode = array_search( $projectQuery, 
$this->mProjects ) ) {
+                       $matchProject = $projectCode; # searched with a project 
name
+               } else {
+                       return $this->getOutput()->addWikiMsg( 
'wminc-searchwiki-noproject' );
+               }
+               
+               $results = array();
+
+               $lcLanguageQuery = strtolower( $languageQuery );
+               # The more important, the more below, because they override 
earlier codes
+               $validCodes = array_keys( Language::getLanguageNames() );
+               if( in_array( $lcLanguageQuery, $validCodes ) ) {
+                       $builtinCode = Language::factory( $lcLanguageQuery 
)->getCode();
+                       $results[$builtinCode] = 'langcode'; # Match language 
code
+               }
+               if( $codeByEnglishName = array_search( $lcLanguageQuery, 
array_map( 'strtolower', $this->mEnglishNames ) ) ) {
+                       $results[$codeByEnglishName] = 'englishname'; # Match 
name in English
+               }
+               if( $codeUserLang = array_search( $lcLanguageQuery, array_map( 
'strtolower', $this->mNamesUserLang ) ) ) {
+                       $results[$codeUserLang] = 'userlangname'; # Match name 
in user language
+               }
+               if( $codeByNativeName = array_search( $lcLanguageQuery, 
array_map( 'strtolower', $this->mNativeNames ) ) ) {
+                       $results[$codeByNativeName] = 'nativename'; # Match 
native name 
+               }
+
+               if( count( $results ) === 1 ) {
+                       self::gotoWiki( $matchProject, key( $results ) );
+               } elseif( count( $results ) < 1 ) {
+                       $noresult = Html::element( 'p', array( 'class' => 
'error' ), wfMessage( 'wminc-searchwiki-noresults' )->text() );
+                       return $this->getOutput()->addHTML( $noresult );
+               } elseif( count( $results ) > 1 ) {
+                       self::showMultipleResults( $matchProject, 
$languageQuery, $results );
+               }
+       }
+
+       /**
+        * Go directly to the wiki if it exists, else to the Incubator test wiki
+        * @param $project String: project code
+        * @param $lang String: Language code
+        */
+       protected function goToWiki( $project, $lang ) {
+               $lang = self::getRootCode( $lang );
+               $status = IncubatorTest::getDBState( array( 'project' => 
$project, 'lang' => $lang, 'error' => null ) );
+               $url = $status == 'existing' ? IncubatorTest::getSubdomain( 
$lang, $project ) :
+                       Title::newFromText( 'W' . $project . '/' . $lang 
)->getFullURL( array( 'goto' => 'mainpage' ) );
+               $this->getOutput()->redirect( $url );
+       }
+
+       protected function getRootCode( $code ) {
+               # e.g. ks-arab -> ks
+               $stripLangTags = array( '-arab', '-latn', '-cyrl', '-deva', 
'-cans', '-grek' );
+               return str_replace( $stripLangTags, '', $code );
+       }
+
+       protected function showMultipleResults( $project, $languageQuery, 
$results ) {
+               $this->getOutput()->addHTML( '<div 
id="wminc-searchwiki-results">' .
+                       Xml::element( 'p', array(), wfMessage( 
'wminc-searchwiki-multiplematches' )->text() ) . '<ul>' );
+               foreach( $results as $resultCode => $resultType ) {
+                       $langName = $this->mNamesUserLang[$resultCode];
+                       $infopage = Title::newFromText( 
IncubatorTest::displayPrefix( $project, $resultCode, true ) );
+                       $linkInfoPage = Linker::linkKnown( $infopage, 
wfMessage( 'wminc-searchwiki-gotoinfopage' )->text() );
+                       $linkMainPage = Linker::linkKnown( $infopage, 
wfMessage( 'wminc-infopage-title-' . $project, $langName )->text(),
+                       array(), array( 'goto' => 'mainpage' ) );
+                       # wminc-searchwiki-match-langcode, 
wminc-searchwiki-match-englishname,
+                       # wminc-searchwiki-match-userlangname, 
wminc-searchwiki-match-nativename
+                       $this->getOutput()->addHTML( '<li>' .
+                               wfMessage( 'wminc-searchwiki-match-' . 
$resultType,
+                                       $languageQuery, $langName, $resultCode 
)->escaped() . ' ' .
+                               $this->getLanguage()->getArrow() . ' ' .
+                               wfMessage( 'wminc-searchwiki-goto', 
$linkMainPage, $linkInfoPage )->text() .
+                       '</li>' );
+               }
+               $this->getOutput()->addHTML( '</ul></div>' );
+       }
+}


Property changes on: trunk/extensions/WikimediaIncubator/SpecialSearchWiki.php
___________________________________________________________________
Added: svn:eol-style
   + native

Modified: trunk/extensions/WikimediaIncubator/WikimediaIncubator.alias.php
===================================================================
--- trunk/extensions/WikimediaIncubator/WikimediaIncubator.alias.php    
2012-02-18 23:54:38 UTC (rev 111848)
+++ trunk/extensions/WikimediaIncubator/WikimediaIncubator.alias.php    
2012-02-19 01:07:16 UTC (rev 111849)
@@ -13,4 +13,5 @@
        'ViewUserLang' => array( 'ViewUserLang' ),
        'MyMainPage' => array( 'MyMainPage' ),
        'RandomByTest' => array( 'RandomByTest' ),
+       'SearchWiki' => array( 'SearchWiki' ),
 );

Modified: trunk/extensions/WikimediaIncubator/WikimediaIncubator.i18n.php
===================================================================
--- trunk/extensions/WikimediaIncubator/WikimediaIncubator.i18n.php     
2012-02-18 23:54:38 UTC (rev 111848)
+++ trunk/extensions/WikimediaIncubator/WikimediaIncubator.i18n.php     
2012-02-19 01:07:16 UTC (rev 111849)
@@ -62,6 +62,21 @@
        # Search
        'wminc-search-nocreate-nopref' => 'You searched for "$1". Please set 
your [[Special:Preferences|test wiki preference]] so we can tell you which page 
you can create!',
        'wminc-search-nocreate-suggest' => 'You searched for "$1". You can 
create a page in your wiki at <b>[[$2]]</b>!',
+
+       # SearchWiki
+       'wminc-searchwiki' => 'Search wiki',
+       'wminc-searchwiki-noproject' => 'You did not select a project.',
+       'wminc-searchwiki-noresults' => 'No results. You can search by language 
codes, native names and names in your interface language or English.',
+       'wminc-searchwiki-selectproject' => 'Search for:',
+       'wminc-searchwiki-inputlanguage' => 'In language:',
+       'wminc-searchwiki-go' => 'Go',
+       'wminc-searchwiki-multiplematches' => 'Your search matches the 
following languages:',
+       'wminc-searchwiki-match-langcode' => '"$1" is an ISO 639 language code 
for $2.',
+       'wminc-searchwiki-match-userlangname' => '$1 is the name of a 
language.',
+       'wminc-searchwiki-match-englishname' => '"$1" is the name for $2 in 
English.',
+       'wminc-searchwiki-match-nativename' => '"$1" is the name for $2 in that 
language.',
+       'wminc-searchwiki-goto' => '<b>$1</b> ($2)',
+       'wminc-searchwiki-gotoinfopage' => 'info page',
 );
 
 /** Message documentation (Message documentation)
@@ -122,6 +137,18 @@
        'wminc-listusers-testwiki' => 'Used on [[Special:ListUsers]]. $1 is 
either "Incubator" or a link to pages like "Wx/xyz".',
        'wminc-search-nocreate-nopref' => 'Used on Special:Search. $1 is the 
search term.',
        'wminc-search-nocreate-suggest' => 'Used on Special:Search. $1 is the 
search term, and $2 is the prefixed form of $1.',
+       'wminc-searchwiki' => 'Title of Special:SearchWiki, to search for a 
wiki in a specific language',
+       'wminc-searchwiki-noproject' => 'Error message',
+       'wminc-searchwiki-noresults' => 'Error message',
+       'wminc-searchwiki-selectproject' => 'Followed by a dropdown menu with 
projects (Wikipedia, Wiktionary, ...)',
+       'wminc-searchwiki-inputlanguage' => 'Followed by an input box where you 
can enter a language name or code',
+       'wminc-searchwiki-go' => 'Submit button',
+       'wminc-searchwiki-multiplematches' => 'Followed by a list of matches 
when there are multiple matches',
+       'wminc-searchwiki-match-langcode' => '$1 is the input; $2 is its 
language name in the user interface language',
+       'wminc-searchwiki-match-userlangname' => '$1 is the input; $2 is its 
language name in the user interface language',
+       'wminc-searchwiki-match-englishname' => '$1 is the input; $2 is its 
language name in the user interface language',
+       'wminc-searchwiki-match-nativename' => '$1 is the input; $2 is its 
language name in the user interface language',
+       'wminc-searchwiki-gotoinfopage' => 'Link text to go to the Wx/xyz info 
page',
 );
 
 /** адыгэбзэ (адыгэбзэ)

Modified: trunk/extensions/WikimediaIncubator/WikimediaIncubator.php
===================================================================
--- trunk/extensions/WikimediaIncubator/WikimediaIncubator.php  2012-02-18 
23:54:38 UTC (rev 111848)
+++ trunk/extensions/WikimediaIncubator/WikimediaIncubator.php  2012-02-19 
01:07:16 UTC (rev 111849)
@@ -16,7 +16,7 @@
        'path' => __FILE__,
        'name' => 'Wikimedia Incubator',
        'author' => 'SPQRobin',
-       'version' => '4.8',
+       'version' => '5.0',
        'url' => 'https://www.mediawiki.org/wiki/Extension:WikimediaIncubator',
        'descriptionmsg' => 'wminc-desc',
 );
@@ -155,3 +155,7 @@
 $wgHooks['SpecialSearchCreateLink'][] = 
'IncubatorTest::onSpecialSearchCreateLink';
 $wgHooks['SpecialSearchPowerBox'][] = 'IncubatorTest::onSpecialSearchPowerBox';
 $wgHooks['SpecialSearchSetupEngine'][] = 
'IncubatorTest::onSpecialSearchSetupEngine';
+
+/* Search for a wiki in a language */
+$wgAutoloadClasses['SpecialSearchWiki'] = $dir . 'SpecialSearchWiki.php';
+$wgSpecialPages['SearchWiki'] = 'SpecialSearchWiki';


_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to