magicword.php
来自「php 开发的内容管理系统」· PHP 代码 · 共 449 行
PHP
449 行
<?php/** * File for magic words * @package MediaWiki * @subpackage Parser *//** * private */$wgMagicFound = false;/** Actual keyword to be used is set in Language.php */$magicWords = array( 'MAG_REDIRECT', 'MAG_NOTOC', 'MAG_START', 'MAG_CURRENTMONTH', 'MAG_CURRENTMONTHNAME', 'MAG_CURRENTMONTHNAMEGEN', 'MAG_CURRENTMONTHABBREV', 'MAG_CURRENTDAY', 'MAG_CURRENTDAY2', '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', 'MAG_RAW', 'MAG_SUBPAGENAME', 'MAG_SUBPAGENAMEE', 'MAG_DISPLAYTITLE', 'MAG_TALKSPACE', 'MAG_TALKSPACEE', 'MAG_SUBJECTSPACE', 'MAG_SUBJECTSPACEE', 'MAG_TALKPAGENAME', 'MAG_TALKPAGENAMEE', 'MAG_SUBJECTPAGENAME', 'MAG_SUBJECTPAGENAMEE', 'MAG_NUMBEROFUSERS', 'MAG_RAWSUFFIX', 'MAG_NEWSECTIONLINK', 'MAG_NUMBEROFPAGES', 'MAG_CURRENTVERSION', 'MAG_BASEPAGENAME', 'MAG_BASEPAGENAMEE', 'MAG_URLENCODE', 'MAG_CURRENTTIMESTAMP', 'MAG_DIRECTIONMARK', 'MAG_LANGUAGE', 'MAG_CONTENTLANGUAGE', 'MAG_PAGESINNAMESPACE', 'MAG_NOGALLERY', 'MAG_NUMBEROFADMINS', 'MAG_FORMATNUM',);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_CURRENTDAY2, MAG_CURRENTDAYNAME, 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_REVISIONID, MAG_SUBPAGENAME, MAG_SUBPAGENAMEE, MAG_DISPLAYTITLE, MAG_TALKSPACE, MAG_TALKSPACEE, MAG_SUBJECTSPACE, MAG_SUBJECTSPACEE, MAG_TALKPAGENAME, MAG_TALKPAGENAMEE, MAG_SUBJECTPAGENAME, MAG_SUBJECTPAGENAMEE, MAG_NUMBEROFUSERS, MAG_RAWSUFFIX, MAG_NEWSECTIONLINK, MAG_NUMBEROFPAGES, MAG_CURRENTVERSION, MAG_BASEPAGENAME, MAG_BASEPAGENAMEE, MAG_URLENCODE, MAG_CURRENTTIMESTAMP, MAG_DIRECTIONMARK, MAG_LANGUAGE, MAG_CONTENTLANGUAGE, MAG_PAGESINNAMESPACE, MAG_NUMBEROFADMINS,);if ( ! defined( 'MEDIAWIKI_INSTALL' ) ) wfRunHooks( 'MagicWordwgVariableIDs', array( &$wgVariableIDs ) );/** * This class encapsulates "magic words" such as #redirect, __NOTOC__, etc. * Usage: * if (MagicWord::get( MAG_REDIRECT )->match( $text ) ) * * Possible future improvements: * * Simultaneous searching for a number of magic words * * $wgMagicWords in shared memory * * Please avoid reading the data out of one of these objects and then writing * special case code. If possible, add another match()-like function here. * * @package MediaWiki */class MagicWord { /**#@+ * @private */ var $mId, $mSynonyms, $mCaseSensitive, $mRegex; var $mRegexStart, $mBaseRegex, $mVariableRegex; var $mModified; /**#@-*/ function MagicWord($id = 0, $syn = '', $cs = false) { $this->mId = $id; $this->mSynonyms = (array)$syn; $this->mCaseSensitive = $cs; $this->mRegex = ''; $this->mRegexStart = ''; $this->mVariableRegex = ''; $this->mVariableStartToEndRegex = ''; $this->mModified = false; } /** * Factory: creates an object representing an ID * @static */ function &get( $id ) { global $wgMagicWords; if ( !is_array( $wgMagicWords ) ) { throw new MWException( "Incorrect initialisation order, \$wgMagicWords does not exist\n" ); } if (!array_key_exists( $id, $wgMagicWords ) ) { $mw = new MagicWord(); $mw->load( $id ); $wgMagicWords[$id] = $mw; } return $wgMagicWords[$id]; } # Initialises this object with an ID function load( $id ) { global $wgContLang; $this->mId = $id; $wgContLang->getMagic( $this ); } /** * Preliminary initialisation * @private */ function initRegex() { #$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(); 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 ? '' : 'i'; $this->mRegex = "/{$this->mBaseRegex}/{$case}"; $this->mRegexStart = "/^(?:{$this->mBaseRegex})/{$case}"; $this->mVariableRegex = str_replace( "\\$1", "(.*?)", $this->mRegex ); $this->mVariableStartToEndRegex = str_replace( "\\$1", "(.*?)", "/^(?:{$this->mBaseRegex})$/{$case}" ); } /** * Gets a regex representing matching the word */ function getRegex() { if ($this->mRegex == '' ) { $this->initRegex(); } return $this->mRegex; } /** * Gets the regexp case modifier to use, i.e. i or nothing, to be used if * one is using MagicWord::getBaseRegex(), otherwise it'll be included in * the complete expression */ function getRegexCase() { if ( $this->mRegex === '' ) $this->initRegex(); return $this->mCaseSensitive ? '' : 'i'; } /** * Gets a regex matching the word, if it is at the string start */ function getRegexStart() { if ($this->mRegex == '' ) { $this->initRegex(); } return $this->mRegexStart; } /** * regex without the slashes and what not */ function getBaseRegex() { if ($this->mRegex == '') { $this->initRegex(); } return $this->mBaseRegex; } /** * Returns true if the text contains the word * @return bool */ function match( $text ) { return preg_match( $this->getRegex(), $text ); } /** * Returns true if the text starts with the word * @return bool */ function matchStart( $text ) { return preg_match( $this->getRegexStart(), $text ); } /** * Returns NULL if there's no match, the value of $1 otherwise * The return code is the matched string, if there's no variable * part in the regex and the matched variable part ($1) if there * is one. */ function matchVariableStartToEnd( $text ) { $matches = array(); $matchcount = preg_match( $this->getVariableStartToEndRegex(), $text, $matches ); if ( $matchcount == 0 ) { return NULL; } elseif ( count($matches) == 1 ) { return $matches[0]; } else { # 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]; } } /** * Returns true if the text matches the word, and alters the * input string, removing all instances of the word */ function matchAndRemove( &$text ) { global $wgMagicFound; $wgMagicFound = false; $text = preg_replace_callback( $this->getRegex(), 'pregRemoveAndRecord', $text ); return $wgMagicFound; } function matchStartAndRemove( &$text ) { global $wgMagicFound; $wgMagicFound = false; $text = preg_replace_callback( $this->getRegexStart(), 'pregRemoveAndRecord', $text ); return $wgMagicFound; } /** * Replaces the word with something else */ function replace( $replacement, $subject, $limit=-1 ) { $res = preg_replace( $this->getRegex(), wfRegexReplacement( $replacement ), $subject, $limit ); $this->mModified = !($res === $subject); return $res; } /** * Variable handling: {{SUBST:xxx}} style words * Calls back a function to determine what to replace xxx with * Input word must contain $1 */ function substituteCallback( $text, $callback ) { $res = preg_replace_callback( $this->getVariableRegex(), $callback, $text ); $this->mModified = !($res === $text); return $res; } /** * Matches the word, where $1 is a wildcard */ function getVariableRegex() { if ( $this->mVariableRegex == '' ) { $this->initRegex(); } return $this->mVariableRegex; } /** * Matches the entire string, where $1 is a wildcard */ function getVariableStartToEndRegex() { if ( $this->mVariableStartToEndRegex == '' ) { $this->initRegex(); } return $this->mVariableStartToEndRegex; } /** * Accesses the synonym list directly */ function getSynonym( $i ) { return $this->mSynonyms[$i]; } function getSynonyms() { return $this->mSynonyms; } /** * Returns true if the last call to replace() or substituteCallback() * returned a modified text, otherwise false. */ function getWasModified(){ return $this->mModified; } /** * $magicarr is an associative array of (magic word ID => replacement) * This method uses the php feature to do several replacements at the same time, * thereby gaining some efficiency. The result is placed in the out variable * $result. The return value is true if something was replaced. * @static **/ function replaceMultiple( $magicarr, $subject, &$result ){ $search = array(); $replace = array(); foreach( $magicarr as $id => $replacement ){ $mw = MagicWord::get( $id ); $search[] = $mw->getRegex(); $replace[] = $replacement; } $result = preg_replace( $search, $replace, $subject ); return !($result === $subject); } /** * Adds all the synonyms of this MagicWord to an array, to allow quick * lookup in a list of magic words */ function addToArray( &$array, $value ) { foreach ( $this->mSynonyms as $syn ) { $array[$syn] = $value; } } function isCaseSensitive() { return $this->mCaseSensitive; }}/** * Used in matchAndRemove() * @private **/function pregRemoveAndRecord( $match ) { global $wgMagicFound; $wgMagicFound = true; return '';}?>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?