X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FMagicWord.php;h=13f706dee4918df6820af62e67416aabe83bc057;hb=743ba4c5d58259ebb7410ef5d74ef4be100ce7b6;hp=2c7ba91bf2bb0daa88aa3d3d6c4ec86575ee2d05;hpb=1b028a6c7491957bb336077fc14bf92d35aa7f73;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/MagicWord.php b/includes/MagicWord.php index 2c7ba91bf2..13f706dee4 100644 --- a/includes/MagicWord.php +++ b/includes/MagicWord.php @@ -1,7 +1,5 @@ 86400, 'currentmonth1' => 86400, 'currentmonthname' => 86400, @@ -215,9 +213,9 @@ class MagicWord { 'pagesinnamespace' => 3600, 'numberofadmins' => 3600, 'numberingroup' => 3600, - ); + ]; - static public $mDoubleUnderscoreIDs = array( + public static $mDoubleUnderscoreIDs = [ 'notoc', 'nogallery', 'forcetoc', @@ -231,19 +229,19 @@ class MagicWord { 'staticredirect', 'notitleconvert', 'nocontentconvert', - ); + ]; - static public $mSubstIDs = array( + public static $mSubstIDs = [ 'subst', 'safesubst', - ); + ]; - static public $mObjects = array(); - static public $mDoubleUnderscoreArray = null; + public static $mObjects = []; + public static $mDoubleUnderscoreArray = null; /**#@-*/ - function __construct( $id = 0, $syn = array(), $cs = false ) { + public function __construct( $id = 0, $syn = [], $cs = false ) { $this->mId = $id; $this->mSynonyms = (array)$syn; $this->mCaseSensitive = $cs; @@ -256,7 +254,7 @@ class MagicWord { * * @return MagicWord */ - static function &get( $id ) { + public static function &get( $id ) { if ( !isset( self::$mObjects[$id] ) ) { $mw = new MagicWord(); $mw->load( $id ); @@ -270,10 +268,10 @@ class MagicWord { * * @return array */ - static function getVariableIDs() { + public static function getVariableIDs() { if ( !self::$mVariableIDsInitialised ) { # Get variable IDs - Hooks::run( 'MagicWordwgVariableIDs', array( &self::$mVariableIDs ) ); + Hooks::run( 'MagicWordwgVariableIDs', [ &self::$mVariableIDs ] ); self::$mVariableIDsInitialised = true; } return self::$mVariableIDs; @@ -283,7 +281,7 @@ class MagicWord { * Get an array of parser substitution modifier IDs * @return array */ - static function getSubstIDs() { + public static function getSubstIDs() { return self::$mSubstIDs; } @@ -293,7 +291,7 @@ class MagicWord { * @param int $id * @return int */ - static function getCacheTTL( $id ) { + public static function getCacheTTL( $id ) { if ( array_key_exists( $id, self::$mCacheTTLs ) ) { return self::$mCacheTTLs[$id]; } else { @@ -306,9 +304,9 @@ class MagicWord { * * @return MagicWordArray */ - static function getDoubleUnderscoreArray() { + public static function getDoubleUnderscoreArray() { if ( is_null( self::$mDoubleUnderscoreArray ) ) { - Hooks::run( 'GetDoubleUnderscoreIDs', array( &self::$mDoubleUnderscoreIDs ) ); + Hooks::run( 'GetDoubleUnderscoreIDs', [ &self::$mDoubleUnderscoreIDs ] ); self::$mDoubleUnderscoreArray = new MagicWordArray( self::$mDoubleUnderscoreIDs ); } return self::$mDoubleUnderscoreArray; @@ -319,7 +317,7 @@ class MagicWord { * For use in parser tests */ public static function clearCache() { - self::$mObjects = array(); + self::$mObjects = []; } /** @@ -328,12 +326,12 @@ class MagicWord { * @param int $id * @throws MWException */ - function load( $id ) { + public function load( $id ) { global $wgContLang; $this->mId = $id; $wgContLang->getMagic( $this ); if ( !$this->mSynonyms ) { - $this->mSynonyms = array( 'brionmademeputthishere' ); + $this->mSynonyms = [ 'brionmademeputthishere' ]; throw new MWException( "Error: invalid magic word '$id'" ); } } @@ -342,13 +340,13 @@ class MagicWord { * Preliminary initialisation * @private */ - function initRegex() { + public function initRegex() { // Sort the synonyms by length, descending, so that the longest synonym // matches in precedence to the shortest $synonyms = $this->mSynonyms; - usort( $synonyms, array( $this, 'compareStringLength' ) ); + usort( $synonyms, [ $this, 'compareStringLength' ] ); - $escSyn = array(); + $escSyn = []; foreach ( $synonyms as $synonym ) { // In case a magic word contains /, like that's going to happen;) $escSyn[] = preg_quote( $synonym, '/' ); @@ -374,7 +372,7 @@ class MagicWord { * * @return int */ - function compareStringLength( $s1, $s2 ) { + public function compareStringLength( $s1, $s2 ) { $l1 = strlen( $s1 ); $l2 = strlen( $s2 ); if ( $l1 < $l2 ) { @@ -391,7 +389,7 @@ class MagicWord { * * @return string */ - function getRegex() { + public function getRegex() { if ( $this->mRegex == '' ) { $this->initRegex(); } @@ -405,7 +403,7 @@ class MagicWord { * * @return string */ - function getRegexCase() { + public function getRegexCase() { if ( $this->mRegex === '' ) { $this->initRegex(); } @@ -418,7 +416,7 @@ class MagicWord { * * @return string */ - function getRegexStart() { + public function getRegexStart() { if ( $this->mRegex == '' ) { $this->initRegex(); } @@ -431,7 +429,7 @@ class MagicWord { * @return string * @since 1.23 */ - function getRegexStartToEnd() { + public function getRegexStartToEnd() { if ( $this->mRegexStartToEnd == '' ) { $this->initRegex(); } @@ -443,7 +441,7 @@ class MagicWord { * * @return string */ - function getBaseRegex() { + public function getBaseRegex() { if ( $this->mRegex == '' ) { $this->initRegex(); } @@ -457,7 +455,7 @@ class MagicWord { * * @return bool */ - function match( $text ) { + public function match( $text ) { return (bool)preg_match( $this->getRegex(), $text ); } @@ -468,7 +466,7 @@ class MagicWord { * * @return bool */ - function matchStart( $text ) { + public function matchStart( $text ) { return (bool)preg_match( $this->getRegexStart(), $text ); } @@ -480,7 +478,7 @@ class MagicWord { * @return bool * @since 1.23 */ - function matchStartToEnd( $text ) { + public function matchStartToEnd( $text ) { return (bool)preg_match( $this->getRegexStartToEnd(), $text ); } @@ -494,8 +492,8 @@ class MagicWord { * * @return string */ - function matchVariableStartToEnd( $text ) { - $matches = array(); + public function matchVariableStartToEnd( $text ) { + $matches = []; $matchcount = preg_match( $this->getVariableStartToEndRegex(), $text, $matches ); if ( $matchcount == 0 ) { return null; @@ -523,11 +521,11 @@ class MagicWord { * * @return bool */ - function matchAndRemove( &$text ) { + public function matchAndRemove( &$text ) { $this->mFound = false; $text = preg_replace_callback( $this->getRegex(), - array( &$this, 'pregRemoveAndRecord' ), + [ &$this, 'pregRemoveAndRecord' ], $text ); @@ -538,11 +536,11 @@ class MagicWord { * @param string $text * @return bool */ - function matchStartAndRemove( &$text ) { + public function matchStartAndRemove( &$text ) { $this->mFound = false; $text = preg_replace_callback( $this->getRegexStart(), - array( &$this, 'pregRemoveAndRecord' ), + [ &$this, 'pregRemoveAndRecord' ], $text ); @@ -554,7 +552,7 @@ class MagicWord { * * @return string */ - function pregRemoveAndRecord() { + public function pregRemoveAndRecord() { $this->mFound = true; return ''; } @@ -568,7 +566,7 @@ class MagicWord { * * @return string */ - function replace( $replacement, $subject, $limit = -1 ) { + public function replace( $replacement, $subject, $limit = -1 ) { $res = preg_replace( $this->getRegex(), StringUtils::escapeRegexReplacement( $replacement ), @@ -589,7 +587,7 @@ class MagicWord { * * @return string */ - function substituteCallback( $text, $callback ) { + public function substituteCallback( $text, $callback ) { $res = preg_replace_callback( $this->getVariableRegex(), $callback, $text ); $this->mModified = $res !== $text; return $res; @@ -600,7 +598,7 @@ class MagicWord { * * @return string */ - function getVariableRegex() { + public function getVariableRegex() { if ( $this->mVariableRegex == '' ) { $this->initRegex(); } @@ -612,7 +610,7 @@ class MagicWord { * * @return string */ - function getVariableStartToEndRegex() { + public function getVariableStartToEndRegex() { if ( $this->mVariableStartToEndRegex == '' ) { $this->initRegex(); } @@ -626,14 +624,14 @@ class MagicWord { * * @return string */ - function getSynonym( $i ) { + public function getSynonym( $i ) { return $this->mSynonyms[$i]; } /** * @return array */ - function getSynonyms() { + public function getSynonyms() { return $this->mSynonyms; } @@ -643,7 +641,7 @@ class MagicWord { * * @return bool */ - function getWasModified() { + public function getWasModified() { return $this->mModified; } @@ -660,10 +658,10 @@ class MagicWord { * * @return bool */ - function replaceMultiple( $magicarr, $subject, &$result ) { + public function replaceMultiple( $magicarr, $subject, &$result ) { wfDeprecated( __METHOD__, '1.25' ); - $search = array(); - $replace = array(); + $search = []; + $replace = []; foreach ( $magicarr as $id => $replacement ) { $mw = MagicWord::get( $id ); $search[] = $mw->getRegex(); @@ -681,7 +679,7 @@ class MagicWord { * @param array $array * @param string $value */ - function addToArray( &$array, $value ) { + public function addToArray( &$array, $value ) { global $wgContLang; foreach ( $this->mSynonyms as $syn ) { $array[$wgContLang->lc( $syn )] = $value; @@ -691,303 +689,14 @@ class MagicWord { /** * @return bool */ - function isCaseSensitive() { + public function isCaseSensitive() { return $this->mCaseSensitive; } /** * @return int */ - function getId() { + public function getId() { return $this->mId; } } - -/** - * Class for handling an array of magic words - * @ingroup Parser - */ -class MagicWordArray { - /** @var array */ - public $names = array(); - - /** @var array */ - private $hash; - - private $baseRegex; - - private $regex; - - /** - * @param array $names - */ - function __construct( $names = array() ) { - $this->names = $names; - } - - /** - * Add a magic word by name - * - * @param string $name - */ - public function add( $name ) { - $this->names[] = $name; - $this->hash = $this->baseRegex = $this->regex = null; - } - - /** - * Add a number of magic words by name - * - * @param array $names - */ - public function addArray( $names ) { - $this->names = array_merge( $this->names, array_values( $names ) ); - $this->hash = $this->baseRegex = $this->regex = null; - } - - /** - * Get a 2-d hashtable for this array - * @return array - */ - function getHash() { - if ( is_null( $this->hash ) ) { - global $wgContLang; - $this->hash = array( 0 => array(), 1 => array() ); - foreach ( $this->names as $name ) { - $magic = MagicWord::get( $name ); - $case = intval( $magic->isCaseSensitive() ); - foreach ( $magic->getSynonyms() as $syn ) { - if ( !$case ) { - $syn = $wgContLang->lc( $syn ); - } - $this->hash[$case][$syn] = $name; - } - } - } - return $this->hash; - } - - /** - * Get the base regex - * @return array - */ - function getBaseRegex() { - if ( is_null( $this->baseRegex ) ) { - $this->baseRegex = array( 0 => '', 1 => '' ); - foreach ( $this->names as $name ) { - $magic = MagicWord::get( $name ); - $case = intval( $magic->isCaseSensitive() ); - foreach ( $magic->getSynonyms() as $i => $syn ) { - // Group name must start with a non-digit in PCRE 8.34+ - $it = strtr( $i, '0123456789', 'abcdefghij' ); - $group = "(?P<{$it}_{$name}>" . preg_quote( $syn, '/' ) . ')'; - if ( $this->baseRegex[$case] === '' ) { - $this->baseRegex[$case] = $group; - } else { - $this->baseRegex[$case] .= '|' . $group; - } - } - } - } - return $this->baseRegex; - } - - /** - * Get an unanchored regex that does not match parameters - * @return array - */ - function getRegex() { - if ( is_null( $this->regex ) ) { - $base = $this->getBaseRegex(); - $this->regex = array( '', '' ); - if ( $this->baseRegex[0] !== '' ) { - $this->regex[0] = "/{$base[0]}/iuS"; - } - if ( $this->baseRegex[1] !== '' ) { - $this->regex[1] = "/{$base[1]}/S"; - } - } - return $this->regex; - } - - /** - * Get a regex for matching variables with parameters - * - * @return string - */ - function getVariableRegex() { - return str_replace( "\\$1", "(.*?)", $this->getRegex() ); - } - - /** - * Get a regex anchored to the start of the string that does not match parameters - * - * @return array - */ - function getRegexStart() { - $base = $this->getBaseRegex(); - $newRegex = array( '', '' ); - if ( $base[0] !== '' ) { - $newRegex[0] = "/^(?:{$base[0]})/iuS"; - } - if ( $base[1] !== '' ) { - $newRegex[1] = "/^(?:{$base[1]})/S"; - } - return $newRegex; - } - - /** - * Get an anchored regex for matching variables with parameters - * - * @return array - */ - function getVariableStartToEndRegex() { - $base = $this->getBaseRegex(); - $newRegex = array( '', '' ); - if ( $base[0] !== '' ) { - $newRegex[0] = str_replace( "\\$1", "(.*?)", "/^(?:{$base[0]})$/iuS" ); - } - if ( $base[1] !== '' ) { - $newRegex[1] = str_replace( "\\$1", "(.*?)", "/^(?:{$base[1]})$/S" ); - } - return $newRegex; - } - - /** - * @since 1.20 - * @return array - */ - public function getNames() { - return $this->names; - } - - /** - * 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. - * - * @param array $m - * - * @throws MWException - * @return array - */ - function parseMatch( $m ) { - reset( $m ); - while ( list( $key, $value ) = each( $m ) ) { - if ( $key === 0 || $value === '' ) { - continue; - } - $parts = explode( '_', $key, 2 ); - if ( count( $parts ) != 2 ) { - // This shouldn't happen - // continue; - throw new MWException( __METHOD__ . ': bad parameter name' ); - } - list( /* $synIndex */, $magicName ) = $parts; - $paramValue = next( $m ); - return array( $magicName, $paramValue ); - } - // This shouldn't happen either - throw new MWException( __METHOD__ . ': parameter not found' ); - } - - /** - * Match some text, with parameter capture - * 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. - * - * @param string $text - * - * @return array - */ - public function matchVariableStartToEnd( $text ) { - $regexes = $this->getVariableStartToEndRegex(); - foreach ( $regexes as $regex ) { - if ( $regex !== '' ) { - $m = array(); - if ( preg_match( $regex, $text, $m ) ) { - return $this->parseMatch( $m ); - } - } - } - return array( false, false ); - } - - /** - * Match some text, without parameter capture - * Returns the magic word name, or false if there was no capture - * - * @param string $text - * - * @return string|bool False on failure - */ - public function matchStartToEnd( $text ) { - $hash = $this->getHash(); - if ( isset( $hash[1][$text] ) ) { - return $hash[1][$text]; - } - global $wgContLang; - $lc = $wgContLang->lc( $text ); - if ( isset( $hash[0][$lc] ) ) { - return $hash[0][$lc]; - } - 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) - * - * @param string $text - * - * @return array - */ - public function matchAndRemove( &$text ) { - $found = array(); - $regexes = $this->getRegex(); - foreach ( $regexes as $regex ) { - if ( $regex === '' ) { - continue; - } - $matches = array(); - if ( 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; - } - - /** - * Return the ID of the magic word at the start of $text, and remove - * the prefix from $text. - * Return false if no match found and $text is not modified. - * Does not match parameters. - * - * @param string $text - * - * @return int|bool False on failure - */ - public function matchStartAndRemove( &$text ) { - $regexes = $this->getRegexStart(); - foreach ( $regexes as $regex ) { - if ( $regex === '' ) { - continue; - } - if ( preg_match( $regex, $text, $m ) ) { - list( $id, ) = $this->parseMatch( $m ); - if ( strlen( $m[0] ) >= strlen( $text ) ) { - $text = ''; - } else { - $text = substr( $text, strlen( $m[0] ) ); - } - return $id; - } - } - return false; - } -}