Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 98
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
SpecialSiteMatrix
0.00% covered (danger)
0.00%
0 / 98
0.00% covered (danger)
0.00%
0 / 3
600
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 execute
0.00% covered (danger)
0.00%
0 / 95
0.00% covered (danger)
0.00%
0 / 1
506
 getGroupName
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace MediaWiki\Extension\SiteMatrix;
4
5use LanguageCode;
6use MediaWiki\Html\Html;
7use MediaWiki\Languages\LanguageNameUtils;
8use MediaWiki\SpecialPage\SpecialPage;
9
10class SpecialSiteMatrix extends SpecialPage {
11
12    /** @var LanguageNameUtils */
13    private $languageNameUtils;
14
15    /**
16     * @param LanguageNameUtils $languageNameUtils
17     */
18    public function __construct(
19        LanguageNameUtils $languageNameUtils
20    ) {
21        parent::__construct( 'SiteMatrix' );
22        $this->languageNameUtils = $languageNameUtils;
23    }
24
25    /**
26     * @param mixed $par
27     */
28    public function execute( $par ) {
29        $langNames = $this->languageNameUtils->getLanguageNames();
30
31        $this->setHeaders();
32        $this->outputHeader();
33
34        $matrix = new SiteMatrix();
35
36        $localLanguageNames = $this->languageNameUtils->getLanguageNames( $this->getLanguage()->getCode() );
37
38        # Construct the HTML
39
40        # Header row
41        $s = Html::openElement( 'table', [ 'class' => 'wikitable', 'id' => 'mw-sitematrix-table' ] ) .
42            "<tr>" .
43            Html::element( 'th',
44                [ 'rowspan' => 2 ],
45                $this->msg( 'sitematrix-language' )->text() ) .
46            Html::element( 'th',
47                [ 'colspan' => count( $matrix->getSites() ) ],
48                $this->msg( 'sitematrix-project' )->text() ) .
49            "</tr>
50            <tr>";
51        foreach ( $matrix->getNames() as $id => $name ) {
52            $url = $matrix->getSiteUrl( $id );
53            $s .= Html::rawElement( 'th', [], "<a href=\"{$url}\">{$name}</a>" );
54        }
55        $s .= "</tr>\n";
56
57        # Bulk of table
58        foreach ( $matrix->getLangList() as $lang ) {
59            $s .= '<tr>';
60            $attribs = [];
61            if ( isset( $localLanguageNames[$lang] ) ) {
62                $attribs['title'] = $localLanguageNames[$lang];
63            }
64
65            if ( isset( $langNames[$lang] ) ) {
66                $langDisplay = Html::element( 'span',
67                    [ 'lang' => LanguageCode::bcp47( $lang ) ],
68                    $langNames[$lang] );
69            } else {
70                $langDisplay = '';
71            }
72
73            if ( isset( $localLanguageNames[$lang] ) &&
74                strlen( $localLanguageNames[$lang] ) &&
75                $langNames[$lang] !== $localLanguageNames[$lang]
76            ) {
77                $langDisplay .= $this->msg( 'word-separator' )->escaped() .
78                    $this->msg( 'parentheses', $localLanguageNames[$lang] )->escaped();
79            }
80            $s .= Html::rawElement( 'td',
81                [ 'id' => $lang ],
82                Html::rawElement( 'strong', $attribs, $langDisplay )
83            );
84
85            foreach ( $matrix->getNames() as $site => $name ) {
86                $url = $matrix->getUrl( $lang, $site );
87                if ( $matrix->exist( $lang, $site ) ) {
88                    # Wiki exists
89                    $closed = $matrix->isClosed( $lang, $site );
90                    $s .= "<td>" . ( $closed ? "<del>" : '' ) .
91                        "<a href=\"{$url}\">{$lang}</a>" . ( $closed ? "</del>" : '' ) . '</td>';
92                } else {
93                    # Non-existent wiki
94                    $s .= "<td><a href=\"{$url}\" class=\"new\">{$lang}</a></td>";
95                }
96            }
97            $s .= "</tr>\n";
98        }
99
100        $language = $this->getLanguage();
101        # Total
102        $totalCount = 0;
103        $s .= '<tr><th rowspan="2" id="total">' .
104            $this->msg( 'sitematrix-sitetotal' )->escaped() . '</th>';
105        foreach ( $matrix->getNames() as $site => $name ) {
106            $url = $matrix->getSiteUrl( $site );
107            $count = $matrix->getCountPerSite( $site );
108            $totalCount += $count;
109            $count = htmlspecialchars( $language->formatNum( $count ) );
110            $s .= "<th><a href=\"{$url}\">{$count}</a></th>";
111        }
112        $s .= '</tr>';
113
114        $s .= '<tr>';
115        $noProjects = count( $matrix->getNames() );
116        $totalCount = htmlspecialchars( $language->formatNum( $totalCount ) );
117        $s .= "<th colspan=\"{$noProjects }\">{$totalCount}</th>";
118        $s .= '</tr>';
119
120        $s .= Html::closeElement( 'table' ) . "\n";
121
122        # Specials
123        $s .= '<h2 id="mw-sitematrix-others">' . $this->msg( 'sitematrix-others' )->escaped() . '</h2>';
124
125        $s .= Html::openElement( 'table',
126            [ 'class' => 'wikitable', 'id' => 'mw-sitematrix-other-table' ] ) .
127            "<tr>" .
128            Html::element( 'th', [], $this->msg( 'sitematrix-other-projects' )->text() ) .
129            Html::element( 'th', [], $this->msg( 'sitematrix-other-projects-language' )->text() ) .
130            "</tr>";
131
132        foreach ( $matrix->getSpecials() as $special ) {
133            [ $lang, $site ] = $special;
134
135            // sanity check
136            if ( !$lang && !$site ) {
137                continue;
138            }
139
140            $langhost = str_replace( '_', '-', $lang );
141            $url = $matrix->getUrl( $lang, $site );
142
143            # Handle options
144            $flags = [];
145            if ( $matrix->isPrivate( $lang . $site ) ) {
146                $flags[] = $this->msg( 'sitematrix-private' )->escaped();
147            }
148            if ( $matrix->isFishbowl( $lang . $site ) ) {
149                $flags[] = $this->msg( 'sitematrix-fishbowl' )->escaped();
150            }
151            if ( $matrix->isNonGlobal( $lang . $site ) ) {
152                $flags[] = $this->msg( 'sitematrix-nonglobal' )->escaped();
153            }
154            $flagsStr = implode( ', ', $flags );
155            if ( $site != 'wiki' ) {
156                $langhost .= $site;
157            }
158            $closed = $matrix->isClosed( $lang, $site );
159            $s .= '<tr><td>' . ( $closed ? '<del>' : '' ) .
160                $language->specialList( '<a href="' . $url . '/">' . $langhost . "</a>", $flagsStr ) .
161                ( $closed ? '</del>' : '' ) . '</td>';
162            $s .= '<td>' . $matrix->getLanguageCode( $lang, $site ) . '</td>';
163            $s .= "</tr>\n";
164        }
165
166        $s .= Html::closeElement( 'table' ) . "\n";
167
168        $this->getOutput()->addHTML( $s );
169        $this->getOutput()->addWikiMsg( 'sitematrix-total', $language->formatNum( $matrix->getCount() ) );
170    }
171
172    /** @inheritDoc */
173    protected function getGroupName() {
174        return 'wiki';
175    }
176}