<?php if (!defined('PmWiki')) exit();
/* foxconvert.php   copyright Hans Bracker, 2015

   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.
   
	Script to display and convert hidden PTVs of form (:<name>: <value>:) 
	Display via markup expression {(hiddenptvs <csv-pagename-list> )}
	Include powertools.php to generate csv pagelist.
	Example: {(hiddenptvs (plist Main.*))} display hidden PTVs in Main group.
	Convert via Fox form using foxfilter 'ptvconvert'
	Example forms for display and conversion of PTVs:
	
(:table width=100%:)
(:cell:)
!!!Display hidden PTVs
(:fox test foxaction=display foxtemplate="{$$(hiddenptvs (plist {$$group}.{$$name}))}":)(:input default source=1:)
Pages (:input text name *:)
Group (:input text group Main:)

->(:input submit post 'Display hidden PTVs':)
(:foxend test:)
(:cell:)
!!!Convert hidden PTVs
(:fox convert foxaction=display foxtemplate="{$$(hiddenptvs {$$plist})}":) (:input hidden plist "{$$(plist {$$group}.{$$name})}":) (:input hidden foxfilter ptvconvert:)(:input default source=1:)
Pages (:input text name *:)
Group (:input text group Main:)
replace (:input text old size=8:) with (:input text new size=8:)
(:input submit post "Convert hidden PTVs":) Test run (:input checkbox testrun:)
(:foxend convert:)
(:tableend:)
(:foxmessages:)(:foxdisplay:)

*/
$RecipeInfo['FoxPTVConvert']['Version'] = '2015-09-28';

# show hidden ptvs as name: value; input argument: PageName or list of page names
$MarkupExpr['hiddenptvs'] = 'MXDisplayHiddenPTVs($pagename, $args[0], $argp["type"])';
function MXDisplayHiddenPTVs($pagename, $list, $type) {
   global $PCache, $PageTextVarPatterns;
   $pgout = array(); $out = array(); echo $type;
   $plist = (isset($list)) ? explode(',',$list) : array($pagename);
   foreach($plist as $pn) {
   		$pn = MakePageName($pagename, $pn);
   		PageTextVar($pn, '');
	   	foreach($PCache[$pn] as $key => $val) {
	   			if (substr($key,0,3)!="=p_")	continue;
	   			else $ptvpages[] = $pn;
	   	}
	 }
	 $ptvpages = (is_array($ptvpages)) ? array_unique($ptvpages) : array();	 
	 //show($ptvpages);
   foreach($ptvpages as $pn) {
			$pgout[$pn][0] = "!!!!!![[$pn]]\n";
			$page = RetrieveAuthPage($pn, 'edit', false, READPAGE_CURRENT);
			$text = $page['text'];
			$pat = $PageTextVarPatterns['(:var:...:)'];	//hidden PTVs  // ['var:'];	//Text PTVs 
			if ($type=='text') $pat = $PageTextVarPatterns['var:']; 	
			if (!preg_match_all($pat, $text, $match, PREG_SET_ORDER)) continue;
						//$m[0]=all, $m[1]=beforevalue, $m[2]=name, $m[3]=value, $m[4]=aftervalue
			foreach ($match as $m) { 	
				$k = $m[2]; $v = $m[3];
	   		$pgout[$pn][] = "'''".$k."''': ".$v;
	  	}
			sort($pgout[$pn]);
			$out[] = implode("\n",$pgout[$pn]);
	}
  return implode("\n",$out);
}

# convert hidden ptvs by replacing old with new string;
$FoxFilterFunctions['ptvconvert'] = FoxConvertHiddenPTVs;
function FoxConvertHiddenPTVs($pagename, $fx) {
	 global $PCache, $PageTextVarPatterns, $EditFunctions, $FoxMsgFmt;
	 $fx['plist'] = FoxVarReplace($pagename,$fx,'',$fx['plist']);
	 //show($fx,"fx");
   $plist = explode(',',$fx['plist']);
   foreach($plist as $pn) {
   		$pn = MakePageName($pagename, $pn);
   		PageTextVar($pn, '');
	   	foreach($PCache[$pn] as $k => $v) {
	   			if (substr($k,0,3)!="=p_")	continue;
	   			else $ptvpages[] = $pn;
	   	}
	 } 
	 $pt = $fx['old']; $rp = $fx['new'];
	 if(!is_array($ptvpages) || $fx['old']="") 
	 	 FoxAbort($pagename, "%red%Input Error!%%");	
	 else  $ptvpages = array_values(array_unique($ptvpages));
	//show($ptvpages,"all ptv pages");
   foreach($ptvpages as $pn) {
   		Lock(2);
			$page = RetrieveAuthPage($pn, 'admin', true);
			$text = $told = $page['text'];
			$pat = $PageTextVarPatterns['(:var:...:)'];	//hidden PTVs  // ['var:'];	//Text PTVs 
			if ($type=='text') $pat = $PageTextVarPatterns['var:'];   	
			if (!preg_match_all($pat, $text, $match, PREG_SET_ORDER)) { 
				Lock(0); continue; //page has no hidden PTV, so load next page
			}     //$m[0]=all, $m[1]=beforevalue, $m[2]=name, $m[3]=value, $m[4]=aftervalue
			foreach ($match as $m) { 	
				$ptv =$m[0]; $k = $m[2]; $v = $m[3];
				$vn = str_replace($pt,$rp,$v);
				$ptvn = str_replace($v,$vn,$ptv);
				$text = str_replace($ptv,$ptvn,$text);
	  	}
	  	if ($text==$told) $FoxMsgFmt[] = "%red%no change: [[".$pn."]]%%";
	  	else {
	  		$mod[] = $pn;
		  	$pnew = $page;
		  	$pnew['text'] = $text;
		  	if ($fx['testrun']) {
		  		echo "test updating: ".$pn." => ".$text."<br/>";
		  	} else {
		  		$FoxMsgFmt[] = "%green%update: [[".$pn."]]%%";
					UpdatePage($pn, $page, $pnew, $EditFunctions); //silent update!!! //no summary written//
				}
			}
			Lock(0);
	}
	if($mod) $fx['modified-pages'] = implode(',',$mod);
	return $fx;
	//HandleDispatch($pagename,'browse','End of Update');
	//exit;
}