Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 4
CRAP
80.00% covered (warning)
80.00%
28 / 35
FileExporterHooks
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 4
13.15
80.00% covered (warning)
80.00%
28 / 35
 onSkinTemplateNavigation
0.00% covered (danger)
0.00%
0 / 1
6
95.83% covered (success)
95.83%
23 / 24
 getExportButtonLabel
0.00% covered (danger)
0.00%
0 / 1
4.37
71.43% covered (warning)
71.43%
5 / 7
 onListDefinedTags
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 onChangeTagsAllowedAdd
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
<?php
namespace FileExporter;
use Message;
use SkinTemplate;
use User;
use WikiFilePage;
/**
 * @license GPL-2.0-or-later
 * @author Addshore
 */
class FileExporterHooks {
    /**
     * @param SkinTemplate $skinTemplate
     * @param array[] &$links
     */
    public static function onSkinTemplateNavigation( SkinTemplate $skinTemplate, array &$links ) {
        $context = $skinTemplate->getContext();
        $config = $context->getConfig();
        $user = $context->getUser();
        $title = $context->getTitle();
        if ( !$title ||
            $title->getNamespace() !== NS_FILE ||
            !$title->exists() ||
            $user->isNewbie()
        ) {
            return;
        }
        $page = new WikiFilePage( $title );
        if ( !$page->isLocal() ) {
            return;
        }
        $parsedUrl = wfParseUrl( $config->get( 'FileExporterTarget' ) );
        $query = wfCgiToArray( $parsedUrl['query'] ?? '' );
        $query['clientUrl'] = $title->getFullURL( '', false, PROTO_CANONICAL );
        // Add another URL parameter in order to be able to track hits to the import special page
        // coming directly from the exporter.
        $query['importSource'] = 'FileExporter';
        $parsedUrl['query'] = wfArrayToCgi( $query );
        $targetUrl = wfAssembleUrl( $parsedUrl );
        $links['views']['fileExporter'] = [
            'class' => '',
            'text' => self::getExportButtonLabel( $parsedUrl['host'] ),
            'href' => $targetUrl,
            'target' => '_blank',
        ];
    }
    /**
     * @param string $host
     *
     * @return string
     */
    private static function getExportButtonLabel( $host ) {
        if ( $host === 'commons.wikimedia.org' ) {
            $msg = 'fileexporter-to-wikimedia-commons';
        } elseif ( strpos( $host, '.beta.wmflabs.org' ) > 0
            || preg_match( '/^test\d*\./i', $host )
        ) {
            $msg = 'fileexporter-to-test';
        } else {
            $msg = 'fileexporter-text';
        }
        return Message::newFromKey( $msg )->plain();
    }
    /**
     * @see https://www.mediawiki.org/wiki/Manual:Hooks/ChangeTagsListActive
     * @see https://www.mediawiki.org/wiki/Manual:Hooks/ListDefinedTags
     *
     * @param string[] &$tags
     */
    public static function onListDefinedTags( array &$tags ) {
        $tags[] = 'fileimporter-remote';
    }
    /**
     * @see https://www.mediawiki.org/wiki/Manual:Hooks/ChangeTagsAllowedAdd
     * @param array &$allowedTags
     * @param array $tags
     * @param User|null $user
     */
    public static function onChangeTagsAllowedAdd( array &$allowedTags, array $tags, User $user = null ) {
        $allowedTags[] = 'fileimporter-remote';
    }
}