X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/mediawiki.git/blobdiff_plain/87219ebd28426c6d21cb545233ee52f5f7af7dfd..refs/tags/mediawiki-1.17.0:/includes/parser/ParserOptions.php diff --git a/includes/parser/ParserOptions.php b/includes/parser/ParserOptions.php index 985bba28..9d8b3e4f 100644 --- a/includes/parser/ParserOptions.php +++ b/includes/parser/ParserOptions.php @@ -1,5 +1,11 @@ mUseDynamicDates; } function getInterwikiMagic() { return $this->mInterwikiMagic; } function getAllowExternalImages() { return $this->mAllowExternalImages; } function getAllowExternalImagesFrom() { return $this->mAllowExternalImagesFrom; } function getEnableImageWhitelist() { return $this->mEnableImageWhitelist; } - function getEditSection() { return $this->mEditSection; } - function getNumberHeadings() { return $this->mNumberHeadings; } + function getEditSection() { $this->optionUsed('editsection'); + return $this->mEditSection; } + function getNumberHeadings() { $this->optionUsed('numberheadings'); + return $this->mNumberHeadings; } function getAllowSpecialInclusion() { return $this->mAllowSpecialInclusion; } function getTidy() { return $this->mTidy; } function getInterfaceMessage() { return $this->mInterfaceMessage; } function getTargetLanguage() { return $this->mTargetLanguage; } function getMaxIncludeSize() { return $this->mMaxIncludeSize; } function getMaxPPNodeCount() { return $this->mMaxPPNodeCount; } + function getMaxPPExpandDepth() { return $this->mMaxPPExpandDepth; } function getMaxTemplateDepth() { return $this->mMaxTemplateDepth; } function getRemoveComments() { return $this->mRemoveComments; } function getTemplateCallback() { return $this->mTemplateCallback; } function getEnableLimitReport() { return $this->mEnableLimitReport; } function getCleanSignatures() { return $this->mCleanSignatures; } function getExternalLinkTarget() { return $this->mExternalLinkTarget; } + function getMath() { $this->optionUsed('math'); + return $this->mMath; } + function getThumbSize() { $this->optionUsed('thumbsize'); + return $this->mThumbSize; } + function getIsPreview() { return $this->mIsPreview; } function getIsSectionPreview() { return $this->mIsSectionPreview; } - function getIsPrintable() { return $this->mIsPrintable; } + function getIsPrintable() { $this->optionUsed('printable'); + return $this->mIsPrintable; } - function getSkin() { + function getSkin( $title = null ) { if ( !isset( $this->mSkin ) ) { - $this->mSkin = $this->mUser->getSkin(); + $this->mSkin = $this->mUser->getSkin( $title ); } return $this->mSkin; } function getDateFormat() { + $this->optionUsed('dateformat'); if ( !isset( $this->mDateFormat ) ) { $this->mDateFormat = $this->mUser->getDatePreference(); } @@ -79,6 +103,16 @@ class ParserOptions { return $this->mTimestamp; } + /** + * You shouldn't use this. Really. $parser->getFunctionLang() is all you need. + * Using this fragments the cache and is discouraged. Yes, {{int: }} uses this, + * producing inconsistent tables (Bug 14404). + */ + function getUserLang() { + $this->optionUsed('userlang'); + return $this->mUserLang; + } + function setUseDynamicDates( $x ) { return wfSetVar( $this->mUseDynamicDates, $x ); } function setInterwikiMagic( $x ) { return wfSetVar( $this->mInterwikiMagic, $x ); } function setAllowExternalImages( $x ) { return wfSetVar( $this->mAllowExternalImages, $x ); } @@ -101,17 +135,30 @@ class ParserOptions { function setTimestamp( $x ) { return wfSetVar( $this->mTimestamp, $x ); } function setCleanSignatures( $x ) { return wfSetVar( $this->mCleanSignatures, $x ); } function setExternalLinkTarget( $x ) { return wfSetVar( $this->mExternalLinkTarget, $x ); } + function setMath( $x ) { return wfSetVar( $this->mMath, $x ); } + function setUserLang( $x ) { return wfSetVar( $this->mUserLang, $x ); } + function setThumbSize( $x ) { return wfSetVar( $this->mThumbSize, $x ); } + function setIsPreview( $x ) { return wfSetVar( $this->mIsPreview, $x ); } function setIsSectionPreview( $x ) { return wfSetVar( $this->mIsSectionPreview, $x ); } function setIsPrintable( $x ) { return wfSetVar( $this->mIsPrintable, $x ); } + /** + * Extra key that should be present in the parser cache key. + */ + function addExtraKey( $key ) { + $this->mExtraKey .= '!' . $key; + } + function __construct( $user = null ) { $this->initialiseFromUser( $user ); } /** * Get parser options - * @static + * + * @param $user User object + * @return ParserOptions object */ static function newFromUser( $user ) { return new ParserOptions( $user ); @@ -122,7 +169,7 @@ class ParserOptions { global $wgUseDynamicDates, $wgInterwikiMagic, $wgAllowExternalImages; global $wgAllowExternalImagesFrom, $wgEnableImageWhitelist, $wgAllowSpecialInclusion, $wgMaxArticleSize; global $wgMaxPPNodeCount, $wgMaxTemplateDepth, $wgMaxPPExpandDepth, $wgCleanSignatures; - global $wgExternalLinkTarget; + global $wgExternalLinkTarget, $wgLang; wfProfileIn( __METHOD__ ); @@ -161,9 +208,131 @@ class ParserOptions { $this->mEnableLimitReport = false; $this->mCleanSignatures = $wgCleanSignatures; $this->mExternalLinkTarget = $wgExternalLinkTarget; + $this->mMath = $user->getOption( 'math' ); + $this->mUserLang = $wgLang->getCode(); + $this->mThumbSize = $user->getOption( 'thumbsize' ); + $this->mIsPreview = false; $this->mIsSectionPreview = false; + $this->mIsPrintable = false; wfProfileOut( __METHOD__ ); } + + /** + * Registers a callback for tracking which ParserOptions which are used. + * This is a private API with the parser. + */ + function registerWatcher( $callback ) { + $this->onAccessCallback = $callback; + } + + /** + * Called when an option is accessed. + */ + protected function optionUsed( $optionName ) { + if ( $this->onAccessCallback ) { + call_user_func( $this->onAccessCallback, $optionName ); + } + } + + /** + * Returns the full array of options that would have been used by + * in 1.16. + * Used to get the old parser cache entries when available. + */ + public static function legacyOptions() { + global $wgUseDynamicDates; + $legacyOpts = array( 'math', 'stubthreshold', 'numberheadings', 'userlang', 'thumbsize', 'editsection', 'printable' ); + if ( $wgUseDynamicDates ) { + $legacyOpts[] = 'dateformat'; + } + return $legacyOpts; + } + + /** + * Generate a hash string with the values set on these ParserOptions + * for the keys given in the array. + * This will be used as part of the hash key for the parser cache, + * so users sharign the options with vary for the same page share + * the same cached data safely. + * + * Replaces User::getPageRenderingHash() + * + * Extensions which require it should install 'PageRenderingHash' hook, + * which will give them a chance to modify this key based on their own + * settings. + * + * @since 1.17 + * @return \string Page rendering hash + */ + public function optionsHash( $forOptions ) { + global $wgContLang, $wgRenderHashAppend; + + $confstr = ''; + + if ( in_array( 'math', $forOptions ) ) + $confstr .= $this->mMath; + else + $confstr .= '*'; + + + // Space assigned for the stubthreshold but unused + // since it disables the parser cache, its value will always + // be 0 when this function is called by parsercache. + // The conditional is here to avoid a confusing 0 + if ( true || in_array( 'stubthreshold', $forOptions ) ) + $confstr .= '!0' ; + else + $confstr .= '!*' ; + + if ( in_array( 'dateformat', $forOptions ) ) + $confstr .= '!' . $this->getDateFormat(); + + if ( in_array( 'numberheadings', $forOptions ) ) + $confstr .= '!' . ( $this->mNumberHeadings ? '1' : '' ); + else + $confstr .= '!*'; + + if ( in_array( 'userlang', $forOptions ) ) + $confstr .= '!' . $this->mUserLang; + else + $confstr .= '!*'; + + if ( in_array( 'thumbsize', $forOptions ) ) + $confstr .= '!' . $this->mThumbSize; + else + $confstr .= '!*'; + + // add in language specific options, if any + // FIXME: This is just a way of retrieving the url/user preferred variant + $confstr .= $wgContLang->getExtraHashOptions(); + + // Since the skin could be overloading link(), it should be + // included here but in practice, none of our skins do that. + // $confstr .= "!" . $this->mSkin->getSkinName(); + + $confstr .= $wgRenderHashAppend; + + if ( !in_array( 'editsection', $forOptions ) ) { + $confstr .= '!*'; + } elseif ( !$this->mEditSection ) { + $confstr .= '!edit=0'; + } + + if ( $this->mIsPrintable && in_array( 'printable', $forOptions ) ) + $confstr .= '!printable=1'; + + if ( $this->mExtraKey != '' ) + $confstr .= $this->mExtraKey; + + // Give a chance for extensions to modify the hash, if they have + // extra options or other effects on the parser cache. + wfRunHooks( 'PageRenderingHash', array( &$confstr ) ); + + // Make it a valid memcached key fragment + $confstr = str_replace( ' ', '_', $confstr ); + + return $confstr; + } }