X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FMagicWord.php;h=7d38b0ee75043c9211cd820c99e618a2f8b99d82;hb=09da7fb96c45255899fa0f4c62412d14b8575b3e;hp=1ca7a8767153c4cad5d63ecd416ce883861f694f;hpb=c7c31c6fecde75b0fa96a215e6de4a05eabc020f;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/MagicWord.php b/includes/MagicWord.php index 1ca7a87671..7d38b0ee75 100644 --- a/includes/MagicWord.php +++ b/includes/MagicWord.php @@ -2,6 +2,7 @@ /** * File for magic words * @package MediaWiki + * @subpackage Parser */ /** @@ -9,59 +10,98 @@ */ $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_CURRENTDAY', 5); -define('MAG_CURRENTDAYNAME', 6); -define('MAG_CURRENTYEAR', 7); -define('MAG_CURRENTTIME', 8); -define('MAG_NUMBEROFARTICLES', 9); -define('MAG_CURRENTMONTHNAMEGEN', 10); -define('MAG_MSG', 11); -define('MAG_SUBST', 12); -define('MAG_MSGNW', 13); -define('MAG_NOEDITSECTION', 14); -define('MAG_END', 15); -define('MAG_IMG_THUMBNAIL', 16); -define('MAG_IMG_RIGHT', 17); -define('MAG_IMG_LEFT', 18); -define('MAG_IMG_NONE', 19); -define('MAG_IMG_WIDTH', 20); -define('MAG_IMG_CENTER', 21); -define('MAG_INT', 22); -define('MAG_FORCETOC', 23); -define('MAG_SITENAME', 24); -define('MAG_NS', 25); -define('MAG_LOCALURL', 26); -define('MAG_LOCALURLE', 27); -define('MAG_SERVER', 28); -define('MAG_IMG_FRAMED', 29); -define('MAG_PAGENAME', 30); -define('MAG_PAGENAMEE', 31); -define('MAG_NAMESPACE', 32); -define('MAG_TOC', 33); -define('MAG_GRAMMAR', 34); -define('MAG_NOTITLECONVERT', 35); +$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, MAG_CURRENTMONTHNAME, + MAG_CURRENTMONTHNAMEGEN, + MAG_CURRENTMONTHABBREV, MAG_CURRENTDAY, MAG_CURRENTDAYNAME, MAG_CURRENTYEAR, MAG_CURRENTTIME, MAG_NUMBEROFARTICLES, - MAG_CURRENTMONTHNAMEGEN, + MAG_NUMBEROFFILES, MAG_SITENAME, MAG_SERVER, + MAG_SERVERNAME, + MAG_SCRIPTPATH, MAG_PAGENAME, MAG_PAGENAMEE, - MAG_NAMESPACE + MAG_FULLPAGENAME, + MAG_FULLPAGENAMEE, + MAG_NAMESPACE, + MAG_NAMESPACEE, + MAG_CURRENTWEEK, + MAG_CURRENTDOW, + MAG_REVISIONID, ); +if ( ! defined( 'MEDIAWIKI_INSTALL' ) ) + wfRunHooks( 'MagicWordwgVariableIDs', array( &$wgVariableIDs ) ); /** * This class encapsulates "magic words" such as #redirect, __NOTOC__, etc. @@ -127,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}" ); } /** @@ -191,13 +234,17 @@ class MagicWord { * is one. */ function matchVariableStartToEnd( $text ) { + $matches = array(); $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]; } } @@ -236,7 +283,6 @@ class MagicWord { * Input word must contain $1 */ function substituteCallback( $text, $callback ) { - $regex = $this->getVariableRegex(); $res = preg_replace_callback( $this->getVariableRegex(), $callback, $text ); $this->mModified = !($res === $text); return $res;