marking error suppression operators so that they can easily be removed with a search...
[lhc/web/wiklou.git] / includes / SpecialMaintenance.php
1 <?php
2
3 function sns()
4 {
5 global $wgLang ;
6 $ns = $wgLang->getNamespaces() ;
7 return $ns[-1] ;
8 }
9
10 function wfSpecialMaintenance( $par=NULL )
11 {
12 global $wgUser, $wgOut, $wgLang, $wgTitle, $wgRequest, $wgLanguageCode;
13 global $wgMiserMode;
14
15 if ( $wgMiserMode ) {
16 $wgOut->addWikiText( wfMsg( "perfdisabled" ) );
17 return;
18 }
19
20 $submitmll = $wgRequest->getVal( 'submitmll' );
21
22 if( $par )
23 $subfunction = $par;
24 else
25 $subfunction = $wgRequest->getText( 'subfunction' );
26
27 if ( $subfunction == "disambiguations" ) return wfSpecialDisambiguations() ;
28 if ( $subfunction == "doubleredirects" ) return wfSpecialDoubleRedirects() ;
29 if ( $subfunction == "brokenredirects" ) return wfSpecialBrokenRedirects() ;
30 if ( $subfunction == "selflinks" ) return wfSpecialSelfLinks() ;
31 if ( $subfunction == "mispeelings" ) return wfSpecialMispeelings() ;
32 if ( $subfunction == "missinglanguagelinks" ) return wfSpecialMissingLanguageLinks() ;
33 if ( !is_null( $submitmll ) ) return wfSpecialMissingLanguageLinks() ;
34
35 $sk = $wgUser->getSkin();
36 $ns = $wgLang->getNamespaces() ;
37 $r = wfMsg("maintnancepagetext") ;
38 $r .= "<UL>\n" ;
39 #$r .= "<li>".getMPL("disambiguations")."</li>\n" ; # Doesn't work
40 $r .= "<li>".getMPL("doubleredirects")."</li>\n" ;
41 $r .= "<li>".getMPL("brokenredirects")."</li>\n" ;
42 #$r .= "<li>".getMPL("selflinks")."</li>\n" ; # Doesn't work
43 $r .= "<li>".getMPL("mispeelings")."</li>\n" ;
44
45 $r .= "<li>";
46 $l = getMPL("missinglanguagelinks");
47 $l = str_replace ( "</a>" , "" , $l ) ;
48 $l = str_replace ( "<a " , "<FORM method=post " , $l ) ;
49 $l = explode ( ">" , $l ) ;
50 $l = $l[0] ;
51 $r .= $l.">\n" ;
52 $r .= "<input type=submit name='submitmll' value='" ;
53 $r .= htmlspecialchars(wfMsg("missinglanguagelinksbutton"), ENT_QUOTES);
54 $r .= "'>\n" ;
55 $r .= "<select name=thelang>\n" ;
56 $a = $wgLang->getLanguageNames();
57 $ak = array_keys ( $a ) ;
58 foreach ( $ak AS $k ) {
59 if ( $k != $wgLanguageCode )
60 $r .= "<option value='{$k}'>{$a[$k]}</option>\n" ;
61 }
62 $r .= "</select>\n" ;
63 $r .= "</FORM>\n</li>" ;
64
65 $r .= "</UL>\n" ;
66 $wgOut->addHTML ( $r ) ;
67 }
68
69 function getMPL ( $x )
70 {
71 global $wgUser , $wgLang;
72 $sk = $wgUser->getSkin() ;
73 return $sk->makeKnownLink(sns().":Maintenance",wfMsg($x),"subfunction={$x}") ;
74 }
75
76 function getMaintenancePageBacklink( $subfunction )
77 {
78 global $wgUser , $wgLang;
79 $sk = $wgUser->getSkin() ;
80 $ns = $wgLang->getNamespaces() ;
81 $r = $sk->makeKnownLink (
82 $ns[-1].":Maintenance",
83 wfMsg("maintenancebacklink") ) ;
84 $t = wfMsg ( $subfunction ) ;
85
86 $s = "<table width=100% border=0><tr><td>";
87 $s .= "<h2>{$t}</h2></td><td align=right>";
88 $s .= "{$r}</td></tr></table>\n" ;
89 return $s ;
90 }
91
92 # Broken function
93 # Suggest deprecating this in favour of a Special:Whatlinkshere with prev/next links [TS]
94 function wfSpecialDisambiguations()
95 {
96 global $wgUser, $wgOut, $wgLang, $wgTitle;
97 $fname = "wfSpecialDisambiguations";
98
99 list( $limit, $offset ) = wfCheckLimits();
100 $dbr =& wfGetDB( DB_SLAVE );
101 extract( $dbr->tableNames( 'links', 'cur' ) );
102
103 $dp = $dbr->strencode( wfMsg("disambiguationspage") );
104
105 die( "wfSpecialDisambiguation is broken. Link tables have changed...\n" );
106
107 $sql = "SELECT la.l_from,la.l_to,"
108 . " lb.l_from AS source,lb.l_to AS dest,"
109 . " c.cur_id, c.cur_title AS dt"
110 . " FROM $links AS la, $links AS lb, $cur AS c, $cur AS d"
111 . " WHERE la.l_from='{$dp}'"
112 . " AND la.l_to=lb.l_to"
113 . " AND la.l_from<>lb.l_from"
114 . " AND c.cur_id=lb.l_to"
115 . " AND c.cur_namespace=0"
116 . " AND d.cur_title=lb.l_from"
117 . " AND d.cur_namespace=0"
118 . " LIMIT {$offset}, {$limit}";
119
120 $res = $dbr->query( $sql, $fname );
121
122 $sk = $wgUser->getSkin();
123
124 $top = "<p>".wfMsg( "disambiguationstext", $sk->makeKnownLink( $dp ) )."</p><br>\n";
125 $top = getMaintenancePageBacklink( "disambiguations" ) . $top;
126 $top .= wfShowingResults( $offset, $limit );
127 $wgOut->addHTML( "<p>{$top}\n" );
128
129 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
130 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=disambiguations" , $sl ) ;
131 $wgOut->addHTML( "<br>{$sl}\n" );
132
133 $s = "<ol start=" . ( $offset + 1 ) . ">";
134 while ( $obj = $dbr->fetchObject( $res ) ) {
135 $l1 = $sk->makeKnownLink ( $obj->source , "" , "redirect=no" ) ;
136 $l2 = $sk->makeKnownLink ( $obj->dt ) ;
137 $l3 = $sk->makeBrokenLink ( $obj->source , "(".wfMsg("qbedit").")" , "redirect=no" ) ;
138 $s .= "<li>{$l1} {$l3} => {$l2}</li>\n" ;
139 }
140 $dbr->freeResult( $res );
141 $s .= "</ol>";
142 $wgOut->addHTML( $s );
143 $wgOut->addHTML( "<p>{$sl}\n" );
144 }
145
146 function wfSpecialDoubleRedirects()
147 {
148 global $wgUser, $wgOut, $wgLang, $wgTitle;
149 $fname = "wfSpecialDoubleRedirects";
150
151 list( $limit, $offset ) = wfCheckLimits();
152 $dbr =& wfGetDB( DB_SLAVE );
153 extract( $dbr->tableNames( 'cur', 'links' ) );
154
155 $sql = "SELECT ca.cur_namespace as ns_a, ca.cur_title as title_a," .
156 " cb.cur_namespace as ns_b, cb.cur_title as title_b," .
157 " cb.cur_text AS rt " .
158 "FROM $links,$cur AS ca,$cur AS cb ".
159 "WHERE ca.cur_is_redirect=1 AND cb.cur_is_redirect=1 AND l_to=cb.cur_id " .
160 " AND l_from=ca.cur_id LIMIT {$offset}, {$limit}" ;
161
162 $res = $dbr->query( $sql, $fname );
163
164 $top = getMaintenancePageBacklink( "doubleredirects" );
165 $top .= "<p>".wfMsg("doubleredirectstext")."</p><br>\n";
166 $top .= wfShowingResults( $offset, $limit );
167 $wgOut->addHTML( "<p>{$top}\n" );
168
169 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
170 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=doubleredirects" , $sl ) ;
171 $wgOut->addHTML( "<br>{$sl}\n" );
172
173 $sk = $wgUser->getSkin();
174 $s = "<ol start=" . ( $offset + 1 ) . ">";
175 while ( $obj = $dbr->fetchObject( $res ) ) {
176 $n = explode ( "\n" , $obj->rt ) ;
177 $n = $n[0] ;
178 $sourceTitle = Title::makeTitle( $obj->ns_a, $obj->title_a );
179 $destTitle = Title::makeTitle( $obj->ns_b, $obj->title_b );
180
181 $l1 = $sk->makeKnownLinkObj( $sourceTitle , "" , "redirect=no" ) ;
182 $l2 = $sk->makeKnownLinkObj( $destTitle , "" , "redirect=no" ) ;
183 $l3 = $sk->makeBrokenLinkObj( $sourceTitle , "(".wfMsg("qbedit").")" , "redirect=no" ) ;
184 $s .= "<li>{$l1} {$l3} => {$l2} (\"{$n}\")</li>\n" ;
185 }
186 $dbr->freeResult( $res );
187 $s .= "</ol>";
188 $wgOut->addHTML( $s );
189 $wgOut->addHTML( "<p>{$sl}\n" );
190 }
191
192 function wfSpecialBrokenRedirects()
193 {
194 global $wgUser, $wgOut, $wgLang, $wgTitle;
195 $fname = "wfSpecialBrokenRedirects";
196
197 list( $limit, $offset ) = wfCheckLimits();
198 $dbr =& wfGetDB( DB_SLAVE );
199 extract( $dbr->tableNames( 'cur', 'brokenlinks' ) );
200
201
202 $sql = "SELECT bl_to,cur_title FROM $brokenlinks,$cur " .
203 "WHERE cur_is_redirect=1 AND cur_namespace=0 AND bl_from=cur_id " .
204 "LIMIT {$offset}, {$limit}" ;
205
206 $res = $dbr->query( $sql, $fname );
207
208 $top = getMaintenancePageBacklink( "brokenredirects" );
209 $top .= "<p>".wfMsg("brokenredirectstext")."</p><br>\n";
210 $top .= wfShowingResults( $offset, $limit );
211 $wgOut->addHTML( "<p>{$top}\n" );
212
213 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
214 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=brokenredirects" , $sl ) ;
215 $wgOut->addHTML( "<br>{$sl}\n" );
216
217 $sk = $wgUser->getSkin();
218 $s = "<ol start=" . ( $offset + 1 ) . ">";
219 while ( $obj = $dbr->fetchObject( $res ) ) {
220 $l1 = $sk->makeKnownLink ( $obj->cur_title , "" , "redirect=no" ) ;
221 $l2 = $sk->makeBrokenLink ( $obj->cur_title , "(".wfMsg("qbedit").")" , "redirect=no" ) ;
222 $l3 = $sk->makeBrokenLink ( $obj->bl_to , "" , "redirect=no" ) ;
223 $s .= "<li>{$l1} {$l2} => {$l3}</li>\n" ;
224 }
225 $dbr->freeResult( $res );
226 $s .= "</ol>";
227 $wgOut->addHTML( $s );
228 $wgOut->addHTML( "<p>{$sl}\n" );
229 }
230
231 # This doesn't really work anymore, because self-links are now displayed as
232 # unlinked bold text, and are not entered into the link table.
233 function wfSpecialSelfLinks()
234 {
235 global $wgUser, $wgOut, $wgLang, $wgTitle;
236 $fname = "wfSpecialSelfLinks";
237
238 list( $limit, $offset ) = wfCheckLimits();
239
240 $sql = "SELECT cur_namespace,cur_title FROM cur,links " .
241 "WHERE l_from=l_to AND l_to=cur_id " .
242 "LIMIT {$offset}, {$limit}";
243
244 $res = wfQuery( $sql, DB_SLAVE, $fname );
245
246 $top = getMaintenancePageBacklink( "selflinks" );
247 $top .= "<p>".wfMsg("selflinkstext")."</p><br>\n";
248 $top .= wfShowingResults( $offset, $limit );
249 $wgOut->addHTML( "<p>{$top}\n" );
250
251 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
252 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=selflinks" , $sl ) ;
253 $wgOut->addHTML( "<br>{$sl}\n" );
254
255 $sk = $wgUser->getSkin();
256 $s = "<ol start=" . ( $offset + 1 ) . ">";
257 while ( $obj = wfFetchObject( $res ) ) {
258 $title = Title::makeTitle( $obj->cur_namespace, $obj->cur_title );
259 $s .= "<li>".$sk->makeKnownLinkObj( $title )."</li>\n" ;
260 }
261 wfFreeResult( $res );
262 $s .= "</ol>";
263 $wgOut->addHTML( $s );
264 $wgOut->addHTML( "<p>{$sl}\n" );
265 }
266
267 function wfSpecialMispeelings ()
268 {
269 global $wgUser, $wgOut, $wgLang, $wgTitle;
270 $sk = $wgUser->getSkin();
271 $fname = "wfSpecialMispeelings";
272
273 list( $limit, $offset ) = wfCheckLimits();
274 $dbr =& wfGetDB( DB_SLAVE );
275 extract( $dbr->tableNames( 'cur', 'searchindex' ) );
276
277 # Determine page name
278 $ms = wfMsg ( "mispeelingspage" ) ;
279 $mss = str_replace ( " " , "_" , $ms );
280 $msp = $wgLang->getNsText(4).":".$ms ;
281 $msl = $sk->makeKnownLink ( $msp ) ;
282
283 # Load list from database
284 $l = $dbr->selectField( 'cur', 'cur_text', array( 'cur_title' => $mss, 'cur_namespace' => 4 ), $fname );
285 $l = explode ( "\n" , $l ) ;
286 $a = array () ;
287 foreach ( $l as $x )
288 if ( substr ( trim ( $x ) , 0 , 1 ) == "*" )
289 $a[] = strtolower ( trim ( substr ( trim ( $x ) , 1 ) ) );
290 asort ( $a ) ;
291
292 $cnt = 0 ;
293 $b = array () ;
294 foreach ( $a AS $x ) {
295 if ( $cnt < $offset+$limit && $x != "" ) {
296 $y = $x ;
297 $x = preg_replace( '/^(\S+).*$/', '$1', $x );
298 $sql = "SELECT DISTINCT cur_title FROM $cur,$searchindex WHERE cur_id=si_page AND ".
299 "cur_namespace=0 AND cur_is_redirect=0 AND " .
300 "(MATCH(si_text) AGAINST ('" . $dbr->strencode( $wgLang->stripForSearch( $x ) ) . "'))" ;
301 $res = $dbr->query( $sql, $fname );
302 while ( $obj = $dbr->fetchObject ( $res ) ) {
303 if ( $cnt >= $offset AND $cnt < $offset+$limit ) {
304 if ( $y != "" ) {
305 if ( count ( $b ) > 0 ) $b[] = "</OL>\n" ;
306 $b[] = "<H3>{$y}</H3>\n<OL start=".($cnt+1).">\n" ;
307 $y = "" ;
308 }
309 $b[] = "<li>".
310 $sk->makeKnownLink ( $obj->cur_title ).
311 " (".
312 $sk->makeBrokenLink ( $obj->cur_title , wfMsg ( "qbedit" ) ).
313 ")</li>\n" ;
314 }
315 $cnt++ ;
316 }
317 }
318 }
319 $top = getMaintenancePageBacklink( "mispeelings" );
320 $top .= "<p>".wfMsg( "mispeelingstext", $msl )."</p><br>\n";
321 $top .= wfShowingResults( $offset, $limit );
322 $wgOut->addHTML( "<p>{$top}\n" );
323
324 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
325 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=mispeelings" , $sl ) ;
326 $wgOut->addHTML( "<br>{$sl}\n" );
327
328 $s = implode ( "" , $b ) ;
329 if ( count ( $b ) > 0 ) $s .= "</ol>";
330 $wgOut->addHTML( $s );
331 $wgOut->addHTML( "<p>{$sl}\n" );
332 }
333
334
335 function wfSpecialMissingLanguageLinks()
336 {
337 global $wgUser, $wgOut, $wgLang, $wgTitle, $wgRequest;
338
339 $fname = "wfSpecialMissingLanguageLinks";
340 $thelang = $wgRequest->getText( 'thelang' );
341 if ( $thelang == "w" ) $thelang = "en" ; # Fix for international wikis
342
343 list( $limit, $offset ) = wfCheckLimits();
344 $dbr =& wfGetDB( DB_SLAVE );
345 $cur = $dbr->tableName( 'cur' );
346
347 $sql = "SELECT cur_title FROM $cur " .
348 "WHERE cur_namespace=0 AND cur_is_redirect=0 " .
349 "AND cur_title NOT LIKE '%/%' AND cur_text NOT LIKE '%[[{$thelang}:%' " .
350 "LIMIT {$offset}, {$limit}";
351
352 $res = $dbr->query( $sql, $fname );
353
354
355 $mll = wfMsg( "missinglanguagelinkstext", $wgLang->getLanguageName($thelang) );
356
357 $top = getMaintenancePageBacklink( "missinglanguagelinks" );
358 $top .= "<p>$mll</p><br>";
359 $top .= wfShowingResults( $offset, $limit );
360 $wgOut->addHTML( "<p>{$top}\n" );
361
362 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
363 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=missinglanguagelinks&thelang={$thelang}" , $sl ) ;
364 $wgOut->addHTML( "<br>{$sl}\n" );
365
366 $sk = $wgUser->getSkin();
367 $s = "<ol start=" . ( $offset + 1 ) . ">";
368 while ( $obj = $dbr->fetchObject( $res ) )
369 $s .= "<li>".$sk->makeKnownLink ( $obj->cur_title )."</li>\n" ;
370 $dbr->freeResult( $res );
371 $s .= "</ol>";
372 $wgOut->addHTML( $s );
373 $wgOut->addHTML( "<p>{$sl}\n" );
374 }
375
376 ?>