ApiQueryBase::titleToKey and ApiQueryBase::keyToTitle;
[lhc/web/wiklou.git] / includes / ImageGallery.php
index aa8c323..492a3e0 100644 (file)
@@ -2,15 +2,12 @@
 if ( ! defined( 'MEDIAWIKI' ) )
        die( 1 );
 
-/**
- */
-
 /**
  * Image gallery
  *
  * Add images to the gallery using add(), then render that list to HTML using toHTML().
  *
- * @addtogroup Media
+ * @ingroup Media
  */
 class ImageGallery
 {
@@ -20,9 +17,14 @@ class ImageGallery
        var $mRevisionId = 0;
 
        /**
-        * Is the gallery on a wiki page (i.e. not a special page)
+        * Hide blacklisted images?
+        */
+       var $mHideBadImages;
+
+       /**
+        * Registered parser object for output callbacks
         */
-       var $mParsing;
+       var $mParser;
 
        /**
         * Contextual title, used when images are being screened
@@ -33,6 +35,8 @@ class ImageGallery
        private $mPerRow = 4; // How many images wide should the gallery be?
        private $mWidths = 120, $mHeights = 120; // How wide/tall each thumbnail should be
 
+       private $mAttribs = array();
+
        /**
         * Create a new image gallery object.
         */
@@ -40,14 +44,22 @@ class ImageGallery
                $this->mImages = array();
                $this->mShowBytes = true;
                $this->mShowFilename = true;
-               $this->mParsing = false;
+               $this->mParser = false;
+               $this->mHideBadImages = false;
+       }
+
+       /**
+        * Register a parser object
+        */
+       function setParser( $parser ) {
+               $this->mParser = $parser;
        }
 
        /**
-        * Set the "parse" bit so we know to hide "bad" images
+        * Set bad image flag
         */
-       function setParsing( $val = true ) {
-               $this->mParsing = $val;
+       function setHideBadImages( $flag = true ) {
+               $this->mHideBadImages = $flag;
        }
 
        /**
@@ -182,6 +194,19 @@ class ImageGallery
                $this->mShowFilename = ( $f == true);
        }
 
+       /**
+        * Set arbitrary attributes to go on the HTML gallery output element.
+        * Should be suitable for a <table> element.
+        *
+        * Note -- if taking from user input, you should probably run through
+        * Sanitizer::validateAttributes() first.
+        *
+        * @param array of HTML attribute pairs
+        */
+       function setAttributes( $attribs ) {
+               $this->mAttribs = $attribs;
+       }
+
        /**
         * Return a HTML representation of the image gallery
         *
@@ -197,7 +222,13 @@ class ImageGallery
 
                $sk = $this->getSkin();
 
-               $s = '<table class="gallery" cellspacing="0" cellpadding="0">';
+               $attribs = Sanitizer::mergeAttributes(
+                       array(
+                               'class' => 'gallery',
+                               'cellspacing' => '0',
+                               'cellpadding' => '0' ),
+                       $this->mAttribs );
+               $s = Xml::openElement( 'table', $attribs );
                if( $this->mCaption )
                        $s .= "\n\t<caption>{$this->mCaption}</caption>";
 
@@ -206,10 +237,10 @@ class ImageGallery
                foreach ( $this->mImages as $pair ) {
                        $nt = $pair[0];
                        $text = $pair[1];
-                       
+
                        # Give extensions a chance to select the file revision for us
-                       $time = false;
-                       wfRunHooks( 'BeforeGalleryFindFile', array( &$this, &$nt, &$time ) );
+                       $time = $descQuery = false;
+                       wfRunHooks( 'BeforeGalleryFindFile', array( &$this, &$nt, &$time, &$descQuery ) );
 
                        $img = wfFindFile( $nt, $time );
 
@@ -217,7 +248,7 @@ class ImageGallery
                                # We're dealing with a non-image, spit out the name and be done with it.
                                $thumbhtml = "\n\t\t\t".'<div style="height: '.($this->mHeights*1.25+2).'px;">'
                                        . htmlspecialchars( $nt->getText() ) . '</div>';
-                       } elseif( $this->mParsing && wfIsBadImage( $nt->getDBkey(), $this->getContextTitle() ) ) {
+                       } elseif( $this->mHideBadImages && wfIsBadImage( $nt->getDBkey(), $this->getContextTitle() ) ) {
                                # The image is blacklisted, just show it as a text link.
                                $thumbhtml = "\n\t\t\t".'<div style="height: '.($this->mHeights*1.25+2).'px;">'
                                        . $sk->makeKnownLinkObj( $nt, htmlspecialchars( $nt->getText() ) ) . '</div>';
@@ -227,12 +258,23 @@ class ImageGallery
                                        . htmlspecialchars( $img->getLastError() ) . '</div>';
                        } else {
                                $vpad = floor( ( 1.25*$this->mHeights - $thumb->height ) /2 ) - 2;
-                               $thumbhtml = "\n\t\t\t".'<div class="thumb" style="padding: ' . $vpad . 'px 0; width: '.($this->mWidths+30).'px;">'
-                                       . $sk->makeKnownLinkObj( $nt, $thumb->toHtml() ) . '</div>';
+
+                               $thumbhtml = "\n\t\t\t".
+                                       '<div class="thumb" style="padding: ' . $vpad . 'px 0; width: ' .($this->mWidths+30).'px;">'
+                                       # Auto-margin centering for block-level elements. Needed now that we have video
+                                       # handlers since they may emit block-level elements as opposed to simple <img> tags.
+                                       # ref http://css-discuss.incutio.com/?page=CenteringBlockElement
+                                       . '<div style="margin-left: auto; margin-right: auto; width: ' .$this->mWidths.'px;">'
+                                       . $thumb->toHtml( array( 'desc-link' => true, 'desc-query' => $descQuery ) ) . '</div></div>';
+
+                               // Call parser transform hook
+                               if ( $this->mParser && $img->getHandler() ) {
+                                       $img->getHandler()->parserTransformHook( $this->mParser, $img );
+                               }
                        }
 
                        //TODO
-                       //$ul = $sk->makeLink( $wgContLang->getNsText( Namespace::getUser() ) . ":{$ut}", $ut );
+                       //$ul = $sk->makeLink( $wgContLang->getNsText( MWNamespace::getUser() ) . ":{$ut}", $ut );
 
                        if( $this->mShowBytes ) {
                                if( $img ) {
@@ -258,7 +300,7 @@ class ImageGallery
                                $s .= "\n\t<tr>";
                        }
                        $s .=
-                               "\n\t\t" . '<td><div class="gallerybox" style="width: '.($this->mWidths*1.25).'px;">'
+                               "\n\t\t" . '<td><div class="gallerybox" style="width: '.($this->mWidths+35).'px;">'
                                        . $thumbhtml
                                        . "\n\t\t\t" . '<div class="gallerytext">' . "\n"
                                                . $textlink . $text . $nb
@@ -283,7 +325,7 @@ class ImageGallery
        public function count() {
                return count( $this->mImages );
        }
-       
+
        /**
         * Set the contextual title
         *
@@ -292,7 +334,7 @@ class ImageGallery
        public function setContextTitle( $title ) {
                $this->contextTitle = $title;
        }
-       
+
        /**
         * Get the contextual title, if applicable
         *
@@ -305,4 +347,3 @@ class ImageGallery
        }
 
 } //class
-