OSDN Git Service

34a4255fd373f22e5fe25a1f56944a7c2604f136
[pukiwiki/pukiwiki.git] / plugin / links.inc.php
1 <?php
2 /////////////////////////////////////////////////
3 // PukiWiki - Yet another WikiWikiWeb clone.
4 //
5 // $Id: links.inc.php,v 1.5 2003/02/17 08:38:03 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,$non_list;
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 and !preg_match("/$non_list/",$_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 cache.');
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 refer cache.');
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,$non_list;
84         
85         $obj = new InlineConverter(array('page','auto'));
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 and !preg_match("/$non_list/",$_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 cache.');
111         fputs($fp,join("\t",$rel_new));
112         fclose($fp);
113         
114         $add = array_diff($rel_new,$rel_old);
115         $ref = "$page\t$time\n";
116         foreach ($add as $_page) {
117                 $ref_file = CACHE_DIR.encode($_page).'.ref';
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') or die;
127                 fputs($fp,$ref);
128                 fclose($fp);
129         }
130         $del = array_diff($rel_old,$rel_new);
131         foreach ($del as $_page) {
132                 $ref_file = CACHE_DIR.encode($_page).'.ref';
133                 if (file_exists($ref_file)) {
134                         $ref = '';
135                         foreach (file($ref_file) as $line) {
136                                 list($ref_page,$time) = explode("\t",rtrim($line));
137                                 if ($ref_page != $page) {
138                                         $ref .= $line;
139                                 }
140                         }
141                         $fp = fopen($ref_file,'w') or die;
142                         fputs($fp,$ref);
143                         fclose($fp);
144                 }
145         }
146 }
147 function links_init_db()
148 {
149         global $get,$adminpass,$whatsnew;
150         
151         if (md5($get['adminpass']) != $adminpass) {
152                 return array('msg'=>'update database',
153                         'body'=>'<p>administrator password require.</p>');
154         }
155         // ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î½é´ü²½
156         $pages = get_existpages();
157         db_exec('DELETE FROM page;');
158         db_exec('DELETE FROM link;');
159         foreach ($pages as $page) {
160                 if ($page == $whatsnew) {
161                         continue;
162                 }
163                 $time = get_filetime($page);
164                 $a_page = addslashes($page);
165                 db_exec("INSERT INTO page (name,lastmod) VALUES ('$a_page',$time);");
166         }
167         $rows = db_query('SELECT id,name FROM page;');
168         $pages = array();
169         foreach ($rows as $row) {
170                 $pages[$row['name']] = $row['id'];
171         }
172         
173         $obj = new InlineConverter(); 
174         foreach ($pages as $page=>$id) {
175                 $links = $obj->get_objects(join('',get_source($page)),$page);
176                 foreach ($links as $_obj) {
177                         if ($_obj->type == 'pagename') {
178                                 $_page = $_obj->name;
179                                 if (array_key_exists($_page,$pages)) {
180                                         $ref_id = $pages[$_page];
181                                         if ($ref_id and $ref_id != $id) {
182                                                 db_exec("INSERT INTO link (page_id,ref_id) VALUES ($id,$ref_id);");
183                                         }
184                                 }
185                         }
186                 }
187         }
188         return array('msg'=>'update database','body'=>'<p>done.</p>');
189 }
190 function links_update_db($page)
191 {
192         global $whatsnew;
193
194         if ($vars['page'] != $whatsnew) {
195                 return;
196         }
197         
198         $is_page = is_page($page);
199         $time = ($is_page) ? get_filetime($page) : 0;
200         $a_page = addslashes($page);
201         
202         $rows = db_query("SELECT id FROM page WHERE name='$a_page';");
203         
204         if (count($rows) == 0) { // not exist
205                 db_exec("INSERT INTO page (name,lastmod) VALUES ('$a_page',$time);");
206         }
207         else {
208                 $id = $rows[0]['id'];
209                 db_exec("DELETE FROM link WHERE page_id=$id;");
210                 if ($is_page) {
211                         db_exec("UPDATE page SET lastmod=$time WHERE id=$id;");
212                 }
213                 else {
214                         db_exec("DELETE FROM page WHERE id=$id;");
215                         db_exec("DELETE FROM link WHERE ref_id=$id;");
216                         return;
217                 }
218         }
219         
220         $rows = db_query("SELECT id,name FROM page;");
221         $pages = array();
222         foreach ($rows as $row) {
223                 $pages[$row['name']] = $row['id'];
224         }
225         
226         $id = $pages[$page];
227         
228         $obj = new InlineConverter();
229         $links = $obj->get_objects(join('',get_source($page)),$page);
230         foreach ($links as $_obj) {
231                 if ($_obj->type == 'pagename') {
232                         $_page = $_obj->name;
233                         if (array_key_exists($_page,$pages)) {
234                                 $ref_id = $pages[$_page];
235                                 if ($ref_id and $ref_id != $id) {
236                                         db_exec("INSERT INTO link (page_id,ref_id) VALUES ($id,$ref_id);");
237                                 }
238                         }
239                 }
240         }
241 }
242 ?>