New date formatter
[lhc/web/wiklou.git] / includes / SpecialMaintenance.php
1 <?
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, $subfunction, $wgLanguageCode, $submitmll;
13 global $wgMiserMode;
14 if ( $wgMiserMode ) {
15 $wgOut->addWikiText( wfMsg( "perfdisabled" ) );
16 return;
17 }
18
19 if( $par )
20 $subfunction = $par;
21 else
22 $subfunction = $_REQUEST['subfunction'];
23
24 if ( $subfunction == "disambiguations" ) return wfSpecialDisambiguations() ;
25 if ( $subfunction == "doubleredirects" ) return wfSpecialDoubleRedirects() ;
26 if ( $subfunction == "brokenredirects" ) return wfSpecialBrokenRedirects() ;
27 if ( $subfunction == "selflinks" ) return wfSpecialSelfLinks() ;
28 if ( $subfunction == "mispeelings" ) return wfSpecialMispeelings() ;
29 if ( $subfunction == "missinglanguagelinks" ) return wfSpecialMissingLanguageLinks() ;
30 if ( isset ( $submitmll ) ) return wfSpecialMissingLanguageLinks() ;
31
32 $sk = $wgUser->getSkin();
33 $ns = $wgLang->getNamespaces() ;
34 $r = wfMsg("maintnancepagetext") ;
35 $r .= "<UL>\n" ;
36 $r .= "<li>".getMPL("disambiguations")."</li>\n" ;
37 $r .= "<li>".getMPL("doubleredirects")."</li>\n" ;
38 $r .= "<li>".getMPL("brokenredirects")."</li>\n" ;
39 $r .= "<li>".getMPL("selflinks")."</li>\n" ;
40 $r .= "<li>".getMPL("mispeelings")."</li>\n" ;
41
42 $r .= "<li>";
43 $l = getMPL("missinglanguagelinks");
44 $l = str_replace ( "</a>" , "" , $l ) ;
45 $l = str_replace ( "<a " , "<FORM method=post " , $l ) ;
46 $l = explode ( ">" , $l ) ;
47 $l = $l[0] ;
48 $r .= $l.">\n" ;
49 $r .= "<input type=submit name='submitmll' value='" ;
50 $r .= htmlspecialchars(wfMsg("missinglanguagelinksbutton"), ENT_QUOTES);
51 $r .= "'>\n" ;
52 $r .= "<select name=thelang>\n" ;
53 $a = $wgLang->getLanguageNames();
54 $ak = array_keys ( $a ) ;
55 foreach ( $ak AS $k ) {
56 if ( $k != $wgLanguageCode )
57 $r .= "<option value='{$k}'>{$a[$k]}</option>\n" ;
58 }
59 $r .= "</select>\n" ;
60 $r .= "</FORM>\n</li>" ;
61
62 $r .= "</UL>\n" ;
63 $wgOut->addHTML ( $r ) ;
64 }
65
66 function getMPL ( $x )
67 {
68 global $wgUser , $wgLang;
69 $sk = $wgUser->getSkin() ;
70 return $sk->makeKnownLink(sns().":Maintenance",wfMsg($x),"subfunction={$x}") ;
71 }
72
73 function getMaintenancePageBacklink()
74 {
75 global $wgUser , $wgLang , $subfunction ;
76 $sk = $wgUser->getSkin() ;
77 $ns = $wgLang->getNamespaces() ;
78 $r = $sk->makeKnownLink (
79 $ns[-1].":Maintenance",
80 wfMsg("maintenancebacklink") ) ;
81 $t = wfMsg ( $subfunction ) ;
82
83 $s = "<table width=100% border=0><tr><td>";
84 $s .= "<h2>{$t}</h2></td><td align=right>";
85 $s .= "{$r}</td></tr></table>\n" ;
86 return $s ;
87 }
88
89
90 function wfSpecialDisambiguations()
91 {
92 global $wgUser, $wgOut, $wgLang, $wgTitle;
93 $fname = "wfSpecialDisambiguations";
94
95 list( $limit, $offset ) = wfCheckLimits();
96
97 $dp = wfStrencode( wfMsg("disambiguationspage") );
98
99 $sql = "SELECT la.l_from,la.l_to,"
100 . " lb.l_from AS source,lb.l_to AS dest,"
101 . " c.cur_id, c.cur_title AS dt"
102 . " FROM links AS la, links AS lb, cur AS c, cur AS d"
103 . " WHERE la.l_from='{$dp}'"
104 . " AND la.l_to=lb.l_to"
105 . " AND la.l_from<>lb.l_from"
106 . " AND c.cur_id=lb.l_to"
107 . " AND c.cur_namespace=0"
108 . " AND d.cur_title=lb.l_from"
109 . " AND d.cur_namespace=0"
110 . " LIMIT {$offset}, {$limit}";
111
112 $res = wfQuery( $sql, DB_READ, $fname );
113
114 $sk = $wgUser->getSkin();
115
116 $top = "<p>".wfMsg( "disambiguationstext", $sk->makeKnownLink( $dp ) )."</p><br>\n";
117 $top = getMaintenancePageBacklink() . $top;
118 $top .= wfShowingResults( $offset, $limit );
119 $wgOut->addHTML( "<p>{$top}\n" );
120
121 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
122 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=disambiguations" , $sl ) ;
123 $wgOut->addHTML( "<br>{$sl}\n" );
124
125 $s = "<ol start=" . ( $offset + 1 ) . ">";
126 while ( $obj = wfFetchObject( $res ) ) {
127 $l1 = $sk->makeKnownLink ( $obj->source , "" , "redirect=no" ) ;
128 $l2 = $sk->makeKnownLink ( $obj->dt ) ;
129 $l3 = $sk->makeBrokenLink ( $obj->source , "(".wfMsg("qbedit").")" , "redirect=no" ) ;
130 $s .= "<li>{$l1} {$l3} => {$l2}</li>\n" ;
131 }
132 wfFreeResult( $res );
133 $s .= "</ol>";
134 $wgOut->addHTML( $s );
135 $wgOut->addHTML( "<p>{$sl}\n" );
136 }
137
138 function wfSpecialDoubleRedirects()
139 {
140 global $wgUser, $wgOut, $wgLang, $wgTitle;
141 $fname = "wfSpecialDoubleRedirects";
142
143 list( $limit, $offset ) = wfCheckLimits();
144
145 $sql = "SELECT l_from,l_to,cb.cur_text AS rt,cb.cur_title AS ti FROM links,cur AS ca, cur AS cb WHERE ca.cur_is_redirect=1 AND cb.cur_is_redirect=1 AND l_to=cb.cur_id AND l_from=ca.cur_title AND ca.cur_namespace=0 LIMIT {$offset}, {$limit}" ;
146
147 $res = wfQuery( $sql, DB_READ, $fname );
148
149 $top = getMaintenancePageBacklink();
150 $top .= "<p>".wfMsg("doubleredirectstext")."</p><br>\n";
151 $top .= wfShowingResults( $offset, $limit );
152 $wgOut->addHTML( "<p>{$top}\n" );
153
154 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
155 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=doubleredirects" , $sl ) ;
156 $wgOut->addHTML( "<br>{$sl}\n" );
157
158 $sk = $wgUser->getSkin();
159 $s = "<ol start=" . ( $offset + 1 ) . ">";
160 while ( $obj = wfFetchObject( $res ) ) {
161 $n = explode ( "\n" , $obj->rt ) ;
162 $n = $n[0] ;
163 $l1 = $sk->makeKnownLink ( $obj->l_from , "" , "redirect=no" ) ;
164 $l2 = $sk->makeKnownLink ( $obj->ti , "" , "redirect=no" ) ;
165 $l3 = $sk->makeBrokenLink ( $obj->l_from , "(".wfMsg("qbedit").")" , "redirect=no" ) ;
166 $s .= "<li>{$l1} {$l3} => {$l2} (\"{$n}\")</li>\n" ;
167 }
168 wfFreeResult( $res );
169 $s .= "</ol>";
170 $wgOut->addHTML( $s );
171 $wgOut->addHTML( "<p>{$sl}\n" );
172 }
173
174 function wfSpecialBrokenRedirects()
175 {
176 global $wgUser, $wgOut, $wgLang, $wgTitle;
177 $fname = "wfSpecialBrokenRedirects";
178
179 list( $limit, $offset ) = wfCheckLimits();
180
181 $sql = "SELECT bl_to,cur_title FROM brokenlinks,cur WHERE cur_is_redirect=1 AND cur_namespace=0 AND bl_from=cur_id LIMIT {$offset}, {$limit}" ;
182
183 $res = wfQuery( $sql, DB_READ, $fname );
184
185 $top = getMaintenancePageBacklink();
186 $top .= "<p>".wfMsg("brokenredirectstext")."</p><br>\n";
187 $top .= wfShowingResults( $offset, $limit );
188 $wgOut->addHTML( "<p>{$top}\n" );
189
190 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
191 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=brokenredirects" , $sl ) ;
192 $wgOut->addHTML( "<br>{$sl}\n" );
193
194 $sk = $wgUser->getSkin();
195 $s = "<ol start=" . ( $offset + 1 ) . ">";
196 while ( $obj = wfFetchObject( $res ) ) {
197 $l1 = $sk->makeKnownLink ( $obj->cur_title , "" , "redirect=no" ) ;
198 $l2 = $sk->makeBrokenLink ( $obj->cur_title , "(".wfMsg("qbedit").")" , "redirect=no" ) ;
199 $l3 = $sk->makeBrokenLink ( $obj->bl_to , "" , "redirect=no" ) ;
200 $s .= "<li>{$l1} {$l2} => {$l3}</li>\n" ;
201 }
202 wfFreeResult( $res );
203 $s .= "</ol>";
204 $wgOut->addHTML( $s );
205 $wgOut->addHTML( "<p>{$sl}\n" );
206 }
207
208 function wfSpecialSelfLinks()
209 {
210 global $wgUser, $wgOut, $wgLang, $wgTitle;
211 $fname = "wfSpecialSelfLinks";
212
213 list( $limit, $offset ) = wfCheckLimits();
214
215 $sql = "SELECT cur_title FROM cur,links WHERE cur_is_redirect=0 AND cur_namespace=0 AND l_from=cur_title AND l_to=cur_id LIMIT {$offset}, {$limit}";
216
217 $res = wfQuery( $sql, DB_READ, $fname );
218
219 $top = getMaintenancePageBacklink();
220 $top .= "<p>".wfMsg("selflinkstext")."</p><br>\n";
221 $top .= wfShowingResults( $offset, $limit );
222 $wgOut->addHTML( "<p>{$top}\n" );
223
224 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
225 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=selflinks" , $sl ) ;
226 $wgOut->addHTML( "<br>{$sl}\n" );
227
228 $sk = $wgUser->getSkin();
229 $s = "<ol start=" . ( $offset + 1 ) . ">";
230 while ( $obj = wfFetchObject( $res ) )
231 $s .= "<li>".$sk->makeKnownLink ( $obj->cur_title )."</li>\n" ;
232 wfFreeResult( $res );
233 $s .= "</ol>";
234 $wgOut->addHTML( $s );
235 $wgOut->addHTML( "<p>{$sl}\n" );
236 }
237
238 function wfSpecialMispeelings ()
239 {
240 global $wgUser, $wgOut, $wgLang, $wgTitle;
241 $sk = $wgUser->getSkin();
242 $fname = "wfSpecialMispeelings";
243
244 list( $limit, $offset ) = wfCheckLimits();
245
246 # Determine page name
247 $ms = wfMsg ( "mispeelingspage" ) ;
248 $mss = wfStrencode( str_replace ( " " , "_" , $ms ) );
249 $msp = $wgLang->getNsText(4).":".$ms ;
250 $msl = $sk->makeKnownLink ( $msp ) ;
251
252 # Load list from database
253 $sql = "SELECT cur_text FROM cur WHERE cur_title='{$mss}' AND cur_namespace=4" ;
254 $res = wfQuery( $sql, DB_READ, $fname );
255 $obj = wfFetchObject ( $res ) ;
256 $l = $obj->cur_text ;
257 $l = explode ( "\n" , $l ) ;
258 $a = array () ;
259 foreach ( $l as $x )
260 if ( substr ( trim ( $x ) , 0 , 1 ) == "*" )
261 $a[] = strtolower ( trim ( substr ( trim ( $x ) , 1 ) ) );
262 asort ( $a ) ;
263
264 $cnt = 0 ;
265 $b = array () ;
266 foreach ( $a AS $x ) {
267 if ( $cnt < $offset+$limit && $x != "" ) {
268 $y = $x ;
269 $x = preg_replace( '/^(\S+).*$/', '$1', $x );
270 #$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 ) ) . "'))" ;
271 $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 ) ) . "'))" ;
272 $res = wfQuery( $sql, DB_READ, $fname );
273 while ( $obj = wfFetchObject ( $res ) ) {
274 if ( $cnt >= $offset AND $cnt < $offset+$limit ) {
275 if ( $y != "" ) {
276 if ( count ( $b ) > 0 ) $b[] = "</OL>\n" ;
277 $b[] = "<H3>{$y}</H3>\n<OL start=".($cnt+1).">\n" ;
278 $y = "" ;
279 }
280 $b[] = "<li>".
281 $sk->makeKnownLink ( $obj->cur_title ).
282 " (".
283 $sk->makeBrokenLink ( $obj->cur_title , wfMsg ( "qbedit" ) ).
284 ")</li>\n" ;
285 }
286 $cnt++ ;
287 }
288 }
289 }
290 $top = getMaintenancePageBacklink();
291 $top .= "<p>".wfMsg( "mispeelingstext", $msl )."</p><br>\n";
292 $top .= wfShowingResults( $offset, $limit );
293 $wgOut->addHTML( "<p>{$top}\n" );
294
295 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
296 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=mispeelings" , $sl ) ;
297 $wgOut->addHTML( "<br>{$sl}\n" );
298
299 $s = implode ( "" , $b ) ;
300 if ( count ( $b ) > 0 ) $s .= "</ol>";
301 $wgOut->addHTML( $s );
302 $wgOut->addHTML( "<p>{$sl}\n" );
303 }
304
305
306 function wfSpecialMissingLanguageLinks()
307 {
308 global $wgUser, $wgOut, $wgLang, $wgTitle, $thelang, $subfunction;
309 $fname = "wfSpecialMissingLanguageLinks";
310 $subfunction = "missinglanguagelinks" ;
311 if ( $thelang == "w" ) $thelang = "en" ; # Fix for international wikis
312
313 list( $limit, $offset ) = wfCheckLimits();
314
315 $sql = "SELECT cur_title FROM cur WHERE cur_namespace=0 AND cur_is_redirect=0 AND cur_title NOT LIKE '%/%' AND cur_text NOT LIKE '%[[{$thelang}:%' LIMIT {$offset}, {$limit}";
316
317 $res = wfQuery( $sql, DB_READ, $fname );
318
319
320 $mll = wfMsg( "missinglanguagelinkstext", $wgLang->getLanguageName($thelang) );
321
322 $top = getMaintenancePageBacklink();
323 $top .= "<p>$mll</p><br>";
324 $top .= wfShowingResults( $offset, $limit );
325 $wgOut->addHTML( "<p>{$top}\n" );
326
327 $sl = wfViewPrevNext( $offset, $limit, "REPLACETHIS" ) ;
328 $sl = str_replace ( "REPLACETHIS" , sns().":Maintenance&subfunction=missinglanguagelinks&thelang={$thelang}" , $sl ) ;
329 $wgOut->addHTML( "<br>{$sl}\n" );
330
331 $sk = $wgUser->getSkin();
332 $s = "<ol start=" . ( $offset + 1 ) . ">";
333 while ( $obj = wfFetchObject( $res ) )
334 $s .= "<li>".$sk->makeKnownLink ( $obj->cur_title )."</li>\n" ;
335 wfFreeResult( $res );
336 $s .= "</ol>";
337 $wgOut->addHTML( $s );
338 $wgOut->addHTML( "<p>{$sl}\n" );
339 }
340
341 ?>