Extension:TransformChanges.php

From Organic Design wiki
Revision as of 07:33, 7 February 2008 by Nad (talk | contribs) (500 changes fix by MW:User:Fish1203)

<?

  1. Extension:TransformChanges
  2. - See http://www.mediawiki.org/Extension:TransformChanges for installation and usage details
  3. - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)

if (!defined('MEDIAWIKI')) die('Not an entry point.');

define('TRANSFORMCHANGES_VERSION','1.0.8, 2008-02-07');

$wgExtensionCredits['other'][] = array(

       'name'        => 'TransformChanges',
       'author'      => 'User:Nad',
       'description' => 'Makes recent-changes and watchlists render in nice columns for easier reading.',
       'url'         => 'http://www.organicdesign.co.nz/Extension:TransformChanges',
       'version'     => TRANSFORMCHANGES_VERSION

);

    1. Returns the position of the $n-th $c token (string) in $haystack (= position at the end of the token)

function strposn($haystack, $c, $n) {

       $a = explode($c, $haystack, $n+1);
       if($n <= 0 || count($a) <= $n)
               return false;
       return strlen($haystack) - strlen($a[$n]);

}

  1. Disable enhanced recent changes

$wgExtensionFunctions[] = 'wfSetupTransformChanges'; function wfSetupTransformChanges() {

       global $wgUser;
       $wgUser->setOption('usenewrc',false);

}

$wgHooks['SpecialPageExecuteAfterPage'][] = 'wfTransformChanges'; function wfTransformChanges() {

       global $wgOut;
       $title = $wgOut->getPageTitle();
       if ($title != wfMsgForContent('recentchanges') && $title != wfMsgForContent('watchlist')) return true;
       $text =& $wgOut->mBodytext;

$text = preg_replace('|(\\s*)?

(.+?)

\\s*(

    )
  • |s','$3
  • ',$text);
           ## Edits by Fish1203
           ## (http://www.mediawiki.org/wiki/User:Fish1203)
           ## solving the PHP preg_replace_callback() pcre.backtrack_limit problem
    
           ## splitting in days
    
    $parts = explode('
      ',$text); $first = 1; $nbedits = 50; $text = $parts[0] . ""; foreach($parts as $part) { if ($first == 1) { ## skipping first part (= Special:RecentChanges "header") $first = 0; } else { $nbsubparts = (substr_count($part,"") - 1); ## how many edits for this day ?
                             ## if more than $nbedits edits for this day
                             if ($nbsubparts > $nbedits) {             
                                     $divide = intval(abs($nbsubparts/$nbedits));
      
                                     ## splits each day in parts containing $nbedits edits (max.)
                                     $start = 0;
                                     $parts2 = array();
                                     for($lp=0; $lp<$divide; $lp++) {
      
      $parts2[$lp] = substr($part, $start, (strposn($part,"",($lp+1)*$nbedits))-$start ); $start = (strposn($part,"",($lp+1)*$nbedits));
                                     }
                                     $parts2[$divide] = substr($part, $start, strlen($part));   ## last part for the day
      
                                     foreach($parts2 as $part2) {
      
      $part2 = '
        ' . $part2 . '
      '; $text .= preg_replace_callback('|
        (.+?)
      |s','wfTransformChangesUL',$part2);
                                     }
                             }
                             else {
      
      $part = '
        ' . $part . '
      '; $text .= preg_replace_callback('|
        (.+?)
      |s','wfTransformChangesUL',$part);
                             }
                     }
             }
      
      
      ## there may be one last tag remaining...
             ## just remove it... :-)
      
      $text = str_replace("","",$text); $text .= "
      ";
             return true;
      

      }

      function wfTransformChangesUL($match) {

             global $wgTransformChangesRow;
             $wgTransformChangesRow = 'odd';               ## was originally $wgTransformChangesRow = 0
      
      $rows = preg_replace_callback('|<li\\s*(.*?)>(.+?)|s','wfTransformChangesLI',$match[1]);
             return $rows;
      

      }

      function wfTransformChangesLI($match) {

             global $wgTransformChangesRow,$wgSimpleSecurity;
             $wgTransformChangesRow = $wgTransformChangesRow == 'even' ? 'odd' : 'even';
             list(,$date,$text) = $match;
             $cols = array('time','title','user','talk','info','comment','diff');
             $ncols = count($cols);
             $row = ;
      
      $error = 'Error: match failed!';
             if ($date) {
      
      $row = "$date\n";
                     $wgTransformChangesRow = 'even';
             }
      
      $row .= ""; if (preg_match('|^(.*?); (\\d+:\\d+)(.+?)(<a.+?\\))\\s*(.*?)$|',$text,$m)) { list(,$diff,$time,$bytes,$user,$comment) = $m; if (preg_match('|^(.+\\)).*?\\. \\.\\s*(.*?)\\s*(<a.+)$|',$diff,$m)) list(,$diff,$info,$title) = $m; else $info = $title = ; if (preg_match('|(\\(.+?\\))|',$bytes,$m)) $info .= "$m[1]"; if (preg_match('|(<a.+?</a>).+?(\\(.+?\\))|',$user,$m)) { # Remove talk for email or IP users and make user lowercase list(,$user,$talk) = $m; if (ereg('@',$user) || !eregi('[a-z]',$user)) { $talk = ; $user = strtolower($user); } } if (preg_match('|\\((.+)\\)|',$comment,$m)) $comment = $m[1]; $allowed = true; if (preg_match('|title="(.+?)"|',$title,$m) && is_object($wgSimpleSecurity)) { # Only show row if ok by SimpleSecurity extension $t = Title::newFromText($m[1]); $allowed = $wgSimpleSecurity->validateTitle('view',$t); } if ($allowed) foreach ($cols as $col) $row .= "{$$col}";
                     } else $row = $error;
      
      $row .= "\n"; return $row; } ?>