wikimedia/mediawiki-core

View on GitHub
includes/skins/components/SkinComponentCopyright.php

Summary

Maintainability
A
3 hrs
Test Coverage
<?php

namespace MediaWiki\Skin;

use HtmlArmor;
use MediaWiki\Config\Config;
use MediaWiki\HookContainer\ProtectedHookAccessorTrait;
use MediaWiki\MainConfigNames;
use MediaWiki\MediaWikiServices;
use MediaWiki\Message\Message;
use MediaWiki\SpecialPage\SpecialPage;
use MediaWiki\Title\Title;
use MediaWiki\User\User;
use MessageLocalizer;

class SkinComponentCopyright implements SkinComponent {
    use ProtectedHookAccessorTrait;

    /** @var Config */
    private $config;
    /** @var MessageLocalizer */
    private $localizer;
    /** @var SkinComponentRegistryContext */
    private $skinContext;
    /** @var User */
    private $user;

    /**
     * @param SkinComponentRegistryContext $skinContext
     */
    public function __construct( SkinComponentRegistryContext $skinContext ) {
        $this->skinContext = $skinContext;
        $this->config = $skinContext->getConfig();
        $this->localizer = $skinContext->getMessageLocalizer();
        $this->user = $skinContext->getUser();
    }

    /**
     * @inheritDoc
     */
    public function getTemplateData(): array {
        return [
            'html' => $this->getCopyrightHTML(),
        ];
    }

    /**
     * Get the copyright.
     *
     * @return string
     */
    public function getCopyrightHTML(): string {
        $out = $this->skinContext->getOutput();
        $title = $out->getTitle();
        $isRevisionCurrent = $out->isRevisionCurrent();
        $config = $this->config;
        $localizer = $this->localizer;
        $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
        if ( !$isRevisionCurrent
            && !$localizer->msg( 'history_copyright' )->inContentLanguage()->isDisabled()
        ) {
            $type = 'history';
        } else {
            $type = 'normal';
        }

        if ( $config->get( MainConfigNames::RightsPage ) ) {
            $title = Title::newFromText( $config->get( MainConfigNames::RightsPage ) );
            $link = $linkRenderer->makeKnownLink( $title,
                    new HtmlArmor( $config->get( MainConfigNames::RightsText ) ?: $title->getText() )
                );
        } elseif ( $config->get( MainConfigNames::RightsUrl ) ) {
            $link = $linkRenderer->makeExternalLink(
                $config->get( MainConfigNames::RightsUrl ),
                $config->get( MainConfigNames::RightsText ),
                $title ?? SpecialPage::getTitleFor( 'Badtitle' )
            );
        } elseif ( $config->get( MainConfigNames::RightsText ) ) {
            $link = $config->get( MainConfigNames::RightsText );
        } else {
            # Give up now
            return '';
        }

        if ( $config->get( MainConfigNames::AllowRawHtmlCopyrightMessages ) ) {
            // First check whether the old, raw HTML message exists (if not disallowed by wiki config),
            // for compatibility with on-wiki message overrides.
            $msgKey = $type === 'history' ? 'history_copyright' : 'copyright';

            // Allow for site and per-namespace customization of copyright notice.
            $this->getHookRunner()->onSkinCopyrightFooter( $title, $type, $msgKey, $link );

            $msg = $localizer->msg( $msgKey )->rawParams( $link );
            if ( !$msg->isDisabled() ) {
                return $msg->text();
            }
        }

        // If it does not exist or disabled, use the new, safer wikitext message.
        $msgKey = $type === 'history' ? 'copyright-footer-history' : 'copyright-footer';
        $msgSpec = Message::newFromSpecifier( $msgKey )->rawParams( $link );

        // Allow for site and per-namespace customization of copyright notice.
        $this->getHookRunner()->onSkinCopyrightFooterMessage( $title, $type, $msgSpec );

        $msg = $localizer->msg( $msgSpec );
        if ( !$msg->isDisabled() ) {
            return $msg->parse();
        }

        return '';
    }
}