]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - includes/changes/RCCacheEntryFactory.php
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / includes / changes / RCCacheEntryFactory.php
1 <?php
2 /**
3  * Creates a RCCacheEntry from a RecentChange to use in EnhancedChangesList
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  * http://www.gnu.org/copyleft/gpl.html
19  *
20  * @file
21  */
22 use MediaWiki\Linker\LinkRenderer;
23
24 class RCCacheEntryFactory {
25
26         /* @var IContextSource */
27         private $context;
28
29         /* @var string[] */
30         private $messages;
31
32         /**
33          * @var LinkRenderer
34          */
35         private $linkRenderer;
36
37         /**
38          * @param IContextSource $context
39          * @param string[] $messages
40          * @param LinkRenderer $linkRenderer
41          */
42         public function __construct(
43                 IContextSource $context, $messages, LinkRenderer $linkRenderer
44         ) {
45                 $this->context = $context;
46                 $this->messages = $messages;
47                 $this->linkRenderer = $linkRenderer;
48         }
49
50         /**
51          * @param RecentChange $baseRC
52          * @param bool $watched
53          *
54          * @return RCCacheEntry
55          */
56         public function newFromRecentChange( RecentChange $baseRC, $watched ) {
57                 $user = $this->context->getUser();
58                 $counter = $baseRC->counter;
59
60                 $cacheEntry = RCCacheEntry::newFromParent( $baseRC );
61
62                 // Should patrol-related stuff be shown?
63                 $cacheEntry->unpatrolled = ChangesList::isUnpatrolled( $baseRC, $user );
64
65                 $cacheEntry->watched = $cacheEntry->mAttribs['rc_type'] == RC_LOG ? false : $watched;
66                 $cacheEntry->numberofWatchingusers = $baseRC->numberofWatchingusers;
67
68                 $cacheEntry->link = $this->buildCLink( $cacheEntry );
69                 $cacheEntry->timestamp = $this->buildTimestamp( $cacheEntry );
70
71                 // Make "cur" and "diff" links.  Do not use link(), it is too slow if
72                 // called too many times (50% of CPU time on RecentChanges!).
73                 $showDiffLinks = $this->showDiffLinks( $cacheEntry, $user );
74
75                 $cacheEntry->difflink = $this->buildDiffLink( $cacheEntry, $showDiffLinks, $counter );
76                 $cacheEntry->curlink = $this->buildCurLink( $cacheEntry, $showDiffLinks, $counter );
77                 $cacheEntry->lastlink = $this->buildLastLink( $cacheEntry, $showDiffLinks );
78
79                 // Make user links
80                 $cacheEntry->userlink = $this->getUserLink( $cacheEntry );
81
82                 if ( !ChangesList::isDeleted( $cacheEntry, Revision::DELETED_USER ) ) {
83                         $cacheEntry->usertalklink = Linker::userToolLinks(
84                                 $cacheEntry->mAttribs['rc_user'],
85                                 $cacheEntry->mAttribs['rc_user_text']
86                         );
87                 }
88
89                 return $cacheEntry;
90         }
91
92         /**
93          * @param RecentChange $cacheEntry
94          * @param User $user
95          *
96          * @return bool
97          */
98         private function showDiffLinks( RecentChange $cacheEntry, User $user ) {
99                 return ChangesList::userCan( $cacheEntry, Revision::DELETED_TEXT, $user );
100         }
101
102         /**
103          * @param RecentChange $cacheEntry
104          *
105          * @return string
106          */
107         private function buildCLink( RecentChange $cacheEntry ) {
108                 $type = $cacheEntry->mAttribs['rc_type'];
109
110                 // New unpatrolled pages
111                 if ( $cacheEntry->unpatrolled && $type == RC_NEW ) {
112                         $clink = $this->linkRenderer->makeKnownLink( $cacheEntry->getTitle() );
113                 // Log entries
114                 } elseif ( $type == RC_LOG ) {
115                         $logType = $cacheEntry->mAttribs['rc_log_type'];
116
117                         if ( $logType ) {
118                                 $clink = $this->getLogLink( $logType );
119                         } else {
120                                 wfDebugLog( 'recentchanges', 'Unexpected log entry with no log type in recent changes' );
121                                 $clink = $this->linkRenderer->makeLink( $cacheEntry->getTitle() );
122                         }
123                 // Log entries (old format) and special pages
124                 } elseif ( $cacheEntry->mAttribs['rc_namespace'] == NS_SPECIAL ) {
125                         wfDebugLog( 'recentchanges', 'Unexpected special page in recentchanges' );
126                         $clink = '';
127                 // Edits
128                 } else {
129                         $clink = $this->linkRenderer->makeKnownLink( $cacheEntry->getTitle() );
130                 }
131
132                 return $clink;
133         }
134
135         private function getLogLink( $logType ) {
136                 $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
137                 $logpage = new LogPage( $logType );
138                 $logname = $logpage->getName()->text();
139
140                 $logLink = $this->context->msg( 'parentheses' )
141                         ->rawParams(
142                                 $this->linkRenderer->makeKnownLink( $logtitle, $logname )
143                         )->escaped();
144
145                 return $logLink;
146         }
147
148         /**
149          * @param RecentChange $cacheEntry
150          *
151          * @return string
152          */
153         private function buildTimestamp( RecentChange $cacheEntry ) {
154                 return $this->context->getLanguage()->userTime(
155                         $cacheEntry->mAttribs['rc_timestamp'],
156                         $this->context->getUser()
157                 );
158         }
159
160         /**
161          * @param RecentChange $recentChange
162          *
163          * @return array
164          */
165         private function buildCurQueryParams( RecentChange $recentChange ) {
166                 return [
167                         'curid' => $recentChange->mAttribs['rc_cur_id'],
168                         'diff' => 0,
169                         'oldid' => $recentChange->mAttribs['rc_this_oldid']
170                 ];
171         }
172
173         /**
174          * @param RecentChange $cacheEntry
175          * @param bool $showDiffLinks
176          * @param int $counter
177          *
178          * @return string
179          */
180         private function buildCurLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
181                 $queryParams = $this->buildCurQueryParams( $cacheEntry );
182                 $curMessage = $this->getMessage( 'cur' );
183                 $logTypes = [ RC_LOG ];
184
185                 if ( !$showDiffLinks || in_array( $cacheEntry->mAttribs['rc_type'], $logTypes ) ) {
186                         $curLink = $curMessage;
187                 } else {
188                         $curUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
189                         $curLink = "<a class=\"mw-changeslist-diff-cur\" href=\"$curUrl\">$curMessage</a>";
190                 }
191
192                 return $curLink;
193         }
194
195         /**
196          * @param RecentChange $recentChange
197          *
198          * @return array
199          */
200         private function buildDiffQueryParams( RecentChange $recentChange ) {
201                 return [
202                         'curid' => $recentChange->mAttribs['rc_cur_id'],
203                         'diff' => $recentChange->mAttribs['rc_this_oldid'],
204                         'oldid' => $recentChange->mAttribs['rc_last_oldid']
205                 ];
206         }
207
208         /**
209          * @param RecentChange $cacheEntry
210          * @param bool $showDiffLinks
211          * @param int $counter
212          *
213          * @return string
214          */
215         private function buildDiffLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
216                 $queryParams = $this->buildDiffQueryParams( $cacheEntry );
217                 $diffMessage = $this->getMessage( 'diff' );
218                 $logTypes = [ RC_NEW, RC_LOG ];
219
220                 if ( !$showDiffLinks ) {
221                         $diffLink = $diffMessage;
222                 } elseif ( in_array( $cacheEntry->mAttribs['rc_type'], $logTypes ) ) {
223                         $diffLink = $diffMessage;
224                 } elseif ( $cacheEntry->getAttribute( 'rc_type' ) == RC_CATEGORIZE ) {
225                         $rcCurId = $cacheEntry->getAttribute( 'rc_cur_id' );
226                         $pageTitle = Title::newFromID( $rcCurId );
227                         if ( $pageTitle === null ) {
228                                 wfDebugLog( 'RCCacheEntryFactory', 'Could not get Title for rc_cur_id: ' . $rcCurId );
229                                 return $diffMessage;
230                         }
231                         $diffUrl = htmlspecialchars( $pageTitle->getLinkURL( $queryParams ) );
232                         $diffLink = "<a class=\"mw-changeslist-diff\" href=\"$diffUrl\">$diffMessage</a>";
233                 } else {
234                         $diffUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
235                         $diffLink = "<a class=\"mw-changeslist-diff\" href=\"$diffUrl\">$diffMessage</a>";
236                 }
237
238                 return $diffLink;
239         }
240
241         /**
242          * Builds the link to the previous version
243          *
244          * @param RecentChange $cacheEntry
245          * @param bool $showDiffLinks
246          *
247          * @return string
248          */
249         private function buildLastLink( RecentChange $cacheEntry, $showDiffLinks ) {
250                 $lastOldid = $cacheEntry->mAttribs['rc_last_oldid'];
251                 $lastMessage = $this->getMessage( 'last' );
252                 $type = $cacheEntry->mAttribs['rc_type'];
253                 $logTypes = [ RC_LOG ];
254
255                 // Make "last" link
256                 if ( !$showDiffLinks || !$lastOldid || in_array( $type, $logTypes ) ) {
257                         $lastLink = $lastMessage;
258                 } else {
259                         $lastLink = $this->linkRenderer->makeKnownLink(
260                                 $cacheEntry->getTitle(),
261                                 new HtmlArmor( $lastMessage ),
262                                 [ 'class' => 'mw-changeslist-diff' ],
263                                 $this->buildDiffQueryParams( $cacheEntry )
264                         );
265                 }
266
267                 return $lastLink;
268         }
269
270         /**
271          * @param RecentChange $cacheEntry
272          *
273          * @return string
274          */
275         private function getUserLink( RecentChange $cacheEntry ) {
276                 if ( ChangesList::isDeleted( $cacheEntry, Revision::DELETED_USER ) ) {
277                         $userLink = ' <span class="history-deleted">' .
278                                 $this->context->msg( 'rev-deleted-user' )->escaped() . '</span>';
279                 } else {
280                         $userLink = Linker::userLink(
281                                 $cacheEntry->mAttribs['rc_user'],
282                                 $cacheEntry->mAttribs['rc_user_text']
283                         );
284                 }
285
286                 return $userLink;
287         }
288
289         /**
290          * @param string $key
291          *
292          * @return string
293          */
294         private function getMessage( $key ) {
295                 return $this->messages[$key];
296         }
297
298 }