wikimedia/mediawiki-core

View on GitHub
includes/specials/SpecialNamespaceInfo.php

Summary

Maintainability
C
1 day
Test Coverage
<?php

/**
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 * http://www.gnu.org/copyleft/gpl.html
 *
 * @file
 * @ingroup SpecialPage
 */

namespace MediaWiki\Specials;

use Language;
use MediaWiki\Html\Html;
use MediaWiki\SpecialPage\SpecialPage;
use MediaWiki\Title\NamespaceInfo;

/**
 * Show information about the different namespaces
 *
 * @since 1.43
 * @author DannyS712
 * @ingroup SpecialPage
 */
class SpecialNamespaceInfo extends SpecialPage {

    private Language $contentLanguage;
    private NamespaceInfo $namespaceInfo;

    public function __construct(
        Language $contentLanguage,
        NamespaceInfo $namespaceInfo
    ) {
        parent::__construct( 'NamespaceInfo' );

        $this->contentLanguage = $contentLanguage;
        $this->namespaceInfo = $namespaceInfo;
    }

    /**
     * @param string|null $par
     */
    public function execute( $par ) {
        $this->setHeaders();
        $this->outputHeader();

        $out = $this->getOutput();

        $idHeading = Html::element(
            'th',
            [],
            $this->msg( 'namespaceinfo-heading-id' )->text()
        );
        $canonicalHeading = Html::element(
            'th',
            [],
            $this->msg( 'namespaceinfo-heading-canonical' )->text()
        );
        $localHeading = Html::element(
            'th',
            [],
            $this->msg( 'namespaceinfo-heading-local' )->text()
        );
        $infoHeading = Html::element(
            'th',
            [],
            $this->msg( 'namespaceinfo-heading-info' )->text()
        );
        $tableHeadingRow = Html::rawElement(
            'tr',
            [],
            $idHeading . $canonicalHeading . $localHeading . $infoHeading
        );

        $tableBodyRows = '';
        foreach ( $this->contentLanguage->getFormattedNamespaces() as $ns => $localName ) {
            $tableBodyRows .= $this->makeNamespaceRow( $ns, $localName );
        }

        $table = Html::rawElement(
            'table',
            [ 'class' => 'wikitable' ],
            $tableHeadingRow . $tableBodyRows
        );

        $out->addHtml( $table );
    }

    /**
     * Get the HTML for a row for a specific namespace
     *
     * @param int $ns
     * @param string $localName
     * @return string
     */
    private function makeNamespaceRow( int $ns, string $localName ): string {
        $canonicalName = $this->namespaceInfo->getCanonicalName( $ns );
        if ( $canonicalName ) {
            $canonicalName = strtr( $canonicalName, '_', ' ' );
        } else {
            $canonicalName = '';
        }

        // Special handling for main namespace
        if ( $ns === NS_MAIN ) {
            $localName = $this->msg( 'blanknamespace' )->escaped();
            $canonicalName = $this->msg( 'blanknamespace' )->inLanguage( 'en' )->escaped();
        }

        $description = $this->msg( 'namespaceinfo-description-ns' . $ns );
        if ( $description->isDisabled() ) {
            // Custom namespace with no message

            if ( $this->namespaceInfo->isTalk( $ns ) ) {
                $subjectNs = $this->namespaceInfo->getSubject( $ns );
                $subjectName = strtr(
                    $this->namespaceInfo->getCanonicalName( $subjectNs ),
                    '_',
                    ' '
                );
                $description = $this->msg( 'namespaceinfo-description-custom-talk' )
                    ->params(
                        $subjectName,
                        $subjectNs
                    );
            } else {
                $description = $this->msg( 'namespaceinfo-description-custom' )
                    ->params( $localName );
            }
        }
        $descriptionText = $description->parse();

        $properties = [];
        if ( $ns >= NS_MAIN ) {
            // Don't talk about immovable namespaces for virtual NS_SPECIAL or NS_MEDIA
            $namespaceProtection = $this->getConfig()->get( 'NamespaceProtection' );
            if ( isset( $namespaceProtection[$ns] ) ) {
                $rightsNeeded = $namespaceProtection[$ns];
                if ( !is_array( $rightsNeeded ) ) {
                    $rightsNeeded = [ $rightsNeeded ];
                }
                foreach ( $rightsNeeded as $right ) {
                    $properties[] = $this->msg( 'namespaceinfo-namespace-protection-right' )
                        ->params( $right )
                        ->parse();
                }
            }

            if ( !$this->namespaceInfo->isMovable( $ns ) ) {
                $properties[] = $this->msg( 'namespaceinfo-namespace-immovable' )->parse();
            }
            if ( $this->namespaceInfo->isContent( $ns ) ) {
                $properties[] = $this->msg( 'namespaceinfo-namespace-iscontent' )->parse();
            }
            if ( $this->namespaceInfo->hasSubpages( $ns ) ) {
                $properties[] = $this->msg( 'namespaceinfo-namespace-subpages' )->parse();
            }
            if ( $this->namespaceInfo->isNonincludable( $ns ) ) {
                $properties[] = $this->msg( 'namespaceinfo-namespace-nonincludable' )->parse();
            }
            if ( $this->namespaceInfo->getNamespaceContentModel( $ns ) !== null ) {
                $properties[] = $this->msg( 'namespaceinfo-namespace-default-contentmodel' )
                    ->params( $this->namespaceInfo->getNamespaceContentModel( $ns ) )
                    ->parse();
            }
        }

        // Convert to a string
        $namespaceProperties = '';
        if ( $properties !== [] ) {
            $namespaceProperties = Html::openElement( 'ul' );
            foreach ( $properties as $propertyText ) {
                $namespaceProperties .= Html::rawElement(
                    'li',
                    [],
                    $propertyText
                );
            }
            $namespaceProperties .= Html::closeElement( 'ul' );
        }

        $idField = Html::rawElement( 'td', [], (string)$ns );
        $canonicalField = Html::rawElement( 'td', [], $canonicalName );
        $localField = Html::rawElement( 'td', [], $localName );
        $infoField = Html::rawElement( 'td', [], $descriptionText . $namespaceProperties );

        return Html::rawElement(
            'tr',
            [],
            $idField . $canonicalField . $localField . $infoField
        );
    }

    /**
     * @return string
     */
    protected function getGroupName() {
        return 'wiki';
    }

}