Merge "Removed old HTMLCacheUpdateJob b/c code"
[lhc/web/wiklou.git] / includes / CategoryViewer.php
index 6b86853..48436c5 100644 (file)
@@ -89,6 +89,9 @@ class CategoryViewer extends ContextSource {
        ) {
                $this->title = $title;
                $this->setContext( $context );
+               $this->getOutput()->addModuleStyles( array(
+                       'mediawiki.action.view.categoryPage.styles'
+               ) );
                $this->from = $from;
                $this->until = $until;
                $this->limit = $context->getConfig()->get( 'CategoryPagingLimit' );
@@ -174,19 +177,30 @@ class CategoryViewer extends ContextSource {
                // Subcategory; strip the 'Category' namespace from the link text.
                $title = $cat->getTitle();
 
-               $link = Linker::link( $title, htmlspecialchars( $title->getText() ) );
-               if ( $title->isRedirect() ) {
-                       // This didn't used to add redirect-in-category, but might
-                       // as well be consistent with the rest of the sections
-                       // on a category page.
-                       $link = '<span class="redirect-in-category">' . $link . '</span>';
-               }
-               $this->children[] = $link;
+               $this->children[] = $this->generateLink(
+                       'subcat',
+                       $title,
+                       $title->isRedirect(),
+                       htmlspecialchars( $title->getText() )
+               );
 
                $this->children_start_char[] =
                        $this->getSubcategorySortChar( $cat->getTitle(), $sortkey );
        }
 
+       function generateLink( $type, Title $title, $isRedirect, $html = null ) {
+               $link = null;
+               Hooks::run( 'CategoryViewer::generateLink', array( $type, $title, $html, &$link ) );
+               if ( $link === null ) {
+                       $link = Linker::link( $title, $html );
+               }
+               if ( $isRedirect ) {
+                       $link = '<span class="redirect-in-category">' . $link . '</span>';
+               }
+
+               return $link;
+       }
+
        /**
         * Get the character to be used for sorting subcategories.
         * If there's a link from Category:A to Category:B, the sortkey of the resulting
@@ -229,13 +243,7 @@ class CategoryViewer extends ContextSource {
                                $this->gallery->add( $title );
                        }
                } else {
-                       $link = Linker::link( $title );
-                       if ( $isRedirect ) {
-                               // This seems kind of pointless given 'mw-redirect' class,
-                               // but keeping for back-compatibility with user css.
-                               $link = '<span class="redirect-in-category">' . $link . '</span>';
-                       }
-                       $this->imgsNoGallery[] = $link;
+                       $this->imgsNoGallery[] = $this->generateLink( 'image', $title, $isRedirect );
 
                        $this->imgsNoGallery_start_char[] = $wgContLang->convert(
                                $this->collation->getFirstLetter( $sortkey ) );
@@ -252,13 +260,7 @@ class CategoryViewer extends ContextSource {
        function addPage( $title, $sortkey, $pageLength, $isRedirect = false ) {
                global $wgContLang;
 
-               $link = Linker::link( $title );
-               if ( $isRedirect ) {
-                       // This seems kind of pointless given 'mw-redirect' class,
-                       // but keeping for back-compatibility with user css.
-                       $link = '<span class="redirect-in-category">' . $link . '</span>';
-               }
-               $this->articles[] = $link;
+               $this->articles[] = $this->generateLink( 'page', $title, $isRedirect );
 
                $this->articles_start_char[] = $wgContLang->convert(
                        $this->collation->getFirstLetter( $sortkey ) );
@@ -331,6 +333,8 @@ class CategoryViewer extends ContextSource {
                                )
                        );
 
+                       Hooks::run( 'CategoryViewer::doCategoryQuery', array( $type, $res ) );
+
                        $count = 0;
                        foreach ( $res as $row ) {
                                $title = Title::newFromRow( $row );
@@ -527,8 +531,7 @@ class CategoryViewer extends ContextSource {
         * TODO: Take the headers into account when creating columns, so they're
         * more visually equal.
         *
-        * More distant TODO: Scrap this and use CSS columns, whenever IE finally
-        * supports those.
+        * TODO: shortList and columnList are similar, need merging
         *
         * @param array $articles
         * @param string[] $articles_start_char
@@ -537,50 +540,34 @@ class CategoryViewer extends ContextSource {
         */
        static function columnList( $articles, $articles_start_char ) {
                $columns = array_combine( $articles, $articles_start_char );
-               # Split into three columns
-               $columns = array_chunk( $columns, ceil( count( $columns ) / 3 ), true /* preserve keys */ );
 
-               $ret = '<table style="width: 100%;"><tr style="vertical-align: top;">';
-               $prevchar = null;
+               $ret = Html::openElement( 'div', array( 'class' => 'mw-category' ) );
 
-               foreach ( $columns as $column ) {
-                       $ret .= '<td style="width: 33.3%;">';
-                       $colContents = array();
+               $colContents = array();
 
-                       # Kind of like array_flip() here, but we keep duplicates in an
-                       # array instead of dropping them.
-                       foreach ( $column as $article => $char ) {
-                               if ( !isset( $colContents[$char] ) ) {
-                                       $colContents[$char] = array();
-                               }
-                               $colContents[$char][] = $article;
+               # Kind of like array_flip() here, but we keep duplicates in an
+               # array instead of dropping them.
+               foreach ( $columns as $article => $char ) {
+                       if ( !isset( $colContents[$char] ) ) {
+                               $colContents[$char] = array();
                        }
+                       $colContents[$char][] = $article;
+               }
 
-                       $first = true;
-                       foreach ( $colContents as $char => $articles ) {
-                               # Change space to non-breaking space to keep headers aligned
-                               $h3char = $char === ' ' ? '&#160;' : htmlspecialchars( $char );
+               foreach ( $colContents as $char => $articles ) {
+                       # Change space to non-breaking space to keep headers aligned
+                       $h3char = $char === ' ' ? '&#160;' : htmlspecialchars( $char );
 
-                               $ret .= '<h3>' . $h3char;
-                               if ( $first && $char === $prevchar ) {
-                                       # We're continuing a previous chunk at the top of a new
-                                       # column, so add " cont." after the letter.
-                                       $ret .= ' ' . wfMessage( 'listingcontinuesabbrev' )->escaped();
-                               }
-                               $ret .= "</h3>\n";
+                       $ret .= '<div class="mw-category-group"><h3>' . $h3char;
+                       $ret .= "</h3>\n";
 
-                               $ret .= '<ul><li>';
-                               $ret .= implode( "</li>\n<li>", $articles );
-                               $ret .= '</li></ul>';
-
-                               $first = false;
-                               $prevchar = $char;
-                       }
+                       $ret .= '<ul><li>';
+                       $ret .= implode( "</li>\n<li>", $articles );
+                       $ret .= '</li></ul></div>';
 
-                       $ret .= "</td>\n";
                }
 
-               $ret .= '</tr></table>';
+               $ret .= Html::closeElement( 'div' );
                return $ret;
        }