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
<?
- Extension:TransformChangesTemplate:Php
- - See http://www.mediawiki.org/Extension:TransformChanges for installation and usage details
- - 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
);
- 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]);
}
- 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 . '
- (.+?)
} } else {
$part = '- ' . $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; }