Back to [[BugTrack2/301]] #contents ----- ** diff file ? [#oaf70da5] Index: lib/plugin.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/lib/plugin.php,v retrieving revision 1.15 diff -u -r1.15 plugin.php --- lib/plugin.php 3 Jul 2005 14:16:23 -0000 1.15 +++ lib/plugin.php 30 Mar 2008 08:49:07 -0000 @@ -1,13 +1,33 @@ <?php -// PukiWiki - Yet another WikiWikiWeb clone. // $Id: plugin.php,v 1.15 2005/07/03 14:16:23 henoheno Exp $ -// Copyright (C) -// 2002-2005 PukiWiki Developers Team -// 2001-2002 Originally written by yu-ji -// License: GPL v2 or (at your option) any later version -// -// Plugin related functions +/* +PukiWiki - Yet another WikiWikiWeb clone, apparently. +Copyright (C) 2002-2005 PukiWiki Developers, + 2001-2002 yu-ji + +License: As listed below (GPL v2) or (at your option) any later version, dependant upon compatibility of licenses. + +This program is free software; 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 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +Note from JordanC: If you're licensing under the GPL, you need to implicitly +define the GPL in the header so that if code is browsed, you don't run the risk of +it being pseudo-legal. +*/ + +// Plugin related functions define('PKWK_PLUGIN_CALL_TIME_LIMIT', 768); // Set global variables for plugins @@ -49,130 +69,104 @@ } } -// Check if plugin API 'action' exists -function exist_plugin_action($name) { - return function_exists('plugin_' . $name . '_action') ? TRUE : exist_plugin($name) ? - function_exists('plugin_' . $name . '_action') : FALSE; -} - -// Check if plugin API 'convert' exists -function exist_plugin_convert($name) { - return function_exists('plugin_' . $name . '_convert') ? TRUE : exist_plugin($name) ? - function_exists('plugin_' . $name . '_convert') : FALSE; -} - -// Check if plugin API 'inline' exists -function exist_plugin_inline($name) { - return function_exists('plugin_' . $name . '_inline') ? TRUE : exist_plugin($name) ? - function_exists('plugin_' . $name . '_inline') : FALSE; -} - -// Do init the plugin -function do_plugin_init($name) -{ - static $checked = array(); - - if (isset($checked[$name])) return $checked[$name]; - - $func = 'plugin_' . $name . '_init'; - if (function_exists($func)) { - // TRUE or FALSE or NULL (return nothing) - $checked[$name] = call_user_func($func); - } else { - $checked[$name] = NULL; // Not exist +/** + * @brief Used to check the existence of a callback function + * Since there's only a few function types for callbacks, the array can be + * manipulated or expanded to allow/deny other callback functions. + * @param string $name + * @param string $affix + * @return boolean + */ +function plugin_callback_exists($name,$affix = "action") { + if(in_array($affix,array("action","convert","inline")) && exist_plugin($name)) { + $plugin_name = "plugin_" . $name . "_" . $affix; + return (function_exists($plugin_name)) ? TRUE : FALSE; // Function exists : Function doesn't exist. } +} - return $checked[$name]; +function plugin_do_callback($name,$affix = NULL,$params = NULL) { + $name .= (is_null($affix)) ? "" : "_" . $affix; + $func_name = "plugin_" . $name; + return (count($params) > 0 && isset($params[0])) ? call_user_func($func_name,$params) : (isset($params) && is_string($params)) ? $func_name($params) : $func_name(); } -// Call API 'action' of the plugin -function do_plugin_action($name) +// Do init the plugin +function plugin_do_init($name) { - if (! exist_plugin_action($name)) return array(); - - if(do_plugin_init($name) === FALSE) - die_message('Plugin init failed: ' . $name); - - $retvar = call_user_func('plugin_' . $name . '_action'); - - // Insert a hidden field, supports idenrtifying text enconding - if (PKWK_ENCODING_HINT != '') + static $checked = array(); + if(isset($checked[$name]) { + $funcname = plugin_callback_exists($name,'init') ? "plugin" . $name . "_init"; + return $checked[$name] = ($funcname()) ? $funcname() : call_user_func($funcname); // No need for double ternary - returns false on error. + } else { + return FALSE; // Yeah, your plugin is poop. + } +} +/** + * @brief Used to perform the predefined "action" + * @param string $name + * + * @return array + * @return string + */ +function plugin_do_action($name) +{ + if(plugin_callback_exists($name) && do_plugin_init($name)) { // Cached callback + $retvar = plugin_do_callback($name,"action"); + } + elseif(!plugin_do_init($name)) { + $retvar = array(); + } elseif(PKWK_ENCODING_HINT != '') { $retvar = preg_replace('/(<form[^>]*>)/', '$1' . "\n" . - '<div><input type="hidden" name="encode_hint" value="' . - PKWK_ENCODING_HINT . '" /></div>', $retvar); - + '<div><input type="hidden" name="encode_hint" value="' . + PKWK_ENCODING_HINT . '" /></div>', $retvar); + } return $retvar; } -// Call API 'convert' of the plugin -function do_plugin_convert($name, $args = '') +/** + * @brief Calls the conversion function of the specified plug-in + * + * @param string $name + * @param string (CSV) $args + */ +function plugin_do_convert($name, $args = '') { global $digest; + $args = ($args == '') ? array() : (strpos(",",$args)) ? csv_explode(',',$args) : FALSE; - if(do_plugin_init($name) === FALSE) - return '[Plugin init failed: ' . $name . ']'; - - if (! PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK) { - // Multiline plugin? + if(!plugin_do_init($name)) + return "Plugin init failed for" . $name; + if (!PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK) { + if (isset($body)) $aryargs[] = & $body; $pos = strpos($args, "\r"); // "\r" is just a delimiter if ($pos !== FALSE) { $body = substr($args, $pos + 1); $args = substr($args, 0, $pos); } - } - - if ($args === '') { - $aryargs = array(); // #plugin() - } else { - $aryargs = csv_explode(',', $args); // #plugin(A,B,C,D) - } - if (! PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK) { - if (isset($body)) $aryargs[] = & $body; // #plugin(){{body}} - } - - $_digest = $digest; - $retvar = call_user_func_array('plugin_' . $name . '_convert', $aryargs); - $digest = $_digest; // Revert - - if ($retvar === FALSE) { - return htmlspecialchars('#' . $name . - ($args != '' ? '(' . $args . ')' : '')); - } else if (PKWK_ENCODING_HINT != '') { - // Insert a hidden field, supports idenrtifying text enconding - return preg_replace('/(<form[^>]*>)/', '$1 ' . "\n" . + $bc_cache = plugin_do_callback("plugin_" . $name . "_convert",$args); + } elseif(!$bc_cache) { + if (PKWK_ENCODING_HINT != '') { + return preg_replace('/(<form[^>]*>)/', '$1 ' . "\n" . '<div><input type="hidden" name="encode_hint" value="' . - PKWK_ENCODING_HINT . '" /></div>', $retvar); - } else { - return $retvar; - } + PKWK_ENCODING_HINT . '" /></div>', $bc_cache); + } + return htmlspecialchars('#' . $name . ($args != '' ? '(' . $args . ')' : '')); + } else + return FALSE; } // Call API 'inline' of the plugin function do_plugin_inline($name, $args, & $body) { global $digest; - - if(do_plugin_init($name) === FALSE) - return '[Plugin init failed: ' . $name . ']'; - - if ($args !== '') { - $aryargs = csv_explode(',', $args); - } else { - $aryargs = array(); - } - - // NOTE: A reference of $body is always the last argument - $aryargs[] = & $body; // func_num_args() != 0 - - $_digest = $digest; - $retvar = call_user_func_array('plugin_' . $name . '_inline', $aryargs); - $digest = $_digest; // Revert - - if($retvar === FALSE) { - // Do nothing + $args = ($args == '') ? csv_explode(',', $args) & $body : array(); + if(plugin_do_init($name)) + return "Plugin init failed for" .$name; + $bc_cache = plugin_do_callback($name,"inline",$args); + elseif(!$bc_cache) { return htmlspecialchars('&' . $name . ($args ? '(' . $args . ')' : '') . ';'); } else { - return $retvar; + return $bc_cache; } } ?> Index: pukiwiki/lib/convert_html.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/lib/convert_html.php,v retrieving revision 1.20 diff -u -r1.20 convert_html.php --- pukiwiki/lib/convert_html.php 10 Sep 2007 14:18:50 -0000 1.20 +++ pukiwiki/lib/convert_html.php 30 Mar 2008 08:20:17 -0000 @@ -141,18 +141,18 @@ if (PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK) { // Usual code if (preg_match('/^\#([^\(]+)(?:\((.*)\))?/', $text, $matches) && - exist_plugin_convert($matches[1])) { + plugin_callback_exists($matches[1], 'convert')) { return new Div($matches); } } else { // Hack code if(preg_match('/^#([^\(\{]+)(?:\(([^\r]*)\))?(\{*)/', $text, $matches) && - exist_plugin_convert($matches[1])) { + plugin_callback_exists($matches[1], 'convert')) { $len = strlen($matches[3]); $body = array(); if ($len == 0) { return new Div($matches); // Seems legacy block plugin - } else if (preg_match('/\{{' . $len . '}\s*\r(.*)\r\}{' . $len . '}/', $text, $body)) { + } else if (preg_match('/\{{' . $len . '}\s*\r(.*)\r\}{' . $len . '}/', $text, $body)) { $matches[2] .= "\r" . $body[1] . "\r"; return new Div($matches); // Seems multiline-enabled block plugin } @@ -783,7 +783,7 @@ function toString() { // Call #plugin - return do_plugin_convert($this->name, $this->param); + return plugin_do_convert($this->name, $this->param); } } Index: pukiwiki/lib/html.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/lib/html.php,v retrieving revision 1.65 diff -u -r1.65 html.php --- pukiwiki/lib/html.php 19 Aug 2007 13:59:07 -0000 1.65 +++ pukiwiki/lib/html.php 30 Mar 2008 08:24:44 -0000 @@ -91,7 +91,7 @@ ' ' . get_pg_passage($_page, FALSE) : ''; // List of attached files to the page - $attaches = ($attach_link && $is_read && exist_plugin_action('attach')) ? + $attaches = ($attach_link && $is_read && plugin_callback_exists('attach', 'action')) ? attach_filelist() : ''; // List of related pages @@ -164,7 +164,7 @@ if ($digest === FALSE) $digest = md5(get_source($page, TRUE, TRUE)); $refer = $template = ''; - + // Add plugin $addtag = $add_top = ''; if(isset($vars['add'])) { Index: pukiwiki/lib/pukiwiki.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/lib/pukiwiki.php,v retrieving revision 1.21 diff -u -r1.21 pukiwiki.php --- pukiwiki/lib/pukiwiki.php 26 Aug 2007 15:17:28 -0000 1.21 +++ pukiwiki/lib/pukiwiki.php 30 Mar 2008 08:29:40 -0000 @@ -133,8 +133,8 @@ // Plugin execution if ($plugin != '') { - if (exist_plugin_action($plugin)) { - $retvars = do_plugin_action($plugin); + if (plugin_callback_exists($plugin, 'action')) { + $retvars = plugin_do_action($plugin); if ($retvars === FALSE) exit; // Done // Rescan $vars (Some plugins rewrite it) Index: pukiwiki/plugin/filelist.inc.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/plugin/filelist.inc.php,v retrieving revision 1.3 diff -u -r1.3 filelist.inc.php --- pukiwiki/plugin/filelist.inc.php 9 Jan 2005 08:16:28 -0000 1.3 +++ pukiwiki/plugin/filelist.inc.php 30 Mar 2008 08:31:04 -0000 @@ -7,6 +7,6 @@ function plugin_filelist_action() { - return do_plugin_action('list'); + return plugin_do_action('list'); } ?> Index: pukiwiki/plugin/read.inc.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/plugin/read.inc.php,v retrieving revision 1.8 diff -u -r1.8 read.inc.php --- pukiwiki/plugin/read.inc.php 15 Jan 2005 13:57:07 -0000 1.8 +++ pukiwiki/plugin/read.inc.php 30 Mar 2008 08:32:30 -0000 @@ -17,11 +17,11 @@ return array('msg'=>'', 'body'=>''); } else if (! PKWK_SAFE_MODE && is_interwiki($page)) { - return do_plugin_action('interwiki'); // InterWikiNameを処理 + return plugin_do_action('interwiki'); // InterWikiNameを処理 } else if (is_pagename($page)) { $vars['cmd'] = 'edit'; - return do_plugin_action('edit'); // 存在しないので、編集フォームを表示 + return plugin_do_action('edit'); // 存在しないので、編集フォームを表示 } else { // 無効なページ名 Index: pukiwiki/plugin/rename.inc.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/plugin/rename.inc.php,v retrieving revision 1.37 diff -u -r1.37 rename.inc.php --- pukiwiki/plugin/rename.inc.php 3 Nov 2007 15:26:19 -0000 1.37 +++ pukiwiki/plugin/rename.inc.php 30 Mar 2008 08:34:21 -0000 @@ -310,8 +310,8 @@ { $files = array(); $dirs = array(BACKUP_DIR, DIFF_DIR, DATA_DIR); - if (exist_plugin_convert('attach')) $dirs[] = UPLOAD_DIR; - if (exist_plugin_convert('counter')) $dirs[] = COUNTER_DIR; + if (plugin_callback_exists('attach', 'convert')) $dirs[] = UPLOAD_DIR; + if (plugin_callback_exists('counter', 'convert')) $dirs[] = COUNTER_DIR; // and more ... $matches = array(); Index: pukiwiki/skin/pukiwiki.skin.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/skin/pukiwiki.skin.php,v retrieving revision 1.56 diff -u -r1.56 pukiwiki.skin.php --- pukiwiki/skin/pukiwiki.skin.php 26 Jul 2007 00:57:00 -0000 1.56 +++ pukiwiki/skin/pukiwiki.skin.php 30 Mar 2008 08:35:39 -0000 @@ -51,7 +51,7 @@ } // MenuBar -$menu = arg_check('read') && exist_plugin_convert('menu') ? do_plugin_convert('menu') : FALSE; +$menu = arg_check('read') && plugin_callback_exists('menu', 'convert') ? plugin_do_convert('menu') : FALSE; // ------------------------------------------------------------ // Output Index: pukiwiki/skin/tdiary.skin.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/skin/tdiary.skin.php,v retrieving revision 1.36 diff -u -r1.36 tdiary.skin.php --- pukiwiki/skin/tdiary.skin.php 24 Jun 2007 14:01:21 -0000 1.36 +++ pukiwiki/skin/tdiary.skin.php 30 Mar 2008 08:37:19 -0000 @@ -213,7 +213,7 @@ case 'white_flower': case 'whiteout': case 'wood': - $title_design_date = 0; // Select text design + $title_design_date = 0; // Select text design break; case 'aqua': @@ -531,11 +531,11 @@ $menu = FALSE; } else { $menu = (arg_check('read') && is_page($GLOBALS['menubar']) && - exist_plugin_convert('menu')); + plugin_callback_exists('menu', 'convert')); if ($menu) { $menu_body = preg_replace('#<h2 ([^>]*)>(.*?)</h2>#', '<h3 $1><span class="sanchor"></span> $2</h3>', - do_plugin_convert('menu')); + plugin_do_convert('menu')); } } ----- Back to [[BugTrack2/301]]