Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
82.35% covered (warning)
82.35%
28 / 34
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
FileExporterHooks
82.35% covered (warning)
82.35%
28 / 34
0.00% covered (danger)
0.00%
0 / 5
12.79
0.00% covered (danger)
0.00%
0 / 1
 onSkinTemplateNavigation__Universal
92.59% covered (success)
92.59%
25 / 27
0.00% covered (danger)
0.00%
0 / 1
7.02
 getExportButtonLabel
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
2.06
 onListDefinedTags
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 onChangeTagsListActive
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 onChangeTagsAllowedAdd
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3// phpcs:disable MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName
4
5namespace FileExporter;
6
7use MediaWiki\ChangeTags\Hook\ChangeTagsAllowedAddHook;
8use MediaWiki\ChangeTags\Hook\ChangeTagsListActiveHook;
9use MediaWiki\ChangeTags\Hook\ListDefinedTagsHook;
10use MediaWiki\Config\ConfigException;
11use MediaWiki\Hook\SkinTemplateNavigation__UniversalHook;
12use MediaWiki\MediaWikiServices;
13use MediaWiki\User\User;
14use Message;
15use SkinTemplate;
16
17/**
18 * @license GPL-2.0-or-later
19 * @author Addshore
20 */
21class FileExporterHooks implements
22    ChangeTagsAllowedAddHook,
23    ChangeTagsListActiveHook,
24    SkinTemplateNavigation__UniversalHook,
25    ListDefinedTagsHook
26{
27
28    /**
29     * @param SkinTemplate $skinTemplate
30     * @param array[] &$links
31     */
32    public function onSkinTemplateNavigation__Universal( $skinTemplate, &$links ): void {
33        $context = $skinTemplate->getContext();
34        $config = $context->getConfig();
35        $user = $context->getUser();
36        $title = $context->getTitle();
37
38        if ( !$title ||
39            !$title->inNamespace( NS_FILE ) ||
40            !$title->exists() ||
41            $user->isNewbie()
42        ) {
43            return;
44        }
45
46        $page = MediaWikiServices::getInstance()->getWikiPageFactory()->newFromTitle( $title );
47        if ( !$page->isLocal() ) {
48            return;
49        }
50
51        $target = $config->get( 'FileExporterTarget' );
52        if ( !$target ) {
53            throw new ConfigException( '$wgFileExporterTarget doesn\'t have a default, please set your own' );
54        }
55        $parsedUrl = wfParseUrl( $target );
56        $query = wfCgiToArray( $parsedUrl['query'] ?? '' );
57        $query['clientUrl'] = $title->getFullURL( '', false, PROTO_CANONICAL );
58
59        // Add another URL parameter in order to be able to track hits to the import special page
60        // coming directly from the exporter.
61        $query['importSource'] = 'FileExporter';
62
63        $parsedUrl['query'] = wfArrayToCgi( $query );
64        $targetUrl = wfAssembleUrl( $parsedUrl );
65
66        $links['views']['fileExporter'] = [
67            'class' => '',
68            'text' => self::getExportButtonLabel( $parsedUrl['host'] ),
69            'href' => $targetUrl,
70            'target' => '_blank',
71        ];
72    }
73
74    /**
75     * @param string $host
76     *
77     * @return string
78     */
79    private static function getExportButtonLabel( $host ) {
80        if ( $host === 'commons.wikimedia.org' ) {
81            $msg = 'fileexporter-to-wikimedia-commons';
82        } else {
83            $msg = 'fileexporter-text';
84        }
85
86        return Message::newFromKey( $msg )->plain();
87    }
88
89    /**
90     * @see https://www.mediawiki.org/wiki/Manual:Hooks/ListDefinedTags
91     *
92     * @param string[] &$tags
93     */
94    public function onListDefinedTags( &$tags ) {
95        $tags[] = 'fileimporter-remote';
96    }
97
98    /**
99     * @see https://www.mediawiki.org/wiki/Manual:Hooks/ChangeTagsListActive
100     *
101     * @param string[] &$tags
102     */
103    public function onChangeTagsListActive( &$tags ) {
104        $tags[] = 'fileimporter-remote';
105    }
106
107    /**
108     * @see https://www.mediawiki.org/wiki/Manual:Hooks/ChangeTagsAllowedAdd
109     * @param array &$allowedTags
110     * @param array $tags
111     * @param User|null $user
112     */
113    public function onChangeTagsAllowedAdd( &$allowedTags, $tags, $user ) {
114        $allowedTags[] = 'fileimporter-remote';
115    }
116
117}