<?php if (!defined('PmWiki')) exit(); /** HideDiff - Hide specific edits from page histories Written by (c) Petko Yotov 2022-2024 www.pmwiki.org/Petko This text is written for PmWiki; 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 2 of the License, or (at your option) any later version. See pmwiki.php for full details and lack of warranty. */ $RecipeInfo['HideDiff']['Version'] = '20241015'; SDV($HandleActions['hidediff'], 'HandleHideDiff'); SDV($HandleAuth['hidediff'], 'admin'); SDV($ActionTitleFmt['hidediff'], '| $[History]'); SDV($HTMLStylesFmt['hidediff'], ' .diffbox.hidden {border: 3px dotted red;} .hidediffchk:checked + label { font-weight: bold; } #showhidden:not(:checked) ~ .diffbox.hidden + .diffrestore, button[name="expunge"], #showhidden:not(:checked) ~ .diffbox.hidden { display: none; } input[name="confirm"]:checked ~ button[name="expunge"] { display: inline; } '); include_once("$FarmD/scripts/pagerev.php"); function HandleHideDiff($pagename, $auth='admin') { global $Author, $Now, $HandleDiffFmt, $PageStartFmt, $PageDiffFmt, $PageEndFmt, $DiffShow, $DiffRestoreFmt, $EnableDiffHidden, $MessagesFmt, $IsPagePosted, $ChangeSummary; $old = $page = RetrieveAuthPage($pagename, $auth, true); if (!$page) { return Abort("?cannot hidediff $pagename"); } $DiffRestoreFmt = preg_replace('!</div>$!', " | <input type='checkbox' id='confex\$DiffId' name='confirm' value='\$DiffId' /> <label for='confex\$DiffId'>$[Expunge]</label> <button name='expunge' value='\$DiffId'>$[Confirm]</button> $0", $DiffRestoreFmt); $restore = strval(@$_POST['expunge']); $confirm = strval(@$_POST['confirm']); if($restore && $restore != $confirm) return Abort('? $[Confirm checkbox unchecked.]'); $EnableDiffHidden = 1; $diffkeys = preg_grep('/^diff:\\d+:\\d+:/', array_keys($page)); $cnt = 0; if (preg_match('/^(diff:(\\d+):(\\d+):)(\\w*)$/', $restore, $m)) { RestorePage($pagename,$page,$page,$restore); foreach($diffkeys as $k) { if ($k<$restore) break; $newkey = preg_replace('/:[^:]*$/', ':hidden', $k); unset($page[$k]); $page[$newkey] = ''; $cnt++; } $fmt = XL('Expunged %d edits.'); $ChangeSummary = sprintf($fmt, $cnt); } elseif(isset($_POST['post'])) { $hide = isset($_POST['hide']) ? stripmagic($_POST['hide']) : array(); foreach($diffkeys as $k) { if (!preg_match("/^(diff:(\\d+):\\d+:)([^:]*)$/",$k,$match)) continue; list($full, $start, $id, $cname) = $match; if (isset($hide[$id])) { if ($cname == 'hidden') continue; $page["{$start}hidden"] = $page[$k]; unset($page[$k]); $cnt++; } else { if ($cname != 'hidden') continue; $page[$start] = $page[$k]; unset($page[$k]); $cnt++; } } $fmt = XL('Toggled %d edits (%d hidden).'); $ChangeSummary = sprintf($fmt, $cnt, count($hide)); } if ($cnt) { $MessagesFmt[] = "<h2 class='frame'>$ChangeSummary</h2>"; $IsPagePosted = 1; UpdatePage($pagename, $old, $page); } $DiffShow['minor'] = $DiffShow['source'] = 'y'; $PageDiffFmt = "<h2 class='wikiaction'>$[{\$FullName} History]</h2>"; $formstart = "<form action='\$PageUrl?action=hidediff' method='post'>"; $formstart .= "<input type='hidden' name='n' value='$pagename'>"; $formstart .= "<input type='hidden' name='action' value='hidediff'>"; $formstart .= "<input type='submit' name='post' value='Submit changes'>"; $formstart .= " <input type='checkbox' id='showhidden' checked='checked'> <label for='showhidden'>$[Show hidden]</label>"; $formend = "<input type='submit' name='post' value='Submit changes'></form>"; ob_start(); PrintDiff($pagename); $html = ob_get_clean(); $html = preg_replace_callback("!(<div class='diffbox(.*?)'.*?><div class='difftime'>)(<a.*?id='diff(\\d+)')!", 'cb_hidediff', $html); $html = preg_replace('/\\$(?!\\[)/', '$', $html); SDV($HandleDiffFmt,array(&$PageStartFmt, &$PageDiffFmt,"<div id='wikidiff'>", 'markup:(:messages:)', $formstart, $html, $formend, '</div>', &$PageEndFmt)); PrintFmt($pagename,$HandleDiffFmt); } function cb_hidediff($m) { list($full, $start, $cnames, $link, $id) = $m; $checked = (strpos($cnames, 'hidden') === false)? '' : ' checked="checked"'; $chk = "<input class='hidediffchk' type='checkbox' id='chk$id' name='hide[$id]' value='1' $checked /><label for='chk$id'>$[Hide]</label>"; return "$start $chk $link"; }