2 /////////////////////////////////////////////////
3 // PukiWiki - Yet another WikiWikiWeb clone.
5 // $Id: link.php,v 1.3 2004/10/21 15:07:21 henoheno Exp $
10 * CACHE_DIR/encode(¥Ú¡¼¥¸Ì¾).ref
11 * »²¾È¸µ¥Ú¡¼¥¸Ì¾<tab>AutoLink¤Ë¤è¤ë¥ê¥ó¥¯¤Î¤ß¤Î¤È¤1\n
12 * »²¾È¸µ¥Ú¡¼¥¸Ì¾<tab>AutoLink¤Ë¤è¤ë¥ê¥ó¥¯¤Î¤ß¤Î¤È¤1\n
15 * CACHE_DIR/encode(¥Ú¡¼¥¸Ì¾).rel
16 * »²¾ÈÀè¥Ú¡¼¥¸Ì¾<tab>»²¾ÈÀè¥Ú¡¼¥¸Ì¾<tab>...
20 // ¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤é´ØÏ¢¥Ú¡¼¥¸¤òÆÀ¤ë
21 function links_get_related_db($page)
23 $ref_name = CACHE_DIR . encode($page) . '.ref';
24 if (! file_exists($ref_name)) return 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;
35 //¥Ú¡¼¥¸¤Î´ØÏ¢¤ò¹¹¿·¤¹¤ë
36 function links_update($page)
38 if (ini_get('safe_mode') == '0') set_time_limit(0);
40 $time = is_page($page, TRUE) ? get_filetime($page) : 0;
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);
49 $rel_old = explode("\t", rtrim($lines[0]));
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 == '')
59 if (is_a($_obj, 'Link_autolink')) { // ¹Ôµ·¤¬°¤¤
60 $rel_auto[] = $_obj->name;
62 $rel_new[] = $_obj->name;
65 $rel_new = array_unique($rel_new);
67 // autolink¤·¤«¸þ¤¤¤Æ¤¤¤Ê¤¤¥Ú¡¼¥¸
68 $rel_auto = array_diff(array_unique($rel_auto), $rel_new);
71 $rel_new = array_merge($rel_new, $rel_auto);
73 // .rel:$page¤¬»²¾È¤·¤Æ¤¤¤ë¥Ú¡¼¥¸¤Î°ìÍ÷
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));
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));
88 global $WikiName, $autolink, $nowikiname, $search_non_list;
90 // $page¤¬¿·µ¬ºîÀ®¤µ¤ì¤¿¥Ú¡¼¥¸¤Ç¡¢AutoLink¤ÎÂоݤȤʤêÆÀ¤ë¾ì¹ç
91 if ($time && ! $rel_file_exist && $autolink
92 && (preg_match("/^$WikiName$/", $page) ? $nowikiname : strlen($page) >= $autolink))
94 // $page¤ò»²¾È¤·¤Æ¤¤¤½¤¦¤Ê¥Ú¡¼¥¸¤ò°ìÀƹ¹¿·¤¹¤ë(¤ª¤¤)
96 $pages = do_search($page, 'AND', TRUE);
97 foreach ($pages as $_page) {
102 $ref_file = CACHE_DIR . encode($page) . '.ref';
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));
109 // $page¤òAutoLink¤Ç¤·¤«»²¾È¤·¤Æ¤¤¤Ê¤¤¥Ú¡¼¥¸¤ò°ìÀƹ¹¿·¤¹¤ë(¤ª¤¤¤ª¤¤)
111 links_delete($ref_page, array($page));
116 //¥Ú¡¼¥¸¤Î´ØÏ¢¤ò½é´ü²½¤¹¤ë
117 function links_init()
121 if (ini_get('safe_mode') == '0') set_time_limit(0);
123 // ¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î½é´ü²½
124 foreach (get_existfiles(CACHE_DIR, '.ref') as $cache)
126 foreach (get_existfiles(CACHE_DIR, '.rel') as $cache)
129 $pages = get_existpages();
130 $ref = array(); // »²¾È¸µ
131 $ref_notauto = array();
132 foreach ($pages as $page) {
133 if ($page == $whatsnew) continue;
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 == '')
142 $rel[] = $_obj->name;
143 if (! is_a($_obj, 'Link_autolink')) {
144 $ref_notauto[$_obj->name][$page] = TRUE;
146 $ref[$_obj->name][] = $page;
148 $rel = array_unique($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));
157 foreach ($ref as $page=>$arr) {
158 if (empty($arr)) continue;
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");
172 function links_add($page, $add, $rel_auto)
174 $rel_auto = array_flip($rel_auto);
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";
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;
190 if ($is_page || ! $all_auto) {
191 $fp = fopen($ref_file, 'w')
192 or die_message('cannot write ' . htmlspecialchars($ref_file));
199 function links_delete($page, $del)
201 foreach ($del as $_page) {
202 $ref_file = CACHE_DIR . encode($_page) . '.ref';
203 if (! file_exists($ref_file)) continue;
206 $is_page = is_page($_page);
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;
217 if ($is_page && ! $all_auto && $ref != '') {
218 $fp = fopen($ref_file, 'w')
219 or die_message('cannot write ' . htmlspecialchars($ref_file));
226 function & links_get_objects($page, $refresh = FALSE)
230 if (! isset($obj) || $refresh)
231 $obj = & new InlineConverter(NULL, array('note'));
233 return $obj->get_objects(join('', preg_grep('/^(?!\/\/|\s)./', get_source($page))), $page);