<?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['/(?:<|<)pre class=[\'"]pmwikimarkup[\'"](?:>|>)(.*?)(?:<|<)\/pre(?:>|>)/'] = '$1'; #$ROEPatterns['/</'] = '<'; #$ROEPatterns['/>/'] = '>'; $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('$','$',htmlspecialchars(@$new['text'],ENT_NOQUOTES)); ### # THIS PART MODIFIED FROM HANDLEEDIT() $EditableRules = array("'''", "''", '\\r', '!vspace', '<vspace><p>', '<vspace>', 'restore', '>', '<', '&', '<:', '^<:', '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 = "/<pre class=\\\\?['\"]pmwikimarkup\\\\?['\"]>(.*?)<\\/pre>/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('<', '>', '&nbsp;'), array('<', '>', ' '), $v), 'X'); if(isset($match[1][$k])) $ret.="\n{$match[1][$k]}"; } return str_replace($all, $ret, $allHF); }