Introducing special page modular extensions, making the board vote special page the...
[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" ;
40 $r .= "<li>".getMPL("doubleredirects")."</li>\n" ;
41 $r .= "<li>".getMPL("brokenredirects")."</li>\n" ;
42 $r .= "<li>".getMPL("selflinks")."</li>\n" ;
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
101 $dp = wfStrencode( wfMsg("disambiguationspage") );
102
103 die( "wfSpecialDisambiguation is broken. Link tables have changed...\n" );
104
105 $sql = "SELECT la.l_from,la.l_to,"
106 . " lb.l_from AS source,lb.l_to AS dest,"
107 . " c.cur_id, c.cur_title AS dt"
108 . " FROM links AS la, links AS lb, cur AS c, cur AS d"
109 . " WHERE la.l_from='{$dp}'"
110 . " AND la.l_to=lb.l_to"
111 . " AND la.l_from<>lb.l_from"
112 . " AND c.cur_id=lb.l_to"
113 . " AND c.cur_namespace=0"
114 . " AND d.cur_title=lb.l_from"
115 . " AND d.cur_namespace=0"
116 . " LIMIT {$offset}, {$limit}";
117
118 $res = wfQuery( $sql, DB_READ, $fname );
119
120 $sk = $wgUser->getSkin();
121
122 $top = "<p>".wfMsg( "disambiguationstext", $sk->makeKnownLink( $dp ) )."</p><br>\n";
123 $top = getMaintenancePageBacklink( "disambiguations" ) . $top;
124 $top .= wfShowingResults( $offset, $limit );
125 $wgOut->addHTML( "<p>{$top}\n" );
126
127 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
128 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=disambiguations" , $sl ) ;
129 $wgOut->addHTML( "<br>{$sl}\n" );
130
131 $s = "<ol start=" . ( $offset + 1 ) . ">";
132 while ( $obj = wfFetchObject( $res ) ) {
133 $l1 = $sk->makeKnownLink ( $obj->source , "" , "redirect=no" ) ;
134 $l2 = $sk->makeKnownLink ( $obj->dt ) ;
135 $l3 = $sk->makeBrokenLink ( $obj->source , "(".wfMsg("qbedit").")" , "redirect=no" ) ;
136 $s .= "<li>{$l1} {$l3} => {$l2}</li>\n" ;
137 }
138 wfFreeResult( $res );
139 $s .= "</ol>";
140 $wgOut->addHTML( $s );
141 $wgOut->addHTML( "<p>{$sl}\n" );
142 }
143
144 function wfSpecialDoubleRedirects()
145 {
146 global $wgUser, $wgOut, $wgLang, $wgTitle;
147 $fname = "wfSpecialDoubleRedirects";
148
149 list( $limit, $offset ) = wfCheckLimits();
150
151 $sql = "SELECT ca.cur_namespace as ns_a, ca.cur_title as title_a," .
152 " cb.cur_namespace as ns_b, cb.cur_title as title_b," .
153 " cb.cur_text AS rt " .
154 "FROM links,cur AS ca,cur AS cb ".
155 "WHERE ca.cur_is_redirect=1 AND cb.cur_is_redirect=1 AND l_to=cb.cur_id " .
156 " AND l_from=ca.cur_id LIMIT {$offset}, {$limit}" ;
157
158 $res = wfQuery( $sql, DB_READ, $fname );
159
160 $top = getMaintenancePageBacklink( "doubleredirects" );
161 $top .= "<p>".wfMsg("doubleredirectstext")."</p><br>\n";
162 $top .= wfShowingResults( $offset, $limit );
163 $wgOut->addHTML( "<p>{$top}\n" );
164
165 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
166 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=doubleredirects" , $sl ) ;
167 $wgOut->addHTML( "<br>{$sl}\n" );
168
169 $sk = $wgUser->getSkin();
170 $s = "<ol start=" . ( $offset + 1 ) . ">";
171 while ( $obj = wfFetchObject( $res ) ) {
172 $n = explode ( "\n" , $obj->rt ) ;
173 $n = $n[0] ;
174 $sourceTitle = Title::makeTitle( $obj->ns_a, $obj->title_a );
175 $destTitle = Title::makeTitle( $obj->ns_b, $obj->title_b );
176
177 $l1 = $sk->makeKnownLinkObj( $sourceTitle , "" , "redirect=no" ) ;
178 $l2 = $sk->makeKnownLinkObj( $destTitle , "" , "redirect=no" ) ;
179 $l3 = $sk->makeBrokenLinkObj( $sourceTitle , "(".wfMsg("qbedit").")" , "redirect=no" ) ;
180 $s .= "<li>{$l1} {$l3} => {$l2} (\"{$n}\")</li>\n" ;
181 }
182 wfFreeResult( $res );
183 $s .= "</ol>";
184 $wgOut->addHTML( $s );
185 $wgOut->addHTML( "<p>{$sl}\n" );
186 }
187
188 function wfSpecialBrokenRedirects()
189 {
190 global $wgUser, $wgOut, $wgLang, $wgTitle;
191 $fname = "wfSpecialBrokenRedirects";
192
193 list( $limit, $offset ) = wfCheckLimits();
194
195 $sql = "SELECT bl_to,cur_title FROM brokenlinks,cur " .
196 "WHERE cur_is_redirect=1 AND cur_namespace=0 AND bl_from=cur_id " .
197 "LIMIT {$offset}, {$limit}" ;
198
199 $res = wfQuery( $sql, DB_READ, $fname );
200
201 $top = getMaintenancePageBacklink( "brokenredirects" );
202 $top .= "<p>".wfMsg("brokenredirectstext")."</p><br>\n";
203 $top .= wfShowingResults( $offset, $limit );
204 $wgOut->addHTML( "<p>{$top}\n" );
205
206 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
207 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=brokenredirects" , $sl ) ;
208 $wgOut->addHTML( "<br>{$sl}\n" );
209
210 $sk = $wgUser->getSkin();
211 $s = "<ol start=" . ( $offset + 1 ) . ">";
212 while ( $obj = wfFetchObject( $res ) ) {
213 $l1 = $sk->makeKnownLink ( $obj->cur_title , "" , "redirect=no" ) ;
214 $l2 = $sk->makeBrokenLink ( $obj->cur_title , "(".wfMsg("qbedit").")" , "redirect=no" ) ;
215 $l3 = $sk->makeBrokenLink ( $obj->bl_to , "" , "redirect=no" ) ;
216 $s .= "<li>{$l1} {$l2} => {$l3}</li>\n" ;
217 }
218 wfFreeResult( $res );
219 $s .= "</ol>";
220 $wgOut->addHTML( $s );
221 $wgOut->addHTML( "<p>{$sl}\n" );
222 }
223
224 # This doesn't really work anymore, because self-links are now displayed as
225 # unlinked bold text, and are not entered into the link table.
226 function wfSpecialSelfLinks()
227 {
228 global $wgUser, $wgOut, $wgLang, $wgTitle;
229 $fname = "wfSpecialSelfLinks";
230
231 list( $limit, $offset ) = wfCheckLimits();
232
233 $sql = "SELECT cur_namespace,cur_title FROM cur,links " .
234 "WHERE l_from=l_to AND l_to=cur_id " .
235 "LIMIT {$offset}, {$limit}";
236
237 $res = wfQuery( $sql, DB_READ, $fname );
238
239 $top = getMaintenancePageBacklink( "selflinks" );
240 $top .= "<p>".wfMsg("selflinkstext")."</p><br>\n";
241 $top .= wfShowingResults( $offset, $limit );
242 $wgOut->addHTML( "<p>{$top}\n" );
243
244 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
245 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=selflinks" , $sl ) ;
246 $wgOut->addHTML( "<br>{$sl}\n" );
247
248 $sk = $wgUser->getSkin();
249 $s = "<ol start=" . ( $offset + 1 ) . ">";
250 while ( $obj = wfFetchObject( $res ) ) {
251 $title = Title::makeTitle( $obj->cur_namespace, $obj->cur_title );
252 $s .= "<li>".$sk->makeKnownLinkObj( $title )."</li>\n" ;
253 }
254 wfFreeResult( $res );
255 $s .= "</ol>";
256 $wgOut->addHTML( $s );
257 $wgOut->addHTML( "<p>{$sl}\n" );
258 }
259
260 function wfSpecialMispeelings ()
261 {
262 global $wgUser, $wgOut, $wgLang, $wgTitle;
263 $sk = $wgUser->getSkin();
264 $fname = "wfSpecialMispeelings";
265
266 list( $limit, $offset ) = wfCheckLimits();
267
268 # Determine page name
269 $ms = wfMsg ( "mispeelingspage" ) ;
270 $mss = wfStrencode( str_replace ( " " , "_" , $ms ) );
271 $msp = $wgLang->getNsText(4).":".$ms ;
272 $msl = $sk->makeKnownLink ( $msp ) ;
273
274 # Load list from database
275 $sql = "SELECT cur_text FROM cur WHERE cur_title='{$mss}' AND cur_namespace=4" ;
276 $res = wfQuery( $sql, DB_READ, $fname );
277 $obj = wfFetchObject ( $res ) ;
278 $l = $obj->cur_text ;
279 $l = explode ( "\n" , $l ) ;
280 $a = array () ;
281 foreach ( $l as $x )
282 if ( substr ( trim ( $x ) , 0 , 1 ) == "*" )
283 $a[] = strtolower ( trim ( substr ( trim ( $x ) , 1 ) ) );
284 asort ( $a ) ;
285
286 $cnt = 0 ;
287 $b = array () ;
288 foreach ( $a AS $x ) {
289 if ( $cnt < $offset+$limit && $x != "" ) {
290 $y = $x ;
291 $x = preg_replace( '/^(\S+).*$/', '$1', $x );
292 #$sql = "SELECT DISTINCT cur_title FROM cur WHERE cur_namespace=0 AND cur_is_redirect=0 AND (MATCH(cur_ind_text) AGAINST ('" . wfStrencode( $wgLang->stripForSearch( $x ) ) . "'))" ;
293 $sql = "SELECT DISTINCT cur_title FROM cur,searchindex WHERE cur_id=si_page AND cur_namespace=0 AND cur_is_redirect=0 AND (MATCH(si_text) AGAINST ('" . wfStrencode( $wgLang->stripForSearch( $x ) ) . "'))" ;
294 $res = wfQuery( $sql, DB_READ, $fname );
295 while ( $obj = wfFetchObject ( $res ) ) {
296 if ( $cnt >= $offset AND $cnt < $offset+$limit ) {
297 if ( $y != "" ) {
298 if ( count ( $b ) > 0 ) $b[] = "</OL>\n" ;
299 $b[] = "<H3>{$y}</H3>\n<OL start=".($cnt+1).">\n" ;
300 $y = "" ;
301 }
302 $b[] = "<li>".
303 $sk->makeKnownLink ( $obj->cur_title ).
304 " (".
305 $sk->makeBrokenLink ( $obj->cur_title , wfMsg ( "qbedit" ) ).
306 ")</li>\n" ;
307 }
308 $cnt++ ;
309 }
310 }
311 }
312 $top = getMaintenancePageBacklink( "mispeelings" );
313 $top .= "<p>".wfMsg( "mispeelingstext", $msl )."</p><br>\n";
314 $top .= wfShowingResults( $offset, $limit );
315 $wgOut->addHTML( "<p>{$top}\n" );
316
317 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
318 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=mispeelings" , $sl ) ;
319 $wgOut->addHTML( "<br>{$sl}\n" );
320
321 $s = implode ( "" , $b ) ;
322 if ( count ( $b ) > 0 ) $s .= "</ol>";
323 $wgOut->addHTML( $s );
324 $wgOut->addHTML( "<p>{$sl}\n" );
325 }
326
327
328 function wfSpecialMissingLanguageLinks()
329 {
330 global $wgUser, $wgOut, $wgLang, $wgTitle, $wgRequest;
331
332 $fname = "wfSpecialMissingLanguageLinks";
333 $thelang = $wgRequest->getText( 'thelang' );
334 if ( $thelang == "w" ) $thelang = "en" ; # Fix for international wikis
335
336 list( $limit, $offset ) = wfCheckLimits();
337
338 $sql = "SELECT cur_title FROM cur " .
339 "WHERE cur_namespace=0 AND cur_is_redirect=0 " .
340 "AND cur_title NOT LIKE '%/%' AND cur_text NOT LIKE '%[[{$thelang}:%' " .
341 "LIMIT {$offset}, {$limit}";
342
343 $res = wfQuery( $sql, DB_READ, $fname );
344
345
346 $mll = wfMsg( "missinglanguagelinkstext", $wgLang->getLanguageName($thelang) );
347
348 $top = getMaintenancePageBacklink( "missinglanguagelinks" );
349 $top .= "<p>$mll</p><br>";
350 $top .= wfShowingResults( $offset, $limit );
351 $wgOut->addHTML( "<p>{$top}\n" );
352
353 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
354 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=missinglanguagelinks&thelang={$thelang}" , $sl ) ;
355 $wgOut->addHTML( "<br>{$sl}\n" );
356
357 $sk = $wgUser->getSkin();
358 $s = "<ol start=" . ( $offset + 1 ) . ">";
359 while ( $obj = wfFetchObject( $res ) )
360 $s .= "<li>".$sk->makeKnownLink ( $obj->cur_title )."</li>\n" ;
361 wfFreeResult( $res );
362 $s .= "</ol>";
363 $wgOut->addHTML( $s );
364 $wgOut->addHTML( "<p>{$sl}\n" );
365 }
366
367 ?>