OSDN Git Service

create page-name-cache file(s) for hidden page(s).
[pukiwiki/pukiwiki.git] / plugin / links.inc.php
1 <?php
2 /////////////////////////////////////////////////
3 // PukiWiki - Yet another WikiWikiWeb clone.
4 //
5 // $Id: links.inc.php,v 1.9 2003/02/26 08:53:51 panda Exp $
6 //
7
8 function plugin_links_action()
9 {
10         global $vars;
11         
12         set_time_limit(0);
13         
14         if (!defined('LINK_DB')) {
15                 if ($vars['page'] != '') {
16                         links_update_file($vars['page']);
17                         return;
18                 }
19                 return links_init_file();
20         }
21         else {
22                 if ($vars['page'] != '') {
23                         links_update_db($vars['page']);
24                         return;
25                 }
26                 return links_init_db();
27         }
28 }
29 function links_init_file()
30 {
31         global $get,$adminpass,$whatsnew;
32         
33         if (md5($get['adminpass']) != $adminpass) {
34                 return array('msg'=>'update database',
35                         'body'=>'<p>administrator password require.</p>');
36         }
37         
38         // ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î½é´ü²½
39         foreach (get_existfiles(CACHE_DIR,'.ref') as $cache) {
40                 unlink($cache);
41         }
42         foreach (get_existfiles(CACHE_DIR,'.rel') as $cache) {
43                 unlink($cache);
44         }
45         $pages = get_existpages();
46         $ref = array(); // »²¾È¸µ
47         $obj = new InlineConverter(array('page','auto')); 
48         foreach ($pages as $page) {
49                 if ($page == $whatsnew) {
50                         continue;
51                 }
52                 $time = get_filetime($page);
53                 $rel = array(); // »²¾ÈÀè
54                 $links = $obj->get_objects(join('',get_source($page)),$page);
55                 foreach ($links as $_obj) {
56                         if (!isset($_obj->type) or $_obj->type != 'pagename') {
57                                 continue;
58                         }                       
59                         $_page = $_obj->name;
60                         if ($_page != $page) {
61                                 $rel[$_page] = 1;
62                                 $ref[$_page][$page] = $time;
63                         }
64                 }
65                 $fp = fopen(CACHE_DIR.encode($page).'.rel','w')
66                         or die_message('cannot write '.htmlspecialchars(CACHE_DIR.encode($page).'.rel'));
67                 fputs($fp,join("\t",array_keys($rel)));
68                 fclose($fp);
69         }
70         
71         foreach ($ref as $page=>$arr) {
72                 $fp = fopen(CACHE_DIR.encode($page).'.ref','w')
73                         or die_message('cannot write '.htmlspecialchars(CACHE_DIR.encode($page).'.ref'));
74                 foreach ($arr as $_page=>$time) {
75                         fputs($fp,"$_page\t$time\n");
76                 }
77                 fclose($fp);
78         }
79         return array('msg'=>'update database','body'=>'<p>done.</p>');
80 }
81 function links_update_file($page)
82 {
83         global $whatsnew;
84         
85         $obj = new InlineConverter();
86         $time = is_page($page) ? get_filetime($page) : 0;
87         
88         $rel_old = array();
89         $rel_file = CACHE_DIR.encode($page).'.rel';
90         if (file_exists($rel_file)) {
91                 $lines = file($rel_file);
92                 if (array_key_exists(0,$lines)) {
93                         $rel_old = explode("\t",rtrim($lines[0]));
94                 }
95         }
96         $rel_new = array(); // »²¾ÈÀè
97         $links = $obj->get_objects(join('',get_source($page)),$page);
98         foreach ($links as $_obj) {
99                 if (!isset($_obj->type) or $_obj->type != 'pagename') {
100                         continue;
101                 }                       
102                 $_page = $_obj->name;
103                 if ($_page != $page) {
104                         $rel_new[$_page] = 1;
105                 }
106         }
107         $rel_new = array_keys($rel_new);
108         
109         $fp = fopen($rel_file,'w')
110                 or die_message('cannot write '.htmlspecialchars($rel_file));
111         fputs($fp,join("\t",$rel_new));
112         fclose($fp);
113         
114         $add = array_diff($rel_new,$rel_old);
115         foreach ($add as $_page) {
116                 $ref_file = CACHE_DIR.encode($_page).'.ref';
117                 $ref = "$page\t$time\n";
118                 if (file_exists($ref_file)) {
119                         foreach (file($ref_file) as $line) {
120                                 list($ref_page,$time) = explode("\t",rtrim($line));
121                                 if ($ref_page != $page) {
122                                         $ref .= $line;
123                                 }
124                         }
125                 }
126                 $fp = fopen($ref_file,'w')
127                          or die_message('cannot write '.htmlspecialchars($ref_file));
128                 fputs($fp,$ref);
129                 fclose($fp);
130         }
131         $del = array_diff($rel_old,$rel_new);
132         foreach ($del as $_page) {
133                 $ref_file = CACHE_DIR.encode($_page).'.ref';
134                 if (file_exists($ref_file)) {
135                         $ref = '';
136                         foreach (file($ref_file) as $line) {
137                                 list($ref_page,$time) = explode("\t",rtrim($line));
138                                 if ($ref_page != $page) {
139                                         $ref .= $line;
140                                 }
141                         }
142                         $fp = fopen($ref_file,'w')
143                                 or die_message('cannot write '.htmlspecialchars($ref_file));
144                         fputs($fp,$ref);
145                         fclose($fp);
146                 }
147         }
148 }
149 function links_init_db()
150 {
151         global $get,$adminpass,$whatsnew;
152         
153         if (md5($get['adminpass']) != $adminpass) {
154                 return array('msg'=>'update database',
155                         'body'=>'<p>administrator password require.</p>');
156         }
157         // ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î½é´ü²½
158         $pages = get_existpages();
159         db_exec('DELETE FROM page;');
160         db_exec('DELETE FROM link;');
161         foreach ($pages as $page) {
162                 if ($page == $whatsnew) {
163                         continue;
164                 }
165                 $time = get_filetime($page);
166                 $a_page = addslashes($page);
167                 db_exec("INSERT INTO page (name,lastmod) VALUES ('$a_page',$time);");
168         }
169         $rows = db_query('SELECT id,name FROM page;');
170         $pages = array();
171         foreach ($rows as $row) {
172                 $pages[$row['name']] = $row['id'];
173         }
174         
175         $obj = new InlineConverter(); 
176         foreach ($pages as $page=>$id) {
177                 $links = $obj->get_objects(join('',get_source($page)),$page);
178                 foreach ($links as $_obj) {
179                         if ($_obj->type == 'pagename') {
180                                 $_page = $_obj->name;
181                                 if (array_key_exists($_page,$pages)) {
182                                         $ref_id = $pages[$_page];
183                                         if ($ref_id and $ref_id != $id) {
184                                                 db_exec("INSERT INTO link (page_id,ref_id) VALUES ($id,$ref_id);");
185                                         }
186                                 }
187                         }
188                 }
189         }
190         return array('msg'=>'update database','body'=>'<p>done.</p>');
191 }
192 function links_update_db($page)
193 {
194         global $vars,$whatsnew;
195
196         if ($page == $whatsnew) {
197                 return;
198         }
199         
200         $is_page = is_page($page);
201         $time = ($is_page) ? get_filetime($page) : 0;
202         $a_page = addslashes($page);
203         
204         $rows = db_query("SELECT id FROM page WHERE name='$a_page';");
205         
206         if (count($rows) == 0) { // not exist
207                 db_exec("INSERT INTO page (name,lastmod) VALUES ('$a_page',$time);");
208         }
209         else {
210                 $id = $rows[0]['id'];
211                 db_exec("DELETE FROM link WHERE page_id=$id;");
212                 if ($is_page) {
213                         db_exec("UPDATE page SET lastmod=$time WHERE id=$id;");
214                 }
215                 else {
216                         db_exec("DELETE FROM page WHERE id=$id;");
217                         db_exec("DELETE FROM link WHERE ref_id=$id;");
218                         return;
219                 }
220         }
221         
222         $rows = db_query("SELECT id,name FROM page;");
223         $pages = array();
224         foreach ($rows as $row) {
225                 $pages[$row['name']] = $row['id'];
226         }
227         
228         $id = $pages[$page];
229         
230         $obj = new InlineConverter(array('page','auto'));
231         $links = $obj->get_objects(join('',get_source($page)),$page);
232         foreach ($links as $_obj) {
233                 if (!isset($_obj->type) or $_obj->type != 'pagename') {
234                         continue;
235                 }                       
236                 $_page = $_obj->name;
237                 if (!array_key_exists($_page,$pages)) {
238                         continue;
239                 }
240                 $ref_id = $pages[$_page];
241                 if ($ref_id and $ref_id != $id) {
242                         db_exec("INSERT INTO link (page_id,ref_id) VALUES ($id,$ref_id);");
243                 }
244         }
245 }
246 ?>