OSDN Git Service

Check defined or undefined
[pukiwiki/pukiwiki.git] / plugin / tb.inc.php
1 <?php
2 // $Id: tb.inc.php,v 1.13 2004/07/31 13:41:20 henoheno Exp $
3 /*
4  * PukiWiki TrackBack ¥×¥í¥°¥é¥à
5  * (C) 2003, Katsumi Saito <katsumi@jo1upk.ymt.prug.or.jp>
6  * License: GPL
7  *
8  * plugin_tb_action()    action
9  * tb_save()             TrackBack Ping ¥Ç¡¼¥¿Êݸ(¹¹¿·)
10  * tb_xml_msg($rc, $msg) XML ·ë²Ì½ÐÎÏ
11  * tb_mode_rss($tb_id)   ?__mode=rss ½èÍý
12  * tb_mode_view($tb_id)  ?__mode=view ½èÍý
13  */
14
15 function plugin_tb_action()
16 {
17         global $vars, $trackback;
18
19         // POST: TrackBack Ping ¤òÊݸ¤¹¤ë
20         if (!empty($vars['url']))
21                 tb_save();
22
23         if ($trackback and !empty($vars['__mode']) and !empty($vars['tb_id'])) {
24                 switch ($vars['__mode']) {
25                         case 'rss':  tb_mode_rss($vars['tb_id']);  break;
26                         case 'view': tb_mode_view($vars['tb_id']); break;
27                 }
28         }
29         $pages = get_existpages(TRACKBACK_DIR, '.txt');
30
31         if (count($pages) == 0) {
32                 return array('msg'=>'', 'body'=>'');
33         } else {
34                 return array('msg'=>'trackback list', 'body'=>page_list($pages, 'read', FALSE));
35         }
36 }
37
38 // TrackBack Ping ¥Ç¡¼¥¿Êݸ(¹¹¿·)
39 function tb_save()
40 {
41         global $script, $vars, $trackback;
42         static $fields = array( /* UTIME, */ 'url', 'title', 'excerpt', 'blog_name');
43
44         // µö²Ä¤·¤Æ¤¤¤Ê¤¤¤Î¤Ë¸Æ¤Ð¤ì¤¿¾ì¹ç¤ÎÂбþ
45         if (!$trackback) {
46                 tb_xml_msg(1, 'Feature inactive.');
47         }
48         // TrackBack Ping ¤Ë¤ª¤±¤ë URL ¥Ñ¥é¥á¡¼¥¿¤Ïɬ¿Ü¤Ç¤¢¤ë¡£
49         if (empty($vars['url'])) {
50                 tb_xml_msg(1, 'It is an indispensable parameter. URL is not set up.');
51         }
52         // Query String ¤òÆÀ¤ë
53         if (empty($vars['tb_id'])) {
54                 tb_xml_msg(1, 'TrackBack Ping URL is inaccurate.');
55         }
56
57         $url   = $vars['url'];
58         $tb_id = $vars['tb_id'];
59
60         // ¥Ú¡¼¥¸Â¸ºß¥Á¥§¥Ã¥¯
61         $page = tb_id2page($tb_id);
62         if ($page === FALSE) {
63                 tb_xml_msg(1, 'TrackBack ID is invalid.');
64         }
65
66         // URL ÂÅÅöÀ­¥Á¥§¥Ã¥¯ (¤³¤ì¤òÆþ¤ì¤ë¤È½èÍý»þ´Ö¤ËÌäÂ꤬¤Ç¤ë)
67         $result = http_request($url, 'HEAD');
68         if ($result['rc'] !== 200) {
69                 tb_xml_msg(1, 'URL is fictitious.');
70         }
71
72         // TRACKBACK_DIR ¤Î¸ºß¤È½ñ¤­¹þ¤ß²Äǽ¤«¤Î³Îǧ
73         if (!file_exists(TRACKBACK_DIR)) {
74                 tb_xml_msg(1, 'No such directory');
75         }
76         if (!is_writable(TRACKBACK_DIR)) {
77                 tb_xml_msg(1, 'Permission denied');
78         }
79
80         // TrackBack Ping ¤Î¥Ç¡¼¥¿¤ò¹¹¿·
81         $filename = tb_get_filename($page);
82         $data = tb_get($filename);
83
84         $items = array(UTIME);
85         foreach ($fields as $key)
86         {
87                 $value = isset($vars[$key]) ? $vars[$key] : '';
88                 if (preg_match("/[,\"\n\r]/", $value)) {
89                         $value = '"' . str_replace('"', '""', $value) . '"';
90                 }
91                 $items[$key] = $value;
92         }
93         $data[rawurldecode($items['url'])] = $items;
94
95         $fp = fopen($filename, 'w');
96         set_file_buffer($fp, 0);
97         flock($fp, LOCK_EX);
98         rewind($fp);
99         foreach ($data as $line) {
100                 $line = preg_replace('/[\r\n]/s', '', $line); // One line, one ping
101                 fwrite($fp, join(',', $line) . "\n");
102         }
103         flock($fp, LOCK_UN);
104         fclose($fp);
105
106         tb_xml_msg(0, '');
107 }
108
109 // XML ·ë²Ì½ÐÎÏ
110 function tb_xml_msg($rc, $msg)
111 {
112         header('Content-Type: text/xml');
113         echo '<?xml version="1.0" encoding="iso-8859-1"?>';
114         echo <<<EOD
115
116 <response>
117  <error>$rc</error>
118  <message>$msg</message>
119 </response>
120 EOD;
121         die;
122 }
123
124 // ?__mode=rss ½èÍý
125 function tb_mode_rss($tb_id)
126 {
127         global $script, $vars, $entity_pattern;
128
129         $page = tb_id2page($tb_id);
130         if ($page === FALSE) {
131                 return FALSE;
132         }
133
134         $items = '';
135         foreach (tb_get(tb_get_filename($page)) as $arr)
136         {
137                 // $utime and $blog_name is not used
138                 $utime = array_shift($arr);
139                 list ($url, $title, $excerpt, $blog_name) = array_map(
140                         create_function('$a', 'return htmlspecialchars($a);'), $arr);
141                 $items .= <<<EOD
142
143    <item>
144     <title>$title</title>
145     <link>$url</link>
146     <description>$excerpt</description>
147    </item>
148 EOD;
149         }
150
151         $title = htmlspecialchars($page);
152         $link = "$script?" . rawurlencode($page);
153         $vars['page'] = $page;
154         $excerpt = strip_htmltag(convert_html(get_source($page)));
155         $excerpt = preg_replace("/&$entity_pattern;/", '', $excerpt);
156         $excerpt = mb_strimwidth(preg_replace("/[\r\n]/", ' ', $excerpt), 0, 255, '...');
157
158         $rc = <<<EOD
159
160 <response>
161  <error>0</error>
162  <rss version="0.91">
163   <channel>
164    <title>$title</title>
165    <link>$link</link>
166    <description>$excerpt</description>
167    <language>ja-Jp</language>$items
168   </channel>
169  </rss>
170 </response>
171 EOD;
172         $rc = mb_convert_encoding($rc, 'UTF-8', SOURCE_ENCODING);
173         header('Content-Type: text/xml');
174         echo '<?xml version="1.0" encoding="utf-8" ?>';
175         echo $rc;
176         die;
177 }
178
179 // ?__mode=view ½èÍý
180 function tb_mode_view($tb_id)
181 {
182         global $script, $page_title;
183         global $_tb_title, $_tb_header, $_tb_entry, $_tb_refer, $_tb_date;
184         global $_tb_header_Excerpt, $_tb_header_Weblog, $_tb_header_Tracked;
185
186         // TrackBack ID ¤«¤é¥Ú¡¼¥¸Ì¾¤ò¼èÆÀ
187         $page = tb_id2page($tb_id);
188         if ($page === FALSE) {
189                 return FALSE;
190         }
191         $r_page = rawurlencode($page);
192
193         $tb_title = sprintf($_tb_title, $page);
194         $tb_refer = sprintf($_tb_refer, "<a href=\"$script?$r_page\">'$page'</a>", "<a href=\"$script\">$page_title</a>");
195
196
197         $data = tb_get(tb_get_filename($page));
198
199         // ºÇ¿·ÈǤ«¤éÀ°Îó
200         usort($data, create_function('$a,$b', 'return $b[0] - $a[0];'));
201
202         $tb_body = '';
203         foreach ($data as $x)
204         {
205                 if (count($x) != 5) {
206                         continue; // record broken
207                 }
208                 list ($time, $url, $title, $excerpt, $blog_name) = $x;
209                 if ($title == '') {
210                         $title = 'no title';
211                 }
212                 $time = date($_tb_date, $time + LOCALZONE); // May 2, 2003 11:25 AM
213                 $tb_body .= <<<EOD
214 <div class="trackback-body">
215  <span class="trackback-post"><a href="$url" target="new">$title</a><br />
216   <strong>$_tb_header_Excerpt</strong> $excerpt<br />
217   <strong>$_tb_header_Weblog</strong> $blog_name<br />
218   <strong>$_tb_header_Tracked</strong> $time
219  </span>
220 </div>
221 EOD;
222         }
223         $msg = <<<EOD
224 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
225 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
226 <head>
227  <meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" />
228  <title>$tb_title</title>
229  <link rel="stylesheet" href="skin/trackback.css" type="text/css" />
230 </head>
231 <body>
232  <div id="banner-commentspop">$_tb_header</div>
233  <div class="blog">
234   <div class="trackback-url">
235    $_tb_entry<br />
236    $script?tb_id=$tb_id<br /><br />
237    $tb_refer
238   </div>
239   $tb_body
240  </div>
241 </body>
242 </html>
243 EOD;
244         // BugTrack/466 ¥¨¥ó¥³¡¼¥É¸íǧÂкö
245         header('Content-type: text/html; charset=UTF-8');
246         echo '<?xml version="1.0" encoding="UTF-8"?>';
247         echo mb_convert_encoding($msg, 'UTF-8', SOURCE_ENCODING);
248         die;
249 }
250 ?>