* (bug 153) Adjust thumbnail size calculations to match consistently;
[lhc/web/wiklou.git] / includes / MagicWord.php
index bb4cf49..d5e3ca0 100644 (file)
@@ -2,6 +2,7 @@
 /**
  * File for magic words
  * @package MediaWiki
+ * @subpackage Parser
  */
 
 /**
  */
 $wgMagicFound = false;
 
+/** Actual keyword to be used is set in Language.php */
 
-define('MAG_REDIRECT', 0);
-define('MAG_NOTOC', 1);
-define('MAG_START', 2);
-define('MAG_CURRENTMONTH', 3);
-define('MAG_CURRENTMONTHNAME', 4);
-define('MAG_CURRENTMONTHNAMEGEN', 5);
-define('MAG_CURRENTMONTHABBREV', 6);
-define('MAG_CURRENTDAY', 7);
-define('MAG_CURRENTDAYNAME', 8);
-define('MAG_CURRENTYEAR', 9);
-define('MAG_CURRENTTIME', 10);
-define('MAG_NUMBEROFARTICLES', 11);
-define('MAG_MSG', 12);
-define('MAG_SUBST', 13);
-define('MAG_MSGNW', 14);
-define('MAG_NOEDITSECTION', 15);
-define('MAG_END', 16);
-define('MAG_IMG_THUMBNAIL',  17);
-define('MAG_IMG_RIGHT',      18);
-define('MAG_IMG_LEFT',       19);
-define('MAG_IMG_NONE',       20);
-define('MAG_IMG_WIDTH',      21);
-define('MAG_IMG_CENTER',      22);
-define('MAG_INT', 23);
-define('MAG_FORCETOC', 24);
-define('MAG_SITENAME', 25);
-define('MAG_NS', 26);
-define('MAG_LOCALURL', 27);
-define('MAG_LOCALURLE', 28);
-define('MAG_SERVER', 29);
-define('MAG_IMG_FRAMED', 30);
-define('MAG_PAGENAME', 31);
-define('MAG_PAGENAMEE', 32);
-define('MAG_NAMESPACE', 33);
-define('MAG_TOC', 34);
-define('MAG_GRAMMAR', 35);
-define('MAG_NOTITLECONVERT', 36);
-define('MAG_NOCONTENTCONVERT', 37);
-define('MAG_CURRENTWEEK', 38);
-define('MAG_CURRENTDOW', 39);
+$magicWords = array(
+       'MAG_REDIRECT',
+       'MAG_NOTOC',
+       'MAG_START',
+       'MAG_CURRENTMONTH',
+       'MAG_CURRENTMONTHNAME',
+       'MAG_CURRENTMONTHNAMEGEN',
+       'MAG_CURRENTMONTHABBREV',
+       'MAG_CURRENTDAY',
+       'MAG_CURRENTDAYNAME',
+       'MAG_CURRENTYEAR',
+       'MAG_CURRENTTIME',
+       'MAG_NUMBEROFARTICLES',
+       'MAG_SUBST',
+       'MAG_MSG',
+       'MAG_MSGNW',
+       'MAG_NOEDITSECTION',
+       'MAG_END',
+       'MAG_IMG_THUMBNAIL',
+       'MAG_IMG_RIGHT',
+       'MAG_IMG_LEFT',
+       'MAG_IMG_NONE',
+       'MAG_IMG_WIDTH',
+       'MAG_IMG_CENTER',
+       'MAG_INT',
+       'MAG_FORCETOC',
+       'MAG_SITENAME',
+       'MAG_NS',
+       'MAG_LOCALURL',
+       'MAG_LOCALURLE',
+       'MAG_SERVER',
+       'MAG_IMG_FRAMED',
+       'MAG_PAGENAME',
+       'MAG_PAGENAMEE',
+       'MAG_NAMESPACE',
+       'MAG_NAMESPACEE',
+       'MAG_TOC',
+       'MAG_GRAMMAR',
+       'MAG_NOTITLECONVERT',
+       'MAG_NOCONTENTCONVERT',
+       'MAG_CURRENTWEEK',
+       'MAG_CURRENTDOW',
+       'MAG_REVISIONID',
+       'MAG_SCRIPTPATH',
+       'MAG_SERVERNAME',
+       'MAG_NUMBEROFFILES',
+       'MAG_IMG_MANUALTHUMB',
+       'MAG_PLURAL',
+       'MAG_FULLURL',
+       'MAG_FULLURLE',
+       'MAG_LCFIRST',
+       'MAG_UCFIRST',
+       'MAG_LC',
+       'MAG_UC',
+       'MAG_FULLPAGENAME',
+       'MAG_FULLPAGENAMEE',
+);
+if ( ! defined( 'MEDIAWIKI_INSTALL' ) )
+       wfRunHooks( 'MagicWordMagicWords', array( &$magicWords ) );
+
+for ( $i = 0; $i < count( $magicWords ); ++$i )
+       define( $magicWords[$i], $i );
 
 $wgVariableIDs = array(
        MAG_CURRENTMONTH,
@@ -61,14 +85,23 @@ $wgVariableIDs = array(
        MAG_CURRENTYEAR,
        MAG_CURRENTTIME,
        MAG_NUMBEROFARTICLES,
+       MAG_NUMBEROFFILES,
        MAG_SITENAME,
        MAG_SERVER,
+       MAG_SERVERNAME,
+       MAG_SCRIPTPATH,
        MAG_PAGENAME,
        MAG_PAGENAMEE,
+       MAG_FULLPAGENAME,
+       MAG_FULLPAGENAMEE,
        MAG_NAMESPACE,
+       MAG_NAMESPACEE,
        MAG_CURRENTWEEK,
-       MAG_CURRENTDOW
+       MAG_CURRENTDOW,
+       MAG_REVISIONID,
 );
+if ( ! defined( 'MEDIAWIKI_INSTALL' ) )
+       wfRunHooks( 'MagicWordwgVariableIDs', array( &$wgVariableIDs ) );
 
 /**
  * This class encapsulates "magic words" such as #redirect, __NOTOC__, etc.
@@ -134,15 +167,18 @@ class MagicWord {
         * @private
         */
        function initRegex() {
-               $variableClass = Title::legalChars();
+               #$variableClass = Title::legalChars();
+               # This was used for matching "$1" variables, but different uses of the feature will have
+               # different restrictions, which should be checked *after* the MagicWord has been matched,
+               # not here. - IMSoP
                $escSyn = array_map( 'preg_quote', $this->mSynonyms );
                $this->mBaseRegex = implode( '|', $escSyn );
                $case = $this->mCaseSensitive ? '' : 'i';
                $this->mRegex = "/{$this->mBaseRegex}/{$case}";
-               $this->mRegexStart = "/^({$this->mBaseRegex})/{$case}";
-               $this->mVariableRegex = str_replace( "\\$1", "([$variableClass]*?)", $this->mRegex );
-               $this->mVariableStartToEndRegex = str_replace( "\\$1", "([$variableClass]*?)", 
-                       "/^({$this->mBaseRegex})$/{$case}" );
+               $this->mRegexStart = "/^(?:{$this->mBaseRegex})/{$case}";
+               $this->mVariableRegex = str_replace( "\\$1", "(.*?)", $this->mRegex );
+               $this->mVariableStartToEndRegex = str_replace( "\\$1", "(.*?)", 
+                       "/^(?:{$this->mBaseRegex})$/{$case}" );
        }
        
        /**
@@ -201,10 +237,13 @@ class MagicWord {
                $matchcount = preg_match( $this->getVariableStartToEndRegex(), $text, $matches );
                if ( $matchcount == 0 ) {
                        return NULL;
-               } elseif ( count($matches) == 2 ) {
+               } elseif ( count($matches) == 1 ) {
                        return $matches[0];
                } else {
-                       return $matches[2];
+                       # multiple matched parts (variable match); some will be empty because of synonyms
+                       # the variable will be the second non-empty one so remove any blank elements and re-sort the indices
+                       $matches = array_values(array_filter($matches));
+                       return $matches[1];
                }
        }