<?php if (!defined('PmWiki')) exit();
/**
  WYSIWTF : What You See Is Worse Than Failure
  A simple rich text editor for PmWiki with WhizzyWig.
  Written by (c) Petko Yotov 2011

  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 3 of the License, or
  (at your option) any later version. See pmwiki.php for full details
  and lack of warranty.

  Copyright 2011 Petko Yotov http://notamment.fr
*/

$RecipeInfo['WTF']['Version'] = '20110329plb';

$HandleActions['whiz'] = 'HandleWhiz';

if ($action == 'whiz') include_once("$FarmD/cookbook/convert-html2.php"); 

function HandleWhiz($pagename, $auth = 'edit')
{
	global $HTMLFooterFmt, $HTMLStylesFmt, $EditableRules, $ROEPatterns, $ProtectedRules, $UnprotectedRules, $MarkupRules;

    $ROEPatterns['/(?:&lt;|<)pre class=[\'"]pmwikimarkup[\'"](?:&gt;|>)(.*?)(?:&lt;|<)\/pre(?:&gt;|>)/'] = '$1';
    #$ROEPatterns['/&lt;/'] = '<';
    #$ROEPatterns['/&gt;/'] = '>';

  $HTMLFooterFmt['wtf'] = <<<EOF
<script type="text/javascript" src="\$FarmPubDirUrl/wtf/whizzywig61p.js"></script>
<script type='text/javascript'><!--
  cssFile = "\$FarmPubDirUrl/wtf/wtf.css";
  
  sels = 'blockstyle';
  var h3=t("Heading");
  opts['blockstyle'] = [t("Block style"), t("Paragraph"), h3+" 2", h3+" 3", h3+" 4", t("Fixed width pre"), t("PmWiki Markup")];
  vals['blockstyle'] = ["<p>", "<p>", "<h2>", "<h3>", "<h4>", "<pre>", "<pre class='pmwikimarkup'>"];

  buts = 'code';
  dobut['code'] = '<code>'; 

  makeWhizzyWig("text", "blockstyle fontsize bold italic code color hilite clean left center right justify number bullet indent outdent undo redo rule link image table html fullscreen");
//--></script>
EOF;
#unset($HTMLFooterFmt['wtf']);
  $HTMLStylesFmt['wtf'] = '
  #text { width: 100% !important; }
  #CONTAINERtext { width: 100% !important;}
  #CONTROLStext, #showWYSIWYGtext, .wzCtrl { padding: 0; border: 0;}
  #CONTROLStext button, #showWYSIWYGtext input, #CONTROLStext select { border: 1px outset buttonface; }
  #showWYSIWYGtext input { margin:1px;}
  ';

    ####
    #### THIS CODE COPIED PRETTY BLINDLY FROM HandleEdit()
    ####
#function HandleEdit($pagename, $auth = 'edit') {
  global $IsPagePosted, $EditFields, $ChangeSummary, $EditFunctions, 
    $EnablePost, $FmtV, $Now, $EditRedirectFmt, 
    $PageEditForm, $HandleEditFmt, $PageStartFmt, $PageEditFmt, $PageEndFmt;
  SDV($EditRedirectFmt, '$FullName');
  if (@$_POST['cancel']) 
    { Redirect(FmtPageName($EditRedirectFmt, $pagename)); return; }
  Lock(2);
  $page = RetrieveAuthPage($pagename, $auth, true);
  if (!$page) Abort("?cannot edit $pagename"); 
  $new = $page;
  foreach((array)$EditFields as $k) 
    if (isset($_POST[$k])) $new[$k]=str_replace("\r",'',stripmagic($_POST[$k]));
  $new['csum'] = $ChangeSummary;
  if ($ChangeSummary) $new["csum:$Now"] = $ChangeSummary;
  $EnablePost &= preg_grep('/^post/', array_keys(@$_POST));
  $new['=preview'] = $new['text'];
  PCache($pagename, $new);
#dbglog( "Calling UpdatePage() (EnablePost=$EnablePost)<br>\n");
  UpdatePage($pagename, $page, $new);
  Lock(0);
  if ($IsPagePosted && !@$_POST['postedit']) 
    { Redirect(FmtPageName($EditRedirectFmt, $pagename)); return; }
  $FmtV['$DiffClassMinor'] = 
    (@$_POST['diffclass']=='minor') ?  "checked='checked'" : '';
  $FmtV['$EditText'] = 
    str_replace('$','&#036;',htmlspecialchars(@$new['text'],ENT_NOQUOTES));

###
# THIS PART MODIFIED FROM HANDLEEDIT()
$EditableRules = array("'''", "''", '\\r', '!vspace', '<vspace><p>', '<vspace>', 'restore', '&gt;', '&lt;', '&', '<:', '^<:', 'closeall', '^!<:', '^||||', '^||', 'table', '^!'); // this needs to be hugely fleshed out
#DisableMarkup('!vspace'); // this rule makes it impossible to differentiate 
                          // headers with a following newline and those without
MyBuildMarkupRules(); // sets $ProtectedRules and $UnprotectedRules
$MarkupRules = $ProtectedRules;
#echo "===PROTECTED===<br>\n<pre>".print_r($MarkupRules,true)."</pre><br>\n";
$f = fopen("markup.txt", "a");
fwrite($f, "\n");
fclose($f);
if (true) {
$f = fopen("markup.txt", "a");
fwrite($f, "\n-----====----====----====----====-----\n");
fwrite($f, "All PROTECTED rules: " . print_r($MarkupRules,true) . "\n");
fwrite($f, "-----====----====----====----====-----\n");
fclose($f);
}
$FmtV['$EditText'] = MarkupToHTML($pagename, $FmtV['$EditText'], array('debug'=>1));
if (true) {
$f = fopen("markup.txt", "a");
fwrite($f, "\n-----====----====----====----====-----\n");
fwrite($f, "AFTER FIRST MarkupToHTML(): ");
fwrite($f, "-----====----====----====----====-----\n");
fwrite($f, $FmtV['$EditText']);
fclose($f);
}
$MarkupRules = $UnprotectedRules;
#echo "===UN-PROTECTED===<br>\n<pre>".print_r($MarkupRules,true)."</pre><br>\n";
if (true) {
$f = fopen("markup.txt", "a");
fwrite($f, "\n-----====----====----====----====-----\n");
fwrite($f, "All UN-PROTECTED rules: " . print_r($MarkupRules,true) . "\n");
fwrite($f, "-----====----====----====----====-----\n");
fwrite($f, $x);
fclose($f);
}
$FmtV['$EditText'] = MarkupToHTML($pagename, $FmtV['$EditText'], array('debug'=>1, 'escape'=>0));
$MarkupRules = array(); // delete cache to make sure we get real rules again
#
###

  $FmtV['$EditBaseTime'] = $Now;
  if (@$PageEditForm) {
    $efpage = FmtPageName($PageEditForm, $pagename);
    $form = RetrieveAuthPage($efpage, 'read', false, READPAGE_CURRENT);
    if (!$form || !@$form['text']) 
      Abort("?unable to retrieve edit form $efpage", 'editform');
    $FmtV['$EditForm'] = MarkupToHTML($pagename, $form['text']);
  }
  SDV($PageEditFmt, "<div id='wikiedit'>
    <h2 class='wikiaction'>$[Editing {\$FullName}]</h2>
    <form method='post' rel='nofollow' action='\$PageUrl?action=whiz'>
    <input type='hidden' name='action' value='whiz' />
    <input type='hidden' name='n' value='\$FullName' />
    <input type='hidden' name='basetime' value='\$EditBaseTime' />
    \$EditMessageFmt
    <textarea id='text' name='text' rows='25' cols='60'
      onkeydown='if (event.keyCode==27) event.returnValue=false;'
      >\$EditText</textarea><br />
    <input type='submit' name='post' value=' $[Save] ' />");
  SDV($HandleEditFmt, array(&$PageStartFmt, &$PageEditFmt, &$PageEndFmt));
  PrintFmt($pagename, $HandleEditFmt);
}


# This function copied & modified from BuildMarkupRules()
function MyBuildMarkupRules() {
    global $MarkupTable,$MarkupRules,$LinkPattern, 
        $ProtectedRules, $UnProtectedRules, $EditableRules;
  $UnprotectedRules = $ProtectedRules = array();
  uasort($MarkupTable,'mpcmp');
  foreach($MarkupTable as $id=>$m) 
    if (@$m['pat'] && @$m['seq']) {
      if (in_array($id, $EditableRules))
        $UnprotectedRules[str_replace('\\L',$LinkPattern,$m['pat'])]=$m['rep'];
      else
        $ProtectedRules[str_replace('\\L',$LinkPattern,$m['pat']).'e']='Keep(\'<pre class="pmwikimarkup">$0</pre>\')';
    }
  return array($UnprotectedRules, $ProtectedRules);
}

$EnableGUIButtons = 0;

SDV($WTFAllowedTags, "<p><div><a><img><img/><strong><em><b><i><span><code>".
  "<table><tr><td><th><tbody><h1><h2><h3><h4><h5><h6>".
  "<pre><ul><ol><li><dl><dd><dt><hr><hr/><blockquote><br><br/>");

$WTFKeepToken = "{$KeepToken}WTF{$KeepToken}";
#Markup('WTF', '<markup', '/^.*$/se', 'WTFMarkup(PSS(\'$0\'))');

array_unshift($EditFunctions, 'WysiWTF');
function WysiWTF($pagename, &$page, &$new) {
  global $EnablePost, $WTFAllowedTags;
  if(!@$new['wtf']) {
    $new['wtf'] = 1;
    if(@$page['text'] > '') $new['text'] = "<pre class=\"pmwikimarkup\">{$new['text']}</pre>";
  }
  if($EnablePost) {
    $new['text'] = strip_tags($new['text'], $WTFAllowedTags);
    $new['text'] = preg_replace("/(<\\/?\\w+)(( .*?)?)>/e", 'trim("$1 ".PQA(PSS(\'$3\'))).">"', $new['text']);
//     $new['text'] .= '<wtf/>';
  }
}

function WTFMarkup($allHF) {
  global $KeepToken;
  if(preg_match("/$KeepToken(\d+)X$KeepToken/", $allHF)) return $allHF; # already processed
  $all = preg_replace("/^.*?\\(:groupheader:\\)(.*?)\\(:groupfooter:\\).*$/s", '$1', $allHF);
  if( $all == $allHF) return $allHF; # some include or skin area
  
  $rx = "/&lt;pre class=\\\\?['\"]pmwikimarkup\\\\?['\"]&gt;(.*?)&lt;\\/pre&gt;/s";
  preg_match_all($rx, $all, $match);
//   if((!@$match) || count($match[1])<1) return $allHF;
  $split = preg_split($rx, $all);
//   if(count($split)<2) return $allHF;
//   $cnt++;
  $ret = '';
  foreach ($split as $k=>$v) {
    $ret .= Keep(str_replace( array('&lt;', '&gt;', '&amp;nbsp;'), array('<', '>', '&nbsp;'), $v), 'X');
    if(isset($match[1][$k])) $ret.="\n{$match[1][$k]}";
  }
  return str_replace($all, $ret, $allHF);  
}