<?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 .= "&nbsp; &nbsp; <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('/\\$(?!\\[)/', '&#36;', $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";
}