OSDN Git Service

4c486657c217e79f55b70552ecf37aa547235807
[pukiwiki/pukiwiki.git] / lib / link.php
1 <?php
2 /////////////////////////////////////////////////
3 // PukiWiki - Yet another WikiWikiWeb clone.
4 //
5 // $Id: link.php,v 1.3 2004/10/21 15:07:21 henoheno Exp $
6 //
7
8 /*
9  * ¥Ç¡¼¥¿·Á¼°
10  * CACHE_DIR/encode(¥Ú¡¼¥¸Ì¾).ref
11  * »²¾È¸µ¥Ú¡¼¥¸Ì¾<tab>AutoLink¤Ë¤è¤ë¥ê¥ó¥¯¤Î¤ß¤Î¤È¤­1\n
12  * »²¾È¸µ¥Ú¡¼¥¸Ì¾<tab>AutoLink¤Ë¤è¤ë¥ê¥ó¥¯¤Î¤ß¤Î¤È¤­1\n
13  * ...
14  *
15  * CACHE_DIR/encode(¥Ú¡¼¥¸Ì¾).rel
16  * »²¾ÈÀè¥Ú¡¼¥¸Ì¾<tab>»²¾ÈÀè¥Ú¡¼¥¸Ì¾<tab>...
17  *
18  */
19
20 // ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é´ØÏ¢¥Ú¡¼¥¸¤òÆÀ¤ë
21 function links_get_related_db($page)
22 {
23         $ref_name = CACHE_DIR . encode($page) . '.ref';
24         if (! file_exists($ref_name)) return array();
25
26         $times = array();
27         foreach (file($ref_name) as $line) {
28                 list($_page) = explode("\t", rtrim($line));
29                 $time = get_filetime($_page);   
30                 if($time != 0) $times[$_page] = $time;
31         }
32         return $times;
33 }
34
35 //¥Ú¡¼¥¸¤Î´ØÏ¢¤ò¹¹¿·¤¹¤ë
36 function links_update($page)
37 {
38         if (ini_get('safe_mode') == '0') set_time_limit(0);
39
40         $time = is_page($page, TRUE) ? get_filetime($page) : 0;
41
42         $rel_old        = array();
43         $rel_file       = CACHE_DIR . encode($page) . '.rel';
44         $rel_file_exist = file_exists($rel_file);
45         if ($rel_file_exist === TRUE) {
46                 $lines = file($rel_file);
47                 unlink($rel_file);
48                 if (isset($lines[0]))
49                         $rel_old = explode("\t", rtrim($lines[0]));
50         }
51         $rel_new  = array(); // »²¾ÈÀè
52         $rel_auto = array(); // ¥ª¡¼¥È¥ê¥ó¥¯¤·¤Æ¤¤¤ë»²¾ÈÀè
53         $links    = links_get_objects($page, TRUE);
54         foreach ($links as $_obj) {
55                 if (! isset($_obj->type) || $_obj->type != 'pagename' ||
56                     $_obj->name == $page || $_obj->name == '')
57                         continue;
58
59                 if (is_a($_obj, 'Link_autolink')) { // ¹Ôµ·¤¬°­¤¤
60                         $rel_auto[] = $_obj->name;
61                 } else {
62                         $rel_new[]  = $_obj->name;
63                 }
64         }
65         $rel_new = array_unique($rel_new);
66         
67         // autolink¤·¤«¸þ¤¤¤Æ¤¤¤Ê¤¤¥Ú¡¼¥¸
68         $rel_auto = array_diff(array_unique($rel_auto), $rel_new);
69
70         // Á´¤Æ¤Î»²¾ÈÀè¥Ú¡¼¥¸
71         $rel_new = array_merge($rel_new, $rel_auto);
72
73         // .rel:$page¤¬»²¾È¤·¤Æ¤¤¤ë¥Ú¡¼¥¸¤Î°ìÍ÷
74         if ($time) {
75                 // ¥Ú¡¼¥¸¤¬Â¸ºß¤·¤Æ¤¤¤ë
76                 if (! empty($rel_new)) {
77                         $fp = fopen($rel_file, 'w')
78                                 or die_message('cannot write ' . htmlspecialchars($rel_file));
79                         fputs($fp, join("\t", $rel_new));
80                         fclose($fp);
81                 }
82         }
83
84         // .ref:$_page¤ò»²¾È¤·¤Æ¤¤¤ë¥Ú¡¼¥¸¤Î°ìÍ÷
85         links_add($page, array_diff($rel_new, $rel_old), $rel_auto);
86         links_delete($page, array_diff($rel_old, $rel_new));
87
88         global $WikiName, $autolink, $nowikiname, $search_non_list;
89
90         // $page¤¬¿·µ¬ºîÀ®¤µ¤ì¤¿¥Ú¡¼¥¸¤Ç¡¢AutoLink¤ÎÂоݤȤʤêÆÀ¤ë¾ì¹ç
91         if ($time && ! $rel_file_exist && $autolink
92                 && (preg_match("/^$WikiName$/", $page) ? $nowikiname : strlen($page) >= $autolink))
93         {
94                 // $page¤ò»²¾È¤·¤Æ¤¤¤½¤¦¤Ê¥Ú¡¼¥¸¤ò°ìÀƹ¹¿·¤¹¤ë(¤ª¤¤)
95                 $search_non_list = 1;
96                 $pages           = do_search($page, 'AND', TRUE);
97                 foreach ($pages as $_page) {
98                         if ($_page != $page)
99                                 links_update($_page);
100                 }
101         }
102         $ref_file = CACHE_DIR . encode($page) . '.ref';
103
104         // $page¤¬ºï½ü¤µ¤ì¤¿¤È¤­¤Ë¡¢
105         if (! $time && file_exists($ref_file)) {
106                 foreach (file($ref_file) as $line) {
107                         list($ref_page, $ref_auto) = explode("\t", rtrim($line));
108
109                         // $page¤òAutoLink¤Ç¤·¤«»²¾È¤·¤Æ¤¤¤Ê¤¤¥Ú¡¼¥¸¤ò°ìÀƹ¹¿·¤¹¤ë(¤ª¤¤¤ª¤¤)
110                         if ($ref_auto)
111                                 links_delete($ref_page, array($page));
112                 }
113         }
114 }
115
116 //¥Ú¡¼¥¸¤Î´ØÏ¢¤ò½é´ü²½¤¹¤ë
117 function links_init()
118 {
119         global $whatsnew;
120
121         if (ini_get('safe_mode') == '0') set_time_limit(0);
122
123         // ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î½é´ü²½
124         foreach (get_existfiles(CACHE_DIR, '.ref') as $cache)
125                 unlink($cache);
126         foreach (get_existfiles(CACHE_DIR, '.rel') as $cache)
127                 unlink($cache);
128
129         $pages = get_existpages();
130         $ref   = array(); // »²¾È¸µ
131         $ref_notauto = array();
132         foreach ($pages as $page) {
133                 if ($page == $whatsnew) continue;
134
135                 $rel   = array(); // »²¾ÈÀè
136                 $links = links_get_objects($page);
137                 foreach ($links as $_obj) {
138                         if (! isset($_obj->type) || $_obj->type != 'pagename' ||
139                             $_obj->name == $page || $_obj->name == '')
140                                 continue;
141
142                         $rel[] = $_obj->name;
143                         if (! is_a($_obj, 'Link_autolink')) {
144                                 $ref_notauto[$_obj->name][$page] = TRUE;
145                         }
146                         $ref[$_obj->name][] = $page;
147                 }
148                 $rel = array_unique($rel);
149                 if (! empty($rel)) {
150                         $fp = fopen(CACHE_DIR . encode($page) . '.rel', 'w')
151                                 or die_message('cannot write ' . htmlspecialchars(CACHE_DIR . encode($page) . '.rel'));
152                         fputs($fp, join("\t", $rel));
153                         fclose($fp);
154                 }
155         }
156
157         foreach ($ref as $page=>$arr) {
158                 if (empty($arr)) continue;
159
160                 $arr = array_unique($arr);
161                 $fp  = fopen(CACHE_DIR . encode($page) . '.ref', 'w')
162                         or die_message('cannot write ' . htmlspecialchars(CACHE_DIR . encode($page) . '.ref'));
163                 foreach ($arr as $ref_page) {
164                         $ref_auto = (isset($ref_notauto[$page])
165                                 && isset($ref_notauto[$page][$ref_page])) ? 0 : 1;
166                         fputs($fp, "$ref_page\t$ref_auto\n");
167                 }
168                 fclose($fp);
169         }
170 }
171
172 function links_add($page, $add, $rel_auto)
173 {
174         $rel_auto = array_flip($rel_auto);
175         
176         foreach ($add as $_page) {
177                 $all_auto = isset($rel_auto[$_page]);
178                 $is_page  = is_page($_page);
179                 $ref      = "$page\t" . ($all_auto ? 1 : 0) . "\n";
180
181                 $ref_file = CACHE_DIR . encode($_page) . '.ref';
182                 if (file_exists($ref_file)) {
183                         foreach (file($ref_file) as $line) {
184                                 list($ref_page, $ref_auto) = explode("\t", rtrim($line));
185                                 if (! $ref_auto) $all_auto = FALSE;
186                                 if ($ref_page != $page) $ref .= $line;
187                         }
188                         unlink($ref_file);
189                 }
190                 if ($is_page || ! $all_auto) {
191                         $fp = fopen($ref_file, 'w')
192                                  or die_message('cannot write ' . htmlspecialchars($ref_file));
193                         fputs($fp, $ref);
194                         fclose($fp);
195                 }
196         }
197 }
198
199 function links_delete($page, $del)
200 {
201         foreach ($del as $_page) {
202                 $ref_file = CACHE_DIR . encode($_page) . '.ref';
203                 if (! file_exists($ref_file)) continue;
204
205                 $all_auto = TRUE;
206                 $is_page = is_page($_page);
207
208                 $ref = '';
209                 foreach (file($ref_file) as $line) {
210                         list($ref_page, $ref_auto) = explode("\t", rtrim($line));
211                         if ($ref_page != $page) {
212                                 if (! $ref_auto) $all_auto = FALSE;
213                                 $ref .= $line;
214                         }
215                 }
216                 unlink($ref_file);
217                 if ($is_page && ! $all_auto && $ref != '') {
218                         $fp = fopen($ref_file, 'w')
219                                 or die_message('cannot write ' . htmlspecialchars($ref_file));
220                         fputs($fp, $ref);
221                         fclose($fp);
222                 }
223         }
224 }
225
226 function & links_get_objects($page, $refresh = FALSE)
227 {
228         static $obj;
229
230         if (! isset($obj) || $refresh)
231                 $obj = & new InlineConverter(NULL, array('note'));
232
233         return $obj->get_objects(join('', preg_grep('/^(?!\/\/|\s)./', get_source($page))), $page);
234 }
235 ?>