<?php /** * Doodle Plugin: helps to schedule meetings * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Jonathan Tsai <tryweb@ichiayi.com> * @previsou author Esther Brunner <wikidesign@gmail.com> */ if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); require_once(DOKU_PLUGIN.'syntax.php'); /** * All DokuWiki plugins to extend the parser/rendering mechanism * need to inherit from this class */ class syntax_plugin_doodle extends DokuWiki_Syntax_Plugin { /** * return some info */ function getInfo(){ return array( 'author' => 'Jonathan Tsai', 'email' => 'tryweb@ichiayi.com', 'date' => '2009/08/10', 'name' => 'Doodle Plugin', 'desc' => 'helps to schedule meetings', 'url' => 'http://wiki.splitbrain.org/plugin:doodle', ); } function getType(){ return 'substition';} function getPType(){ return 'block';} function getSort(){ return 168; } /** * Connect pattern to lexer */ function connectTo($mode){ $this->Lexer->addSpecialPattern('<doodle.*?>.+?</doodle>', $mode, 'plugin_doodle'); } /** * Handle the match */ function handle($match, $state, $pos, Doku_Handler $handler){ $match = substr($match, 8, -9); // strip markup list($title, $options) = preg_split('/>/u', $match, 2); list($leftstr, $rightstr) = explode ('\|', $title); if ($rightstr == "") { $title = $leftstr; $disable = ""; $single = ""; $login = ""; } else { $title = $rightstr; $disable = strpos($leftstr, "disable"); $single = strpos($leftstr, "single"); $login = strpos($leftstr, "login"); } if (!$options){ $options = $title; $title = NULL; } $options = explode('^', $match); $c = count($options); for ($i = 0; $i < $c; $i++){ $options[$i] = trim($options[$i]); } return array(trim($title), $options, $disable, $single, $login); } /** * Create output */ function render($mode, Doku_Renderer $renderer, $data) { if ($mode == 'xhtml'){ global $lang; $options = $data[1]; $c = count($options)-1; $title = $renderer->_xmlEntities($data[0]); $disable = $renderer->_xmlEntities($data[2]); $single = $renderer->_xmlEntities($data[3]); $login = $renderer->_xmlEntities($data[4]); $dID = md5($title); // prevent caching to ensure the poll results are fresh $renderer->info['cache'] = false; // get doodle file contents $dfile = metaFN($dID, '.doodle'); $old_dfile = metaFN(md5(cleanID($title)), '.doodle'); // rename old meta File if (file_exists($old_dfile)) { rename($old_dfile, $dfile); } $doodle = unserialize(@file_get_contents($dfile)); if ($c == 0){ // no options given: reset the doodle $doodle = NULL; } // output the doodle $renderer->table_open(); if ($title){ $renderer->tablerow_open(); $renderer->tableheader_open($c); $renderer->doc .= $title; $renderer->tableheader_close(); $renderer->tablerow_close(); } $renderer->tablerow_open(); $renderer->tableheader_open(); $renderer->doc .= $lang['fullname']; $renderer->tableheader_close(); for ($i = 1; $i < $c; $i++){ $renderer->tableheader_open(); $renderer->doc .= $renderer->_xmlEntities($options[$i]); $renderer->tableheader_close(); } $renderer->tablerow_close(); if ($submit = $_REQUEST[$dID.'-submit']){ // user has just voted -> update results $user = trim($_REQUEST['fullname']); $user = str_replace('<', '<', $user); $user = str_replace('>', '>', $user); if (!empty($user)){ for ($i = 1; $i < $c; $i++){ $opt = md5($options[$i]); $opt_old = $renderer->_xmlEntities($options[$i]); if (isset($doodle[$user][$opt_old])) { $doodle[$user][$opt_old] = false; } if ($_REQUEST[$dID.'-option'.$i]){ $doodle[$user][$opt] = true; } else { $doodle[$user][$opt] = false; } } $doodle[$user]['time']=time(); } $fh = fopen($dfile, 'w'); fwrite($fh, serialize($doodle)); fclose($fh); } // display results if (is_array($doodle)) $renderer->doc .= $this->_doodleResults($doodle, $options); // display entry form if ($disable=="") { $renderer->doc .= $this->_doodleForm($c, $dID, $doodle, $options, $login, $single); } $renderer->table_close(); return true; } return false; } function _doodleResults($doodle, $options){ $cuser = count($doodle); if ($cuser < 1) return ''; $copt = count($options)-1; $users = array_keys($doodle); $ret = ''; $count = array(); // table okay / not okay for ($i = 0; $i < $cuser; $i++){ $isChecked = 0; $user = $users[$i]; $updTime = isset($doodle[$user]['time'])?date('Y-m-d H:i:s', $doodle[$user]['time']):'Okey'; $retTmp = '<tr><td class="rightalign">'.$user.'</td>'; for ($j = 1; $j < $copt; $j++){ $option = md5($options[$j]); $option_old = $options[$j]; if ($doodle[$user][$option] || $doodle[$user][$option_old]){ $class = 'okay'; $title = '<img src="'.DOKU_BASE.'lib/images/success.png" title="'. $updTime.'" alt="'.$updTime.'" '. 'width="16" height="16" />'; $count[$option] += 1; $isChecked = 1; } elseif (!isset($doodle[$user][$option]) && !isset($doodle[$user][$option_old])){ $class = 'centeralign'; $title = ' '; } else { $class = 'notokay'; $title = ' '; } $retTmp .= '<td class="'.$class.'">'.$title.'</td>'; } $retTmp .= '</tr>'; $ret .= ($isChecked==1)?$retTmp:""; } // total count $ret .= '<tr><td> </td>'; for ($j = 1; $j < $copt; $j++){ $option = md5($options[$j]); $ret .= '<td class="centeralign">'.$count[$option].'</td>'; } $ret .= '</tr>'; return $ret; } function _doodleForm($n, $dID, $doodle, $options, $login, $single){ global $lang; global $ID; global $INFO; $user = ($_SERVER['REMOTE_USER'] ? $INFO['userinfo']['name'] : ''); $count = array(); $ret = '<form id="doodle__form" method="post" action="'.script(). '" accept-charset="'.$lang['encoding'].'"><tr>'. '<input type="hidden" name="do" value="show" />'. '<input type="hidden" name="id" value="'.$ID.'" />'; if ($login=="") { $ret .= '<td class="rightalign"><input type="text" name="fullname" '.'value="'.$user.'" /></td>'; } else { if ($user=="") { return ""; } $ret .= '<input type="hidden" name="fullname" value="'.$user.'" />'.'<td class="rightalign">'.$user.'</td>'; } $i = 1; while ($i < $n){ if (is_array($doodle)){ $option = md5($options[$i]); $option_old = $options[$j]; if ($doodle[$user][$option] || $doodle[$user][$option_old]){ $checked = 'checked="checked" '; } else { $checked = ' '; } } else { $checked = ' '; } $onclickstr = ""; if ($single!="") { $onclickstr = 'onclick="javascript:'; for ($j=1;$j<$n;$j++) { if ($j!=$i) { $onclickstr .= 'form[\''.$dID.'-option'.$j.'\'].checked=false;'; } } $onclickstr .= '"'; } $ret.= '<td class="centeralign"><input type="checkbox" '. 'name="'.$dID.'-option'.$i.'" value="1" '.$checked.' '.$onclickstr.'/></td>'; $i++; } $ret .= '</tr><tr><td class="centeralign" colspan="'.($n).'">'. '<input class="button" type="submit" name="'.$dID.'-submit" '. 'value="'.$this->getLang('btn_submit').'" />'. '</td></tr></form>'; return $ret; } } ?>