-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAControlImageLinkHooks.php
96 lines (83 loc) · 2.89 KB
/
AControlImageLinkHooks.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?php
/**
* Extension:AControlImageLink - MediaWiki extension.
* Copyright (C) 2020 Edward Chernenko.
*
* 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.
*/
/**
* @file
* Hooks of Extension:AControlImageLink.
*/
class AControlImageLinkHooks {
/**
* Prevent thumbnail from rendering if image has <accesscontrol> tag,
* and the article that includes it either doesn't or has a different <accesscontrol> tag.
* @param DummyLinker &$dummyLinker
* @param Title &$title
* @param File|bool &$file
* @param array &$frameParams
* @param array &$handlerParams
* @param string|bool &$time
* @param string|null &$result
* @param \Parser $parser
* @param string &$query
* @param int|null &$widthOption
* @return bool
*/
public static function onImageBeforeProduceHTML(
&$dummyLinker, Title &$title, &$file, array &$frameParams, array &$handlerParams,
&$time, &$result, Parser $parser, string &$query, &$widthOption
) {
global $wgAControlImageLinkRestrictedExtensions;
$filenameParts = explode( '.', $title->getText() );
$fileExtension = array_pop( $filenameParts );
if ( !in_array( $fileExtension, $wgAControlImageLinkRestrictedExtensions ) ) {
// Images with this extension are not restricted from thumbnailing.
return true;
}
$imageRestriction = self::findAccessControlTag( $title );
if ( !$imageRestriction ) {
// No <accesscontrol> on image page.
return true;
}
$articleRestriction = self::findAccessControlTag( $parser->getTitle() );
if ( $articleRestriction === $imageRestriction ) {
// Contents of <accesscontrol> tags are the same,
// so thumbnailing is allowed.
return true;
}
// Not allowed. Make a simple link instead of thumbnail.
$linkRenderer = MediaWiki\MediaWikiServices::getInstance()->getLinkRenderer();
$result = $linkRenderer->makeLink( $title );
// Suppress normal handling of [[File:]] syntax.
return false;
}
/**
* @param Title $title Page where to look for <accesscontrol> tags
* @return string|null Text inside <accesscontrol> tag.
*/
protected static function findAccessControlTag( Title $title ) {
$page = WikiPage::factory( $title );
$content = $page->getContent( Revision::RAW );
if ( !$content ) {
// Page doesn't exist.
return null;
}
$text = $content->getNativeData();
$matches = false;
if ( !preg_match( '/<accesscontrol>(.*)<\/accesscontrol>/', $text, $matches ) ) {
// No <accesscontrol> tag.
return null;
}
return trim( $matches[1] );
}
}