Index: trunk/extensions/intersection/DynamicPageList.php |
— | — | @@ -1,6 +1,6 @@ |
2 | 2 | <?php |
3 | 3 | /* |
4 | | - |
| 4 | + |
5 | 5 | Purpose: outputs a bulleted list of most recent |
6 | 6 | items residing in a category, or a union |
7 | 7 | of several categories. |
— | — | @@ -26,41 +26,52 @@ |
27 | 27 | |
28 | 28 | Current feature request list |
29 | 29 | 1. Unset cached of calling page |
30 | | - 4. RSS feed output? (GNSM extension?) |
| 30 | + 2. RSS feed output? (GNSM extension?) |
31 | 31 | |
32 | 32 | To install, add following to LocalSettings.php |
33 | | - include("extensions/intersection/DynamicPageList.php"); |
| 33 | + include("$IP/extensions/intersection/DynamicPageList.php"); |
34 | 34 | |
35 | 35 | */ |
36 | 36 | |
37 | | -$wgDLPmaxCategories = 6; // Maximum number of categories to look for |
38 | | -$wgDLPMaxResultCount = 200; // Maximum number of results to allow |
39 | | -$wgDLPAllowUnlimitedResults = false; // Allow unlimited results |
40 | | -$wgDLPAllowUnlimitedCategories = false; // Allow unlimited categories |
| 37 | +if ( !defined( 'MEDIAWIKI' ) ) { |
| 38 | + die( 'This is not a valid entry point to MediaWiki.' ); |
| 39 | +} |
41 | 40 | |
42 | | -$wgHooks['ParserFirstCallInit'][] = 'wfDynamicPageList'; |
43 | | - |
| 41 | +// Extension credits that will show up on Special:Version |
44 | 42 | $wgExtensionCredits['parserhook'][] = array( |
45 | 43 | 'path' => __FILE__, |
46 | 44 | 'name' => 'DynamicPageList', |
| 45 | + 'version' => '1.5', |
47 | 46 | 'descriptionmsg' => 'intersection-desc', |
48 | 47 | 'url' => 'http://www.mediawiki.org/wiki/Extension:Intersection', |
49 | 48 | 'author' => array( '[http://en.wikinews.org/wiki/User:Amgine Amgine]', '[http://en.wikinews.org/wiki/User:IlyaHaykinson IlyaHaykinson]' ), |
50 | 49 | ); |
51 | 50 | |
52 | | -$dir = dirname(__FILE__) . '/'; |
| 51 | +// Internationalization file |
| 52 | +$dir = dirname( __FILE__ ) . '/'; |
53 | 53 | $wgExtensionMessagesFiles['DynamicPageList'] = $dir . 'DynamicPageList.i18n.php'; |
54 | 54 | |
| 55 | +# Configuration variables |
| 56 | +$wgDLPmaxCategories = 6; // Maximum number of categories to look for |
| 57 | +$wgDLPMaxResultCount = 200; // Maximum number of results to allow |
| 58 | +$wgDLPAllowUnlimitedResults = false; // Allow unlimited results |
| 59 | +$wgDLPAllowUnlimitedCategories = false; // Allow unlimited categories |
| 60 | + |
| 61 | +$wgHooks['ParserFirstCallInit'][] = 'wfDynamicPageList'; |
| 62 | +/** |
| 63 | + * Set up the <DynamicPageList> tag. |
| 64 | + * |
| 65 | + * @param $parser Object: instance of Parser |
| 66 | + * @return Boolean: true |
| 67 | + */ |
55 | 68 | function wfDynamicPageList( &$parser ) { |
56 | | - $parser->setHook( "DynamicPageList", "DynamicPageList" ); |
| 69 | + $parser->setHook( 'DynamicPageList', 'renderDynamicPageList' ); |
57 | 70 | return true; |
58 | 71 | } |
59 | 72 | |
60 | 73 | // The callback function for converting the input text to HTML output |
61 | | -function DynamicPageList( $input ) { |
62 | | - global $wgUser; |
63 | | - global $wgLang; |
64 | | - global $wgContLang; |
| 74 | +function renderDynamicPageList( $input ) { |
| 75 | + global $wgUser, $wgLang, $wgContLang; |
65 | 76 | global $wgDisableCounters; // to determine if to allow sorting by #hits. |
66 | 77 | global $wgDLPmaxCategories, $wgDLPMaxResultCount; |
67 | 78 | global $wgDLPAllowUnlimitedResults, $wgDLPAllowUnlimitedCategories; |
— | — | @@ -90,9 +101,9 @@ |
91 | 102 | |
92 | 103 | $bNamespace = false; |
93 | 104 | $iNamespace = 0; |
94 | | - |
| 105 | + |
95 | 106 | $iOffset = 0; |
96 | | - |
| 107 | + |
97 | 108 | $bGoogleHack = false; |
98 | 109 | |
99 | 110 | $bSuppressErrors = false; |
— | — | @@ -105,38 +116,44 @@ |
106 | 117 | $aCategories = array(); |
107 | 118 | $aExcludeCategories = array(); |
108 | 119 | |
109 | | - $aParams = explode("\n", $input); |
| 120 | + $aParams = explode( "\n", $input ); |
110 | 121 | |
111 | 122 | $parser = new Parser; |
112 | 123 | $poptions = new ParserOptions; |
113 | 124 | |
114 | 125 | foreach ( $aParams as $sParam ) { |
115 | | - $aParam = explode( "=", $sParam, 2 ); |
| 126 | + $aParam = explode( '=', $sParam, 2 ); |
116 | 127 | if( count( $aParam ) < 2 ) { |
117 | 128 | continue; |
118 | 129 | } |
119 | | - $sType = trim($aParam[0]); |
120 | | - $sArg = trim($aParam[1]); |
| 130 | + $sType = trim( $aParam[0] ); |
| 131 | + $sArg = trim( $aParam[1] ); |
121 | 132 | switch ( $sType ) { |
122 | 133 | case 'category': |
123 | | - $title = Title::newFromText( $parser->transformMsg($sArg, $poptions) ); |
124 | | - if( is_null( $title ) ) |
| 134 | + $title = Title::newFromText( |
| 135 | + $parser->transformMsg( $sArg, $poptions ) |
| 136 | + ); |
| 137 | + if( is_null( $title ) ) { |
125 | 138 | continue; |
| 139 | + } |
126 | 140 | $aCategories[] = $title; |
127 | 141 | break; |
128 | 142 | case 'notcategory': |
129 | | - $title = Title::newFromText( $parser->transformMsg($sArg, $poptions) ); |
130 | | - if( is_null( $title ) ) |
| 143 | + $title = Title::newFromText( |
| 144 | + $parser->transformMsg( $sArg, $poptions ) |
| 145 | + ); |
| 146 | + if( is_null( $title ) ) { |
131 | 147 | continue; |
| 148 | + } |
132 | 149 | $aExcludeCategories[] = $title; |
133 | 150 | break; |
134 | 151 | case 'namespace': |
135 | | - $ns = $wgContLang->getNsIndex($sArg); |
136 | | - if ( null != $ns ) { |
| 152 | + $ns = $wgContLang->getNsIndex( $sArg ); |
| 153 | + if ( $ns != null ) { |
137 | 154 | $iNamespace = $ns; |
138 | 155 | $bNamespace = true; |
139 | 156 | } else { |
140 | | - $iNamespace = intval($sArg); |
| 157 | + $iNamespace = intval( $sArg ); |
141 | 158 | if ( $iNamespace >= 0 ) { |
142 | 159 | $bNamespace = true; |
143 | 160 | } else { |
— | — | @@ -145,21 +162,21 @@ |
146 | 163 | } |
147 | 164 | break; |
148 | 165 | case 'count': |
149 | | - //ensure that $iCount is a number; |
150 | | - $iCount = IntVal( $sArg ); |
| 166 | + // ensure that $iCount is a number; |
| 167 | + $iCount = intval( $sArg ); |
151 | 168 | $bCountSet = true; |
152 | 169 | break; |
153 | 170 | case 'offset': |
154 | | - $iOffset = IntVal( $sArg ); |
| 171 | + $iOffset = intval( $sArg ); |
155 | 172 | break; |
156 | 173 | case 'imagewidth': |
157 | | - $iGalleryImageWidth = IntVal( $sArg ); |
| 174 | + $iGalleryImageWidth = intval( $sArg ); |
158 | 175 | break; |
159 | 176 | case 'imageheight': |
160 | | - $iGalleryImageHeight = IntVal( $sArg ); |
| 177 | + $iGalleryImageHeight = intval( $sArg ); |
161 | 178 | break; |
162 | 179 | case 'imagesperrow': |
163 | | - $iGalleryNumbRows = IntVal( $sArg ); |
| 180 | + $iGalleryNumbRows = intval( $sArg ); |
164 | 181 | break; |
165 | 182 | case 'mode': |
166 | 183 | switch ( $sArg ) { |
— | — | @@ -186,7 +203,7 @@ |
187 | 204 | $bInlineMode = false; |
188 | 205 | break; |
189 | 206 | case 'inline': |
190 | | - //aka comma seperated list |
| 207 | + // aka comma seperated list |
191 | 208 | $sStartList = ''; |
192 | 209 | $sEndList = ''; |
193 | 210 | $sStartItem = ''; |
— | — | @@ -205,7 +222,7 @@ |
206 | 223 | case 'gallerycaption': |
207 | 224 | // Should perhaps actually parse caption instead |
208 | 225 | // as links and what not in caption might be useful. |
209 | | - $sGalleryCaption = $parser->transformMsg( $sArg, $poptions ); |
| 226 | + $sGalleryCaption = $parser->transformMsg( $sArg, $poptions ); |
210 | 227 | break; |
211 | 228 | case 'galleryshowfilesize': |
212 | 229 | switch ( $sArg ) { |
— | — | @@ -316,14 +333,14 @@ |
317 | 334 | } |
318 | 335 | break; |
319 | 336 | case 'suppresserrors': |
320 | | - if ( 'true' == $sArg ) { |
| 337 | + if ( $sArg == 'true' ) { |
321 | 338 | $bSuppressErrors = true; |
322 | 339 | } else { |
323 | 340 | $bSuppressErrors = false; |
324 | 341 | } |
325 | 342 | break; |
326 | 343 | case 'addfirstcategorydate': |
327 | | - if ( 'true' == $sArg ) { |
| 344 | + if ( $sArg == 'true' ) { |
328 | 345 | $bAddFirstCategoryDate = true; |
329 | 346 | } elseif ( preg_match( '/^(?:[ymd]{2,3}|ISO 8601)$/', $sArg ) ) { |
330 | 347 | // if it more or less is valid dateformat. |
— | — | @@ -359,12 +376,12 @@ |
360 | 377 | } // end main switch() |
361 | 378 | } // end foreach() |
362 | 379 | |
363 | | - $iCatCount = count($aCategories); |
364 | | - $iExcludeCatCount = count($aExcludeCategories); |
| 380 | + $iCatCount = count( $aCategories ); |
| 381 | + $iExcludeCatCount = count( $aExcludeCategories ); |
365 | 382 | $iTotalCatCount = $iCatCount + $iExcludeCatCount; |
366 | 383 | |
367 | 384 | if ( $iCatCount < 1 && false == $bNamespace ) { |
368 | | - if ( false == $bSuppressErrors ) { |
| 385 | + if ( $bSuppressErrors == false ) { |
369 | 386 | return htmlspecialchars( wfMsg( 'intersection_noincludecats' ) ); // "!!no included categories!!"; |
370 | 387 | } else { |
371 | 388 | return ''; |
— | — | @@ -372,7 +389,7 @@ |
373 | 390 | } |
374 | 391 | |
375 | 392 | if ( $iTotalCatCount > $wgDLPmaxCategories && !$wgDLPAllowUnlimitedCategories ) { |
376 | | - if ( false == $bSuppressErrors ) { |
| 393 | + if ( $bSuppressErrors == false ) { |
377 | 394 | return htmlspecialchars( wfMsg( 'intersection_toomanycats' ) ); // "!!too many categories!!"; |
378 | 395 | } else { |
379 | 396 | return ''; |
— | — | @@ -391,7 +408,7 @@ |
392 | 409 | $bCountSet = true; |
393 | 410 | } |
394 | 411 | |
395 | | - //disallow showing date if the query doesn't have an inclusion category parameter |
| 412 | + // disallow showing date if the query doesn't have an inclusion category parameter |
396 | 413 | if ( $iCatCount < 1 ) { |
397 | 414 | $bAddFirstCategoryDate = false; |
398 | 415 | // don't sort by fields relating to categories if there are no categories. |
— | — | @@ -400,83 +417,86 @@ |
401 | 418 | } |
402 | 419 | } |
403 | 420 | |
404 | | - |
405 | | - //build the SQL query |
| 421 | + // build the SQL query |
406 | 422 | $dbr = wfGetDB( DB_SLAVE ); |
407 | | - $aTables = Array( 'page' ); |
408 | | - $aFields = Array( 'page_namespace', 'page_title' ); |
409 | | - $aWhere = Array(); |
410 | | - $aJoin = Array(); |
411 | | - $aOptions = Array(); |
| 423 | + $tables = array( 'page' ); |
| 424 | + $fields = array( 'page_namespace', 'page_title' ); |
| 425 | + $where = array(); |
| 426 | + $join = array(); |
| 427 | + $options = array(); |
412 | 428 | |
413 | 429 | if ( $bGoogleHack ) { |
414 | | - $aFields[] = 'page_id'; |
| 430 | + $fields[] = 'page_id'; |
415 | 431 | } |
416 | 432 | |
417 | 433 | if ( $bAddFirstCategoryDate ) { |
418 | | - $aFields[] = 'c1.cl_timestamp'; |
| 434 | + $fields[] = 'c1.cl_timestamp'; |
419 | 435 | } |
420 | 436 | |
421 | | - if ( true == $bNamespace ) { |
422 | | - $aWhere['page_namespace'] = $iNamespace; |
| 437 | + if ( $bNamespace == true ) { |
| 438 | + $where['page_namespace'] = $iNamespace; |
423 | 439 | } |
424 | 440 | |
425 | 441 | // Bug 14943 - Allow filtering based on FlaggedRevs stability. |
426 | 442 | // Check if the extension actually exists before changing the query... |
427 | 443 | if ( function_exists( 'efLoadFlaggedRevs' ) && $bFlaggedRevs ) { |
428 | | - $aTables[] = 'flaggedpages'; |
429 | | - $aJoin['flaggedpages'] = Array( 'LEFT JOIN', 'page_id = fp_page_id' ); |
| 444 | + $tables[] = 'flaggedpages'; |
| 445 | + $join['flaggedpages'] = array( 'LEFT JOIN', 'page_id = fp_page_id' ); |
430 | 446 | |
431 | 447 | switch( $sStable ) { |
432 | 448 | case 'only': |
433 | | - $aWhere[] = 'fp_stable IS NOT NULL'; |
| 449 | + $where[] = 'fp_stable IS NOT NULL'; |
434 | 450 | break; |
435 | 451 | case 'exclude': |
436 | | - $aWhere['fp_stable'] = null; |
| 452 | + $where['fp_stable'] = null; |
437 | 453 | break; |
438 | 454 | } |
439 | 455 | |
440 | 456 | switch( $sQuality ) { |
441 | 457 | case 'only': |
442 | | - $aWhere[] = 'fp_quality >= 1'; |
| 458 | + $where[] = 'fp_quality >= 1'; |
443 | 459 | break; |
444 | 460 | case 'exclude': |
445 | | - $aWhere[] = 'fp_quality = 0 OR fp_quality IS NULL'; |
| 461 | + $where[] = 'fp_quality = 0 OR fp_quality IS NULL'; |
446 | 462 | break; |
447 | 463 | } |
448 | 464 | } |
449 | 465 | |
450 | 466 | switch ( $sRedirects ) { |
451 | 467 | case 'only': |
452 | | - $aWhere['page_is_redirect'] = 1; |
| 468 | + $where['page_is_redirect'] = 1; |
453 | 469 | break; |
454 | 470 | case 'exclude': |
455 | | - $aWhere['page_is_redirect'] = 0; |
| 471 | + $where['page_is_redirect'] = 0; |
456 | 472 | break; |
457 | 473 | } |
458 | 474 | |
459 | 475 | $iCurrentTableNumber = 1; |
460 | 476 | $categorylinks = $dbr->tableName( 'categorylinks' ); |
461 | 477 | |
462 | | - for ($i = 0; $i < $iCatCount; $i++) { |
463 | | - $aJoin["$categorylinks AS c$iCurrentTableNumber"] = Array( 'INNER JOIN', |
464 | | - Array( "page_id = c{$iCurrentTableNumber}.cl_from", |
| 478 | + for ( $i = 0; $i < $iCatCount; $i++ ) { |
| 479 | + $join["$categorylinks AS c$iCurrentTableNumber"] = array( |
| 480 | + 'INNER JOIN', |
| 481 | + array( |
| 482 | + "page_id = c{$iCurrentTableNumber}.cl_from", |
465 | 483 | "c{$iCurrentTableNumber}.cl_to={$dbr->addQuotes($aCategories[$i]->getDBKey())}" |
466 | 484 | ) |
467 | 485 | ); |
468 | | - $aTables[] = "$categorylinks AS c$iCurrentTableNumber"; |
| 486 | + $tables[] = "$categorylinks AS c$iCurrentTableNumber"; |
469 | 487 | |
470 | 488 | $iCurrentTableNumber++; |
471 | 489 | } |
472 | 490 | |
473 | | - for ($i = 0; $i < $iExcludeCatCount; $i++) { |
474 | | - $aJoin["$categorylinks AS c$iCurrentTableNumber"] = Array( 'LEFT OUTER JOIN', |
475 | | - Array( "page_id = c{$iCurrentTableNumber}.cl_from", |
476 | | - "c{$iCurrentTableNumber}.cl_to={$dbr->addQuotes($aExcludeCategories[$i]->getDBKey())}" |
| 491 | + for ( $i = 0; $i < $iExcludeCatCount; $i++ ) { |
| 492 | + $join["$categorylinks AS c$iCurrentTableNumber"] = array( |
| 493 | + 'LEFT OUTER JOIN', |
| 494 | + array( |
| 495 | + "page_id = c{$iCurrentTableNumber}.cl_from", |
| 496 | + "c{$iCurrentTableNumber}.cl_to={$dbr->addQuotes($aExcludeCategories[$i]->getDBKey())}" |
477 | 497 | ) |
478 | 498 | ); |
479 | | - $aTables[] = "$categorylinks AS c$iCurrentTableNumber"; |
480 | | - $aWhere["c{$iCurrentTableNumber}.cl_to"] = null; |
| 499 | + $tables[] = "$categorylinks AS c$iCurrentTableNumber"; |
| 500 | + $where["c{$iCurrentTableNumber}.cl_to"] = null; |
481 | 501 | $iCurrentTableNumber++; |
482 | 502 | } |
483 | 503 | |
— | — | @@ -508,28 +528,28 @@ |
509 | 529 | break; |
510 | 530 | } |
511 | 531 | |
512 | | - $aOptions['ORDER BY'] = "$sSqlSort $sSqlOrder"; |
| 532 | + $options['ORDER BY'] = "$sSqlSort $sSqlOrder"; |
513 | 533 | |
514 | 534 | if ( $bCountSet ) { |
515 | | - $aOptions['LIMIT'] = $iCount; |
| 535 | + $options['LIMIT'] = $iCount; |
516 | 536 | } |
517 | 537 | if ( $iOffset > 0 ) { |
518 | | - $aOptions['OFFSET'] = $iOffset; |
| 538 | + $options['OFFSET'] = $iOffset; |
519 | 539 | } |
520 | 540 | |
521 | 541 | // process the query |
522 | | - $res = $dbr->select( $aTables, $aFields, $aWhere, __METHOD__, $aOptions, $aJoin ); |
| 542 | + $res = $dbr->select( $tables, $fields, $where, __METHOD__, $options, $join ); |
523 | 543 | $sk = $wgUser->getSkin(); |
524 | 544 | |
525 | 545 | if ( $dbr->numRows( $res ) == 0 ) { |
526 | | - if ( false == $bSuppressErrors ) { |
| 546 | + if ( $bSuppressErrors == false ) { |
527 | 547 | return htmlspecialchars( wfMsg( 'intersection_noresults' ) ); |
528 | 548 | } else { |
529 | 549 | return ''; |
| 550 | + } |
530 | 551 | } |
531 | | - } |
532 | 552 | |
533 | | - //start unordered list |
| 553 | + // start unordered list |
534 | 554 | $output = $sStartList . "\n"; |
535 | 555 | |
536 | 556 | $categoryDate = ''; |
— | — | @@ -538,11 +558,12 @@ |
539 | 559 | $df = DateFormatter::getInstance(); |
540 | 560 | } |
541 | 561 | |
542 | | - //process results of query, outputing equivalent of <li>[[Article]]</li> for each result, |
543 | | - //or something similar if the list uses other startlist/endlist |
544 | | - $articleList = Array(); |
| 562 | + // process results of query, outputing equivalent of <li>[[Article]]</li> |
| 563 | + // for each result, or something similar if the list uses other |
| 564 | + // startlist/endlist |
| 565 | + $articleList = array(); |
545 | 566 | foreach ( $res as $row ) { |
546 | | - $title = Title::makeTitle( $row->page_namespace, $row->page_title); |
| 567 | + $title = Title::makeTitle( $row->page_namespace, $row->page_title ); |
547 | 568 | if ( true == $bAddFirstCategoryDate ) { |
548 | 569 | if ( $sDateFormat != '' ) { |
549 | 570 | # this is a tad ugly |
— | — | @@ -567,47 +588,57 @@ |
568 | 589 | |
569 | 590 | $query = array(); |
570 | 591 | |
571 | | - if ( true == $bGoogleHack ) { |
572 | | - $query['dpl_id'] = intval($row->page_id); |
| 592 | + if ( $bGoogleHack == true ) { |
| 593 | + $query['dpl_id'] = intval( $row->page_id ); |
573 | 594 | } |
574 | 595 | |
575 | | - if ( true == $bShowNamespace ) { |
| 596 | + if ( $bShowNamespace == true ) { |
576 | 597 | $titleText = $title->getPrefixedText(); |
577 | 598 | } else { |
578 | 599 | $titleText = $title->getText(); |
579 | 600 | } |
580 | 601 | |
581 | 602 | if ( $bUseGallery ) { |
582 | | - # Note, $categoryDate is treated as raw html |
583 | | - # this is safe since the only html present |
584 | | - # would come from the dateformatter <span>. |
585 | | - $gallery->add( $title, $categoryDate ); |
| 603 | + # Note, $categoryDate is treated as raw html |
| 604 | + # this is safe since the only html present |
| 605 | + # would come from the dateformatter <span>. |
| 606 | + $gallery->add( $title, $categoryDate ); |
586 | 607 | } else { |
587 | | - $articleList[] = $categoryDate |
588 | | - . $sk->link( $title, htmlspecialchars( $titleText ), $aLinkOptions, $query, array( 'forcearticlepath', 'known' ) ); |
| 608 | + $articleList[] = $categoryDate . |
| 609 | + $sk->link( |
| 610 | + $title, |
| 611 | + htmlspecialchars( $titleText ), |
| 612 | + $aLinkOptions, |
| 613 | + $query, |
| 614 | + array( 'forcearticlepath', 'known' ) |
| 615 | + ); |
589 | 616 | } |
590 | 617 | } |
591 | 618 | |
592 | | - //end unordered list |
| 619 | + // end unordered list |
593 | 620 | if ( $bUseGallery ) { |
594 | 621 | $gallery->setHideBadImages(); |
595 | 622 | $gallery->setShowFilename( $bGalleryFileName ); |
596 | 623 | $gallery->setShowBytes( $bGalleryFileSize ); |
597 | | - if ( $iGalleryImageHeight > 0 ) |
| 624 | + if ( $iGalleryImageHeight > 0 ) { |
598 | 625 | $gallery->setHeights( $iGalleryImageHeight ); |
599 | | - if ( $iGalleryImageWidth > 0 ) |
| 626 | + } |
| 627 | + if ( $iGalleryImageWidth > 0 ) { |
600 | 628 | $gallery->setWidths( $iGalleryImageWidth ); |
601 | | - if ( $iGalleryNumbRows > 0 ) |
| 629 | + } |
| 630 | + if ( $iGalleryNumbRows > 0 ) { |
602 | 631 | $gallery->setPerRow( $iGalleryNumbRows ); |
603 | | - if ( $sGalleryCaption != '' ) |
| 632 | + } |
| 633 | + if ( $sGalleryCaption != '' ) { |
604 | 634 | $gallery->setCaption( $sGalleryCaption ); # gallery class escapes string |
| 635 | + } |
605 | 636 | $output = $gallery->toHtml(); |
606 | 637 | } else { |
607 | 638 | $output .= $sStartItem; |
608 | 639 | if ( $bInlineMode ) { |
609 | 640 | $output .= $wgContLang->commaList( $articleList ); |
610 | | - } else { |
611 | | - $output .= implode( "$sEndItem \n $sStartItem", $articleList ); |
| 641 | + } else { |
| 642 | + $output .= implode( "$sEndItem \n $sStartItem", $articleList ); |
612 | 643 | } |
613 | 644 | $output .= $sEndItem; |
614 | 645 | $output .= $sEndList . "\n"; |