OSDN Git Service

d9a4af242ae6f71af31b61f4878dab4e4dcc4878
[pukiwiki/pukiwiki.git] / file.php
1 <?php
2 // PukiWiki - Yet another WikiWikiWeb clone.
3 // $Id: file.php,v 1.3 2002/11/29 00:09:00 panda Exp $
4 /////////////////////////////////////////////////
5
6 // ¥½¡¼¥¹¤ò¼èÆÀ
7 function get_source($page)
8 {       
9   if(page_exists($page)) {
10      return file(get_filename(encode($page)));
11   }
12
13   return array();
14 }
15
16 // ¥Ú¡¼¥¸¤¬Â¸ºß¤¹¤ë¤«¡©
17 function page_exists($page)
18 {
19         return file_exists(get_filename(encode($page)));
20 }
21
22 // ¥Õ¥¡¥¤¥ë¤Ø¤Î½ÐÎÏ
23 function file_write($dir,$page,$str)
24 {
25         global $post,$update_exec;
26
27         if($str == "")
28         {
29                 @unlink($dir.encode($page).".txt");
30         }
31         else
32         {
33                 $str = preg_replace("/\x0D\x0A|\x0D|\x0A/","\n",$str);
34                 
35                 if($post["notimestamp"] && is_page($page))
36                 {
37                         $timestamp = @filemtime($dir.encode($page).".txt");
38                 }
39                 $fp = fopen($dir.encode($page).".txt","w");
40                 if($fp===FALSE) die_message("cannot write page file or diff file or other".htmlspecialchars($page)."<br>maybe permission is not writable or filename is too long");
41                 while(!flock($fp,LOCK_EX));
42                 fputs($fp,$str);
43                 flock($fp,LOCK_UN);
44                 fclose($fp);
45                 if($timestamp)
46                         touch($dir.encode($page).".txt",$timestamp);
47         }
48         
49         if(!$timestamp)
50                 put_lastmodified();
51
52         if($update_exec and $dir == DATA_DIR)
53         {
54                 system($update_exec." > /dev/null &");
55         }
56 }
57
58 // ºÇ½ª¹¹¿·¥Ú¡¼¥¸¤Î¹¹¿·
59 function put_lastmodified()
60 {
61         global $script,$maxshow,$whatsnew,$date_format,$time_format,$weeklabels,$post,$non_list;
62
63         if($post["notimestamp"]) return;
64
65         $files = get_existpages();
66         foreach($files as $page) {
67                 if($page == $whatsnew) continue;
68                 if(preg_match("/$non_list/",$page)) continue;
69
70                 if(file_exists(get_filename(encode($page))))
71                         {
72                         $page_url = rawurlencode($page);
73                         $lastmodtime = filemtime(get_filename(encode($page)));
74                         $lastmod = date($date_format,$lastmodtime)
75                                  . " (" . $weeklabels[date("w",$lastmodtime)] . ") "
76                                  . date($time_format,$lastmodtime);
77                         $putval[$lastmodtime][] = "-$lastmod - $page";
78                 }
79         }
80         
81         $cnt = 1;
82         krsort($putval);
83         $fp = fopen(get_filename(encode($whatsnew)),"w");
84         if($fp===FALSE) die_message("cannot write page file ".htmlspecialchars($whatsnew)."<br>maybe permission is not writable or filename is too long");
85         flock($fp,LOCK_EX);
86         foreach($putval as $pages)
87         {
88                 foreach($pages as $page)
89                 {
90                         fputs($fp,$page."\n");
91                         $cnt++;
92                         if($cnt > $maxshow) break;
93                 }
94                 if($cnt > $maxshow) break;
95         }
96         flock($fp,LOCK_EX);
97         fclose($fp);
98 }
99
100 // ¥Õ¥¡¥¤¥ë̾¤òÆÀ¤ë(¥¨¥ó¥³¡¼¥É¤µ¤ì¤Æ¤¤¤ëɬÍ×Í­¤ê)
101 function get_filename($pagename)
102 {
103         return DATA_DIR.$pagename.".txt";
104 }
105
106 // ¥Ú¡¼¥¸¤¬Â¸ºß¤¹¤ë¤«¤·¤Ê¤¤¤«
107 function is_page($page,$reload=false)
108 {
109         global $InterWikiName,$_ispage;
110
111         if(($_ispage[$page] === true || $_ispage[$page] === false) && !$reload) return $_ispage[$page];
112
113         if(preg_match("/($InterWikiName)/",$page))
114                 $_ispage[$page] = false;
115         else if(!page_exists($page))
116                 $_ispage[$page] = false;
117         else
118                 $_ispage[$page] = true;
119         
120         return $_ispage[$page];
121 }
122
123 // ¥Ú¡¼¥¸¤¬ÊÔ½¸²Äǽ¤«
124 function is_editable($page)
125 {
126         global $BracketName,$WikiName,$InterWikiName,$cantedit,$_editable;
127
128         if($_editable === true || $_editable === false) return $_editable;
129
130         if(preg_match("/^$InterWikiName$/",$page))
131                 $_editable = false;
132         elseif(!preg_match("/^$BracketName$/",$page) && !preg_match("/^$WikiName$/",$page))
133                 $_editable = false;
134         else if(in_array($page,$cantedit))
135                 $_editable = false;
136         else
137                 $_editable = true;
138         
139         return $_editable;
140 }
141
142 // ¥Ú¡¼¥¸¤¬Åà·ë¤µ¤ì¤Æ¤¤¤ë¤«
143 function is_freeze($page)
144 {
145         global $_freeze;
146
147         if(!is_page($page)) return false;
148         if($_freeze === true || $_freeze === false) return $_freeze;
149
150         $lines = get_source($page);
151         
152         if($lines[0] == "#freeze\n")
153                 $_freeze = true;
154         else
155                 $_freeze = false;
156         
157         return $_freeze;
158 }
159
160 // »ØÄꤵ¤ì¤¿¥Ú¡¼¥¸¤Î·Ð²á»þ¹ï
161 function get_pg_passage($page,$sw=true)
162 {
163         global $_pg_passage,$show_passage;
164
165         if(!$show_passage) return "";
166
167         if(isset($_pg_passage[$page]))
168         {
169                 if($sw)
170                         return $_pg_passage[$page]["str"];
171                 else
172                         return $_pg_passage[$page]["label"];
173         }
174         if($pgdt = @filemtime(get_filename(encode($page))))
175         {
176                 $pgdt = UTIME - $pgdt;
177                 if(ceil($pgdt / 60) < 60)
178                         $_pg_passage[$page]["label"] = "(".ceil($pgdt / 60)."m)";
179                 else if(ceil($pgdt / 60 / 60) < 24)
180                         $_pg_passage[$page]["label"] = "(".ceil($pgdt / 60 / 60)."h)";
181                 else
182                         $_pg_passage[$page]["label"] = "(".ceil($pgdt / 60 / 60 / 24)."d)";
183                 
184                 $_pg_passage[$page]["str"] = "<small>".$_pg_passage[$page]["label"]."</small>";
185         }
186         else
187         {
188                 $_pg_passage[$page]["label"] = "";
189                 $_pg_passage[$page]["str"] = "";
190         }
191
192         if($sw)
193                 return $_pg_passage[$page]["str"];
194         else
195                 return $_pg_passage[$page]["label"];
196 }
197
198 // Last-Modified ¥Ø¥Ã¥À
199 function header_lastmod($page)
200 {
201         global $lastmod;
202         
203         if($lastmod && is_page($page))
204         {
205                 header("Last-Modified: ".gmdate("D, d M Y H:i:s", filemtime(get_filename(encode($page))))." GMT");
206         }
207 }
208
209 // Á´¥Ú¡¼¥¸Ì¾¤òÇÛÎó¤Ë
210 function get_existpages()
211 {
212         $aryret = array();
213
214         if ($dir = @opendir(DATA_DIR))
215         {
216                 while($file = readdir($dir))
217                 {
218                         if($file == ".." || $file == "." || strstr($file,".txt")===FALSE) continue;
219                         $page = decode(trim(preg_replace("/\.txt$/"," ",$file)));
220                         array_push($aryret,$page);
221                 }
222                 closedir($dir);
223         }
224         
225         return $aryret;
226 }
227 ?>