From 240a6cb24d46322c6d84c15b7ff138f630a01d72 Mon Sep 17 00:00:00 2001 From: Tim Starling Date: Mon, 25 Sep 2006 01:35:41 +0000 Subject: [PATCH] Added exception list feature to the bad image list --- includes/ImageFunctions.php | 69 +++++++++++++++++++++++++++---------- includes/Parser.php | 2 +- 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/includes/ImageFunctions.php b/includes/ImageFunctions.php index 38887bbf74..d182d527ab 100644 --- a/includes/ImageFunctions.php +++ b/includes/ImageFunctions.php @@ -174,32 +174,65 @@ function wfGetSVGsize( $filename ) { /** * Determine if an image exists on the 'bad image list'. * - * @param $name String: the image name to check + * The format of MediaWiki:Bad_image_list is as follows: + * * Only list items (lines starting with "*") are considered + * * The first link on a line must be a link to a bad image + * * Any subsequent links on the same line are considered to be exceptions, + * i.e. articles where the image may occur inline. + * + * @param string $name the image name to check + * @param Title $contextTitle The page on which the image occurs, if known * @return bool */ -function wfIsBadImage( $name ) { - static $titleList = false; +function wfIsBadImage( $name, $contextTitle = false ) { + static $badImages = false; wfProfileIn( __METHOD__ ); + + # Run the extension hook $bad = false; - if( wfRunHooks( 'BadImage', array( $name, &$bad ) ) ) { - if( !$titleList ) { - # Build the list now - $titleList = array(); - $lines = explode( "\n", wfMsgForContent( 'bad_image_list' ) ); - foreach( $lines as $line ) { - if( preg_match( '/^\*\s*\[\[:?(.*?)\]\]/i', $line, $matches ) ) { - $title = Title::newFromText( $matches[1] ); - if( is_object( $title ) && $title->getNamespace() == NS_IMAGE ) - $titleList[ $title->getDBkey() ] = true; + if( !wfRunHooks( 'BadImage', array( $name, &$bad ) ) ) { + wfProfileOut( __METHOD__ ); + return $bad; + } + + if( !$badImages ) { + # Build the list now + $badImages = array(); + $lines = explode( "\n", wfMsgForContent( 'bad_image_list' ) ); + foreach( $lines as $line ) { + # List items only + if ( substr( $line, 0, 1 ) !== '*' ) { + continue; + } + + # Find all links + if ( !preg_match_all( '/\[\[:?(.*?)\]\]/', $line, $m ) ) { + continue; + } + + $exceptions = array(); + $imageDBkey = false; + foreach ( $m[1] as $i => $titleText ) { + $title = Title::newFromText( $titleText ); + if ( !is_null( $title ) ) { + if ( $i == 0 ) { + $imageDBkey = $title->getDBkey(); + } else { + $exceptions[$title->getPrefixedDBkey()] = true; + } } } + + if ( $imageDBkey !== false ) { + $badImages[$imageDBkey] = $exceptions; + } } - wfProfileOut( __METHOD__ ); - return array_key_exists( $name, $titleList ); - } else { - wfProfileOut( __METHOD__ ); - return $bad; } + + $contextKey = $contextTitle ? $contextTitle->getPrefixedDBkey() : false; + $bad = isset( $badImages[$name] ) && !isset( $badImages[$name][$contextKey] ); + wfProfileOut( __METHOD__ ); + return $bad; } /** diff --git a/includes/Parser.php b/includes/Parser.php index 6bcfcff24b..7b31c7b545 100644 --- a/includes/Parser.php +++ b/includes/Parser.php @@ -1666,7 +1666,7 @@ class Parser if ( $ns == NS_IMAGE ) { wfProfileIn( "$fname-image" ); - if ( !wfIsBadImage( $nt->getDBkey() ) ) { + if ( !wfIsBadImage( $nt->getDBkey(), $this->mTitle ) ) { # recursively parse links inside the image caption # actually, this will parse them in any other parameters, too, # but it might be hard to fix that, and it doesn't matter ATM -- 2.20.1