?php
function plugin_vote2_init() {
$messages = array( '_vote2_messages' => array( 'arg_notimestamp' => 'notimestamp', 'arg_nonumber' => 'nonumber', 'arg_nolabel' => 'nolabel', 'arg_notitle' => 'notitle', 'title_error' => 'Error in vote2', 'no_page_error' => '$1 のページは存在しません', 'update_failed' => '投票失敗:$1において投票先が無いか項目が合致しませんでした。', 'body_error' => 'あるべき引数が渡されていないか、引数にエラーがあります。', 'msg_collided' => '<h3>あなたが投票している間に、他の人が同じページの内容を更新してしまったようです。<br />従って、投票する位置を間違える可能性があります。<br /><br />
あなたの更新を無効にしました。前のページをリロードしてやり直してください。</h3>'
), ); set_plugin_messages($messages);
} function plugin_vote2_action() {
global $vars, $_vote2_messages; $vote_no = 0; $block_flag = 0; if ( ! is_page($vars['refer']) ){ $error = str_replace('$1', $vars['refer'], $_vote2_messages['no_page_error']); return array( 'msg' => $_vote2_messages['title_error'], 'body' => $error, ); } if ( array_key_exists('vote_no', $vars) ) { $vote_no = $vars['vote_no']; $block_flag = 1; } else if ( array_key_exists('vote_inno', $vars) ){ $vote_no = $vars['vote_inno']; $block_flag = 0; } if ( preg_match('/^(\d+)([ib]?)$/', $vote_no, $match) ){ $vote_no = $match[1]; switch ( $match[2] ){ case 'i': $block_flag = 0; break; case 'b': $block_flag = 1; break; default: break; } switch ( $block_flag ) { case 1: return plugin_vote2_action_block($vote_no); break; case 0: default: return plugin_vote2_action_inline($vote_no); break; } } return array( 'msg' => $_vote2_messages['title_error'], 'body' => $_vote2_messages['body_error'], );
} function plugin_vote2_inline() {
global $script,$vars,$digest, $_vote2_messages, $_vote_plugin_votes; global $_vote_plugin_choice, $_vote_plugin_votes; static $numbers = array(); static $notitle = FALSE; $str_notimestamp = $_vote2_messages['arg_notimestamp']; $str_nonumber = $_vote2_messages['arg_nonumber']; $str_nolabel = $_vote2_messages['arg_nolabel']; $str_notitle = $_vote2_messages['arg_notitle'];
$args = func_get_args(); array_pop($args); // {}内の要素の削除 $page = $vars['page']; if (!array_key_exists($page,$numbers)) $numbers[$page] = 0; $vote_inno = $numbers[$page]++; $o_vote_inno = $f_vote_inno = $vote_inno;
$ndigest = $digest; $arg = ''; $cnt = 0; $nonumber = $nolabel = FALSE; foreach ( $args as $opt ){ $opt = trim($opt); if ( $opt == $str_notimestamp || $opt == '' ){ } else if ( $opt == $str_nonumber ){ $nonumber = TRUE; } else if ( $opt == $str_nolabel ){ $nolabel = TRUE; } else if ( $opt == $str_notitle ){ $notitle = TRUE; } else if ( preg_match('/^(.+(?==))=([+-]?\d+)([ibr]?)$/',$opt,$match) ){ list($page,$vote_inno,$f_vote_inno,$ndigest) = plugin_vote2_address($match,$vote_inno,$page,$ndigest); } else if ( $arg == '' and preg_match("/^(.*)\[(\d+)\]$/",$opt,$match)){ $arg = $match[1]; $cnt = $match[2]; } else if ( $arg == '' ) { $arg = $opt; } } $link = make_link($arg); $e_arg = encode($arg); $f_page = rawurlencode($page); $f_digest = rawurlencode($ndigest); $f_vote_plugin_votes = rawurlencode($_vote_plugin_votes); $f_cnf = ''; if ( $nonumber == FALSE ) { $title = $notitle ? '' : "title=\"$o_vote_inno\""; $f_cnt = "<span $title> " . $cnt . " </span>"; } if ( $nolabel == FALSE ) { $title = $notitle ? '' : "title=\"$f_vote_inno\""; return <<<EOD
a href="$script?plugin=vote2&refer=$f_page&vote_inno=$vote_inno&vote_$e_arg=$f_vote_plugin_votes&digest=$f_digest" $title>$link</a>$f_cnt EOD;
} else { return $f_cnt; }} function plugin_vote2_address($match, $vote_no, $page, $ndigest) {
global $digests;
$this_flag = FALSE; $npage = trim($match[1]); $vote2_no_arg = $match[2]; $vote2_attr_arg = $match[3];
if ( $npage == 'this' ) { $npage = $page; $this_flag = TRUE; } else { $npage = preg_replace('/^\[\[(.*)\]\]$/','$1', $npage); if ( $npage == $page ){ $this_flag = TRUE; } else if ( ! is_page($npage) ) { $vote2_attr_arg = 'error'; } else if ( array_key_exists($npage, $digests) ) { $ndigest = $digests[$npage]; } else { $ndigest = md5(join('',get_source($npage))); $digests[$npage] = $ndigest; } } switch ( $vote2_attr_arg ){ case '': case 'i': case 'b': $vote_no = $vote2_no_arg . $vote2_attr_arg; break; case 'r': if ( $this_flag ) { $vote_no += $vote2_no_arg; } else { $vote_no = 'error'; } break; default: $vote_no = 'error'; break; } $f_vote_no = htmlspecialchars($npage . '=' . $vote_no); return array($npage, $vote_no, $f_vote_no, $ndigest);
} function plugin_vote2_convert() {
global $script,$vars,$digest, $_vote2_messages; global $_vote_plugin_choice, $_vote_plugin_votes, $digests; static $numbers = array(); static $notitle = FALSE; $str_notimestamp = $_vote2_messages['arg_notimestamp']; $str_nonumber = $_vote2_messages['arg_nonumber']; $str_nolabel = $_vote2_messages['arg_nolabel']; $str_notitle = $_vote2_messages['arg_notitle']; if (!array_key_exists($vars['page'],$numbers)) { $numbers[$vars['page']] = 0; } $o_vote_no = $f_vote_no = $vote_no = $numbers[$vars['page']]++; if (!func_num_args()) { return ''; }
$args = func_get_args(); $page = $vars['page'];
$ndigest = $digest; $tdcnt = 0; $body2 = ''; $nonumber = $nolabel = FALSE; $options = array(); foreach($args as $arg) { $arg = trim($arg); if ( $arg == $str_nonumber ){ $nonumber = TRUE; continue; } else if ( $arg == $str_nolabel ){ $nolabel = TRUE; continue; } else if ( $arg == $str_notitle ){ $notitle = TRUE; continue; } $options[] = $arg; } foreach($options as $arg) { $cnt = 0; if ( $arg == $str_notimestamp ){ continue; } else if ( preg_match('/^(.+(?==))=([+-]?\d+)([bir]?)$/',$arg,$match) ){ list($page,$vote_no,$f_vote_no,$ndigest) = plugin_vote2_address($match,$vote_no,$page,$ndigest); continue; } else if (preg_match("/^(.*)\[(\d+)\]$/",$arg,$match)) { $arg = $match[1]; $cnt = $match[2]; } $e_arg = encode($arg); $f_cnf = ''; if ( $nonumber == FALSE ) { $title = $notitle ? '' : "title=\"$o_vote_no\""; $f_cnt = "<span $title> " . $cnt . " </span>"; } $link = make_link($arg); switch ( $tdcnt++ % 3){ case 0: $cls = 'vote_td1'; break; case 1: $cls = 'vote_td2'; break; case 2: $cls = 'vote_td3'; break; } $cls = ($tdcnt++ % 2) ? 'vote_td1' : 'vote_td2'; if ( $nolabel == FALSE ){ $body2 .= <<<EOD <tr> <td align="left" class="$cls" style="padding-left:1em;padding-right:1em;">$link</td> <td align="right" class="$cls">$f_cnt <input type="submit" name="vote_$e_arg" value="$_vote_plugin_votes" class="submit" /> </td> </tr>
EOD;
} else { $body2 .= <<<EOD <tr> <td align="left" class="$cls" style="padding-left:1em;padding-right:1em;">$link</td> <td align="right" class="$cls">$f_cnt </td> </tr>
EOD;
} }
$s_page = htmlspecialchars($page); $s_digest = htmlspecialchars($ndigest); $title = $notitle ? '' : "title=\"$f_vote_no\""; $body = <<<EOD
form action="$script" method="post">
<table cellspacing="0" cellpadding="2" class="style_table" summary="vote" $title> <tr> <td align="left" class="vote_label" style="padding-left:1em;padding-right:1em"><strong>$_vote_plugin_choice</strong> <input type="hidden" name="plugin" value="vote2" /> <input type="hidden" name="refer" value="$s_page" /> <input type="hidden" name="digest" value="$s_digest" /> <input type="hidden" name="vote_no" value="$vote_no" /> </td> <td align="center" class="vote_label"><strong>$_vote_plugin_votes</strong></td> </tr>
EOD;
$body .= <<<EOD
$body2
</table>
/form>
EOD;
return $body;
} function plugin_vote2_action_inline($vote_no) {
global $get,$vars,$script,$cols,$rows, $_vote2_messages; global $_title_collided,$_msg_collided,$_title_updated; global $_vote_plugin_choice, $_vote_plugin_votes; $str_notimestamp = $_vote2_messages['arg_notimestamp']; $str_nonumber = $_vote2_messages['arg_nonumber']; $str_nolabel = $_vote2_messages['arg_nolabel']; $str_notitle = $_vote2_messages['arg_notitle']; $str_plugin = 'vote2'; $len_plugin = strlen($str_plugin) + 1; $title = $body = $postdata = ''; $vote_ct = $skipflag = 0; $page = $vars['page']; $postdata_old = get_source($vars['refer']);
$ic = new InlineConverter(array('plugin')); $notimestamp = $update_flag = FALSE; foreach($postdata_old as $line) { if ( $skipflag || substr($line,0,1) == ' ' || substr($line,0,2) == '//' ){ $postdata .= $line; continue; } $pos = 0; $arr = $ic->get_objects($line,$page); while ( count($arr) ){ $obj = array_shift($arr); if ( $obj->name != $str_plugin ) continue; $pos = strpos($line, '&' . $str_plugin, $pos); if ( $vote_ct++ < $vote_no ) { $pos += $len_plugin; continue; } $l_line = substr($line,0,$pos); $r_line = substr($line,$pos + strlen($obj->text)); $options = explode(',', $obj->param); $cnt = 0; $name = ''; $vote = array(); foreach ( $options as $opt ){ $arg = trim($opt); if ( $arg == $str_notimestamp ){ $notimestamp = TRUE; } else if ( $arg == '' ){ continue; } else if ( $arg == $str_nonumber || $arg == $str_nolabel || $arg == $str_notitle ) { } else if (preg_match("/^.+(?==)=[+-]?\d+[bir]?$/",$arg,$match)){ } else if ( $name == '' and preg_match("/^(.*)\[(\d+)\]$/",$arg,$match)){ $name = $match[1]; $cnt = $match[2]; continue; } else if ( $name == '' ){ $name = $arg; continue; } $vote[] = $arg; } array_unshift($vote, $name .'['.($cnt+1).']'); $vote_str = "&$str_plugin(".join(',',$vote).');'; $pline = $l_line . $vote_str . $r_line; if ( $pline !== $line ) $update_flag = TRUE; $postdata_input = $line = $pline; $skipflag = 1; break; } $postdata .= $line; }
if ( md5(@join('',get_source($vars['refer']))) != $vars['digest']) { $title = $_title_collided; $body = $_vote2_messages['msg_collided'] . make_pagelink($vars['refer']) . "<hr />\n $postdata_input"; } else if ( $update_flag == TRUE ) { page_write($vars['refer'],$postdata,$notimestamp); $title = $_title_updated;
} else { $title = $_vote2_messages['update_failed']; }
$retvars['msg'] = $title; $retvars['body'] = $body;
$get['page'] = $vars['refer']; $vars['page'] = $vars['refer'];
return $retvars;
} function plugin_vote2_action_block($vote_no) {
global $post,$vars,$script,$cols,$rows, $_vote2_messages; global $_title_collided,$_msg_collided,$_title_updated; global $_vote_plugin_choice, $_vote_plugin_votes; $str_notimestamp = $_vote2_messages['arg_notimestamp']; $str_nonumber = $_vote2_messages['arg_nonumber']; $str_nolabel = $_vote2_messages['arg_nolabel']; $str_notitle = $_vote2_messages['arg_notitle']; $notimestamp = $update_flag = FALSE;
$postdata_old = get_source($vars['refer']); $vote_ct = 0; $title = $body = $postdata = '';
foreach($postdata_old as $line) { if (!preg_match("/^#vote2\((.*)\)\s*$/",$line,$arg)) { $postdata .= $line; continue; } if ($vote_ct++ != $vote_no) { $postdata .= $line; continue; } $args = explode(',',$arg[1]); foreach($args as $arg) { $arg = trim($arg); $cnt = 0; if ( $arg == $str_notimestamp ){ $notimestamp = TRUE; $votes[] = $arg; continue; } else if ( $arg == '' ) { continue; } else if ( $arg == $str_nonumber || $arg == $str_nolabel || $arg == $str_notitle ){ $votes[] = $arg; continue; } else if (preg_match("/^.+(?==)=[+-]?\d+[bir]?$/",$arg,$match)){ $votes[] = $arg; continue; } else if (preg_match("/^(.*)\[(\d+)\]$/",$arg,$match)) { $arg = $match[1]; $cnt = $match[2]; } $e_arg = encode($arg); if (!empty($vars["vote_$e_arg"]) and $vars["vote_$e_arg"] == $_vote_plugin_votes) { $cnt++; $update_flag = TRUE; } $votes[] = $arg.'['.$cnt.']'; } $vote_str = '#vote2('.@join(',',$votes).")\n"; $postdata_input = $vote_str; $postdata .= $vote_str; }
if ( md5(@join('',get_source($vars['refer']))) != $vars['digest'] ) { $title = $_title_collided; $body = $_vote2_messages['msg_collided'] . make_pagelink($vars['refer']) . "<hr />\n $postdata_input"; } else if ( $update_flag == TRUE ) { $title = $_title_updated; page_write($vars['refer'],$postdata,$notimestamp); } else { $title = $_vote2_messages['update_failed']; }
$retvars['msg'] = $title; $retvars['body'] = $body;
$post['page'] = $vars['refer']; $vars['page'] = $vars['refer'];
return $retvars;
} ?>