X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FSpecialVersion.php;h=6de2da11909136a38f3765809f0ff2749a33316e;hb=eaaf62fbdc21c1b43440e18f3874f31bd7ab12d8;hp=4f3a81aba68af60429757e38dc7b4a7ba42cacf5;hpb=c67565e3dfcda94350650ee75f96092f30b55a40;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/SpecialVersion.php b/includes/SpecialVersion.php index 4f3a81aba6..6de2da1190 100644 --- a/includes/SpecialVersion.php +++ b/includes/SpecialVersion.php @@ -1,9 +1,8 @@ * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason @@ -19,65 +18,77 @@ function wfSpecialVersion() { } class SpecialVersion { + private $firstExtOpened = true; + /** - * @var object - */ - var $langObj; - - /** - * Constructor + * main() */ - function SpecialVersion() { - // English motherfucker, do you speak it? - $this->langObj = setupLangObj( 'LanguageEn' ); - $this->langObj->initEncoding(); - } - function execute() { global $wgOut; - - $wgOut->addWikiText( $this->MediaWikiCredits() . $this->extensionCredits() . $this->wgHooks() ); + + $wgOut->addHTML( '
' ); + $wgOut->addWikiText( + $this->MediaWikiCredits() . + $this->extensionCredits() . + $this->wgHooks() + ); $wgOut->addHTML( $this->IPInfo() ); + $wgOut->addHTML( '
' ); } + /**#@+ + * @private + */ + + /** + * Return wiki text showing the licence information and third party + * software versions (apache, php, mysql). + * @static + */ function MediaWikiCredits() { - global $wgVersion; - - $dbr =& wfGetDB( DB_SLAVE ); - + $version = self::getVersion(); + $dbr = wfGetDB( DB_SLAVE ); + $ret = "__NOTOC__ -
- This wiki is powered by '''[http://www.mediawiki.org/ MediaWiki]''', - copyright (C) 2001-2005 Magnus Manske, Brion Vibber, Lee Daniel Crocker, - Tim Starling, Erik Möller, and others. - + This wiki is powered by '''[http://www.mediawiki.org/ MediaWiki]''', + copyright (C) 2001-2007 Magnus Manske, Brion Vibber, Lee Daniel Crocker, + Tim Starling, Erik Möller, Gabriel Wicke, Ævar Arnfjörð Bjarmason, + Niklas Laxström, Domas Mituzas, Rob Church and others. + MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + MediaWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU General Public License] along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. or [http://www.gnu.org/copyleft/gpl.html read it online] - - * [http://www.mediawiki.org/ MediaWiki]: $wgVersion + + * [http://www.mediawiki.org/ MediaWiki]: $version * [http://www.php.net/ PHP]: " . phpversion() . " (" . php_sapi_name() . ") - * " . $dbr->getSoftwareLink() . ": " . $dbr->getServerVersion() . " -
"; + * " . $dbr->getSoftwareLink() . ": " . $dbr->getServerVersion(); + + return str_replace( "\t\t", '', $ret ) . "\n"; + } - return str_replace( "\t\t", '', $ret ); + /** Return a string of the MediaWiki version with SVN revision if available */ + public static function getVersion() { + global $wgVersion, $IP; + $svn = self::getSvnRevision( $IP ); + return $svn ? "$wgVersion (r$svn)" : $wgVersion; } + /** Generate wikitext showing extensions name, URL, author and description */ function extensionCredits() { - global $wgExtensionCredits, $wgExtensionFunctions, $wgSkinExtensionFunction; - + global $wgExtensionCredits, $wgExtensionFunctions, $wgParser, $wgSkinExtensionFunction; + if ( ! count( $wgExtensionCredits ) && ! count( $wgExtensionFunctions ) && ! count( $wgSkinExtensionFunction ) ) return ''; @@ -87,41 +98,64 @@ class SpecialVersion { 'variable' => 'Variables', 'other' => 'Other', ); - wfRunHooks( 'SpecialVersionExtensionTypes', array( &$extensionTypes ) ); - - $out = "\n* Extensions:\n"; + wfRunHooks( 'SpecialVersionExtensionTypes', array( &$this, &$extensionTypes ) ); + + $out = "

Extensions

\n"; + $out .= wfOpenElement('table', array('id' => 'sv-ext') ); + foreach ( $extensionTypes as $type => $text ) { - if ( count( @$wgExtensionCredits[$type] ) ) { - $out .= "** $text:\n"; + if ( isset ( $wgExtensionCredits[$type] ) && count ( $wgExtensionCredits[$type] ) ) { + $out .= $this->openExtType( $text ); + + usort( $wgExtensionCredits[$type], array( $this, 'compare' ) ); + foreach ( $wgExtensionCredits[$type] as $extension ) { - wfSuppressWarnings(); $out .= $this->formatCredits( - $extension['name'], - $extension['version'], - $extension['author'], - $extension['url'], - $extension['description'] + isset ( $extension['name'] ) ? $extension['name'] : '', + isset ( $extension['version'] ) ? $extension['version'] : null, + isset ( $extension['author'] ) ? $extension['author'] : '', + isset ( $extension['url'] ) ? $extension['url'] : null, + isset ( $extension['description'] ) ? $extension['description'] : '' ); - wfRestoreWarnings(); } } } if ( count( $wgExtensionFunctions ) ) { - $out .= "** Extension functions:\n"; - $out .= '***' . $this->langObj->listToText( $wgExtensionFunctions ) . "\n"; + $out .= $this->openExtType('Extension functions'); + $out .= '' . $this->listToText( $wgExtensionFunctions ) . "\n"; } - if ( count( $wgSkinExtensionFunction ) ) { - $out .= "** Skin extension functions:\n"; - $out .= '***' . $this->langObj->listToText( $wgSkinExtensionFunction ) . "\n"; + if ( $cnt = count( $tags = $wgParser->getTags() ) ) { + for ( $i = 0; $i < $cnt; ++$i ) + $tags[$i] = "<{$tags[$i]}>"; + $out .= $this->openExtType('Parser extension tags'); + $out .= '' . $this->listToText( $tags ). "\n"; + } + + if( $cnt = count( $fhooks = $wgParser->getFunctionHooks() ) ) { + $out .= $this->openExtType('Parser function hooks'); + $out .= '' . $this->listToText( $fhooks ) . "\n"; } + if ( count( $wgSkinExtensionFunction ) ) { + $out .= $this->openExtType('Skin extension functions'); + $out .= '' . $this->listToText( $wgSkinExtensionFunction ) . "\n"; + } + $out .= wfCloseElement( 'table' ); return $out; } + /** Callback to sort extensions by type */ + function compare( $a, $b ) { + if ( $a['name'] === $b['name'] ) + return 0; + else + return Language::lc( $a['name'] ) > Language::lc( $b['name'] ) ? 1 : -1; + } + function formatCredits( $name, $version = null, $author = null, $url = null, $description = null) { - $ret = '*** '; + $ret = ''; if ( isset( $url ) ) $ret .= "[$url "; $ret .= "''$name"; @@ -130,29 +164,148 @@ class SpecialVersion { $ret .= "''"; if ( isset( $url ) ) $ret .= ']'; - if ( isset( $description ) ) - $ret .= ', ' . $description; - if ( isset( $description ) && isset( $author ) ) - $ret .= ', '; - if ( isset( $author ) ) - $ret .= ' by ' . $this->langObj->listToText( (array)$author ); - - return htmlspecialchars( $ret ) . "\n"; + $ret .= ''; + $ret .= "$description"; + $ret .= "" . $this->listToText( (array)$author ) . ""; + $ret .= ''; + return "$ret\n"; } + /** + * @return string + */ function wgHooks() { global $wgHooks; - $ret = "* Hooks:\n"; - foreach ($wgHooks as $hook => $hooks) - $ret .= "** $hook: " . $this->langObj->listToText( $hooks ) . "\n"; + if ( count( $wgHooks ) ) { + $myWgHooks = $wgHooks; + ksort( $myWgHooks ); + + $ret = "

Hooks

\n" + . wfOpenElement('table', array('id' => 'sv-hooks') ) + . "Hook nameSubscribed by\n"; + + foreach ($myWgHooks as $hook => $hooks) + $ret .= "$hook" . $this->listToText( $hooks ) . "\n"; + + $ret .= ''; + return $ret; + } else + return ''; + } + + private function openExtType($text, $name = null) { + $opt = array( 'colspan' => 3 ); + $out = ''; + + if(!$this->firstExtOpened) { + // Insert a spacing line + $out .= '' . wfElement( 'td', $opt ) . "\n"; + } + $this->firstExtOpened = false; + + if($name) { $opt['id'] = "sv-$name"; } - return $ret; + $out .= "" . wfElement( 'th', $opt, $text) . "\n"; + return $out; } + /** + * @static + * + * @return string + */ function IPInfo() { - $ip = str_replace( '--', ' - - ', htmlspecialchars( wfGetIP() ) ); - return "\n"; + $ip = str_replace( '--', ' - ', htmlspecialchars( wfGetIP() ) ); + return "\n" . + "visited from $ip"; + } + + /** + * @param array $list + * @return string + */ + function listToText( $list ) { + $cnt = count( $list ); + + if ( $cnt == 1 ) { + // Enforce always returning a string + return (string)$this->arrayToString( $list[0] ); + } elseif ( $cnt == 0 ) { + return ''; + } else { + $t = array_slice( $list, 0, $cnt - 1 ); + $one = array_map( array( &$this, 'arrayToString' ), $t ); + $two = $this->arrayToString( $list[$cnt - 1] ); + + return implode( ', ', $one ) . " and $two"; + } + } + + /** + * @static + * + * @param mixed $list Will convert an array to string if given and return + * the paramater unaltered otherwise + * @return mixed + */ + function arrayToString( $list ) { + if ( ! is_array( $list ) ) { + return $list; + } else { + $class = get_class( $list[0] ); + return "($class, {$list[1]})"; + } + } + + /** + * Retrieve the revision number of a Subversion working directory. + * + * @param string $dir + * @return mixed revision number as int, or false if not a SVN checkout + */ + public static function getSvnRevision( $dir ) { + // http://svnbook.red-bean.com/nightly/en/svn.developer.insidewc.html + $entries = $dir . '/.svn/entries'; + + if( !file_exists( $entries ) ) { + return false; + } + + $content = file( $entries ); + + // check if file is xml (subversion release <= 1.3) or not (subversion release = 1.4) + if( preg_match( '/^<\?xml/', $content[0] ) ) { + // subversion is release <= 1.3 + if( !function_exists( 'simplexml_load_file' ) ) { + // We could fall back to expat... YUCK + return false; + } + + // SimpleXml whines about the xmlns... + wfSuppressWarnings(); + $xml = simplexml_load_file( $entries ); + wfRestoreWarnings(); + + if( $xml ) { + foreach( $xml->entry as $entry ) { + if( $xml->entry[0]['name'] == '' ) { + // The directory entry should always have a revision marker. + if( $entry['revision'] ) { + return intval( $entry['revision'] ); + } + } + } + } + return false; + } else { + // subversion is release 1.4 + return intval( $content[3] ); + } } + + /**#@-*/ } + +/**#@-*/ ?>