<?php /** * * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Myron Turner <turnermm02@shaw.ca> */ if(!defined('DOKU_INC')) die(); define('REPLACE_DIR', DOKU_INC . 'data/meta/macros/'); /** * All DokuWiki plugins to extend the admin function * need to inherit from this class */ class admin_plugin_textinsert extends DokuWiki_Admin_Plugin { var $output = false; var $macros_file; var $macros_data; //used for html listings /** * handle user request */ function __construct() { if(!$this->getConf('farm')) { define('MACROS_FILE', REPLACE_DIR . 'macros.ser'); } else { define('MACROS_FILE', metaFN('macros','.ser')); } } function handle() { $this->macros_file=MACROS_FILE; if (!isset($_REQUEST['cmd'])) return; // first time - nothing to do $this->output = ''; if (!checkSecurityToken()) return; if (!is_array($_REQUEST['cmd'])) return; $action = ""; // verify valid values switch (key($_REQUEST['cmd'])) { case 'add' : $action = 'add'; $a = $this->add(); break; case 'delete' : $a = $this->del(); break; case 'edit': $a = $this->edit(); break; } // $this->output = print_r($a,true); // $this->output .= print_r($_REQUEST,true); } function add() { $a = $this->get_macros(); $macros = $_REQUEST['macro']; $words = $_REQUEST['word']; foreach ($macros AS $key=>$value) { if(isset($value) && trim($value)) { if(isset($words[$key]) && trim($words[$key])) { $value = utf8_deaccent($value); $a[$value] = htmlspecialchars (($words[$key]),ENT_NOQUOTES, 'UTF-8'); } } } io_saveFile(MACROS_FILE,serialize($a)); return $a; } function del() { $macros = $this->get_macros(); $deletions = $_REQUEST['delete']; $keys = array_keys($deletions); foreach ($keys AS $_key) { unset($macros[$_key]); } io_saveFile(MACROS_FILE,serialize($macros)); return $macros; } function edit() { $macros = $this->get_macros(); $encoded = $_REQUEST['encoded']; $encoded = array_map('urldecode',$encoded); foreach($encoded AS $k=>$val) { $macros[$k] = htmlspecialchars ($val,ENT_NOQUOTES, 'UTF-8', false); } io_saveFile(MACROS_FILE,serialize($macros)); return $macros; } function get_macros() { if(file_exists(MACROS_FILE)) { $a = unserialize(file_get_contents(MACROS_FILE)); if(!is_array($a)) return array(); ksort($a); return $a; } return array(); } function get_delete_list() { $macros = $this->macros_data; ptln('<table cellspacing="4px" width="90%">'); foreach($macros as $macro=>$subst) { ptln("<tr><td><input type='checkbox' name='delete[$macro]' value='$subst'>"); ptln( "<td style='padding:4px;'>$macro<td>$subst</td>"); } ptln('</table>'); } function get_edit_list() { $macros = $this->macros_data; ptln('<table cellspacing="4"><tr><th align="center">Macro</th><th align="center">' . $this->getLang('col_subst') .'</th></tr>'); foreach($macros as $macro=>$subst) { ptln("<tr><td align='center'>$macro </td><td>"); $encoded = urlencode($subst); if($subst != $encoded) { ptln("<input type = 'hidden' name='encoded[$macro]' value='$encoded'>"); } if(strlen($subst) > 80) { ptln ("<textarea cols='55' rows='3' name='edit[$macro]' onchange='replace_encode(this)'>$subst</textarea></td></tr>"); } else { ptln ("<input type='text' size='80' name='edit[$macro]' onchange='replace_encode(this)' value='$subst'></td></tr>"); } } ptln('</table>'); } function view_entries() { $macros = $this->macros_data; ptln('<table cellpadding="8px" width="90%">'); foreach($macros as $macro=>$subst) { ptln( "<tr><td align='center'>$macro<td style='padding: 4px; border-bottom: 1px solid black;'>$subst</tr>"); } ptln('</table>'); } function js() { echo <<<JSFN <script type="text/javascript"> //<![CDATA[ var replace_divs= new Array('macro_add','macro_del','macro_edit','ti_info','macro_list'); /** * Edit onChange handler * @param el input element which has been changed * @desc if an encode hidden input already exists, its value * is re-encoded from the text input's value * If not, a new encoded hidden input is created with the encoded * value. The encode input value is used to substitute the new edit values * in the php edit() function */ function replace_encode (el) { var matches = el.name.match(/\[(.*)\]/); if(matches[1]) { var name = 'encoded['+matches[1]+']'; var val = el.value; val = val.replace(/>/g,">"); val = val.replace(/</g,"<"); if(!el.form[name]) { var encoder = document.createElement('input'); encoder.type = 'hidden'; encoder.name = name; encoder.value = encodeURIComponent(val); el.form.appendChild(encoder); } else if(el.form[name]) { el.form[name].value = encodeURIComponent(val); } } } function ti_getEL(n) { return document.getElementById(n); } function replace_show(which) { for(var i in replace_divs) { ti_getEL(replace_divs[i]).style.display='none'; } ti_getEL(which).style.display='block'; ti_getEL('ti_info_btn').style.display='inline'; } //]]> </script> JSFN; } /** * output appropriate html */ function html() { $this->macros_data = $this->get_macros(); $this->js(); if($this->output) { ptln('<pre>' . $this->output . '</pre>'); } ptln('<div style="padding:4px" id="ti_info">'); ptln('<div style="text-align:right;">'); ptln('<button class="button" style="padding:0px;margin:0px;" onclick="replace_show(\'ti_info_btn\');">'); ptln($this->getLang('hide_info') .'</button> '); ptln('</div>'); ptln('<h2>Info</h2>'); ptln( $this->locale_xhtml('intro') . '</div>'); ptln('<div style="padding-bottom:8px;">'); ptln('<button class="button" onclick="replace_show(\'macro_add\'); ">'); ptln($this->getLang('add_macros') .'</button> '); ptln('<button class="button" onclick="replace_show(\'macro_del\'); ">'); ptln($this->getLang('delete_macros') .'</button> '); ptln('<button class="button" onclick="replace_show(\'macro_edit\'); ">'); ptln($this->getLang('edit_macros') .'</button> '); ptln('<button class="button" onclick="ti_getEL(\'macro_list\').style.display=\'block\';ti_getEL(\'macro_list\').scrollIntoView();">'); ptln($this->getLang('view_macros') .'</button> '); ptln('<button class="button" onclick="ti_getEL(\'macro_list\').style.display=\'none\';">'); ptln($this->getLang('hide_macros') .'</button> '); ptln('<button class="button" id="ti_info_btn" style="display:none" onclick="ti_getEL(\'ti_info\').style.display=\'block\';">'); ptln($this->getLang('show_info') .'</button>'); ptln('</div>'); ptln('<form action="'.wl($ID).'" method="post">'); // output hidden values to ensure dokuwiki will return back to this plugin ptln(' <input type="hidden" name="do" value="admin" />'); ptln(' <input type="hidden" name="page" value="'.$this->getPluginName().'" />'); formSecurityToken(); ptln('<div id="macro_add" style="display:none">'); ptln('<h2>' . $this->getLang('label_add') . '</h2>'); ptln( '<table cellspacing="8px"><tr><th>Macro</th><th>' . $this->getLang('col_subst') . '</th></tr>'); ptln('<tr><td> <input type="text" name="macro[A]" id="m_A" value="" /></td>'); ptln('<td> <input type="text" name="word[A]" size="80" id="w_A" value="" /></td></tr>'); ptln('<tr><td> <input type="text" name="macro[B]" id="m_B" value="" /></td>'); ptln('<td> <input type="text" name="word[B]" size="80" id="w_B" value="" /></td></tr>'); ptln('<tr><td> <input type="text" name="macro[C]" id="m_C" value="" /></td>'); ptln('<td> <input type="text" name="word[C]" size="80" id="w_C" value="" /></td></tr>'); ptln('<tr><td> <input type="text" name="macro[D]" id="m_D" value="" /></td>'); ptln('<td> <input type="text" name="word[D]" size="80" id="w_C" value="" /></td></tr>'); ptln('<tr><td> <input type="text" name="macro[E]" id="m_E" value="" /></td>'); ptln('<td> <input type="text" name="word[E]" size="80" id="w_E" value="" /></td>'); ptln('<tr><td> <input type="text" name="macro[F]" id="m_F" value="" /></td>'); ptln('<td> <textarea cols="45" name="word[F]" rows="4" id="w_F"></textarea></td>'); ptln('</table>'); ptln(' <input type="submit" name="cmd[add]" value="'.$this->getLang('btn_add').'" />'); ptln('</div><br />'); ptln('<div id="macro_del" style="display:none">'); ptln('<h2>' . $this->getLang('label_del') . '</h2>'); $this->get_delete_list(); ptln('<br /><input type="submit" name="cmd[delete]" value="'.$this->getLang('btn_del').'" />'); ptln('</div>'); ptln('<div id="macro_edit" style="display:none; padding: 8px;">'); ptln('<h2>' . $this->getLang('label_edit') . '</h2>'); $this->get_edit_list(); ptln('<br /><input type="submit" name="cmd[edit]" value="'.$this->getLang('btn_edit').'" />'); ptln('</div>'); ptln('</form>'); ptln('<br /><div id="macro_list" style="overflow:auto;display:block;">'); ptln('<h2>' . $this->getLang('label_list') . '</h2>'); $this->view_entries(); ptln('</div>'); } }