OSDN Git Service

BugTrack/219
[pukiwiki/pukiwiki.git] / file.php
1 <?php
2 /////////////////////////////////////////////////
3 // PukiWiki - Yet another WikiWikiWeb clone.
4 //
5 // $Id: file.php,v 1.11 2003/03/02 16:08:04 panda Exp $
6 //
7
8 // ¥½¡¼¥¹¤ò¼èÆÀ
9 function get_source($page)
10 {
11         if (!is_page($page)) {
12                 return array();
13         }
14         return str_replace("\r",'',file(get_filename($page)));
15 }
16
17 // ¥Ú¡¼¥¸¤Î¹¹¿·»þ¹ï¤òÆÀ¤ë
18 function get_filetime($page)
19 {
20         return filemtime(get_filename($page)) - LOCALZONE;
21 }
22
23 // ¥Ú¡¼¥¸¤Î¥Õ¥¡¥¤¥ë̾¤òÆÀ¤ë
24 function get_filename($page)
25 {
26         return DATA_DIR.encode($page).'.txt';
27 }
28
29 // ¥Ú¡¼¥¸¤Î½ÐÎÏ
30 function page_write($page,$postdata)
31 {
32         $postdata = make_str_rules($postdata);
33         
34         // º¹Ê¬¥Õ¥¡¥¤¥ë¤ÎºîÀ®
35         $oldpostdata = is_page($page) ? join('',get_source($page)) : '';
36         $diffdata = do_diff($oldpostdata,$postdata);
37         file_write(DIFF_DIR,$page,$diffdata);
38         
39         // ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ÎºîÀ®
40         make_backup($page,$postdata == '');
41         
42         // ¥Õ¥¡¥¤¥ë¤Î½ñ¤­¹þ¤ß
43         file_write(DATA_DIR,$page,$postdata);
44         
45         // is_page¤Î¥­¥ã¥Ã¥·¥å¤ò¥¯¥ê¥¢¤¹¤ë¡£
46         is_page($page,TRUE);
47         
48         // link¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¹¹¿·
49         links_update($page);
50 }
51
52 // ¥æ¡¼¥¶ÄêµÁ¥ë¡¼¥ë(¥½¡¼¥¹¤òÃÖ´¹¤¹¤ë)
53 function make_str_rules($str)
54 {
55         global $str_rules;
56         
57         $arr = explode("\n",$str);
58         
59         // ÆüÉÕ¡¦»þ¹ïÃÖ´¹½èÍý
60         foreach ($arr as $str)
61         {
62                 if ($str{0} != ' ' and $str{0} != "\t")
63                 {
64                         foreach ($str_rules as $rule => $replace)
65                         {
66                                 $str = preg_replace("/$rule/",$replace,$str);
67                         }
68                 }
69                 $retvars[] = $str;
70         }
71         
72         return join("\n",$retvars);
73 }
74
75 // ¥Õ¥¡¥¤¥ë¤Ø¤Î½ÐÎÏ
76 function file_write($dir,$page,$str)
77 {
78         global $post,$update_exec;
79         global $_msg_invalidiwn;
80         
81         if (!is_pagename($page))
82         {
83                 die_message(
84                         str_replace('$1',htmlspecialchars($page),
85                                 str_replace('$2','WikiName',$_msg_invalidiwn)
86                         )
87                 );
88         }
89         $page = strip_bracket($page);
90         $timestamp = FALSE;
91         $file = $dir.encode($page).'.txt';
92         
93         if ($dir == DATA_DIR and $str == '' and file_exists($file)) {
94                 unlink($file);
95         }
96         if ($str != '') {
97                 $str = preg_replace("/\r/",'',$str);
98                 $str = rtrim($str)."\n";
99                 
100                 if (!empty($post['notimestamp']) and file_exists($file)) {
101                         $timestamp = filemtime($file) - LOCALZONE;
102                 }
103                 
104                 $fp = fopen($file,'w')
105                         or die_message('cannot write page file or diff file or other'.htmlspecialchars($page).'<br>maybe permission is not writable or filename is too long');
106                 flock($fp,LOCK_EX);
107                 fputs($fp,$str);
108                 flock($fp,LOCK_UN);
109                 fclose($fp);
110                 if ($timestamp) {
111                         touch($file,$timestamp + LOCALZONE);
112                 }
113         }
114         
115         if (!$timestamp) {
116                 put_lastmodified();
117         }
118         
119         if ($update_exec and $dir == DATA_DIR) {
120                 system($update_exec.' > /dev/null &');
121         }
122 }
123
124 // ºÇ½ª¹¹¿·¥Ú¡¼¥¸¤Î¹¹¿·
125 function put_lastmodified()
126 {
127         global $script,$post,$maxshow,$whatsnew,$non_list,$autolink;
128
129         $pages = get_existpages();
130         $recent_pages = array();
131         foreach($pages as $page)
132         {
133                 if ($page != $whatsnew and !preg_match("/$non_list/",$page))
134                 {
135                         $recent_pages[$page] = get_filetime($page);
136                 }
137         }
138         
139         //»þ¹ï¹ß½ç¤Ç¥½¡¼¥È
140         arsort($recent_pages,SORT_NUMERIC);
141         
142         // create recent.dat (for recent.inc.php)
143         $fp = fopen(CACHE_DIR.'recent.dat','w')
144                 or die_message('cannot write cache file '.CACHE_DIR.'recent.dat<br>maybe permission is not writable or filename is too long');
145         flock($fp,LOCK_EX);
146         foreach ($recent_pages as $page=>$time)
147         {
148                 fputs($fp,"$time\t$page\n");
149         }
150         flock($fp,LOCK_UN);
151         fclose($fp);
152
153         // create RecentChanges
154         $fp = fopen(get_filename($whatsnew),'w')
155                 or die_message('cannot write page file '.htmlspecialchars($whatsnew).'<br>maybe permission is not writable or filename is too long');
156         flock($fp,LOCK_EX);
157         foreach (array_splice($recent_pages,0,$maxshow) as $page=>$time)
158         {
159                 $s_lastmod = htmlspecialchars(format_date($time));
160                 $s_page = htmlspecialchars($page);
161                 fputs($fp, "-$s_lastmod - [[$s_page]]\n");
162         }
163         fputs($fp,"#norelated\n"); // :)
164         flock($fp,LOCK_UN);
165         fclose($fp);
166         
167         // for autolink
168         if ($autolink)
169         {
170                 $fp = fopen(CACHE_DIR.'autolink.dat','w')
171                         or die_message('cannot write autolink file '.CACHE_DIR.'/autolink.dat<br>maybe permission is not writable');
172                 flock($fp,LOCK_EX);
173                 fputs($fp,get_autolink_pattern($pages));
174                 flock($fp,LOCK_UN);
175                 fclose($fp);
176         }
177 }
178
179 // »ØÄꤵ¤ì¤¿¥Ú¡¼¥¸¤Î·Ð²á»þ¹ï
180 function get_pg_passage($page,$sw=TRUE)
181 {
182         global $show_passage;
183         static $pg_passage;
184         
185         if (!$show_passage) {
186                 return '';
187         }
188         
189         if (!isset($pg_passage)) {
190                 $pg_passage = array();
191         }
192         
193         if (!array_key_exists($page,$pg_passage)) {
194                 $pg_passage[$page] = (is_page($page) and $time = get_filetime($page)) ? get_passage($time) : '';
195         }
196         
197         return $sw ? "<small>{$pg_passage[$page]}</small>" : " {$pg_passage[$page]}";
198 }
199
200 // Last-Modified ¥Ø¥Ã¥À
201 function header_lastmod()
202 {
203         global $lastmod;
204         
205         if ($lastmod and is_page($page)) {
206                 header('Last-Modified: '.date('D, d M Y H:i:s',get_filetime($page)).' GMT');
207         }
208 }
209
210 // Á´¥Ú¡¼¥¸Ì¾¤òÇÛÎó¤Ë
211 function get_existpages($dir=DATA_DIR,$ext='.txt')
212 {
213         $aryret = array();
214         
215         $pattern = '^([0-9A-F]+)';
216         if ($ext != '') {
217                 $pattern .= preg_quote($ext,'/').'$';
218         }
219         $dp = @opendir($dir)
220                 or die_message($dir. ' is not found or not readable.');
221         while ($file = readdir($dp)) {
222                 if (preg_match("/$pattern/",$file,$matches)) {
223                         $aryret[] = decode($matches[1]);
224                 }
225         }
226         closedir($dp);
227         return $aryret;
228 }
229 //¥Õ¥¡¥¤¥ë̾¤Î°ìÍ÷¤òÇÛÎó¤Ë(¥¨¥ó¥³¡¼¥ÉºÑ¤ß¡¢³ÈÄ¥»Ò¤ò»ØÄê)
230 function get_existfiles($dir,$ext)
231 {
232         $aryret = array();
233         
234         $pattern = '^[0-9A-F]+'.preg_quote($ext,'/').'$';
235         $dp = @opendir($dir)
236                 or die_message($dir. ' is not found or not readable.');
237         while ($file = readdir($dp)) {
238                 if (preg_match("/$pattern/",$file)) {
239                         $aryret[] = $dir.$file;
240                 }
241         }
242         closedir($dp);
243         return $aryret;
244 }       
245 function links_update($page)
246 {
247         global $vars;
248
249         // link¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¹¹¿·
250         if (exist_plugin_action('links')) {
251                 // ¤Á¤ç¤Ã¤È¸È©
252                 $tmp = $vars['page'];
253                 $vars['page'] = $page;
254                 do_plugin_action('links');
255                 $vars['page'] = $tmp;
256         }
257 }
258 //¤¢¤ë¥Ú¡¼¥¸¤Î´ØÏ¢¥Ú¡¼¥¸¤òÆÀ¤ë
259 function links_get_related($page)
260 {
261         global $vars,$related;
262         static $links;
263         
264         if (!isset($links)) {
265                 $links = array();
266         }
267         
268         if (array_key_exists($page,$links)) {
269                 return $links[$page];
270         }
271         
272         // ²Äǽ¤Ê¤émake_link()¤ÇÀ¸À®¤·¤¿´ØÏ¢¥Ú¡¼¥¸¤ò¼è¤ê¹þ¤à
273         $links[$page] = ($page == $vars['page']) ? $related : array();
274         
275         $a_page = addslashes($page);
276         
277         if (defined('LINK_DB')) {
278                 $sql = <<<EOD
279 SELECT refpage.name,refpage.lastmod FROM page left join link on page.id = page_id left join page as refpage on ref_id = refpage.id where page.name = '$a_page'
280 UNION
281 SELECT DISTINCT refpage.name,refpage.lastmod FROM page left join link on page.id = ref_id left join page as refpage on page_id = refpage.id where page.name = '$a_page';
282 EOD;
283                 $rows = db_query($sql);
284                 
285                 foreach ($rows as $row) {
286                         if (empty($row['name']) or substr($row['name'],0,1) == ':') {
287                                 continue;
288                         }
289                         $links[$page][$row['name']] = $row['lastmod'];
290                 }
291         }
292         else {
293 //              $links[$page] = array_merge($links[$page],do_search($page,'OR',1));
294                 $ref_name = CACHE_DIR.encode($page).'.ref';
295                 if (file_exists($ref_name)) {
296                         foreach (file($ref_name) as $line) {
297                                 list($_page,$time) = explode("\t",rtrim($line));
298                                 $links[$page][$_page] = $time;
299                         }
300                 }
301         }
302         
303         return $links[$page];
304 }
305 ?>