Difference between revisions of "Extension:TransformChanges.php"

From Organic Design wiki
m
Line 3: Line 3:
 
# - See http://www.mediawiki.org/Extension:TransformChanges for installation and usage details
 
# - See http://www.mediawiki.org/Extension:TransformChanges for installation and usage details
 
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
 
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
+
 
 
if (!defined('MEDIAWIKI')) die('Not an entry point.');
 
if (!defined('MEDIAWIKI')) die('Not an entry point.');
+
 
 
define('TRANSFORMCHANGES_VERSION','1.0.8, 2008-02-07');
 
define('TRANSFORMCHANGES_VERSION','1.0.8, 2008-02-07');
+
 
 
$wgExtensionCredits['other'][] = array(
 
$wgExtensionCredits['other'][] = array(
 
         'name'        => 'TransformChanges',
 
         'name'        => 'TransformChanges',
Line 15: Line 15:
 
         'version'    => TRANSFORMCHANGES_VERSION
 
         'version'    => TRANSFORMCHANGES_VERSION
 
);
 
);
+
 
 
## Returns the position of the $n-th $c token (string) in $haystack (= position at the end of the token)
 
## Returns the position of the $n-th $c token (string) in $haystack (= position at the end of the token)
 
function strposn($haystack, $c, $n) {
 
function strposn($haystack, $c, $n) {
Line 23: Line 23:
 
         return strlen($haystack) - strlen($a[$n]);
 
         return strlen($haystack) - strlen($a[$n]);
 
}
 
}
+
 
 
# Disable enhanced recent changes
 
# Disable enhanced recent changes
 
$wgExtensionFunctions[] = 'wfSetupTransformChanges';
 
$wgExtensionFunctions[] = 'wfSetupTransformChanges';
Line 30: Line 30:
 
         $wgUser->setOption('usenewrc',false);
 
         $wgUser->setOption('usenewrc',false);
 
}
 
}
+
 
 
$wgHooks['SpecialPageExecuteAfterPage'][] = 'wfTransformChanges';
 
$wgHooks['SpecialPageExecuteAfterPage'][] = 'wfTransformChanges';
 
function wfTransformChanges() {
 
function wfTransformChanges() {
Line 38: Line 38:
 
         $text =& $wgOut->mBodytext;
 
         $text =& $wgOut->mBodytext;
 
         $text = preg_replace('|(</ul>\\s*)?<h4>(.+?)</h4>\\s*(<ul class="special">)<li>|s','$3<li $2>',$text);
 
         $text = preg_replace('|(</ul>\\s*)?<h4>(.+?)</h4>\\s*(<ul class="special">)<li>|s','$3<li $2>',$text);
+
 
 
         ## Edits by Fish1203
 
         ## Edits by Fish1203
 
         ## (http://www.mediawiki.org/wiki/User:Fish1203)
 
         ## (http://www.mediawiki.org/wiki/User:Fish1203)
 
         ## solving the PHP preg_replace_callback() pcre.backtrack_limit problem
 
         ## solving the PHP preg_replace_callback() pcre.backtrack_limit problem
+
 
 
         ## splitting in days
 
         ## splitting in days
 
         $parts = explode('<ul class="special">',$text);
 
         $parts = explode('<ul class="special">',$text);
+
 
 
         $first = 1;
 
         $first = 1;
 
         $nbedits = 50;
 
         $nbedits = 50;
+
 
 
         $text = $parts[0] . "<table class=\"changes\">";
 
         $text = $parts[0] . "<table class=\"changes\">";
 
         foreach($parts as $part) {
 
         foreach($parts as $part) {
Line 55: Line 55:
 
                 }
 
                 }
 
                 else {
 
                 else {
+
 
 
                         $nbsubparts = (substr_count($part,"</li>") - 1);      ## how many edits for this day ?
 
                         $nbsubparts = (substr_count($part,"</li>") - 1);      ## how many edits for this day ?
+
 
 
                         ## if more than $nbedits edits for this day
 
                         ## if more than $nbedits edits for this day
 
                         if ($nbsubparts > $nbedits) {             
 
                         if ($nbsubparts > $nbedits) {             
 
                                 $divide = intval(abs($nbsubparts/$nbedits));
 
                                 $divide = intval(abs($nbsubparts/$nbedits));
+
 
 
                                 ## splits each day in parts containing $nbedits edits (max.)
 
                                 ## splits each day in parts containing $nbedits edits (max.)
 
                                 $start = 0;
 
                                 $start = 0;
Line 82: Line 82:
 
                 }
 
                 }
 
         }
 
         }
+
 
 
         ## there may be one last </ul> tag remaining...
 
         ## there may be one last </ul> tag remaining...
 
         ## just remove it... :-)
 
         ## just remove it... :-)
 
         $text = str_replace("</ul>","",$text);
 
         $text = str_replace("</ul>","",$text);
+
 
 
         $text .= "</table>";
 
         $text .= "</table>";
 
         return true;
 
         return true;
 
}
 
}
+
 
 
function wfTransformChangesUL($match) {
 
function wfTransformChangesUL($match) {
 
         global $wgTransformChangesRow;
 
         global $wgTransformChangesRow;
Line 97: Line 97:
 
         return $rows;
 
         return $rows;
 
}
 
}
+
 
 
function wfTransformChangesLI($match) {
 
function wfTransformChangesLI($match) {
 
         global $wgTransformChangesRow,$wgSimpleSecurity;
 
         global $wgTransformChangesRow,$wgSimpleSecurity;

Revision as of 07:38, 7 February 2008

<?

  1. Extension:TransformChangesTemplate:Php
Info.svg These are the MediaWiki extensions we're using and/or developing. Please refer to the information on the mediawiki.org wiki for installation and usage details. Extensions here which have no corresponding mediawiki article are either not ready for use or have been superseded. You can also browse our extension code in our local Subversion repository or our GitHub mirror.
  1. - See http://www.mediawiki.org/Extension:TransformChanges for installation and usage details
  2. - 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; }