OSDN Git Service

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