OSDN Git Service

9c6a201ebbfa8cbdae3b7990516e8fe3939237e9
[pukiwiki/pukiwiki.git] / lib / plugin.php
1 <?php
2 // PukiWiki - Yet another WikiWikiWeb clone.
3 // $Id: plugin.php,v 1.20 2011/01/25 15:01:01 henoheno Exp $
4 // Copyright (C)
5 //   2002-2005 PukiWiki Developers Team
6 //   2001-2002 Originally written by yu-ji
7 // License: GPL v2 or (at your option) any later version
8 //
9 // Plugin related functions
10
11 define('PKWK_PLUGIN_CALL_TIME_LIMIT', 768);
12
13 // Set global variables for plugins
14 function set_plugin_messages($messages)
15 {
16         foreach ($messages as $name=>$val)
17                 if (! isset($GLOBALS[$name]))
18                         $GLOBALS[$name] = $val;
19 }
20
21 // Check plugin '$name' is here
22 function exist_plugin($name)
23 {
24         global $vars;
25         static $exist = array(), $count = array();
26
27         $name = strtolower($name);
28         if(isset($exist[$name])) {
29                 if (++$count[$name] > PKWK_PLUGIN_CALL_TIME_LIMIT)
30                         die('Alert: plugin "' . htmlsc($name) .
31                         '" was called over ' . PKWK_PLUGIN_CALL_TIME_LIMIT .
32                         ' times. SPAM or someting?<br />' . "\n" .
33                         '<a href="' . get_script_uri() . '?cmd=edit&amp;page='.
34                         rawurlencode($vars['page']) . '">Try to edit this page</a><br />' . "\n" .
35                         '<a href="' . get_script_uri() . '">Return to frontpage</a>');
36                 return $exist[$name];
37         }
38
39         if (preg_match('/^\w{1,64}$/', $name) &&
40             file_exists(PLUGIN_DIR . $name . '.inc.php')) {
41                 $exist[$name] = TRUE;
42                 $count[$name] = 1;
43                 require_once(PLUGIN_DIR . $name . '.inc.php');
44                 return TRUE;
45         } else {
46                 $exist[$name] = FALSE;
47                 $count[$name] = 1;
48                 return FALSE;
49         }
50 }
51
52 // Check if plugin API 'action' exists
53 function exist_plugin_action($name) {
54         return  function_exists('plugin_' . $name . '_action') ? TRUE : exist_plugin($name) ?
55                 function_exists('plugin_' . $name . '_action') : FALSE;
56 }
57
58 // Check if plugin API 'convert' exists
59 function exist_plugin_convert($name) {
60         return  function_exists('plugin_' . $name . '_convert') ? TRUE : exist_plugin($name) ?
61                 function_exists('plugin_' . $name . '_convert') : FALSE;
62 }
63
64 // Check if plugin API 'inline' exists
65 function exist_plugin_inline($name) {
66         return  function_exists('plugin_' . $name . '_inline') ? TRUE : exist_plugin($name) ?
67                 function_exists('plugin_' . $name . '_inline') : FALSE;
68 }
69
70 // Do init the plugin
71 function do_plugin_init($name)
72 {
73         static $checked = array();
74
75         // TRUE or FALSE or NULL (Return nothing / Not exists)
76         if (array_key_exists($name, $checked)) return $checked[$name];
77
78         $func = 'plugin_' . $name . '_init';
79         if (function_exists($func)) {
80                 $result = call_user_func($func);
81                 $checked[$name] = ($result === NULL) ? NULL : (bool)$result;
82         } else {
83                 $checked[$name] = NULL;
84         }
85
86         return $checked[$name];
87 }
88
89 // Call API 'action' of the plugin
90 function do_plugin_action($name)
91 {
92         if (! exist_plugin_action($name)) return array();
93
94         if(do_plugin_init($name) === FALSE)
95                 die_message('Plugin init failed: ' . $name);
96
97         $retvar = call_user_func('plugin_' . $name . '_action');
98
99         // Insert a hidden field, supports idenrtifying text enconding
100         if (PKWK_ENCODING_HINT != '')
101                 $retvar =  preg_replace('/(<form[^>]*>)/', '$1' . "\n" .
102                         '<div><input type="hidden" name="encode_hint" value="' .
103                         PKWK_ENCODING_HINT . '" /></div>', $retvar);
104
105         return $retvar;
106 }
107
108 // Call API 'convert' of the plugin
109 function do_plugin_convert($name, $args = '')
110 {
111         global $digest;
112
113         if(do_plugin_init($name) === FALSE)
114                 return '[Plugin init failed: ' . $name . ']';
115
116         if (! PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK) {
117                 // Multiline plugin?
118                 $pos  = strpos($args, "\r"); // "\r" is just a delimiter
119                 if ($pos !== FALSE) {
120                         $body = substr($args, $pos + 1);
121                         $args = substr($args, 0, $pos);
122                 }
123         }
124
125         if ($args === '') {
126                 $aryargs = array();                 // #plugin()
127         } else {
128                 $aryargs = csv_explode(',', $args); // #plugin(A,B,C,D)
129         }
130         if (! PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK) {
131                 if (isset($body)) $aryargs[] = & $body;     // #plugin(){{body}}
132         }
133
134         $_digest = $digest;
135         $retvar  = call_user_func_array('plugin_' . $name . '_convert', $aryargs);
136         $digest  = $_digest; // Revert
137
138         if ($retvar === FALSE) {
139                 return htmlsc('#' . $name .
140                         ($args != '' ? '(' . $args . ')' : ''));
141         } else if (PKWK_ENCODING_HINT != '') {
142                 // Insert a hidden field, supports idenrtifying text enconding
143                 return preg_replace('/(<form[^>]*>)/', '$1 ' . "\n" .
144                         '<div><input type="hidden" name="encode_hint" value="' .
145                         PKWK_ENCODING_HINT . '" /></div>', $retvar);
146         } else {
147                 return $retvar;
148         }
149 }
150
151 // Call API 'inline' of the plugin
152 function do_plugin_inline($name, $args, & $body)
153 {
154         global $digest;
155
156         if(do_plugin_init($name) === FALSE)
157                 return '[Plugin init failed: ' . $name . ']';
158
159         if ($args !== '') {
160                 $aryargs = csv_explode(',', $args);
161         } else {
162                 $aryargs = array();
163         }
164
165         // NOTE: A reference of $body is always the last argument
166         $aryargs[] = & $body; // func_num_args() != 0
167
168         $_digest = $digest;
169         $retvar  = call_user_func_array('plugin_' . $name . '_inline', $aryargs);
170         $digest  = $_digest; // Revert
171
172         if($retvar === FALSE) {
173                 // Do nothing
174                 return htmlsc('&' . $name . ($args ? '(' . $args . ')' : '') . ';');
175         } else {
176                 return $retvar;
177         }
178 }
179 ?>