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