Merge "Linker::link() prints deprecated warning if $query is a string"
[lhc/web/wiklou.git] / includes / parser / DateFormatter.php
index a6fb7df..2917b4a 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Date formatter
  *
+ * This program 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.
+ *
+ * This program 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 a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
+ * @ingroup Parser
  */
 
 /**
  * @todo preferences, OutputPage
  * @ingroup Parser
  */
-class DateFormatter
-{
+class DateFormatter {
        var $mSource, $mTarget;
        var $monthNames = '', $rxDM, $rxMD, $rxDMY, $rxYDM, $rxMDY, $rxYMD;
 
        var $regexes, $pDays, $pMonths, $pYears;
        var $rules, $xMonths, $preferences;
 
+       protected $lang;
+
        const ALL = -1;
        const NONE = 0;
        const MDY = 1;
@@ -32,15 +49,15 @@ class DateFormatter
        const LAST = 8;
 
        /**
-        * @todo document
+        * @param $lang Language In which language to format the date
         */
-       function __construct() {
-               global $wgContLang;
+       function __construct( Language $lang ) {
+               $this->lang = $lang;
 
                $this->monthNames = $this->getMonthRegex();
                for ( $i=1; $i<=12; $i++ ) {
-                       $this->xMonths[$wgContLang->lc( $wgContLang->getMonthName( $i ) )] = $i;
-                       $this->xMonths[$wgContLang->lc( $wgContLang->getMonthAbbreviation( $i ) )] = $i;
+                       $this->xMonths[$this->lang->lc( $this->lang->getMonthName( $i ) )] = $i;
+                       $this->xMonths[$this->lang->lc( $this->lang->getMonthAbbreviation( $i ) )] = $i;
                }
 
                $this->regexTrail = '(?![a-z])/iu';
@@ -103,16 +120,20 @@ class DateFormatter
        /**
         * Get a DateFormatter object
         *
+        * @param $lang Language|string|null In which language to format the date
+        *              Defaults to the site content language
         * @return DateFormatter object
         */
-       public static function &getInstance() {
-               global $wgMemc;
+       public static function &getInstance( $lang = null ) {
+               global $wgMemc, $wgContLang;
                static $dateFormatter = false;
+               $lang = $lang ? wfGetLangObj( $lang ) : $wgContLang;
+               $key = wfMemcKey( 'dateformatter', $lang->getCode() );
                if ( !$dateFormatter ) {
-                       $dateFormatter = $wgMemc->get( wfMemcKey( 'dateformatter' ) );
+                       $dateFormatter = $wgMemc->get( $key );
                        if ( !$dateFormatter ) {
-                               $dateFormatter = new DateFormatter;
-                               $wgMemc->set( wfMemcKey( 'dateformatter' ), $dateFormatter, 3600 );
+                               $dateFormatter = new DateFormatter( $lang );
+                               $wgMemc->set( $key, $dateFormatter, 3600 );
                        }
                }
                return $dateFormatter;
@@ -122,12 +143,12 @@ class DateFormatter
         * @param $preference String: User preference
         * @param $text String: Text to reformat
         * @param $options Array: can contain 'linked' and/or 'match-whole'
+        * @return mixed|String
         */
        function reformat( $preference, $text, $options = array('linked') ) {
-       
                $linked = in_array( 'linked', $options );
                $match_whole = in_array( 'match-whole', $options );
-               
+
                if ( isset( $this->preferences[$preference] ) ) {
                        $preference = $this->preferences[$preference];
                } else {
@@ -149,19 +170,19 @@ class DateFormatter
                                $this->mTarget = $i;
                        }
                        $regex = $this->regexes[$i];
-                       
+
                        // Horrible hack
                        if (!$linked) {
                                $regex = str_replace( array( '\[\[', '\]\]' ), '', $regex );
                        }
-                       
+
                        if ($match_whole) {
                                // Let's hope this works
                                $regex = preg_replace( '!^/!', '/^', $regex );
                                $regex = str_replace( $this->regexTrail,
                                        '$'.$this->regexTrail, $regex );
                        }
-                       
+
                        // Another horrible hack
                        $this->mLinked = $linked;
                        $text = preg_replace_callback( $regex, array( &$this, 'replace' ), $text );
@@ -172,6 +193,7 @@ class DateFormatter
 
        /**
         * @param $matches
+        * @return string
         */
        function replace( $matches ) {
                # Extract information from $matches
@@ -182,14 +204,19 @@ class DateFormatter
                $bits = array();
                $key = $this->keys[$this->mSource];
                for ( $p=0; $p < strlen($key); $p++ ) {
-                       if ( $key{$p} != ' ' ) {
-                               $bits[$key{$p}] = $matches[$p+1];
+                       if ( $key[$p] != ' ' ) {
+                               $bits[$key[$p]] = $matches[$p+1];
                        }
                }
-               
+
                return $this->formatDate( $bits, $linked );
        }
-       
+
+       /**
+        * @param $bits array
+        * @param $link bool
+        * @return string
+        */
        function formatDate( $bits, $link = true ) {
                $format = $this->targets[$this->mTarget];
                
@@ -203,13 +230,13 @@ class DateFormatter
                # Construct new date
                $text = '';
                $fail = false;
-               
+
                // Pre-generate y/Y stuff because we need the year for the <span> title.
                if ( !isset( $bits['y'] ) && isset( $bits['Y'] ) )
                        $bits['y'] = $this->makeIsoYear( $bits['Y'] );
                if ( !isset( $bits['Y'] ) && isset( $bits['y'] ) )
                        $bits['Y'] = $this->makeNormalYear( $bits['y'] );
-                       
+
                if ( !isset( $bits['m'] ) ) {
                        $m = $this->makeIsoMonth( $bits['F'] );
                        if ( !$m || $m == '00' ) {
@@ -218,13 +245,13 @@ class DateFormatter
                                $bits['m'] = $m;
                        }
                }
-               
+
                if ( !isset($bits['d']) ) {
                        $bits['d'] = sprintf( '%02d', $bits['j'] );
                }
 
                for ( $p=0; $p < strlen( $format ); $p++ ) {
-                       $char = $format{$p};
+                       $char = $format[$p];
                        switch ( $char ) {
                                case 'd': # ISO day of month
                                        $text .= $bits['d'];
@@ -248,8 +275,7 @@ class DateFormatter
                                                if ( $m > 12 || $m < 1 ) {
                                                        $fail = true;
                                                } else {
-                                                       global $wgContLang;
-                                                       $text .= $wgContLang->getMonthName( $m );
+                                                       $text .= $this->lang->getMonthName( $m );
                                                }
                                        } else {
                                                $text .= ucfirst( $bits['F'] );
@@ -265,30 +291,30 @@ class DateFormatter
                if ( $fail ) {
                        $text = $matches[0];
                }
-               
+
                $isoBits = array();
                if ( isset($bits['y']) )
                        $isoBits[] = $bits['y'];
                $isoBits[] = $bits['m'];
                $isoBits[] = $bits['d'];
-               $isoDate = implode( '-', $isoBits );;
-               
+               $isoDate = implode( '-', $isoBits );
+
                // Output is not strictly HTML (it's wikitext), but <span> is whitelisted.
                $text = Html::rawElement( 'span',
                                        array( 'class' => 'mw-formatted-date', 'title' => $isoDate ), $text );
-               
+
                return $text;
        }
 
        /**
         * @todo document
+        * @return string
         */
        function getMonthRegex() {
-               global $wgContLang;
                $names = array();
                for( $i = 1; $i <= 12; $i++ ) {
-                       $names[] = $wgContLang->getMonthName( $i );
-                       $names[] = $wgContLang->getMonthAbbreviation( $i );
+                       $names[] = $this->lang->getMonthName( $i );
+                       $names[] = $this->lang->getMonthAbbreviation( $i );
                }
                return implode( '|', $names );
        }
@@ -299,9 +325,7 @@ class DateFormatter
         * @return string ISO month name
         */
        function makeIsoMonth( $monthName ) {
-               global $wgContLang;
-
-               $n = $this->xMonths[$wgContLang->lc( $monthName )];
+               $n = $this->xMonths[$this->lang->lc( $monthName )];
                return sprintf( '%02d', $n );
        }
 
@@ -325,9 +349,10 @@ class DateFormatter
 
        /**
         * @todo document
+        * @return int|string
         */
        function makeNormalYear( $iso ) {
-               if ( $iso{0} == '-' ) {
+               if ( $iso[0] == '-' ) {
                        $text = (intval( substr( $iso, 1 ) ) + 1) . ' BC';
                } else {
                        $text = intval( $iso );