* * Add an accurate count of characters added & removed to each edit summary * * To install, add the following to your configuration file: if ($action=='edit') include_once("$FarmD/cookbook/pagediffsize.php"); * * For more information, please see the online documentation at * http://www.pmwiki.org/wiki/Cookbook/UserAdmin * * * This script is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This script is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ $RecipeInfo['PageDiffSize']['Version'] = '2010-06-17'; array_splice($EditFunctions, array_search('PostPage',$EditFunctions), 0, 'PageDiffSize'); include_once("$FarmD/scripts/pagerev.php"); function PageDiffSize($pagename, &$page, &$new) { global $EnablePost, $DeleteKeyPattern, $ChangeSummary, $DiffFunction, $DiffRenderSourceFunction, $FarmD, $Now, $PageDiffSizeFmt; if (!$EnablePost || empty($DiffFunction) || !function_exists($DiffFunction)) return; SDVA($PageDiffSizeFmt, array(-1 => ' (deleted)', 0=>' (±0)', 1=>' (-$del)', 2=>' (+$ins)', 3=>' (+$ins/-$del)')); SDV($DeleteKeyPattern,"^\\s*delete\\s*$"); if (preg_match("/$DeleteKeyPattern/", $new['text'])) { $ChangeSummary .= $PageDiffSizeFmt[-1]; $new["csum:$Now"] = $new['csum'] = $ChangeSummary; return; } SDV($DiffRenderSourceFunction, 'DiffRenderSource'); $diff_chars = !empty($DiffRenderSourceFunction) && function_exists($DiffRenderSourceFunction); $difftxt = $DiffFunction($new['text'], @$page['text']); $ins = 0; $del = 0; $in=array(); $out=array(); $dtype=''; foreach (explode("\n", "$difftxt\n") as $d) { if ($d > '') { if ($d[0] == '-' || $d[0] == '\\') continue; if ($d[0] == '<') { $out[]=substr($d, 2); continue; } if ($d[0] == '>') { $in[]=substr($d, 2); continue; } } if (preg_match("/^\\d+(,\\d+)?([adc])\\d+/", $dtype, $match)) { switch($match[2]) { case 'a': $del += strlen(implode("\n", $in)); break; case 'd': $ins += strlen(implode("\n", $out)); break; case 'c': if ($diff_chars) { preg_match_all('!(.*?)!s', $DiffRenderSourceFunction($in, $out, 0), $in_m); $del += strlen(implode('', $in_m[1])); preg_match_all('!(.*?)!s', $DiffRenderSourceFunction($in, $out, 1), $out_m); $ins += strlen(implode('', $out_m[1])); } else { $in_s = implode("\\", $in); $out_s = implode("\\", $out); $lmin = min(strlen($in_s), strlen($out_s)); for ($i = 0; $i < $lmin; ++$i) if ($in_s[$i] != $out_s[$i]) break; for ( $jo = strlen($out_s) - 1, $ji = strlen($in_s) - 1; ($jo >= $i) && ($ji >= $i); --$jo, --$ji ) if ($in_s[$ji] != $out_s[$jo]) break; if ($jo + 1 > $i) $ins += $jo + 1 - $i; if ($ji + 1 > $i) $del += $ji + 1 - $i; } break; } } $in=array(); $out=array(); $dtype=$d; } $dsum = str_replace( array('$ins', '$del', '$sum'), array( $ins, $del, $ins > $del ? ('+'.($ins - $del)) : ($ins - $del)), $PageDiffSizeFmt[($ins?2:0) + ($del?1:0)]); if ($dsum) { $ChangeSummary .= $dsum; $new["csum:$Now"] = $new['csum'] = $ChangeSummary; } }