<?php if (!defined('PmWiki')) exit(); /* foxdelete.php Copyright Hans Bracker 2014. This program 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 2 of the License, or (at your option) any later version. Needs PmWiki 2.2.56+ */ $RecipeInfo['FoxDelete']['Version'] = '2019-11-11'; SDV($EnableFoxPageDelete, true); #enable general page deletes SDV($EnableFoxPostDelete, true); #enable general deletes for ranges and lines # add action foxdelete $HandleActions['foxdelete'] = 'FoxHandleDelete'; function FoxHandleDelete($pagename) { #echo $pagename; exit; global $FoxAuth,$FoxPageDeleteKey,$EnableFoxPageDelete,$EnableFoxPostDelete, $ChangeSummary, $Now, $EditFunctions, $IsPagePosted, $FoxMsgFmt; $args = FoxRequestArgs(); //fetch GET or POST arguments $key = $args['key']; # Retrieve the delete-key if ($key=='') FoxAbort($pagename, "ERROR: Delete key is missing. "); $target = (isset($args['target'])) ? $args['target'] : $pagename; # delete permission set by $FoxAuth $page = RetrieveAuthPage($target, $FoxAuth, true); #check page permissions for 'pagedelete' or 'delete' if (($key==$target && FoxPagePermission($pagename, 'pagedelete', $target, $page, '') == false) OR FoxPagePermission($pagename, 'delete', $target, $page, '') == false) FoxAbort($pagename, "Deleting page [[$target]] aborted"); #check general permission if (($key!=$target && $EnableFoxPostDelete==false) OR ($key==$target && $EnableFoxPageDelete==false)) FoxAbort($pagename, "Deletion not enabled! "); if (!$page) FoxAbort($pagename, "ERROR: Cannot read $page! "); $new = $page; # trim text and add newline so the following regexes also work for the last line $text = rtrim($page['text'])."\n"; $old = $text; # Remove the line containing the delete statement with the provided key $text = preg_replace('/^.*\\{\\[foxdelline(| button)? '.$key.'.*\\n/m',"",$text); # Remove the range containing the delrange statement with the provided key $text = preg_replace('/#foxbegin '.$key.'#.*?\\{\\[foxdelrange(| ?button) '.$key.' .*?#foxend '.$key.'#.*?\n/s',"",$text); #delete entire page by posting delete keyword as defined for PmWiki, normally 'delete' SDV($FoxPageDeleteKey, 'delete'); if ($key==$target && $EnableFoxPageDelete==true) $text = $FoxPageDeleteKey; # if nothing changed abort if($old==$text) FoxAbort($pagename, "ERROR: Delete action was unsuccessful! "); # Remove the added newline character (or any whitespace from the end) $text = rtrim($text); #remove unnecessary edit functions before saving unset($EditFunctions['EditTemplate'], $EditFunctions['RestorePage'], $EditFunctions['AutoCreateTargets'], $EditFunctions['PreviewPage']); # save page $new['text'] = $text; $new['csum'] = $ChangeSummary; if ($ChangeSummary) $new["csum:$Now"] = $ChangeSummary; $IsPagePosted = UpdatePage($target, $page, $new, $EditFunctions); # set up page redirection, cater for deletelink ($_GET) if(@$args['base']) $pagename = $args['base']; Redirect($pagename); } //}}} Markup('foxdelete','directives','/\{\[foxdel(line|range|page)\\s?(|button)\\s*(.*?)\\s*\]}/', "FoxDeleteMarkup"); # Creates the HTML code for delete links {[foxdelline]}, {[foxdelrange]} # and delete buttons {[foxdelline button]} and {[foxdelrange button]} function FoxDeleteMarkup($m) { global $ScriptUrl, $EnablePathInfo, $EnableFoxPageDelete,$EnableFoxPostDelete, $EnableFoxDeleteMsg, $FoxDeleteMsg, $FoxDeleteSummaryMsg; extract($GLOBALS['MarkupToHTML']); SDV($EnableFoxDeleteMsg, false); //set to true to enable post delete confirmation SDV($FoxDeleteMsg, '$[Please confirm: Do you want to delete this post?]'); SDV($FoxDelPageMsg, '$[Please confirm: Do you want to delete the page]'); SDV($FoxDeleteSummaryMsg, '$[Post deleted]'); //if you don't want a summary message, set it to '' SDV($FoxDelPageSummaryMsg, '$[Page deleted]'); $range = $m[1]; $type = $m[2]; $opt = ParseArgs($m[3]); $par = (array)@$opt['']; if($par[0]=='button') { $type = 'button'; array_shift($par); } if($range=='page') { if($EnableFoxPageDelete==false) return; #generate no links for page delete if (isset($opt['target'])) $target = $opt['target']; else $target = (empty($par))? $pagename : array_shift($par); $key = $target = FoxGroupName($pagename,'',$target); $summary = $FoxDelPageSummaryMsg; } else { if($EnableFoxPostDelete==false) return; #generate no links for post and line delete $key = array_shift($par); $target = (isset($opt['target'])) ? $opt['target'] : array_shift($par); $summary = $FoxDeleteSummaryMsg; } $label = (isset($opt['label'])) ? $opt['label'] : array_shift($par); # tooltip for delete link if (isset($opt['tooltip'])) $tooltip = "title='{$opt['tooltip']}'"; else if (isset($opt['title'])) $tooltip = "title='{$opt['title']}'"; else $tooltip = ''; if ($target=="") $target = $pagename; $TargetPageUrl = PUE(($EnablePathInfo) ? "$ScriptUrl/$target" : "$ScriptUrl?n=$target"); # javascript delete message dialogue if($EnableFoxDeleteMsg==true && $range!='page') $onclick = "onclick='return confirm(\"{$FoxDeleteMsg}\")'"; else $onclick = ""; if($range=='page') { $onclick = "onclick='return confirm(\"{$FoxDelPageMsg} ".$target." ?\")'"; $tooltip = (isset($opt['tooltip'])) ? "title='{$opt['tooltip']}'" : "title='{$target}'"; } if($label=='') $label = ($range=='page')? '$[Delete Page]' : '$[Delete]'; #construct HTML output if($type=='button') { # delete button $out = FmtPageName("<form class='foxdelbutton' action='{$TargetPageUrl}' method='post'> <input type='hidden' name='n' value='$target' /> <input type='hidden' name='base' value='$pagename' /> <input type='hidden' name='action' value='foxdelete' /> <input type='hidden' name='csum' value='$summary' /> <input type='hidden' name='key' value='$key' /> <input type='submit' name='doit' value='{$label}' class='inputbutton' {$onclick}/> </form>", $target); } else { # delete link which works with and without javascript: $out = FmtPageName("<a class='foxdellink' $tooltip href='$TargetPageUrl?action=foxdelete&key=$key&target=$target&base=$pagename&csum=$summary' rel='nofollow' {$onclick}>{$label}</a>",$target); } return Keep($out); } //}}}