X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2FMagicWord.php;h=fcd6b0343d6bf794122773899ed22923b1415aac;hb=3141337d77504b52045406c540a371f3444d40fc;hp=3f208ea53d3bbacb448e5ee377f41c7664ce3617;hpb=b002ea6e2ca7830b75a37efc5e67a1a237221c07;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/MagicWord.php b/includes/MagicWord.php index 3f208ea53d..fcd6b0343d 100644 --- a/includes/MagicWord.php +++ b/includes/MagicWord.php @@ -1,7 +1,10 @@ 86400, @@ -136,15 +143,34 @@ class MagicWord { 'localweek' => 3600, 'localdow' => 3600, 'numberofusers' => 3600, + 'numberofactiveusers' => 3600, 'numberofpages' => 3600, 'currentversion' => 86400, 'currenttimestamp' => 3600, 'localtimestamp' => 3600, 'pagesinnamespace' => 3600, 'numberofadmins' => 3600, + 'numberofviews' => 3600, + 'numberingroup' => 3600, ); + static public $mDoubleUnderscoreIDs = array( + 'notoc', + 'nogallery', + 'forcetoc', + 'toc', + 'noeditsection', + 'newsectionlink', + 'nonewsectionlink', + 'hiddencat', + 'index', + 'noindex', + 'staticredirect', + ); + + static public $mObjects = array(); + static public $mDoubleUnderscoreArray = null; /**#@-*/ @@ -192,7 +218,7 @@ class MagicWord { } return self::$mVariableIDs; } - + /* Allow external reads of TTL array */ static function getCacheTTL($id) { if (array_key_exists($id,self::$mCacheTTLs)) { @@ -201,8 +227,15 @@ class MagicWord { return -1; } } - - + + /** Get a MagicWordArray of double-underscore entities */ + static function getDoubleUnderscoreArray() { + if ( is_null( self::$mDoubleUnderscoreArray ) ) { + self::$mDoubleUnderscoreArray = new MagicWordArray( self::$mDoubleUnderscoreIDs ); + } + return self::$mDoubleUnderscoreArray; + } + # Initialises this object with an ID function load( $id ) { global $wgContLang; @@ -224,13 +257,13 @@ class MagicWord { # 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(); foreach ( $this->mSynonyms as $synonym ) // In case a magic word contains /, like that's going to happen;) $escSyn[] = preg_quote( $synonym, '/' ); $this->mBaseRegex = implode( '|', $escSyn ); - + $case = $this->mCaseSensitive ? '' : 'iu'; $this->mRegex = "/{$this->mBaseRegex}/{$case}"; $this->mRegexStart = "/^(?:{$this->mBaseRegex})/{$case}"; @@ -448,11 +481,13 @@ class MagicWord { /** * Class for handling an array of magic words + * @ingroup Parser */ class MagicWordArray { var $names = array(); var $hash; var $baseRegex, $regex; + var $matches; function __construct( $names = array() ) { $this->names = $names; @@ -559,6 +594,8 @@ class MagicWordArray { /** * Parse a match array from preg_match + * Returns array(magic word ID, parameter value) + * If there is no parameter value, that element will be false. */ function parseMatch( $m ) { reset( $m ); @@ -583,7 +620,7 @@ class MagicWordArray { /** * Match some text, with parameter capture - * Returns an array with the magic word name in the first element and the + * Returns an array with the magic word name in the first element and the * parameter in the second element. * Both elements are false if there was no match. */ @@ -617,4 +654,25 @@ class MagicWordArray { } return false; } + + /** + * Returns an associative array, ID => param value, for all items that match + * Removes the matched items from the input string (passed by reference) + */ + public function matchAndRemove( &$text ) { + $found = array(); + $regexes = $this->getRegex(); + foreach ( $regexes as $regex ) { + if ( $regex === '' ) { + continue; + } + preg_match_all( $regex, $text, $matches, PREG_SET_ORDER ); + foreach ( $matches as $m ) { + list( $name, $param ) = $this->parseMatch( $m ); + $found[$name] = $param; + } + $text = preg_replace( $regex, '', $text ); + } + return $found; + } }